Pular para o conteúdo
Anderson Rocha

projetos / Ativo — MVP em desenvolvimento

GymFlow

Plataforma de acompanhamento de treino — frontend Next.js com RSC sobre uma API NestJS + Apollo GraphQL, Prisma e PostgreSQL.

Ver repositório →
GymFlow — screenshot da interface

Visão geral

GymFlow é uma plataforma de acompanhamento de treino: cria treinos a partir de uma biblioteca de exercícios, executa-os como sessões com registro de peso e repetições por série e revisa agenda, progresso e planos em um workspace desktop dedicado. O fluxo mobile fica concentrado em registrar uma sessão ao vivo; o desktop é o lugar para preparar blocos de treino e entender o panorama maior. Iniciado em fevereiro de 2026, o projeto também funciona como uma implementação de referência de uma stack específica — Next.js App Router com React Server Components no frontend, NestJS com Apollo GraphQL no backend e Prisma sobre PostgreSQL.

É um MVP em desenvolvimento ativo, e esta página deixa isso claro. A arquitetura está definida e documentada com diagramas mermaid no README, a integração com banco está em andamento e autenticação JWT própria é o próximo marco. O repositório é público: o código pode ser lido hoje, ainda em construção.

Demonstração ao vivo

Do início ao fim de um treino

app mobile responsivo

Uma sessão mobile completa: escolhe Upper Day, registra peso e repetições, conclui cada exercício e chega ao resumo do treino.

Arquitetura

O sistema é API-first: o backend NestJS é a única fonte de verdade, e cada cliente consome a mesma API Apollo GraphQL. O app web usa Next.js App Router com React Server Components buscando dados por um cliente GraphQL. GraphQL foi escolhido em vez de REST especificamente pela segurança de tipos entre camadas: o schema é o contrato, e os tipos permanecem do resolver ao cliente.

O backend é organizado em camadas: Resolver → Service → Domain → Prisma. Resolvers permanecem enxutos, services orquestram, lógica de domínio fica isolada do GraphQL e do ORM e Prisma fica restrito à borda de persistência. É mais cerimônia do que um MVP individual estritamente precisa; a escolha é deliberada — a camada de domínio sobrevive a uma troca de transporte ou ORM, e a estrutura se sustenta quando chega um segundo cliente.

Esse segundo cliente explica a decisão de autenticação. O PostgreSQL roda no Supabase, mas a autenticação usa JWT próprio em vez de Supabase Auth: controlar a emissão de tokens mantém o cliente mobile em React Native no roadmap sem acoplar todos os consumidores ao modelo de sessão do Supabase.

  • apps/web — Next.js App Router, React Server Components e cliente GraphQL
  • apps/api — NestJS + Apollo GraphQL, Prisma ORM e autenticação JWT própria (em andamento)
  • Banco de dados — PostgreSQL no Supabase
  • Ferramentas — monorepo pnpm com pipelines de typecheck, lint e testes

Capturas

Capturas do MVP rodando localmente.

Workspace desktop do GymFlow mostrando próximo treino, consistência semanal, métricas de treino e sessão recente
Biblioteca desktop de exercícios do GymFlow com busca, filtros de grupo muscular e tabela de catálogo estruturada
Construtor desktop de treino do GymFlow com sequência de exercícios, séries e repetições planejadas e visão do plano
Interface mobile do GymFlow 1
Interface mobile do GymFlow 2

Stack e decisões

EscolhaMotivo
Backend API-firstA API NestJS é a única fonte de verdade; o app web é um consumidor entre clientes futuros
GraphQL em vez de RESTTipagem forte entre camadas — o schema é o contrato do resolver ao cliente
Backend em camadas: Resolver → Service → Domain → PrismaLógica de domínio isolada de transporte e ORM; cada camada pode evoluir separadamente
JWT próprio em vez de Supabase AuthControle sobre emissão de tokens para suportar múltiplos clientes no futuro, começando por React Native
PostgreSQL no SupabasePostgres gerenciado, mantendo autenticação e lógica da aplicação na API
Monorepo pnpm (apps/web + apps/api)Tipos e ferramentas compartilhados; pipelines de typecheck, lint e testes para os dois apps
Next.js App Router + React Server ComponentsBusca de dados server-first no cliente web

Links