Forja Blueprint
App IA Fitness · documento de produto e engenharia

Forja
Blueprint

Arquitetura, banco de dados, fluxos de tela, gamificação, monetização e o código estrutural do app que une treino, nutrição e motivação com um coach de IA, recompensa cada presença em academia credenciada e abre um ecossistema pago para academias e lojistas.

3perfis: atleta, academia, lojista
29telas implementadas
64testes automatizados passando
1código para iOS, Android e web
Decisão técnica

React Native com Expo, não Flutter

O critério decisivo foi uma única linguagem para app, backend e regras de negócio. A pontuação, a sequência, os macros e a validação do QR rodam com o mesmo código no celular, no servidor e no simulador de demonstração.

CritérioReact Native (Expo SDK 58)Flutter
Código compartilhado com o backendTypeScript em tudo: pacote @forja/core usado no app e na APIDart no app, outra linguagem no servidor
Performance e animaçõesNova arquitetura (Fabric, JSI) e animações no thread nativoExcelente, motor Impeller próprio
Atualização sem passar pela lojaEAS Update entrega correções em minutosExige solução de terceiros
Web e painéisMesmo app roda na web (painel da academia num tablet ou navegador)Web possível, menos madura para painéis
Contratação no BrasilMaior oferta de devs JS/TSMercado menor
Backend

Node.js 22 + Fastify 5

TypeScript, Zod, JWT, rate limit, Prisma. Escolhido sobre Python e Go para reaproveitar o domínio do app sem tradução.

Dados

PostgreSQL + Redis + NoSQL

Postgres para o transacional (check-ins, extrato, resgates). Redis para ligas em sorted sets e limites. DynamoDB para eventos de alto volume (chat, impressões).

Nuvem

AWS em contêineres

API em ECS Fargate atrás de ALB, RDS Multi-AZ, ElastiCache, EventBridge e SQS para eventos, jobs agendados para evasão e push.

Entregável 1

Mapa da arquitetura e fluxo de dados

Clientes falam com uma única API stateless. Toda regra que o usuário sente vive em @forja/core. Eventos de domínio alimentam os jobs de IA (evasão e notificações comportamentais).

flowchart LR
  subgraph CLI[Clientes]
    A[App do atleta
iOS e Android] G[App da academia
tablet na recepção] M[App do lojista] W[Web e protótipo] end subgraph EDGE[Borda] CF[CloudFront + WAF] LB[ALB] end subgraph API[API Forja · Fastify em ECS Fargate] AU[Autenticação JWT] AT[Atleta: treino, nutrição, check-in] GA[Motor de gamificação
@forja/core] CO[Coach Atlas] GY[Academias: acesso QR e NFC] ME[Lojistas: anúncios e vouchers] end subgraph DATA[Dados] PG[(PostgreSQL)] RD[(Redis)] DY[(DynamoDB
eventos e chat)] end subgraph ASYNC[Assíncrono] EB[[EventBridge + SQS]] J1[Job de evasão diário] J2[Job de push comportamental] end CL[API de IA generativa] HL[Apple Health, Health Connect, Strava] PU[Expo Push, APNs, FCM] PA[Stripe, Pix, lojas de apps] A & G & M & W --> CF --> LB --> AU AU --> AT & GY & ME AT --> GA GY --> GA AT --> CO --> CL AT --> HL GA --> PG GA --> RD CO --> DY ME --> DY AT & GY & ME --> EB EB --> J1 & J2 J1 --> PG J2 --> PU AU --> PA
sequenceDiagram
  autonumber
  participant A as App do atleta
  participant R as Catraca ou tablet
  participant API as API Forja
  participant C as @forja/core
  participant DB as PostgreSQL
  A->>API: GET /v1/athlete/access-pass
  API-->>A: QR FJ1.U.usuario.janela.HMAC (vale 30 s)
  R->>API: POST /v1/gym/access (payload lido)
  API->>C: verifyToken + decideCheckin
  C-->>API: liberado, pontua 1 vez por dia
  API->>C: grant(): sequência, multiplicadores, desafios, conquistas
  API->>DB: transação: check-in, XP, Brasas, extrato
  API-->>R: ACESSO LIBERADO + perfil do aluno
  API-->>A: celebração com +XP, +Brasas e anúncio nativo

