Código aberto · Local-first · Linha de comando
Audite seu próprio histórico de posts como uma IA faria.
$ exposurecheck audit --twitter ./twitter_export \
--backend local --expensive-model llama3.1 --i-own-this-data
ExposureCheck v0.1 · local backend · nothing left this machine
Parsed 3,214 posts · 19 months · prefilter kept 2,901 (weak signals retained)
RISK CONTRIBUTION posts what drives it
───────────────────────────────────────────────────────────────
● LOCATION High 28 local events, commute clues, "my gym"
● EMPLOYER High 11 project code-names, office banter
● SCHEDULE Medium 63 posting-time concentration → UTC-8
○ FAMILY Low 4 a relative's first name, a school
Top card · LOCATION (High)
[LOCAL EVENT] near [NEIGHBORHOOD] — 6 posts
[COMMUTE] on [TRANSIT LINE] — mentioned 9 times
→ generalise: drop venue names; delay event posts by a week
12 posts to review · re-run with -i to open YOUR own originals
No dossier written. No profile saved. "High" is not "you are doxxed" —
it means a model could narrow this down. Fix, then re-scan.
Exemplo real de execução com um modelo local. As categorias aparecem mascaradas (em código), o valor recuperado não é exibido e nenhum perfil é salvo.
O que ela faz, em um minuto#
O ExposureCheck lê os dados que você exporta de uma plataforma — nunca uma conta ativa, nunca a de outra pessoa — e faz a pergunta que um adversário faria: juntando tudo isso, o que dá para deduzir sobre quem está por trás?
- Ela interpreta a sua exportação GDPR do Reddit e o seu arquivo do X / Twitter (uma pasta ou um
.zip). - Roda uma cascata que preserva a cobertura: uma passagem barata ordena cada post por prioridade, uma passagem cara lê os mais importantes, e os sinais fracos ficam — o mosaico se monta a partir de sinais fracos, então descartá-los seria um falso conforto.
- Extrai a camada de metadados de forma determinística — o campo de localização que você mesmo preencheu, os links de saída, o EXIF/GPS (dados que a câmera grava na foto, como local e horário) das imagens, o modelo do aparelho e a concentração de horários de postagem que entrega o seu fuso. No X, isso vaza mais do que o próprio texto.
- Devolve cartões de risco por categoria — Localização, Empregador, Família, Agenda, Finanças, Vínculos de conta — ordenados pela contribuição ao risco, cada um com exemplos mascarados e correções concretas, que começam pela generalização.
Ela é local-first, não grava nenhum dossiê e nunca salva no disco um perfil seu.
Nunca ouviu falar em “reidentificação por mosaico”? Comece pela ameaça, não pela ferramenta: leia o artigo que acompanha esta página, Audite seu próprio histórico de posts como uma IA faria, e depois volte.
O que ela deliberadamente não faz#
- Nenhum dossiê. Ela nunca imprime “você mora em X, trabalha na Y, seu nome é Z”. Os cartões mostram trechos mascarados; o valor recuperado só aparece quando você clica para abrir o seu próprio post original, ali na hora, sem nunca ser salvo.
- Não exporta os achados. Não faz scraping (coleta automática); o único insumo é a exportação. Não posta nem apaga nada no seu lugar. Não analisa o histórico de ninguém mais.
- Ela não deixa você anônimo. Ela reduz o risco. “Low” não é “seguro”, e metadados, horários e estilo de escrita só entram em parte no escopo.
O que sai da sua máquina — e o que não sai#
Essa é a primeira coisa que uma ferramenta de privacidade deveria dizer, então aqui está, logo de cara. A inferência roda num backend que você escolhe, e é essa escolha — não a ferramenta — que decide o que viaja:
| Backend | O que é | Os seus dados saem da sua máquina? |
|---|---|---|
local | um modelo local no Ollama / llama.cpp / LM Studio | ✅ Não — ficam no seu computador |
heuristic | um esboço offline em regex, com cobertura quase nula | ✅ Não — mas só para desenvolvimento/CI, não é uma auditoria de verdade |
cloud | qualquer endpoint compatível com OpenAI, com a sua chave | ⚠️ Sim — os seus posts vão para esse provedor |
A ferramenta em si não tem servidor, nem telemetria, nem conta. A autora não guarda nenhum dado seu e nenhuma chave. Quando você escolhe cloud, a sua exportação vai para o provedor de API que você indicou — e valem todas as regras dele: registro de logs, prazo de retenção, política de treinamento e o IP e a cobrança atrelados à sua chave. O ExposureCheck não acrescenta nenhum salto na rota; mas também não consegue remover aquele que você decidiu tomar.
A única ressalva sobre a nuvem que de fato pesa#
Se a conta que você está auditando for uma com pseudônimo que você mantém apartada da sua identidade real, e a sua conta de IA/nuvem estiver registrada ou paga sob o seu nome real, então mandar esse histórico para a nuvem permite ao provedor ligar identidade real ↔ conta anônima do lado dele (por intimação judicial, vazamento ou alguém de dentro). É exatamente essa desanonimização que a ferramenta existe para evitar.
Logo: para auditar uma conta estritamente anônima → use --backend local (ou uma conta na nuvem aberta e paga de forma anônima). Para auditar a sua conta pública / com nome real → a nuvem não tem problema. A CLI deixa isso claro na tela e pede que você reconheça o risco quando ele se aplica. A ferramenta nunca obriga a usar o modo local — isso reduziria o público a ninguém —, ela apenas torna a escolha explícita.
Como funciona#
export ─▶ parse ─▶ prefilter (drop only TRUE-empty) ─┬─▶ deterministic: profile + EXIF + timing ─┐
└─▶ cascade: cheap route ─▶ expensive read ─┤
▼
risk-contribution scoring ─▶ category cards ─▶ no-dossier reportA cascata existe para que processar um histórico de 1 a 3 mil posts continue acessível: a passagem barata decide o que merece a leitura cara, em vez de mandar tudo. A pontuação por contribuição ao risco então ordena as categorias por quanto elas de fato estreitam quem você é — e não pela confiança bruta do modelo, que não é calibrada.
Instalação#
O núcleo — a interpretação dos arquivos, o EXIF, a cascata e os backends HTTP de nuvem e local — usa apenas a biblioteca padrão do Python. Nenhum pacote de terceiros toca na sua exportação, o que mantém pequeno o código em que você precisa confiar.
# from source (a PyPI release ships with the first public version):
git clone https://github.com/coraaegis/exposurecheck && cd exposurecheck
pip install -e .
# or run without installing:
python -m exposurecheck --help# Local model — nothing leaves your machine (recommended for anonymous accounts)
exposurecheck audit \
--reddit ./reddit_export.zip \
--twitter ./twitter_export \
--backend local --expensive-model llama3.1 \
--i-own-this-data
# Cloud — bring your own key; set it in the ENV, never on the command line
export OPENAI_API_KEY=sk-...
exposurecheck audit --twitter ./twitter_export --backend cloud --i-own-this-dataA chave da API é lida intencionalmente de uma variável de ambiente: argumentos de linha de comando vazam para o histórico do shell e para a lista de processos.
Por enquanto, o ExposureCheck é uma ferramenta de linha de comando, voltada a quem se sente à vontade num terminal — que é também onde vivem os primeiros a revisá-la. Um aplicativo de um clique para quem não é técnico (um pacote pronto, com uma interface local que roda no navegador e sem nenhum Python para instalar) é o próximo marco; a CLI fica para quem usa a fundo.
Confie como confiaria em qualquer ferramenta de privacidade — verificando, não acreditando#
A autora é pseudônima, então não tome um nome como garantia. Tome, no lugar, as coisas que você pode verificar:
- Leia o código. Ele é de código aberto (MIT) e usa só a biblioteca padrão, então a árvore de dependências que você precisa auditar é, na prática, a própria biblioteca padrão.
- Verifique a release. Cada release é assinada com PGP por Cora Aegis. Busque a chave por WKD e confira a assinatura:As somas de verificação SHA-256 acompanham cada release, e as builds são reprodutíveis — recompile a partir da fonte com a tag e confirme que o resultado bate.
gpg --locate-keys cora@cypherpunkguide.com gpg --verify exposurecheck-0.1.0.tar.gz.asc - Sem certificado de assinatura de código atrelado a uma identidade, por design — um certificado desses prenderia o projeto a uma identidade legal, o oposto do objetivo. Um binário do Windows sem assinatura pode disparar o aviso de “editor desconhecido” do SmartScreen; isso é esperado. Prefira um gerenciador de pacotes (pip / Scoop / Homebrew) ou rode a partir da fonte, e verifique a assinatura PGP.
- O desenho da saída é a salvaguarda. A regra de “nenhum dossiê” é garantida no código: os rótulos mascarados são gerados pelo programa, então nem mesmo o texto do próprio modelo consegue trazer um valor recuperado para dentro do relatório. As proteções contra duplo uso — insumo restrito a quem é dono dos dados, saída só por categoria, mascaramento e uma avaliação de abuso pré-lançamento — estão documentadas em
ABUSE-EVAL.md.
Uma tabela transparente de fluxo de dados e um modelo de ameaças publicado mostram o que a ferramenta pretende fazer. O código, a assinatura e a build reprodutível são como você confirma que ela faz isso — e nada além.
Limites que vale conhecer#
- “Low” não é “seguro”. A ferramenta reduz o risco; ela não atesta anonimato.
- A cobertura não é perfeita. Um achado em branco (“nada sinalizado”) não prova que você é inidentificável — sobretudo no backend
heuristic, que existe para testes, não para auditoria. - Fora do escopo: a impressão digital do estilo de escrita, o cruzamento entre plataformas além do que está nas suas exportações, os metadados de rede e o conteúdo visual das imagens (a v1 lê só o EXIF/metadados — veja o roteiro).
- A própria ferramenta lê os seus dados mais sensíveis. É justamente por isso que ela é local-first, usa só a biblioteca padrão, é de código aberto e assinada: para que aquilo que você roda a fim de medir a sua exposição seja, ele mesmo, a menor e mais auditável superfície possível.
Perguntas frequentes#
O ExposureCheck envia os meus posts para algum lugar?#
Só se você escolher o backend cloud, e mesmo assim apenas para o provedor de API cuja chave você forneceu. Com local ou heuristic, nada sai da sua máquina. A ferramenta não tem servidor nem telemetria próprios.
Ela vai me dizer o meu endereço ou o meu nome real?#
Não. É o desenho deliberado de “nenhum dossiê”. Ela mostra categorias mascaradas e aponta para os seus próprios posts originais, para que você decida o que mudar. Ela nunca monta nem guarda um perfil seu.
Estou auditando uma conta anônima. O backend de nuvem é seguro?#
Use --backend local para uma conta estritamente anônima, a menos que a sua própria conta de nuvem seja anônima. Mandar o histórico de uma conta anônima para uma conta de IA com nome real liga as duas do lado do provedor — exatamente o risco que esta ferramenta ajuda você a encontrar.
É realmente seguro rodar no meu histórico inteiro?#
O código é de código aberto e usa só a biblioteca padrão, então você consegue ler o que ele faz; a release é assinada com PGP e reprodutível, então você consegue confirmar o que instalou; e nada de perfil é gravado no disco. Verifique isso, não tome por fé — é toda a postura da ferramenta.
Por que uma linha de comando e não um aplicativo?#
O primeiro público é técnico, e uma CLI é a forma mais auditável. Um aplicativo de um clique, empacotado e com uma interface local no navegador, é o próximo marco para quem não é técnico.
Feito por Cora Aegis. Encontrou uma falha de privacidade ou de segurança? A divulgação responsável é bem-vinda — cora@cypherpunkguide.com (PGP via WKD). A fonte oficial e o nome ExposureCheck ficam em github.com/coraaegis/exposurecheck.