- Python 57.6%
- HTML 22.3%
- CSS 14.5%
- JavaScript 5.6%
| api | ||
| assets | ||
| css | ||
| js | ||
| scripts | ||
| .gitignore | ||
| apoio.html | ||
| contrato.html | ||
| estados.html | ||
| index.html | ||
| municipios.html | ||
| nginx-soberaniadigital.conf | ||
| processamento.html | ||
| proposta.html | ||
| quemsomos.html | ||
| README.md | ||
Soberania Digital — soberaniadigital.org.br
Painel publico de transparencia que expoe quanto o Brasil gasta com contratos publicos, com foco inicial em tecnologia proprietaria estrangeira (Microsoft, Oracle, SAP, AWS, Google, IBM).
Objetivo politico: mostrar ao cidadao brasileiro o volume de dinheiro publico que sai do pais para corporacoes estrangeiras de tecnologia, quando alternativas livres e soberanas existem.
Objetivo tecnico: construir o maior datalake de contratos publicos do Brasil, com auditoria automatizada via IA para detectar irregularidades, lock-in, e descumprimento de leis de transparencia.
Site: https://soberaniadigital.org.br Codigo: https://git.pop.coop/soberania-brasileira/digital Iniciativa: PopSolutions Cooperativa (https://pop.coop)
Numeros Atuais
| Metrica | Valor |
|---|---|
| Contratos no banco | 952.711 |
| Valor total mapeado | R$ 829+ bilhoes |
| Fontes de dados | 11 |
| Estados cobertos | 27/27 |
| Municipios com dados | 5.137 de 5.570 (92.2%) |
| Contratos auditados por LLM | 9.690 |
| Lock-in detectado | 302 contratos |
| Score medio de conformidade | 41.8/100 |
Stack
- Frontend: Alpine.js + HTMX + CSS puro (zero frameworks pesados)
- Backend: FastAPI (Python)
- Banco: PostgreSQL
- Scrapers: Python (httpx, psycopg2)
- LLM local: Ollama + Gemma 3 4B (classificacao e auditoria via rede neural)
- Servidor: Debian + Nginx + Proxmox (datacenter pop.coop, Barueri-SP)
Arquitetura
soberaniadigital/
├── index.html # Painel principal (dashboard de gastos)
├── estados.html # Gastos por estado (27 UFs)
├── municipios.html # Gastos por municipio (5.570 do IBGE)
├── contrato.html # Detalhe de contrato individual + auditoria LLM
├── processamento.html # Monitor de processamento LLM ao vivo
├── proposta.html # O Que Propomos
├── quemsomos.html # Quem Somos (cadastro via gov.br SSO)
├── apoio.html # Apoiadores institucionais
├── css/
│ └── style.css # Design system completo (~3000 linhas)
├── js/
│ └── app.js # Alpine.js stores e logica global
├── data/
│ ├── dashboard.json # JSON pre-agregado para o frontend (~7MB)
│ ├── llm_stats.json # Snapshot de stats do processamento LLM
│ ├── municipios_faltantes.json # Municipios sem dados (cross-ref IBGE)
│ ├── apoiadores.json # Apoiadores institucionais
│ ├── uniao/ # Contratos federais (executivo/legislativo/judiciario)
│ ├── estados/ # Resumos e contratos por estado
│ ├── municipios/ # Contratos por municipio
│ └── raw/ # Dados brutos de cada fonte (~15GB)
├── scripts/
│ ├── db.py # Camada PostgreSQL (tabelas, indices, views)
│ ├── normalize.py # Gera JSONs do frontend a partir do banco
│ ├── populate_ibge.py # Popula tabela IBGE com 5.570 municipios
│ ├── llm_enrich.py # Pipeline de classificacao/auditoria via LLM
│ ├── scraper_pncp.py # PNCP busca por keyword (TI)
│ ├── scraper_pncp_full.py # PNCP enumeracao completa por data (TODOS contratos)
│ ├── scraper_pncp_municipios.py # PNCP busca focada nos municipios faltantes
│ ├── scraper_transparencia.py # Portal da Transparencia (CGU)
│ ├── scraper_comprasgov.py # ComprasGov (dados abertos de compras federais)
│ ├── scraper_siconfi.py # SICONFI/Tesouro Nacional (DCA todos municipios)
│ ├── scraper_tcesp.py # TCE-SP (778k contratos)
│ ├── scraper_tcesp_despesas.py # TCE-SP despesas por municipio
│ ├── scraper_tcers.py # TCE-RS (balancete + contratos)
│ ├── scraper_tcees.py # TCE-ES (contratacoes + despesas)
│ ├── scraper_tcemt.py # TCE-MT (despesas CSV)
│ ├── scraper_tcepb.py # TCE-PB (SAGRES)
│ ├── scraper_tcepe_despesas.py # TCE-PE (despesas municipais)
│ ├── scraper_tceba.py # TCE-BA (criado, nao rodado)
│ ├── scraper_tcece.py # TCE-CE (criado, nao rodado)
│ ├── scraper_tceto.py # TCE-TO (criado, nao rodado)
│ ├── scraper_ceis_cnep.py # CEIS + CNEP (empresas impedidas/punidas)
│ ├── scraper_querido_diario.py # Querido Diario (gazetas municipais, 350+ cidades)
│ ├── recategorize.py # Recategorizacao de contratos
│ ├── migrate_to_pg.py # Migracao SQLite -> PostgreSQL
│ └── run_scrapers.py # Orquestrador de scrapers
├── api/
│ ├── llm_stats.py # FastAPI: stats LLM, feed ao vivo, detalhe contrato
│ └── auth.py # SSO gov.br (OpenID Connect)
├── .config/
│ └── settings.env # Credenciais (GITIGNORED)
└── nginx-soberaniadigital.conf # Config Nginx (SSL, proxy, cache)
Fontes de Dados
Operacionais (dados no banco)
| Fonte | Tipo | Contratos | Valor | Cobertura |
|---|---|---|---|---|
| TCE-SP | Tribunal de Contas SP | 778.350 | R$ 143B | SP (645 municipios) |
| PNCP | Portal Nacional Contratacoes | 85.201 | R$ 465B | Nacional (busca keyword) |
| TCE-ES | Tribunal de Contas ES | 23.020 | R$ 99B | ES |
| TCE-MT | Tribunal de Contas MT | 21.437 | R$ 1.8B | MT |
| Transparencia | Portal da Transparencia CGU | 11.559 | R$ 51.9B | Federal |
| SICONFI | Tesouro Nacional (DCA) | 9.358 | R$ 49.4B | Nacional (agregado) |
| PNCP Full | PNCP enumeracao completa | 9.338+ | R$ 3.3B+ | Nacional (em andamento) |
| TCE-RS | Tribunal de Contas RS | 8.826 | R$ 11.8B | RS |
| TCE-PB | Tribunal de Contas PB | 2.847 | R$ 622K | PB |
| ComprasGov | Compras do Gov Federal | 2.721 | R$ 3.7B | Federal |
| TCE-PE | Tribunal de Contas PE | 54 | R$ 4.1M | PE (parcial) |
Em desenvolvimento
| Fonte | Status | Descricao |
|---|---|---|
| PNCP Full | Rodando | Enumeracao completa ~1.5M contratos, 49 dias processados |
| CEIS/CNEP | Rodando | Blacklist de empresas impedidas/punidas |
| Querido Diario | Pronto | Mineracao de gazetas municipais (350+ cidades) |
| TCEs restantes | Planejado | 18 estados sem scraper (MG, RJ, BA, PR, etc.) |
| TCMs | Planejado | Tribunais de Contas Municipais (BA, GO, PA, RJ, SP) |
| TransfereGov | Planejado | Convenios e transferencias federais |
Banco de Dados (PostgreSQL)
Tabelas principais
| Tabela | Registros | Descricao |
|---|---|---|
contratos |
952.711 | Contratos normalizados de todas as fontes |
api_raw |
19.000+ | Respostas brutas das APIs (auditoria) |
llm_enrichment |
9.690 | Classificacao e auditoria via LLM |
ibge_municipios |
5.570 | Referencia IBGE (todos municipios do Brasil) |
fornecedores_alvo |
12 | CNPJs das big techs monitoradas |
fornecedor_canonical |
6.653 | Deduplicacao de nomes de fornecedores |
opacidade_orgao |
4.257 | Indice de opacidade por orgao |
scrape_log |
200+ | Log de execucao dos scrapers |
empresas_impedidas |
em carga | CEIS + CNEP (blacklist) |
contrato_dedup |
nova | Deduplicacao cross-source |
contrato_audit |
nova | Auditoria LLM completa |
omissao_pncp |
nova | Contratos que deveriam estar no PNCP mas nao estao |
Coluna numero_pncp
Identificador unico nacional do PNCP (CNPJ_ORGAO-TIPO-SEQ/ANO).
Permite deduplicacao cross-source e rastreamento de contratos entre fontes.
Pipeline LLM (Processamento de Linguagem Natural)
Cada contrato e processado por uma rede neural local (Gemma 3 4B via Ollama) que classifica e audita automaticamente:
Classificacao
- e_ti: boolean — e Tecnologia da Informacao?
- categoria: licenca_software, cloud, hardware, servicos_ti, rede, telecom, etc.
- fornecedor_normalizado: nome limpo (ex: "BRASOFTWARE INFORMATICA LTDA" -> "Microsoft")
- produto: nome do produto/servico identificado
- lock_in: detecta se o contrato direciona para marca especifica
- alternativa_livre: sugere alternativa open source
Auditoria de Conformidade (Lei 14.133/2021)
- campos_ausentes: campos obrigatorios vazios (CNPJ, modalidade, valor, datas, link)
- nao_conformidades: lista de problemas encontrados
- score_conformidade: nota 0-100 por contrato
Resultados ate agora
- 9.690 contratos processados
- 64% confirmados como TI, 32% falsos positivos filtrados
- 302 contratos com lock-in detectado (R$ 3B+ em Microsoft, Oracle, Google)
- Score medio de conformidade: 41.8/100 (orgaos publicam com menos da metade da conformidade exigida)
Configuracao
- Modelo: gemma3:4b (Q4_K_M, 4.3B parametros)
- Servidor: Ollama via SSH tunnel (notebook do mantenedor)
- Paralelismo: OLLAMA_NUM_PARALLEL=8
- Throughput: ~0.9 contratos/segundo
Frontend
Paginas
| Pagina | URL | Descricao |
|---|---|---|
| Painel | /index.html |
Dashboard principal com totais, graficos, filtros |
| Estados | /estados.html |
Ranking de gastos por estado (27 UFs) |
| Municipios | /municipios.html |
Gastos por municipio (5.570 do IBGE, drill-down) |
| Processamento LN | /processamento.html |
Monitor ao vivo do pipeline LLM |
| Contrato | /contrato.html?id=... |
Detalhe individual com auditoria de conformidade |
| O Que Propomos | /proposta.html |
Projeto politico (ChaskiMail, Kankunapa, pop.coop) |
| Quem Somos | /quemsomos.html |
Cadastro via gov.br SSO |
| Apoio | /apoio.html |
Apoiadores institucionais |
Menu de navegacao
[Painel] [Dados v] [Processamento LN] [O Que Propomos] [Quem Somos] [Apoio]
|
├── Estados
└── Municipios
Design
- Fundo escuro (#0a0f1a), verde bandeira (#009739), amarelo (#FFDF00)
- Tipografia: JetBrains Mono (dados), Source Serif 4 (texto)
- Inspiracao: The Pudding, ProPublica, Brasil.io
- Responsivo (mobile-first)
Como rodar
Requisitos
- Python 3.11+
- PostgreSQL 15+
- Node.js nao necessario (frontend puro)
Setup
cd soberaniadigital
python -m venv .venv
source .venv/bin/activate
pip install httpx psycopg2-binary python-dotenv pyjwt fastapi uvicorn
# Configurar credenciais
cp .config/settings.env.example .config/settings.env
# Editar com suas chaves
# Inicializar banco
python -c "from scripts.db import init_db; init_db()"
# Popular tabela IBGE (5.570 municipios)
python scripts/populate_ibge.py
Scrapers
# PNCP completo (TODOS os contratos, ~1.5M)
python scripts/scraper_pncp_full.py
# PNCP busca por keyword (TI)
python scripts/scraper_pncp.py
# Portal da Transparencia (federal)
python scripts/scraper_transparencia.py
# SICONFI (Tesouro Nacional — todos municipios)
python scripts/scraper_siconfi.py
# TCE-SP (Sao Paulo — maior dataset)
python scripts/scraper_tcesp.py
# CEIS/CNEP (empresas impedidas)
python scripts/scraper_ceis_cnep.py
# Querido Diario (gazetas municipais)
python scripts/scraper_querido_diario.py
# Municipios faltantes (busca focada PNCP)
python scripts/scraper_pncp_municipios.py --uf BA MA PE
LLM Enrichment
Requer Ollama rodando com modelo gemma3:4b (local ou via SSH tunnel).
# Processar contratos de alto valor
python scripts/llm_enrich.py --limit 25000 --batch-size 8
# Processar por estado
python scripts/llm_enrich.py --uf SP --batch-size 8
# Processar por fonte
python scripts/llm_enrich.py --fonte pncp --batch-size 8
Gerar frontend
# Regenerar dashboard.json e JSONs do frontend
python scripts/normalize.py
API
# Stats LLM + feed ao vivo
uvicorn api.llm_stats:app --host 0.0.0.0 --port 8081
Plano Estrategico: 5 Camadas de Captura
A estrategia e: nenhuma fonte unica e confiavel. Cruzando varias fontes, detectamos tanto os contratos quanto a malandragem de quem nao publica.
Camada 1 — Fontes Federais
PNCP Full, ComprasGov, Portal da Transparencia, TransfereGov
Camada 2 — Fontes Estaduais/Municipais
27 TCEs + 5 TCMs (Tribunais de Contas)
Camada 3 — Mineracao de Gazetas
Querido Diario (350+ municipios), DOU (Diario Oficial da Uniao). Contrato que aparece na gazeta mas NAO no PNCP = descumprimento da Lei 14.133.
Camada 4 — Cruzamento e Enriquecimento
CEIS (empresas inidoneas), CNEP (empresas punidas), CNPJ da Receita Federal.
Camada 5 — Auditoria e Deteccao
Deduplicacao cross-source, detector de omissao PNCP, auditoria LLM completa.
Base Legal
- Lei 14.133/2021 — Nova Lei de Licitacoes (campos obrigatorios em contratos)
- Lei 12.527/2011 — Lei de Acesso a Informacao (transparencia ativa)
- Art. 5 XXXIII CF — Direito constitucional a informacao
- Lei 12.846/2013 — Lei Anticorrupcao (empresas punidas)
Creditos
Projeto da PopSolutions Cooperativa (pop.coop) Marcos Mendez e colaboradores