Supersalários do Judiciário Brasileiro expostos em dados
Dashboard público que expõe remunerações acima do teto constitucional no sistema de Justiça brasileiro. Dados reais. Transparência cidadã. Sem filtro.
O ExtraTeto é uma plataforma de jornalismo de dados que monitora e expõe os supersalários do Judiciário brasileiro — remunerações que ultrapassam o teto constitucional de R$ 46.366,19.
O projeto coleta dados públicos da API do DadosJusBr, processa e armazena localmente em SQLite, e apresenta visualizações interativas que permitem qualquer cidadão fiscalizar como o dinheiro público está sendo gasto.
- Mais de 10.000 membros do Judiciário recebem acima do teto por mês
- O total pago acima do teto ultrapassa R$ 6,5 bilhões por ano
- A média de excesso por membro é de R$ 50.000/mês
- Com esse dinheiro seria possível construir 206 hospitais ou 2.953 creches
- Ranking interativo — Busca, filtragem e ordenação de todos os membros do Judiciário por remuneração
- Mapa de calor — Visualização geográfica dos supersalários por estado brasileiro
- Estatísticas agregadas — Top 10 órgãos, composição da remuneração, comparações salariais
- Páginas por órgão — Detalhamento individual de cada tribunal e ministério público
- Detecção de anomalias — Variações atípicas de remuneração entre meses consecutivos com filtros por estado/órgão
- Evolução temporal — Histórico mensal de pagamentos por membro
- Sync automático — GitHub Action atualiza os dados nos dias 1, 10 e 20 de cada mês
- API pública REST — Endpoints documentados para consumo externo dos dados
- Exportação CSV — Download dos dados filtrados com proteção contra CSV injection
- Compartilhamento social — Botões para Twitter/X, Facebook, WhatsApp e link direto
- SEO otimizado — Open Graph, JSON-LD, sitemap, robots.txt
- Responsivo — Layout adaptável de mobile a desktop
| Camada | Tecnologia |
|---|---|
| Framework | Next.js 16 (App Router, Server Components) |
| UI | React 19 + TypeScript 5 |
| Estilização | Tailwind CSS 4 |
| Gráficos | Recharts 3 |
| Animações | Framer Motion 12 |
| Ícones | Lucide React |
| Banco de Dados | SQLite via better-sqlite3 |
| ORM | Drizzle ORM |
| Busca | SQLite FTS5 (full-text search server-side) |
| Virtualização | @tanstack/react-virtual |
| Testes | Vitest + Playwright |
| Fonte de Dados | DadosJusBr API |
# Clone o repositório
git clone https://github.com/skottrun/extrateto.git
cd extrateto
# Instale as dependências
npm installO projeto usa SQLite local. Você precisa popular o banco antes de rodar:
# Opção 1: Seed com dados mock (rápido, para desenvolvimento)
npm run db:seed
# Opção 2: Sincronizar dados reais da API DadosJusBr
npm run db:sync
# Sincronizar um mês específico
npx tsx scripts/sync-data.ts --year 2025 --month 1
# Sincronizar todos os meses disponíveis
npx tsx scripts/sync-data.ts --all
# Forçar re-sincronização (sobrescreve dados existentes)
npx tsx scripts/sync-data.ts --year 2025 --month 1 --force# Servidor de desenvolvimento
npm run dev
# Build de produção
npm run build
npm startAbra http://localhost:3000 no navegador.
| Página | Rota | Descrição |
|---|---|---|
| Ranking | / |
Lista completa com busca, filtros e ordenação |
| Mapa | /mapa |
Mapa de calor por estado |
| Estatísticas | /estatisticas |
Gráficos e análises agregadas |
| Órgãos | /orgao |
Lista de tribunais e MPs |
| Detalhe Órgão | /orgao/[slug] |
Dados detalhados por órgão |
| Anomalias | /anomalias |
Detecção de variações atípicas de remuneração |
| API Docs | /api-docs |
Documentação interativa da API |
| Metodologia | /metodologia |
Explicação da coleta e tratamento |
| Sobre | /sobre |
Sobre o projeto |
# Listar membros (paginado)
curl http://localhost:3000/api/v1/membros?page=1&limit=10
# Filtrar por estado
curl http://localhost:3000/api/v1/membros?estado=SP
# Filtrar por órgão
curl http://localhost:3000/api/v1/membros?orgao=TJ-SP
# Buscar por nome
curl http://localhost:3000/api/v1/membros?nome=silva
# Apenas acima do teto
curl http://localhost:3000/api/v1/membros?acima_teto=true
# Ordenar
curl http://localhost:3000/api/v1/membros?sort=maior_acima_teto
# Histórico de um membro
curl "http://localhost:3000/api/v1/membros/historico?nome=João Silva&orgao=TJ-SP"
# Listar estados
curl http://localhost:3000/api/v1/estados
# Listar órgãos
curl http://localhost:3000/api/v1/orgaosextrateto/
├── .github/workflows/ # GitHub Actions (cron-sync automático)
├── data/ # Banco SQLite (versionado, atualizado pelo cron)
├── e2e/ # Testes E2E (Playwright)
├── scripts/
│ └── sync-data.ts # Script de sincronização com DadosJusBr
├── public/ # Assets estáticos
├── src/
│ ├── app/ # Rotas (Next.js App Router)
│ │ ├── api/
│ │ │ ├── search/ # GET /api/search (busca FTS5)
│ │ │ └── v1/ # API REST
│ │ │ ├── estados/ # GET /api/v1/estados
│ │ │ ├── membros/ # GET /api/v1/membros
│ │ │ └── orgaos/ # GET /api/v1/orgaos
│ │ ├── anomalias/ # Página de detecção de anomalias
│ │ ├── estatisticas/ # Página de estatísticas
│ │ ├── mapa/ # Página do mapa
│ │ ├── orgao/ # Páginas de órgãos
│ │ └── ... # Demais páginas
│ ├── components/ # Componentes React reutilizáveis
│ │ ├── brazil-map.tsx # Mapa interativo do Brasil
│ │ ├── kpi-cards.tsx # Cards de indicadores
│ │ ├── member-card.tsx # Card de membro
│ │ ├── salary-bar.tsx # Barra de composição salarial
│ │ └── ...
│ ├── data/ # Camada de dados e cache
│ │ └── get-members.ts # Queries com cache em memória
│ └── lib/ # Utilitários e banco
│ ├── db/ # Schema Drizzle + queries SQLite
│ ├── aggregations.ts # Funções de agregação
│ ├── constants.ts # Constantes (estados, órgãos, teto)
│ ├── export-csv.ts # Exportação CSV segura
│ └── utils.ts # Formatação de moeda, percentual, etc.
├── next.config.ts # Configuração Next.js + security headers
├── middleware.ts # Rate limiting + CORS
├── package.json
└── tsconfig.json
# Testes unitários
npm test
# Testes unitários em watch mode
npm run test:watch
# Testes E2E (requer servidor rodando)
npm run test:e2e- Autenticação para API (rate limiting público já implementado)
- Notificações de novos dados disponíveis
- Comparativo temporal (evolução ano a ano)
- Exportação em PDF dos relatórios
- Integração com dados do CNJ (Conselho Nacional de Justiça)
- PWA (Progressive Web App) para acesso offline
- Modo embarcado (widget para outros sites)
- i18n (tradução para inglês)
Contribuições são bem-vindas! Para contribuir:
- Faça um fork do projeto
- Crie uma branch para sua feature (
git checkout -b feature/minha-feature) - Commit suas mudanças (
git commit -m 'Adiciona minha feature') - Push para a branch (
git push origin feature/minha-feature) - Abra um Pull Request
- Siga o padrão de código existente (TypeScript strict, ESLint)
- Adicione testes para novas funcionalidades
- Mantenha o README atualizado
- Use commits descritivos em português
Distribuído sob a licença MIT. Veja LICENSE para mais informações.
- GitHub: https://github.com/andredutraf
- Twitter: https://x.com/skottrun
Dados públicos, fiscalização cidadã.
Feito com dados do DadosJusBr