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.
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.
clique em um componente · arraste para mover · scroll para zoom
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.
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.
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.