viniciusrbr.dev
← Todos os projetos

Fit.ai

Aplicativo de fitness com personal trainer virtual em IA — monta planos de treino personalizados, acompanha sessões e mede a consistência do usuário.

Next.jsReactTypeScriptTailwindFastifyPostgreSQLPrismaDocker
Capa do projeto Fit.ai

Visão geral

Montar um plano de treino coerente — divisão de grupos musculares, séries, repetições, descanso — e manter constância exige conhecimento técnico e disciplina. O Fit.ai concentra tudo isso em um só lugar: um personal trainer virtual com IA monta planos completos e personalizados, e o app cuida da execução das sessões e das métricas de consistência que mantêm o usuário engajado.

O produto é voltado especialmente a iniciantes em musculação. No primeiro acesso, o usuário conversa com o Coach AI, que descobre seu objetivo, nível e disponibilidade e gera o plano automaticamente — sem formulários intermináveis. A aplicação está concluída e em produção, com login social via Google e experiência mobile-first.

Funcionalidades

  • Coach AI — assistente com Google Gemini 2.5 Flash que conversa com o usuário, cadastra seus dados físicos e monta planos de treino automaticamente via tools. Responde em streaming e fica disponível como overlay flutuante em qualquer tela.
  • Onboarding inteligente — quem ainda não tem dados de treino ou plano ativo é levado ao onboarding, onde o Coach AI gera o primeiro plano em minutos.
  • Plano de treino semanal — dias da semana ordenados, diferenciando dias de treino e de descanso, com grupos musculares, duração estimada e exercícios.
  • Treino do dia — exercícios com séries, repetições e tempo de descanso; o usuário inicia e conclui a sessão, com ajuda contextual por exercício.
  • Home personalizada — saudação, cartão de consistência com streak da semana e o treino de hoje em destaque (ou mensagem de descanso).
  • Estatísticas — mapa de calor de consistência (estilo GitHub), treinos concluídos, taxa de conclusão, tempo total treinado e streak.
  • Perfil — peso, altura, percentual de gordura corporal, idade e objetivo: os dados que a IA usa para personalizar cada treino.

Stack e arquitetura

O projeto é dividido em dois repositórios independentes que se comunicam por HTTP/JSON.

O front-end é um app Next.js 16 (App Router) com React 19 e TypeScript, priorizando Server Components para busca de dados. A UI usa Tailwind CSS v4 e shadcn/ui sobre Radix, com foco mobile-first. O chat do Coach AI é construído com o Vercel AI SDK (useChat + renderização de Markdown em streaming), e o cliente da API é gerado automaticamente pelo Orval a partir do OpenAPI do back-end — garantindo tipos sempre em sincronia com o contrato.

O back-end é uma API REST em Fastify 5 e Node.js 24 (ESM), com PostgreSQL e Prisma 7 na persistência. A validação de request/response é feita com Zod, que também alimenta a documentação OpenAPI/Swagger. A autenticação usa BetterAuth (login social Google, sessões por cookie com suporte cross-subdomain). Toda a stack roda em Docker (build multi-stage), com o banco provisionado via Docker Compose em desenvolvimento.

A arquitetura segue um Service Layer Pattern na forma de Use Cases, inspirado em Clean Architecture: as rotas cuidam apenas de concerns HTTP (validação, autenticação, mapeamento de erros) e delegam toda a regra de negócio a casos de uso, que convertem o resultado do Prisma em DTOs — nunca expondo o model diretamente.

// Rota fina: valida, autentica e delega ao caso de uso
const session = await auth.api.getSession({
  headers: fromNodeHeaders(request.headers),
});
if (!session) {
  return reply.status(401).send({ error: "Unauthorized", code: "UNAUTHORIZED" });
}

const useCase = new CreateWorkoutPlanUseCase();
const output = await useCase.execute({ userId: session.user.id, ...request.body });

Desafios

O maior desafio foi a geração de planos pela IA: o Coach AI não apenas responde em linguagem natural — ele executa tools que buscam e atualizam os dados físicos do usuário e criam planos de treino estruturados diretamente no banco. Para manter a integridade, cada usuário tem no máximo um plano ativo: ao criar um novo plano, o anterior é desativado dentro de uma $transaction do Prisma, garantindo atomicidade.

Outro ponto foi o contrato entre front-end e back-end. Em vez de manter tipos manuais dos dois lados, o schema OpenAPI gerado pelo Fastify + Zod é consumido pelo Orval, que gera o cliente tipado do front — eliminando divergências entre a API e o consumo.

Resultados

O Fit.ai está no ar em fit-ai.viniciusrbr.dev, reunindo planejamento, execução e acompanhamento em um único fluxo — do onboarding com IA ao mapa anual de consistência. O projeto segue em evolução contínua, com melhorias mapeadas em testes automatizados, rate limiting no endpoint de IA e cache para os dados de home e estatísticas.

Repositórios: front-end · back-end.