Política de Privacidade — Etus Open Telemetry

Este documento é o contrato público com operadores que rodam software open source da Etus. Ele espelha 1:1 o schema técnico em 02-event-schema.md. Toda mudança de campo coletado é breaking change, exige bump de schema_version e atualização desta política.

PT-BR primeiro. English version below. Both versions are equally authoritative.


🇧🇷 Português

TL;DR

A telemetria do Etus Open Telemetry está desligada por padrão. Se você ativar opt-in explícito, sua instância envia um pequeno heartbeat anônimo uma vez por dia, contendo apenas dados sobre a instância (versão do produto, sistema operacional, número de usuários ativos, etc.) — nunca dados sobre as pessoas que usam a sua instância. Você pode inspecionar, desativar e pedir exclusão a qualquer momento.

1. Quem somos

A telemetria é operada por Etus, identificada como controladora dos dados nos termos da LGPD (Lei nº 13.709/2018). Contato: privacy@etus.com.br (placeholder — confirmar antes de produção).

2. O que coletamos

A coleta acontece via SDK embarcado nos OSS da Etus que você hospeda. Há dois tipos de evento:

2.1 instance.heartbeat — uma vez a cada 24h

CampoTipoDescrição
schema_versionsemverVersão do schema desta política
event_idUUID v4Identificador único do evento (dedup)
timestampISO 8601 UTCQuando o evento foi emitido
product.namestring (enum)Qual OSS da Etus emitiu (ex: etus-foo)
product.versionsemverVersão da instalação
instance.idhashIdentificador opaco da instância (ver §4)
instance.first_seen_atISO 8601 UTCQuando o opt-in foi ativado nessa instância
environment.osenumlinux | macos | windows | unknown
environment.archenumx86_64 | arm64 | unknown
environment.runtimeenumnode (e outros que vierem)
environment.runtime_versionsemverVersão do runtime
environment.deploymentenumdocker | kubernetes | native | unknown
environment.is_containerizedboolean
database.engineenum por produtoEx: postgres, mysql
database.version_majorstringApenas major.minor
usage.usersinteiro ≥ 0Contagem de usuários ativos da instância
usage.storage_bytesinteiro ≥ 0Storage usado em bytes
usage.uptime_daysinteiro ≥ 0Dias desde o último start
features.enabled[]array de enumsQuais features estão ativas (whitelist por produto)
features.integrations[]array de enumsQuais integrações estão configuradas

2.2 instance.lifecycle — eventual (transições)

Mesmo envelope acima, mais:

CampoTipoDescrição
lifecycle.typeenuminstall | upgrade | feature_enabled | feature_disabled | uninstall
lifecycle.from_versionsemver | null
lifecycle.to_versionsemver | null
lifecycle.featurestring (whitelisted) | null

Veja ADR-0003 para a discussão sobre usage.* ser inteiro exato em vez de bucket.

3. O que NÃO coletamos

Nada fora do schema acima. Especificamente, nunca enviamos:

4. Sobre o instance.id — não-correlacionável

O instance.id enviado é uma função hash criptográfica dos seguintes valores, mantidos no disco da sua instância:

seed         = 32 bytes aleatórios, gerados na 1ª execução com opt-in
install_uuid = UUIDv4 gerado na 1ª execução
instance.id  = SHA-256(seed || install_uuid || product_name) → primeiros 16 bytes em base32

Conseqüências:

5. Por que coletamos

A Etus não vende dados de telemetria. Nunca repassa a terceiros (exceto Cloudflare, processador de dados conforme §8).

6. Como ativar (opt-in)

Telemetria é desligada por padrão. Para ativar, escolha uma das opções abaixo:

Variável de ambiente (preferível):

export ETUS_TELEMETRY=enabled

Config do app hospedeiro (varia por produto — veja o README do OSS específico). Em código:

telemetry.init({
  product: 'etus-foo',
  version: '1.0.0',
  optedIn: true,
});

Na primeira execução com opt-in ativo, o SDK gera a seed e o install_uuid localmente e envia o primeiro heartbeat.

7. Como inspecionar antes de enviar

O SDK expõe um modo de inspeção que mostra exatamente o payload que seria enviado, sem enviar:

const preview = await telemetry.inspect();
console.log(preview);

Ou via o arquivo de estado direto: cat ~/.config/etus-telemetry/<product>.json.

8. Onde os dados ficam

Toda a infra roda na Cloudflare:

A Cloudflare atua como operadora de dados (processadora) nos termos da LGPD. Não há outros sub-processadores.

9. Como desativar

Qualquer uma destas opções desliga a coleta imediatamente:

Variável de ambiente:

export ETUS_TELEMETRY=disabled
# ou o sinal universal:
export DO_NOT_TRACK=1

Config do app:

telemetry.init({ product: '...', version: '...', optedIn: false });

Comando direto (se o app hospedeiro expuser):

<seu-app> telemetry disable

A Etus também não coleta em ambientes de CI — qualquer um dos sinais CI=true, GITHUB_ACTIONS, GITLAB_CI, BUILDKITE, CIRCLECI, JENKINS_URL, CONTINUOUS_INTEGRATION desliga automaticamente.

10. Retenção

11. Como pedir exclusão (Direito do titular — LGPD art. 18)