IA aplicada

  • Coach Atlas: modelo de linguagem com prompt de sistema que recebe anamnese, metas e estado do dia. Sem chave ou em falha, cai para o motor de regras em português.
  • Próxima melhor ação: ordena check-in, treino, proteína, água, desafio quase completo e upgrade por urgência.
  • Push comportamental: horário calculado pela mediana dos check-ins do aluno, 45 min antes.
  • Evasão: modelo logístico com dias sem visita, queda de frequência em 14 dias, sequência e plano.

Segurança e LGPD

  • QR do aluno renova a cada 30 s e é assinado com HMAC-SHA256: print não passa na catraca.
  • Pontos de check-in uma vez por dia, deduplicação de 40 min por academia.
  • Dados de saúde tratados como sensíveis: consentimento explícito, criptografia em repouso, retenção definida.
  • Rate limit separado para login, coach e eventos de anúncio.
Entregável 2

Estrutura do banco de dados

21 modelos no PostgreSQL (Prisma). O diagrama mostra as relações centrais; chat, impressões e eventos analíticos também são espelhados no armazenamento NoSQL.

erDiagram
  USERS ||--o| ATHLETE_STATS : tem
  USERS ||--o| ANAMNESIS : responde
  USERS ||--o{ WORKOUT_PLANS : recebe
  USERS ||--o{ WORKOUT_SESSIONS : registra
  USERS ||--o| NUTRITION_PLANS : recebe
  USERS ||--o{ NUTRITION_DAYS : registra
  USERS ||--o{ CHECK_INS : faz
  USERS ||--o{ LEDGER_ENTRIES : acumula
  USERS ||--o{ REDEMPTIONS : resgata
  USERS ||--o{ CHAT_MESSAGES : conversa
  USERS ||--o{ CHURN_SCORES : recebe
  GYMS ||--o{ CHECK_INS : recebe
  GYMS ||--o{ USERS : "gerida por / academia principal"
  GYMS ||--o{ CHALLENGES : cria
  MERCHANTS ||--o{ REWARDS : oferece
  MERCHANTS ||--o{ CAMPAIGNS : anuncia
  REWARDS ||--o{ REDEMPTIONS : gera
  CAMPAIGNS ||--o{ AD_DAILY : agrega
TabelaPapelÍndices e cuidados
usersAtleta, gestor de academia ou lojista; plano, configurações e token de pushe-mail único; (role, onboarded); gym_id
athlete_statsXP, Brasas, nível, liga, XP semanal, sequência, protetores, conquistas e contadores(league, weekly_xp) para ranking; espelho em Redis
check_insCada leitura de passe: método, resultado, XP e Brasas pagos(gym_id, at) e (user_id, at); particionar por mês
ledger_entriesExtrato imutável de XP e Brasas com referência de origem(user_id, at); nunca atualizado, só inserido
workout_plans · workout_sessionsFicha gerada (JSON por dia) e séries registradas com volume e recordes(user_id, finished_at)
nutrition_plans · nutrition_daysMetas, refeições e suplementos; consumo diário e águaúnico (user_id, day)
rewards · redemptionsCatálogo em Brasas e vouchers emitidoscódigo do voucher único; baixa em transação
campaigns · ad_dailyAnúncios nativos com orçamento, CPM, CPC e agregados diáriosúnico (campaign_id, day)
challenges · churn_scores · push_logsDesafios por período, risco de evasão calculado pelo job, notificações enviadas(scope, ends_at); (user_id, computed_at)
Entregável 3

Fluxo de telas por perfil

Cada perfil tem uma barra flutuante com a ação principal elevada ao centro: check-in para o atleta, leitura de acesso para a academia e validação de voucher para o lojista.

flowchart TD
  W[Boas-vindas] --> L[Entrar] & R[Criar conta]
  R --> O[Anamnese em 6 etapas] --> F[IA forjando o plano] --> RV[Plano revelado]
  RV --> H
  subgraph Atleta
    H[Início: nível, sequência, próxima ação, painel configurável]
    P[Plano: treino e nutrição]
    C((Check-in: passe QR, leitura, academias))
    CH[Coach Atlas]
    LJ[Loja de Brasas]
    H --> P & C & CH & LJ
    P --> S[Sessão de treino guiada] --> CEL[Celebração de recompensa]
    C --> CEL
    H --> RK[Ranking e ligas] & DS[Desafios e conquistas] & PF[Perfil]
    LJ --> CT[Carteira e vouchers]
    PF --> PL[Planos Pro e Elite] & IN[Integrações de saúde] & CF[Configurações]
  end
flowchart TD
  subgraph Academia
    GD[Painel: ao vivo, fluxo por hora, repasse, retenção]
    GM[Alunos: risco de evasão com ação sugerida]
    GA((Acesso: ler passe QR ou NFC, QR da recepção))
    GC[Desafios da academia]
    GP[Academia: dados e plano de parceria]
    GD --> GM --> GA
    GA --> GC --> GP
  end
flowchart TD
  subgraph Lojista
    MD[Painel: ROI, impressões, CTR, resgates]
    MC[Anúncios] --> ME[Nova campanha com prévia]
    MV((Validar voucher))
    MO[Ofertas em Brasas] --> MR[Nova oferta]
    MP[Loja e preços]
    MD --> MC
    MD --> MV --> MO --> MP
  end
Entregável 4

Gamificação passo a passo

Duas medidas separadas: XP mede progresso e nunca é gasto; Brasas são a moeda trocada por prêmios. A ordem abaixo é exatamente a do pipeline grant() executado em cada atividade.

  1. Atividade validada

    Check-in por QR ou NFC (+50 XP, +20 Brasas), treino concluído (+80 XP, +15), treino acima de 45 min (+20, +5), recorde pessoal (+25, +5), refeição (+5, +1), macros do dia (+30, +10), meta de água (+15, +3). Quem volta depois de 5 dias ou mais sem atividade recebe Brasas em dobro no check-in.

  2. Sequência

    Check-in ou treino mantêm a chama. Protetores cobrem até 2 dias perdidos (1 por semana no Pro, 2 no Elite, ou 150 Brasas). Marcos de 7, 30 e 100 dias pagam bônus.

  3. Multiplicadores

    XP cresce 1% por dia de sequência, até 30%. Brasas multiplicam por 1,25 no Pro e 1,5 no Elite. No Free a celebração mostra quanto o Pro teria rendido.

  4. Desafios

    Semanais globais (4 check-ins, 3 treinos, proteína em 5 dias, água em 4 dias), da academia (mensal), patrocinados por lojistas e exclusivos Elite. Pagos automaticamente ao completar.

  5. Conquistas

    20 emblemas em quatro raridades, do primeiro check-in ao Inquebrável (100 dias). Cada um paga XP uma única vez.

  6. Nível e liga

    Curva 100 × (N−1)^1,55 + 50 × (N−1). Ligas semanais de metal (Ferro a Titânio) em grupos de 30: os 7 primeiros sobem, os 5 últimos descem.

  7. Extrato e resgate

    Tudo vira lançamento no extrato. Brasas compram produtos, descontos, serviços e diárias na rede; o voucher sai com QR e vale 30 dias.

NívelTítuloXP acumulado
2Aprendiz da Forja150
5Ferreiro1.057
10Forjador3.464
15Mestre do Aço6.677
25Titã14.982
40Lenda da Forja31.202
50Lenda da Forja44.118

Equilíbrio da economia

Um atleta ativo gera cerca de 35 Brasas por dia (check-in, treino e nutrição). Os prêmios custam entre 120 (café proteico, cerca de 4 dias) e 3.000 (1 mês de Pro, cerca de 3 meses). Saídas de moeda: resgates, protetores de sequência e diárias da rede. O custo real de cada prêmio é pago pelo parceiro, que recebe o cliente na loja.

Antifraude: QR assinado e rotativo, pontos uma vez por dia, deduplicação por academia e geocerca recomendada para a versão de produção.

Ecossistema SaaS

Três fontes de receita

Atletas

Assinatura

  • Free: plano por IA, coach 8 mensagens por dia, academias Free.
  • Pro, R$ 29,90: coach ilimitado, macros ajustados pelo relógio, Brasas 1,25x, academias Pro.
  • Elite, R$ 79,90: rede inteira, Brasas 1,5x, desafios exclusivos, sem anúncios.
Academias

Parceria

  • Parceiro: sem mensalidade, recebe repasse por visita de assinante Pro ou Elite (R$ 4,00 a R$ 12,00). Alunos Free treinam na própria academia e geram retenção.
  • Parceiro Pro, R$ 199/mês: previsão de evasão, desafios próprios, push segmentado, destaque.
Lojistas

Mídia e resgates

  • Anúncios nativos em leilão: R$ 12 a R$ 20 por mil impressões mais R$ 0,40 a R$ 0,70 por clique.
  • R$ 2,90 por voucher validado.
  • Desafio patrocinado a partir de R$ 1.500 por semana.
Gatilhos de conversão já no app: limite diário do coach com convite ao Pro, academias e prêmios bloqueados por plano, desafio Elite visível porém trancado, "no Pro você teria ganho +X Brasas" em cada celebração, e ajuste automático de macros pelo relógio como recurso Pro.
Entregável 5

Código estrutural

Um contrato único descreve a API inteira. O app gera o cliente HTTP a partir dele, o backend registra as rotas a partir dele e o simulador local o implementa para testes sem servidor.

// packages/core/src/api.ts
export interface FitApi {
  saveAnamnesis(a: Anamnesis): Promise<{ workout: WorkoutPlan; nutrition: NutritionPlan; user: User }>;
  getHome(): Promise<AthleteHome>;
  finishWorkout(a: { dayId: string; sets: SetLog[]; durationMin: number; startedAt: string }): Promise<{ session; reward; ad }>;
  getAccessPass(): Promise<{ payload: string; expiresInSec: number }>;
  validateAccess(a: { payload: string; method: CheckInMethod }): Promise<AccessResult>;
  redeemReward(a: { rewardId: string }): Promise<{ redemption: Redemption; balance: number }>;
  // ... 51 métodos no total, para atleta, academia e lojista
}

export const ROUTES = {
  getHome:        { verb: 'GET',  path: '/v1/athlete/home',  auth: ['athlete'] },
  finishWorkout:  { verb: 'POST', path: '/v1/athlete/workouts', auth: ['athlete'] },
  validateAccess: { verb: 'POST', path: '/v1/gym/access',     auth: ['gym'] },
  // ...
};

// Pipeline de recompensa: mesma ordem no app, no simulador e na API
function grant(user, builder, reason, { qualifying }) {
  if (qualifying) touchStreak(stats, hoje);          // 1. sequência e marcos
  const ev = builder.commit(agora);                  // 2. multiplicadores de sequência e plano
  pagarDesafiosConcluidos(user, ev);                 // 3. desafios
  ev.badges = unlockBadges(stats, metricas, agora);  // 4. conquistas
  ev.levelUp = compararNivel(antes, stats.level);    // 5. nível
  lancarNoExtrato(user, ev);                         // 6. extrato imutável
  return ev;
}
PastaConteúdo
packages/coreDomínio, contrato da API, gamificação, nutrição, treino, coach, evasão, passes QR e simulador. 20 testes.
apps/mobileApp Expo com 29 telas, tema claro, escuro e alto contraste, microinterações e build web de página única.
apps/apiFastify, Prisma, PostgreSQL, Redis opcional, coach com IA generativa, jobs de evasão e push, Docker. 44 testes de integração contra PostgreSQL e Redis reais.
docsArquitetura, banco, fluxos, gamificação, monetização, código estrutural e roadmap em detalhe.
Hoje

Como testar

No navegador, agora

Abra o protótipo navegável. Na tela inicial escolha "Explorar como Lucas" (atleta), "Explorar a Iron House" (academia) ou "Explorar a NutriMax" (lojista).

No celular, com Expo Go

No projeto: cd apps/mobile, npm install, npx expo start e leia o QR com o Expo Go. Contas: lucas@forja.app, gestor@ironhouse.app e rafael@nutrimax.app, senha forja123. Para APK: npx eas-cli build -p android --profile preview.

Fases do PRD

O que está pronto e o que vem

FaseStatus no códigoPróximo passo
1 · MVP
anamnese, chat, planos
Pronto: anamnese em 6 etapas, coach com IA e voz opcional, ficha de treino e plano nutricional, gamificação, academias, lojistas, assinaturas.Pagamento real (Stripe, Pix, compras nas lojas), push em produção, publicação nas lojas.
2 · Integrações
wearables
Fluxo pronto com dados simulados: conexão, sincronização e recálculo automático de macros.HealthKit, Health Connect, Strava OAuth e Garmin com permissões reais.
3 · Marketplace
profissionais humanos
Base pronta: perfis, extrato, triagem pela IA prevista no Elite.Cadastro de personal trainers e nutricionistas, agenda, pagamento dividido.