Ir para o conteúdo
Bruno Lucildo
Voltar para projetos
Projeto pessoalEm desenvolvimento

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
Tela de entrada do Rondo: o logo do Rondo em pixel art sobre um cartão com os campos de e-mail e senha, um botão laranja Sign in e links para recuperar a senha e criar uma conta. A interface do app está em inglês.
Tela de cadastro do Rondo: o logo sobre um cartão com os campos de nome, sobrenome, e-mail, senha e confirmação de senha e um botão laranja Create account. A interface do app está em inglês.
Tela de recuperação de senha do Rondo: o logo sobre um cartão que pede o e-mail para receber o link de redefinição, com um botão laranja Send reset link. A interface do app está em inglês.
Tela de redefinição de senha do Rondo: o logo sobre um cartão com os campos de nova senha e confirmação, cada um com um controle para mostrar a senha, e um botão laranja Reset password. A interface do app está em inglês.
Telas da versão de desenvolvimento local, sem dados reais. A interface do app está em inglês.

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.