Como o instance.id é opaco para a Etus, o pedido de exclusão precisa ser iniciado por você:

  1. Localize seu instance.id em ~/.config/etus-telemetry/<product>.json — campo derivado da seed (ou rode telemetry.inspect() para obtê-lo).
  2. Envie e-mail para privacy@etus.com.br com o assunto [etus-telemetry] DSR — delete e o instance.id no corpo.
  3. Apagamos todos os eventos brutos com esse instance.id em até 15 dias úteis.
  4. Agregações já materializadas não são retroativamente recalculadas — elas são contagens, não armazenam o ID.

Você também pode parar de enviar dados novos a qualquer momento via §9.

12. Mudanças nesta política

Toda mudança que afete campos coletados:

Histórico:

13. Contato


🇺🇸 English

TL;DR

Etus Open Telemetry is off by default. If you explicitly opt in, your instance sends a small anonymous heartbeat once a day with data about the instance (product version, OS, active user count, etc.) — never data about the people using your instance. You can inspect, disable and request deletion at any time.

1. Who we are

Telemetry is operated by Etus, identified as the data controller under GDPR. Contact: privacy@etus.com.br (placeholder — to confirm before production).

2. What we collect

Collection happens through an SDK embedded in the Etus OSS products you host. There are two event types:

2.1 instance.heartbeat — once every 24h

FieldTypeDescription
schema_versionsemverVersion of the schema covered by this policy
event_idUUID v4Unique event identifier (dedup)
timestampISO 8601 UTCWhen emitted
product.namestring (enum)Which Etus OSS emitted it (e.g. etus-foo)
product.versionsemverInstallation version
instance.idhashOpaque instance identifier (see §4)
instance.first_seen_atISO 8601 UTCWhen opt-in was enabled on this instance
environment.osenumlinux | macos | windows | unknown
environment.archenumx86_64 | arm64 | unknown
environment.runtimeenumnode (plus future ones)
environment.runtime_versionsemverRuntime version
environment.deploymentenumdocker | kubernetes | native | unknown
environment.is_containerizedboolean
database.engineenum per producte.g. postgres, mysql
database.version_majorstringMajor.minor only
usage.usersinteger ≥ 0Active user count on the instance
usage.storage_bytesinteger ≥ 0Storage used, in bytes
usage.uptime_daysinteger ≥ 0Days since last start
features.enabled[]array of enumsActive features (whitelist per product)
features.integrations[]array of enumsConfigured integrations

2.2 instance.lifecycle — eventual (transitions)

Same envelope as above, plus:

FieldTypeDescription
lifecycle.typeenuminstall | upgrade | feature_enabled | feature_disabled | uninstall
lifecycle.from_versionsemver | null
lifecycle.to_versionsemver | null
lifecycle.featurestring (whitelisted) | null

See ADR-0003 for the discussion of why usage.* are exact integers rather than buckets.

3. What we do NOT collect

Nothing outside the schema above. Specifically, we never send:

4. About instance.id — non-correlatable

The instance.id we receive is a cryptographic hash of these values, kept on your instance's disk:

seed         = 32 random bytes, generated on first opt-in run
install_uuid = UUIDv4 generated on first run
instance.id  = SHA-256(seed || install_uuid || product_name) → first 16 bytes in base32

Implications:

5. Why we collect

Etus does not sell telemetry data. We do not share with third parties, except Cloudflare as data processor per §8.

6. How to enable (opt-in)

Telemetry is off by default. To enable, pick one option below:

Environment variable (preferred):

export ETUS_TELEMETRY=enabled

Host app config (varies per product — see the specific OSS README). In code:

telemetry.init({
  product: 'etus-foo',
  version: '1.0.0',
  optedIn: true,
});

On the first opt-in run, the SDK generates the seed and install_uuid locally and sends the first heartbeat.

7. How to inspect before sending

The SDK exposes an inspect mode that shows exactly the payload that would be sent, without sending it:

const preview = await telemetry.inspect();
console.log(preview);

Or read the state file directly: cat ~/.config/etus-telemetry/<product>.json.

8. Where the data lives

Everything runs on Cloudflare:

Cloudflare acts as data processor under GDPR. There are no other sub-processors.

9. How to disable

Any of these options stops collection immediately:

Environment variable:

export ETUS_TELEMETRY=disabled
# or the universal signal:
export DO_NOT_TRACK=1

App config:

telemetry.init({ product: '...', version: '...', optedIn: false });

Direct command (if the host app exposes one):

<your-app> telemetry disable

Etus also does not collect in CI environments — any of CI=true, GITHUB_ACTIONS, GITLAB_CI, BUILDKITE, CIRCLECI, JENKINS_URL, CONTINUOUS_INTEGRATION automatically disables telemetry.

10. Retention

11. How to request deletion (data subject right — GDPR art. 17)

Since instance.id is opaque to Etus, the deletion request needs to be initiated by you:

  1. Find your instance.id in ~/.config/etus-telemetry/<product>.json — derived from the seed (or run telemetry.inspect() to get it).
  2. Email privacy@etus.com.br with the subject [etus-telemetry] DSR — delete and the instance.id in the body.
  3. We will delete all raw events with that instance.id within 15 business days.
  4. Already-materialized aggregations are not retroactively recomputed — they are counts, they do not store the ID.

You can also stop sending new data at any time via §9.

12. Changes to this policy

Any change that affects collected fields:

History:

13. Contact