fepublica

module
v1.5.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 10, 2026 License: AGPL-3.0

README

Fé Pública

Arquivo imutável e criptograficamente verificável de dados públicos brasileiros.

ci Go Report Card Go Reference

Status: alpha — em desenvolvimento ativo. Licença: AGPL-3.0

Fé Pública é um serviço open source que coleta dados de portais públicos brasileiros (Portal da Transparência, PNCP, e outros), organiza cada coleta em uma árvore de Merkle, ancora a raiz dessa árvore em Bitcoin via OpenTimestamps, e expõe uma API de verificação que permite a qualquer pessoa provar — offline, sem depender da nossa infraestrutura — que um dado público existia em determinada data e não foi alterado desde então.

O nome vem do termo jurídico brasileiro: fé pública é a garantia de autenticidade que certos documentos oficiais carregam por força de lei. Este projeto busca reproduzir a mesma garantia para dados abertos, usando criptografia em vez de autoridade.

Por que isso existe

Dado público brasileiro muda e desaparece silenciosamente. Registros do Cadastro de Empresas Inidôneas e Suspensas (CEIS) são retirados da lista sem trilha pública. Contratos no PNCP recebem emendas retroativas sem changelog. Edições do Diário Oficial da União acontecem por ato formal, mas nem sempre são fáceis de reconstruir após o fato.

Hoje, quem precisa provar "esse dado existia nesta data" depende da boa-fé do portal oficial, ou de registros manuais. Este projeto oferece uma alternativa:

  • Snapshots periódicos de datasets públicos, via APIs oficiais, dentro dos termos de uso.
  • Hashes encadeados em árvores de Merkle, de modo que uma prova curta basta para demonstrar inclusão de um registro específico.
  • Âncoras em Bitcoin via OpenTimestamps — um protocolo gratuito e sem operação de nó próprio no MVP.
  • Verificação independente via CLI que não depende do servidor Fé Pública continuar no ar. Sua prova é sua para sempre.

Casos de uso

  • Jornalismo investigativo: provar que uma empresa estava (ou não) numa lista de sanções em data X, mesmo que o portal oficial tenha sido editado depois.
  • Pesquisa acadêmica: citar snapshots reproduzíveis de datasets públicos em artigos.
  • Compliance e due diligence: manter trilha verificável de consultas ao CEIS/CNEP no momento da contratação.
  • Accountability civil: monitorar edições retroativas de contratos públicos no PNCP.
  • Evidência processual: gerar provas de existência de conteúdo público em data certa.

Escopo do MVP

Em escopo Fora do MVP
Coletor CEIS (Portal da Transparência) UI web completa
Coletor CNEP Multi-tenant
Merkle tree + batching Alertas / notificações
Anchor worker via OpenTimestamps Calendar server OTS próprio
API HTTP de verificação Suporte a múltiplas fontes via plugin
API HTTP de diff entre snapshots PNCP, DOU (v2)
CLI standalone de verificação offline Helm chart (v2)
Docker Compose para local + produção Kubernetes operator (v3)

Status atual

Este repositório está em fase inicial. Nem todas as partes descritas aqui estão implementadas. Confira docs/ROADMAP.md para o estado real por componente.

Quickstart (local)

# 1. Cadastre-se e obtenha um token da API do Portal da Transparência:
#    https://portaldatransparencia.gov.br/api-de-dados/cadastrar-email

# 2. Clone e configure:
git clone https://github.com/gmowses/fepublica
cd fepublica
cp .env.example .env
# edite .env e coloque TRANSPARENCIA_API_KEY=<seu-token>

# 3. Suba o stack:
make up

# 4. Rode a migração:
docker compose --profile migrate run --rm migrate

# 5. Dispare um coletor sob demanda:
docker compose run --rm collector run --source ceis

# 6. Veja o estado da API:
curl http://localhost:8080/health
curl http://localhost:8080/snapshots

Arquitetura resumida

┌──────────────┐    ┌───────────┐    ┌──────────┐    ┌───────────┐
│  Portal da   │    │           │    │          │    │           │
│ Transparência├───►│ collector ├───►│ postgres ├───►│  anchor   │
│    (API)     │    │           │    │          │    │  worker   │
└──────────────┘    └───────────┘    └─────┬────┘    └─────┬─────┘
                                           │               │
                                     ┌─────▼─────┐         │
                                     │   api     │         ▼
                                     │  (http)   │    ┌──────────────┐
                                     └─────┬─────┘    │   OTS        │
                                           │          │  calendars   │
                             ┌─────────────┼──────────┤  (Bitcoin)   │
                             │             │          └──────────────┘
                             ▼             ▼
                      ┌───────────┐  ┌──────────┐
                      │  verify   │  │ journal  │
                      │    CLI    │  │ / audit  │
                      └───────────┘  └──────────┘

