Pular para o conteúdo
Voltar para projetos
Autoria e desenvolvimento

Voto Aberto

Plataforma de transparência parlamentar: o que cada deputado federal propôs e como votou, direto dos dados abertos da Câmara, com link para conferir cada informação na fonte.

Página inicial do Voto Aberto no computador e o placar de uma votação no celular

Resultados-chave

648
deputados da 57ª legislatura

Carga de 12/10/2026

1.597
votações nominais

471.978 votos individuais

94.480
proposições

Com a etapa atual explicada

94%
cobertura de testes

232 testes, fora da interface

Contexto e problema

Os registros oficiais da Câmara dos Deputados são abertos, mas difíceis de consultar: cerca de 1 GB de arquivos anuais mais uma API REST, com vocabulário próprio. O Voto Aberto os torna pesquisáveis e compreensíveis, sempre com link para a fonte oficial em cada dado.

Solução implementada

Um processo Node e um arquivo de banco: não há fila, cache externo nem serviço separado de API.

  • Página por votação nominal, com a pergunta votada, o resultado oficial, o placar e a orientação das bancadas.
  • Perfil de cada deputado, com histórico de votações filtrável, propostas, mandato, comissões e despesas.
  • Comparação de dois a quatro deputados lado a lado, com a lista das votações usadas em cada cálculo.
  • Propostas com a etapa atual em linguagem simples: centenas de situações oficiais agrupadas em nove etapas.
  • Busca única por deputados, propostas e votações, usando o FTS5 do SQLite.

Arquitetura

A sincronização grava no banco com upsert pela chave oficial e as páginas leem o banco diretamente. Só tramitação, comissões e despesas são buscadas na Câmara sob demanda, com cache.

  • Banco vazio: carga inicial em 227 s, cerca de 1 GB baixado, banco de 265 MB.
  • Banco carregado: rodada incremental de 10 a 14 s, sem baixar arquivos.
  • Reconciliação: reconfere os arquivos anuais depois de 30 dias sem conferir ou 60 sem sincronizar.

Decisões de engenharia

  • Regras de negócio isoladas: funções puras em src/domain/, sem banco, HTTP ou React. A ausência de voto nunca é tratada como falta física, e indicadores sem base de cálculo devolvem "sem dado", não zero.
  • Camadas verificadas pelo lint: cada pasta só importa de uma lista fixa de outras; uma importação fora dela quebra o npm run lint e o CI.
  • Sincronização incremental e idempotente: toda gravação é upsert pela chave oficial, então reprocessar não duplica.
  • Tolerância a falhas da fonte: downloads cortados são retomados com Range, registros inválidos são contados (não "consertados") e uma resposta vazia nunca apaga dados já gravados.

Resultados

A base reúne 648 deputados da 57ª legislatura, 1.597 votações nominais, 471.978 votos individuais e 94.480 proposições. O projeto tem 232 testes automatizados, 94% de cobertura fora da interface e um teste de ponta a ponta que roda a sincronização inteira contra uma Câmara simulada, offline.

Arquitetura

Da fonte oficial ao navegador

Sincronização em processo separado, SQLite como única fonte de leitura e a API da Câmara só sob demanda.

sob demandaArquivos anuais daCâmara, cerca de 1GBAPI de dados abertosda CâmaraSincronizaçãoprocesso separadoSQLite WAL + FTS5Next.js ServerComponentsNavegador HTMLpronto

passo a passo

etapa 0/3

Tecnologias utilizadas

Frontend

  • Next.jsApp Router e Server Components: páginas prontas do servidor
  • CSSUm único arquivo próprio, com tokens para tema claro e escuro

Backend

  • TypeScriptModo estrito e regras de negócio como funções puras
  • ZodValidação de cada registro vindo da Câmara
  • Vitest232 testes, com 94% de cobertura fora da interface
  • Node.jsServidor e sincronização em processo separado

Dados & Mensageria

  • SQLiteWAL e busca FTS5, sem serviço de busca à parte

Principais funcionalidades

  • Link para a fonteCada informação aponta para o dado oficial
  • Busca únicaDeputados, propostas e votações via FTS5
  • ComparadorDe dois a quatro deputados, sem ranking
  • Sincronização automáticaA cada 4 horas, incremental e idempotente

Imagens e demonstrações

  • Cada votação, explicada em linguagem simples
  • Placar contado pelo sistema e orientação das bancadas
  • Perfil do deputado com histórico filtrável
  • Deputados lado a lado, sem ranking
  • Claro, escuro e no celular

Sobre o projeto

O Voto Aberto não dá notas nem diz em quem votar: mostra o que está registrado, explica em linguagem simples o que cada votação decidia e declara o que os dados não permitem afirmar. Dados da carga de 12/10/2026; a base se atualiza sozinha a cada 4 horas.

Outros projetos

destaque

Strata

Do planejamento ao código, com o time inteiro na mesma tarefa

Plataforma para times de software que reúne quadro, chat, documentos e um editor de código. Cada tarefa vira um canvas infinito com a especificação, o código e o time, e o contexto não se perde entre ferramentas.

tipos de ambiente no canvas
7
plano Orbit, gratuito
US$ 0
Página inicial do Strata com o quadro de tarefas sobre um fundo espacial
Detalhes Demo
destaque

Distributed Wagering Processor

Serviço financeiro que aplica apostas, vitórias, derrotas, reembolsos e estornos nas carteiras dos jogadores, com saldo e extrato corretos mesmo quando as mensagens chegam duplicadas, fora de ordem ou ao mesmo tempo.

  • Bun
  • NestJS
  • TypeScript
  • PostgreSQL
  • MikroORM
  • AWS SQS
testes automatizados
248
mesma aposta em paralelo
50×
instâncias disputando uma carteira
3
Wallet Console e Flow Explorer mostrando uma aposta e duas requisições disputando a mesma carteira
Detalhes GitHub
destaque

Crash Game

Um cassino multiplayer em tempo real: a curva sobe, todos veem o mesmo multiplicador ao mesmo tempo e cada jogador decide quando sacar antes do crash.

  • Bun
  • NestJS
  • React
  • Vite
  • TypeScript
  • PostgreSQL
entre atualizações do multiplicador
100 ms
microsserviços NestJS
3
testes automatizados
503
Uma rodada do Crash Game a 3,49x no navegador e a mesma tela no celular
Detalhes GitHub