Pauta
Transparência política municipal: o cidadão reporta um problema urbano, acompanha a resolução e se aproxima de quem o representa
Sobre o projeto
Pauta nasce de uma distância concreta: a maioria das pessoas não sabe quem são seus vereadores nem o que eles propõem, e as reclamações sobre a cidade viram desabafo sem chegar a quem poderia resolver. A plataforma liga as três pontas, cidadão, acontecimento urbano e representante, em um fluxo só. O cidadão fotografa um problema de infraestrutura e envia com a localização. Uma LLM de visão sugere a categoria automaticamente, com revisão manual como saída segura quando a confiança é baixa. A demanda vira um ponto geolocalizado no mapa e uma publicação no feed do bairro, onde pode ser acompanhada até a resolução, e as atualizações relevantes chegam por notificação interna, push ou e-mail. A frente de recomendação de candidatos por afinidade de pautas é a parte em construção: o contrato da API e a busca vetorial já estão prontos, e o pipeline de embeddings foi desenvolvido em paralelo pela equipe de recomendação. A abordagem escolhida foi semântica, com embeddings e similaridade de cosseno sobre as propostas apresentadas, no lugar da ideia inicial de classificador tradicional.
Como funciona
O front em Next.js envia a denúncia com foto e coordenadas. O backend FastAPI guarda a imagem no Supabase Storage e aciona a LLM de visão da Cloudflare Workers AI para classificar a categoria; se a confiança não for suficiente, o caso vai para revisão manual em vez de receber um palpite. A geometria do ponto é persistida com GeoAlchemy2 em PostgreSQL com PostGIS, e aparece no mapa em react-leaflet e no feed da comunidade. As notificações seguem o padrão outbox: o backend grava o evento em uma tabela e um worker Celery o consome, criando a notificação interna e disparando push por Firebase ou e-mail por Resend. Esse desenho evita perder evento quando o serviço externo falha. Na recomendação, as ementas apresentadas por cada parlamentar viram embeddings agregados em um perfil de atuação, comparados por similaridade de cosseno no pgvector, com agrupamento por clusterização e justificativa gerada por LLM. A autenticação é do Supabase, com o token validado no backend por chave pública, e o feed continua acessível a visitantes sem conta.
Arquitetura
- 01
Backend FastAPI com SQLAlchemy, GeoAlchemy2 e Alembic
- 02
Frontend Next.js com App Router, React e react-leaflet para o mapa
- 03
Banco único PostgreSQL: PostGIS para a geometria e pgvector para os embeddings
- 04
Classificação de fotos por LLM de visão na Cloudflare Workers AI, com revisão manual de reserva
- 05
Notificações por outbox de eventos, consumidas por worker Celery com Redis
- 06
Entrega por push com Firebase e e-mail com Resend
- 07
Supabase para autenticação por JWT e armazenamento das fotos
- 08
Pipeline de recomendação em Python, separado do backend
Funcionalidades
- Denúncia de problema urbano com foto e localização
- Classificação automática da categoria por LLM de visão, com revisão manual de reserva
- Mapa geolocalizado com PostGIS e acompanhamento de status
- Feed da comunidade por bairro, aberto também a visitantes sem conta
- Notificações internas, push e e-mail a partir de um outbox de eventos
- Perfil de interesses do usuário para orientar o que ele recebe
- Recomendação de candidatos por afinidade, com busca vetorial em pgvector
- Autenticação por JWT validado no backend, com cookies e cabeçalhos endurecidos
Tecnologias
- Backend
- Python 3.12 · FastAPI · SQLAlchemy · Celery
- Frontend
- Next.js 16 · React 19 · TypeScript · Tailwind v4 · react-leaflet
- AI/ML
- Cloudflare Workers AI · sentence-transformers · Groq
- Database
- PostgreSQL · PostGIS · pgvector · Supabase
- Infrastructure
- Redis · Docker