Componentes:

  • collector — consome API oficial, grava em events (append-only) + snapshots.
  • merkle — pacote interno que constrói árvore e gera provas de inclusão.
  • anchor worker — periodicamente seleciona snapshots não ancorados, constrói Merkle tree, envia hash raiz para calendars OTS, guarda o receipt.
  • api — endpoints HTTP de consulta, verificação, e diff histórico.
  • verify CLI — binário standalone que valida uma prova offline sem depender do servidor Fé Pública.

Veja docs/DESIGN.md para detalhes.

Garantias que o serviço oferece

  1. Integridade: dado um snapshot e uma prova, você pode verificar sem nós que o registro existia naquele snapshot.
  2. Tempo: dado um receipt OTS, você pode verificar (via Bitcoin) que o snapshot foi ancorado antes de um determinado bloco Bitcoin — logo, antes de um momento no tempo.
  3. Independência: a verificação não requer o servidor Fé Pública estar no ar. Se sumirmos do mapa, sua prova continua válida enquanto Bitcoin existir.
  4. Reprodutibilidade: a política de coleta é pública e versionada. Qualquer um pode rodar uma instância paralela e comparar.

Garantias que o serviço não oferece

  1. Autenticidade da fonte: Fé Pública arquiva o que a API oficial retorna. Se o governo publicou um dado errado, Fé Pública registra esse erro. Não somos fact-checker.
  2. Completude: podemos ter gaps de coleta (falha de API, rate limit, bug). Sempre publicaremos nossa cobertura real.
  3. Privacidade: todos os dados coletados já são públicos por lei. Este projeto não coleta, armazena ou processa dados pessoais não-públicos.

Roadmap

  • v0.1 (MVP): CEIS + CNEP, anchoring via calendars OTS públicos, CLI de verificação, API básica.
  • v0.2: PNCP, diff histórico, UI mínima de busca.
  • v0.3: DOU, Helm chart, observabilidade (Prometheus metrics, Grafana dashboards).
  • v1.0: Calendar server OTS próprio ("primeiro calendar operado no Brasil"), webhook para jornalistas/pesquisadores, documentação completa.

Contribuir

Veja CONTRIBUTING.md. Contribuições são bem-vindas, especialmente:

  • Adição de novas fontes (cada fonte é um pacote em internal/transparencia/).
  • Melhoria do parser defensivo de payload governamental.
  • Tradução da documentação para inglês.
  • Casos de uso jornalísticos (abra uma issue contando o que você precisa).

Agradecimentos

Licença

Este projeto é distribuído sob a GNU Affero General Public License v3.0.

Escolhemos AGPL em vez de MIT deliberadamente: se alguém oferecer Fé Pública como serviço público ou privado, deve abrir o código das modificações. Infraestrutura de integridade de dados públicos não deveria virar produto fechado.

Directories

