Rondo
Uma plataforma para criar e operar especialistas de IA para as funções de um clube de futebol, com respostas rastreáveis até as fontes conectadas. A fundação técnica existe; as funcionalidades de produto, não.
Tecnologias
- TypeScript
- Node.js
- PostgreSQL
Visão geral
O Rondo é uma plataforma para criar e operar especialistas: agentes de IA especializados nas funções de um clube de futebol, como técnico ou analista de desempenho, alimentados por fontes de dados conectadas e com respostas que citam essas fontes. O projeto se chamava Analytics Personas antes de receber o nome Rondo. O repositório é um monorepo com um app web em React, uma API em Nest.js e uma pilha local de observabilidade. É um projeto pessoal.
Desafio
Os clubes de futebol guardam conhecimento em ferramentas dispersas: documentos, wikis, chamados e planilhas. Cada função precisa transformar esse material em decisões rápidas, e uma resposta que não pode ser rastreada até as fontes, ou que inventa dados, é pior do que nenhuma. O desafio é construir especialistas cujas respostas possam ser auditadas, sobre uma base em que contas e acesso aos dados sejam confiáveis desde o início.
Solução
A ideia do produto é um especialista por função, cada um com seu escopo, suas fontes autorizadas e seu formato de entrega, respondendo a pedidos em linguagem natural com citações e declarando a lacuna quando falta contexto. Até agora o trabalho foi para a base de que isso precisa: contas com confirmação por e-mail, entrada e recuperação de senha, uma API observável e testada sob carga, e um sistema de design com identidade visual própria. Os especialistas, os conectores e a integração com o modelo de linguagem estão planejados e ainda não existem.
Arquitetura
Um monorepo com um app web em React e Vite (TanStack Router e Query), uma API em Nest.js com TypeScript, um site de documentação em Next.js e um pacote de design system compartilhado, construído sobre Tailwind CSS e shadcn/ui. A API é organizada em fatias verticais com camadas de domínio, aplicação, infraestrutura e interface, um request handler por endpoint e um caso de uso por fluxo. Os dados ficam em PostgreSQL por meio de um Supabase local, com row-level security ligada e sem policies, de modo que só a API os alcança. A API envia traces, métricas e logs por OpenTelemetry a uma pilha Grafana local (Loki, Tempo e Mimir), com dashboard e alertas provisionados, e os testes de carga com k6 rodam contra uma instância isolada. Lint, formatação e testes unitários, de integração e end-to-end rodam localmente; ainda não há pipeline de CI.
Decisões técnicas
Autenticação própria da API.
Contas, hashes de senha em Argon2id e tokens de link de uso único, guardados só como hash, ficam nas tabelas da própria API; o Supabase Auth foi deliberadamente deixado de fora.
Sessões que podem ser revogadas na hora.
O token de sessão é um JWT assinado, mas toda requisição também confere a sessão no banco; assim, sair ou entrar em outro lugar tem efeito imediato e só a última sessão de cada pessoa continua válida.
Proteger o servidor antes das funcionalidades.
Limites de requisição no cadastro e na entrada, e um teto de hashes de senha simultâneos com fila limitada, que responde "ocupado" em vez de travar a API inteira, desenho moldado por testes de carga.
Observabilidade desde o início.
Métricas, traces e logs chegam a um único dashboard do Grafana, com cada tentativa contada uma vez em um só lugar e sem dados pessoais nos rótulos das métricas.
Uma identidade visual própria.
Uma direção retrô em 8 bits, inspirada em futebol e no Brasil, com logo em pixel art, uma paleta de cinco cores e sombras duras deslocadas, documentada com regras de acessibilidade que visam o WCAG 2.2 AA.
Estado atual
Em desenvolvimento. Implementado: criação de conta com confirmação por e-mail, entrada, saída e recuperação de senha, mais a observabilidade e a configuração de testes de carga. Não implementado: especialistas, conectores, ingestão de fontes, integração com o modelo de linguagem, implantação e pipeline de CI. A interface está em inglês, e as telas exibidas aqui vêm da versão de desenvolvimento local, sem dados reais.



