transparencia radical
Cada byte que sale de tu máquina: listado aquí. Tu código no sale sin que lo envíes.
El análisis es 100% local. Por sí sola, codafort envía solo dos cosas: una métrica de uso seudónima (sin código, sin ruta de archivo, sin la ubicación de ningún finding) y, con licencia activa, su revalidación una vez al día (el id de la licencia y el propio token, que lleva el tier, la validez y el correo del titular). Código y findings solo salen cuando los entregas a la Platform de tu organización, o le conectas un repositorio. Está todo en esta página, y la telemetría la apagas en una línea.
La línea roja
Si un dato puede identificarte a ti, a tu código o a tu objetivo, no es telemetría; es tuyo. Ninguna telemetría lo lleva, en ningún plan: solo sale cuando tú mismo lo entregas a la Platform de tu organización (abajo).
✕ Lo que la telemetría NUNCA lleva
✕ Tu código, fragmentos o cualquier contenido de archivo
✕ Rutas, nombres de archivo, de repositorio o de branch
✕ Nombres y versiones de tus dependencias
✕ Secretos, variables de entorno, config
✕ La ubicación de un finding (archivo:línea)
✕ Tu IP, hostname, usuario o correo
✓ Lo que enviamos (seudónimo)
✓ Que ocurrió un scan, y cuánto tardó (en rangos, no el valor exacto)
✓ Cuántos findings, por severidad
✓ Por clase de CWE (p. ej. "SQL injection", nunca dónde)
✓ Qué lenguajes escaneas
✓ Versión de codafort, sistema y arquitectura
✓ Un ID aleatorio de la instalación, fijo, sin nombre ni correo
El paquete entero, exactamente como sale
Un envío real, generado por un scan que encontró un SQL injection. Ejecuta codafort scan . --telemetry-dry-run y mira el tuyo, byte a byte, sin enviar nada.
{
"schema": "coda-telemetry/1",
"install_id": "a3f…", // aleatório, fixo / random, fixed
"version": "0.1.0",
"os": "macos", "arch": "aarch64",
"event": "scan",
"files_bucket": "1-9", // faixa, nunca o nº exato / bucket, never exact
"duration_bucket": "100ms-1s",
"findings": {
"by_severity": { "critical": 1 },
"by_cwe_class": { "89": 1 }, // classe, jamais arquivo:linha / class, never file:line
"by_lang": { "python": 1 }
}
}
Niveles: del silencio total a tu propio panel
| Nivel | Qué sale | Por defecto |
|---|---|---|
| 0 · Silencioso | nada: CI, air-gap, banco/sector público | auto (CI / no TTY) |
| 1 · Heartbeat | los conteos agregados de arriba | ENCENDIDO |
| 2 · Producto | qué reglas disparan, aceptación del fix, falsos positivos que marcas | opt-in (aún no existe) |
| 3 · Tu Platform | no es telemetría: lo que entregas a la Platform de tu organización con platform push o lo que la conexión sincroniza, findings con fragmento de código incluidos (ver abajo) | opt-in, plan Platform |
Apagarlo es gratis y toma una línea
codafort config telemetry off # permanente / permanent
export CODAFORT_TELEMETRY=off # sessão · CI / session · CI
codafort scan . --no-telemetry # só desta vez / just this once
export CODAFORT_LICENSE_OFFLINE=1 # sem revalidar a licença / no licence check
Cuando enciendes la Platform, sale tu dato, y solo porque lo enviaste
El canal codafort platform no es telemetría: entrega a la Platform de tu organización el resultado del análisis, para la cola, el historial de cada finding y el marcador antes/después. Nada pasa por él hasta que autorices este equipo.
Qué sale, y cuándo
platform push: los findings (regla, severidad, mensaje y el fragmento de código donde están), las dependencias y la lista de archivos, con el nombre del repositorio, la rama y el commit. El resto del grafo queda en la máquina, salvo con --with-graph. Con --git, van también el nombre y el correo del autor del commit de cada finding.
La ruta absoluta no sale: todo va relativo a la raíz del repositorio, y el envío se rechaza si queda alguna.
Después de platform connect: un registro por comando en ese repositorio, sin nuevo envío tuyo: el verbo, el hash de los argumentos, cuántos findings, la duración, el repositorio, la rama y el commit, el agente de IA usado y las propuestas de corrección con su justificación. Sin rutas y sin código. En el platform login, el nombre de esta máquina se vuelve la etiqueta del dispositivo.
Cómo no enviarlo
No hagas platform login: sin sesión (o sin token en el CI), el canal no tiene con quién hablar.
platform disconnect desvincula el repositorio y descarta lo que esperaba envío; platform logout revoca la sesión.
La versión para entornos aislados no tiene el canal. La guía completa está en la documentación.
Modelamos las amenazas de nuestra propia telemetría
Recolectar métricas de seguridad crea un objetivo. Una empresa de seguridad tiene que probar que se ocupó de eso, y no solo prometerlo.
Sin mapa de vulnerabilidades
Los findings salen solo como conteos por clase, nunca con archivo, línea o repositorio. Una filtración de nuestra base no reconstruye "qué bug, dónde".
Sin IP guardada
El colector va a descartar la IP al llegar. Sin geolocalización, sin identificar la máquina.
ID aleatorio, sin nombre
El install-id es un número aleatorio generado en la instalación. Queda igual en esa máquina, y por eso lo tratamos como dato personal seudónimo; pero no lleva nombre, correo ni nada de la máquina.
Publicamos solo agregados
Ningún número que publiquemos aísla a un cliente (k-anonimato).
Para entornos aislados, una versión sin red
El contrato Platform incluye una versión para entornos sin internet, entregada sin telemetría, sin revalidación online de la licencia y sin el canal de la Platform. El código de red no viene en ella, y un auditor puede comprobarlo. La versión pública tiene los tres, y la telemetría se apaga en una línea.
Y la LGPD / GDPR
El Nivel 1 es dato personal seudonimizado: un ID fijo, sin nombre ni correo. La base legal es el interés legítimo en entender y corregir el producto, y te opones apagándola. En la Platform, tu organización es la responsable y Orchestro trata los datos como encargada, bajo contrato y acuerdo de tratamiento de datos, con aislamiento por cliente. La página de privacidad detalla cada tratamiento.