Path Synopsis
cmd
anchor command
Command anchor runs the anchor worker loop.
Command anchor runs the anchor worker loop.
api command
Command api serves the public HTTP API.
Command api serves the public HTTP API.
archive command
Command archive runs the cold archive worker: it moves old event payloads from the Postgres `events.canonical_json` column into the S3-compatible bucket, reclaiming database space while preserving all cryptographic proofs (content_hash stays in place).
Command archive runs the cold archive worker: it moves old event payloads from the Postgres `events.canonical_json` column into the S3-compatible bucket, reclaiming database space while preserving all cryptographic proofs (content_hash stays in place).
cartoes-indexer command
Command cartoes-indexer walks CPGF events and projects them into the cartoes table.
Command cartoes-indexer walks CPGF events and projects them into the cartoes table.
ceap-indexer command
Command ceap-indexer materializes camara-ceap events into the ceap projection table.
Command ceap-indexer materializes camara-ceap events into the ceap projection table.
collector command
Command collector runs scheduled data collection from public Brazilian sources.
Command collector runs scheduled data collection from public Brazilian sources.
contratos-indexer command
Command contratos-indexer walks PNCP events and projects them into the contratos table.
Command contratos-indexer walks PNCP events and projects them into the contratos table.
driftd command
Command driftd runs the drift detector worker.
Command driftd runs the drift detector worker.
enteadm command
Command enteadm is a one-shot CLI that seeds the entes table from IBGE and the curated federal YAML.
Command enteadm is a one-shot CLI that seeds the entes table from IBGE and the curated federal YAML.
forenses-runner command
Command forenses-runner roda todos os detectores periodicamente e persiste os findings na tabela findings, idempotente via dedup_key.
Command forenses-runner roda todos os detectores periodicamente e persiste os findings na tabela findings, idempotente via dedup_key.
lai-crawler command
Command lai-crawler checks LAI compliance for configured public entes.
Command lai-crawler checks LAI compliance for configured public entes.
notifier command
Command notifier dispatches change_events to external channels: RSS (marks-only), Telegram, and Mastodon.
Command notifier dispatches change_events to external channels: RSS (marks-only), Telegram, and Mastodon.
verify command
Command fepublica-verify validates a proof file offline, without requiring access to the Fé Pública server that emitted it.
Command fepublica-verify validates a proof file offline, without requiring access to the Fé Pública server that emitted it.
internal
anchor
Package anchor builds Merkle trees for snapshots and submits their roots to one or more OpenTimestamps calendars.
Package anchor builds Merkle trees for snapshots and submits their roots to one or more OpenTimestamps calendars.
api
Package api implements the public HTTP API.
Package api implements the public HTTP API.
archive
Package archive is a thin wrapper around minio-go for S3-compatible storage.
Package archive is a thin wrapper around minio-go for S3-compatible storage.
canonjson
Package canonjson produces a deterministic JSON serialization of arbitrary values.
Package canonjson produces a deterministic JSON serialization of arbitrary values.
cartoes
Package cartoes parses Portal da Transparência CPGF JSON into a typed row ready for the cartoes projection table.
Package cartoes parses Portal da Transparência CPGF JSON into a typed row ready for the cartoes projection table.
ceap
Package ceap parses CEAP (Câmara) JSON into a typed row.
Package ceap parses CEAP (Câmara) JSON into a typed row.
collector
Package collector orchestrates a single collection run: it fetches records from a source, canonicalizes them, hashes them, and persists a snapshot plus events to the store.
Package collector orchestrates a single collection run: it fetches records from a source, canonicalizes them, hashes them, and persists a snapshot plus events to the store.
config
Package config loads runtime configuration from environment variables.
Package config loads runtime configuration from environment variables.
contratos
Package contratos parses PNCP canonical JSON into a typed contract row ready to be inserted into the contratos projection table.
Package contratos parses PNCP canonical JSON into a typed contract row ready to be inserted into the contratos projection table.
drift
Package drift runs the diff detector: it finds pairs of consecutive snapshots of the same source that have not been compared yet, computes the per-record difference, and persists a diff_run plus one change_event per affected record.
Package drift runs the diff detector: it finds pairs of consecutive snapshots of the same source that have not been compared yet, computes the per-record difference, and persists a diff_run plus one change_event per affected record.
entes
Package entes loads and manages the list of Brazilian public entities.
Package entes loads and manages the list of Brazilian public entities.
feed
Package feed generates Atom and JSON Feed documents from change_events.
Package feed generates Atom and JSON Feed documents from change_events.
lai
Package lai runs compliance checks against Brazilian public transparency portals.
Package lai runs compliance checks against Brazilian public transparency portals.
logging
Package logging sets up a zerolog logger based on config.
Package logging sets up a zerolog logger based on config.
merkle
Package merkle implements a binary SHA-256 Merkle tree with inclusion proofs.
Package merkle implements a binary SHA-256 Merkle tree with inclusion proofs.
metrics
Package metrics centralizes Prometheus metrics used across collector, anchor, and API components.
Package metrics centralizes Prometheus metrics used across collector, anchor, and API components.
notify
Package notify dispatches change_events to external channels: Telegram, Mastodon, and (internally) the RSS/JSON feeds.
Package notify dispatches change_events to external channels: Telegram, Mastodon, and (internally) the RSS/JSON feeds.
ots
Package ots implements a minimal HTTP client for OpenTimestamps calendar servers.
Package ots implements a minimal HTTP client for OpenTimestamps calendar servers.
severity
Package severity classifies change events into info/warn/alert levels.
Package severity classifies change events into info/warn/alert levels.
store
Forenses queries — heurísticas para detectar padrões suspeitos sobre os dados já materializados (contratos, cartoes, eventos CEIS/CNEP).
Forenses queries — heurísticas para detectar padrões suspeitos sobre os dados já materializados (contratos, cartoes, eventos CEIS/CNEP).
transparencia
Package transparencia provides a typed HTTP client for the Brazilian Portal da Transparência public API.
Package transparencia provides a typed HTTP client for the Brazilian Portal da Transparência public API.
transparencia/camara
Package camara fetches data from the Câmara dos Deputados public API (dadosabertos.camara.leg.br).
Package camara fetches data from the Câmara dos Deputados public API (dadosabertos.camara.leg.br).
transparencia/cartoes
Package cartoes fetches transactions from the CPGF (Cartão de Pagamento do Governo Federal) endpoint of the Portal da Transparência.
Package cartoes fetches transactions from the CPGF (Cartão de Pagamento do Governo Federal) endpoint of the Portal da Transparência.
transparencia/ceis
Package ceis fetches records from the CEIS (Cadastro de Empresas Inidôneas e Suspensas) endpoint of the Portal da Transparência.
Package ceis fetches records from the CEIS (Cadastro de Empresas Inidôneas e Suspensas) endpoint of the Portal da Transparência.
transparencia/cnep
Package cnep fetches records from the CNEP (Cadastro Nacional de Empresas Punidas) endpoint of the Portal da Transparência.
Package cnep fetches records from the CNEP (Cadastro Nacional de Empresas Punidas) endpoint of the Portal da Transparência.
transparencia/pncp
Package pncp fetches records from the Portal Nacional de Contratações Públicas (PNCP), which aggregates all public procurement contracts in Brazil since 2023.
Package pncp fetches records from the Portal Nacional de Contratações Públicas (PNCP), which aggregates all public procurement contracts in Brazil since 2023.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL