Voltar

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

  1. 01

    Backend FastAPI com SQLAlchemy, GeoAlchemy2 e Alembic

  2. 02

    Frontend Next.js com App Router, React e react-leaflet para o mapa

  3. 03

    Banco único PostgreSQL: PostGIS para a geometria e pgvector para os embeddings

  4. 04

    Classificação de fotos por LLM de visão na Cloudflare Workers AI, com revisão manual de reserva

  5. 05

    Notificações por outbox de eventos, consumidas por worker Celery com Redis

  6. 06

    Entrega por push com Firebase e e-mail com Resend

  7. 07

    Supabase para autenticação por JWT e armazenamento das fotos

  8. 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