GESTAR nasceu no Hackathon Devs Impacto para dar transparência aos indicadores e chamados das escolas municipais. O painel reúne visão territorial (mapa e heatmap), rankings IDEB/SAEB/rendimento e um fluxo de abertura de demandas que usa Gemini, orquestrado pelo n8n, para padronizar cada chamado e priorizar o atendimento.
- Artur Pereira — arturguedepereira@gmail.com
- Davi Gurgel — daviogurgel@gmail.com
- José Rodrigues — josevitorrodrigues17@gmail.com
- Luis Aranha — lhamagalhaes@gmail.com
- Next.js 16 + React 19 + TypeScript (App Router) para o dashboard.
- Tailwind CSS 4 (preview) para design system rápido.
- Recharts e @vis.gl/react-google-maps para visualizações e mapa/heatmap.
- Google Gemini via SDK
@google/generative-ai, com prompts controlados pelo n8n (sem uso de CrewAI no fluxo atual). - JSON local em
frontend/dashboard-edu-pb/src/datapara persistência offline do protótipo. - Scripts Node.js (
scripts/filter_indicadores.js) para higienizar indicadores públicos.
hackathon_devsImpacto/
├── frontend/
│ └── dashboard-edu-pb/ # App Next.js + APIs internas
├── backend/ # Protótipo legado (não utilizado no fluxo n8n)
│ ├── chat_agent.py
│ └── requirements.txt
├── scripts/
│ └── filter_indicadores.js # Limpeza de indicadores x escolas
└── README.md
Status atual: demo offline. Os dados são lidos e gravados em
frontend/dashboard-edu-pb/src/data.
-
Pré-requisitos
- Node.js ≥ 18
- npm (ou pnpm/yarn)
-
Instalação
cd frontend/dashboard-edu-pb npm install -
Variáveis de ambiente (
.env.local)GEMINI_API_KEY=your_google_gemini_key NEXT_PUBLIC_GOOGLE_MAPS_API_KEY=browser_key_with_maps_javascript_enabled NEXT_PUBLIC_GOOGLE_MAPS_MAP_ID=optional_cloud_map_id N8N_WEBHOOK_URL=https://<seu-servidor-n8n>/webhook/gestarGEMINI_API_KEYhabilita o endpoint/api/processarDemanda.NEXT_PUBLIC_GOOGLE_MAPS_API_KEYlibera mapa e heatmap.N8N_WEBHOOK_URLaponta para o fluxo que conversa com Gemini.
-
Scripts úteis
npm run dev # http://localhost:3000 npm run build # build de produção npm start # servir build npm run lint # lint com ESLint
-
Principais páginas
/ou/secretaria: visão territorial, ranking e painel comparativo por escola./escolas: painel operacional com abas “Visão Geral” e “Enviar Demanda”./login/escolase/login/secretaria: logins mock que populam olocalStoragepara demos.
-
Rotas de API (Next.js)
Rota Método Descrição /api/getDemanda?inep=25092570GET Carrega src/data/chamados.json, filtra pelo INEP e ordena por data./api/processarDemandaPOST Envia { texto, inep, escolaId }para o webhook do n8n/Gemini, recebe o chamado estruturado e salva no JSON./api/atualizarStatusPATCH Atualiza o status local ( aceitar,rejeitar,concluir). -
Dados estáticos
src/data/escolas.json— escolas com geolocalização.src/data/indicador_*.json— IDEB, SAEB, distorção idade-série, rendimento.src/data/dashboard_stats.json— agregados para cards.src/data/chamados.json— base de chamados persistida pelas rotas.
- O frontend posta a demanda em
/api/processarDemanda. - A rota repassa o payload para um webhook no n8n (
N8N_WEBHOOK_URL). - O n8n executa:
- validação básica e enriquecimento (INEP, sessão, timestamps);
- prompt no Gemini para gerar título, descrição, categoria e prioridade padronizados;
- registros em data stores do n8n (histórico/memória) e opcionalmente em base relacional;
- resposta JSON síncrona para o frontend, que salva no arquivo local.
- Fluxos adicionais do n8n podem consumir os mesmos dados para relatórios ou responder perguntas (sem depender do código em
backend/).
A pasta
backend/permanece apenas como referência de um protótipo legado, mas não é utilizada no fluxo atual.
node scripts/filter_indicadores.js
- Cria backups
.bake remove indicadores cujo INEP não existe emsrc/data/escolas.json. - Substitui tokens
NaNpornullpara manter JSON válido.
- Para testar: acesse
/login/escolas, use o mock exibido na tela, abra uma demanda e confira a atualização em/escolase no mapa. - Em produção, troque os arquivos JSON por uma API/banco (Postgres, Firestore etc.) e proteja as rotas com autenticação real.
- Sempre mantenha as chaves (
GEMINI_API_KEY,NEXT_PUBLIC_GOOGLE_MAPS_API_KEY) fora do versionamento.