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.
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ério | React Native (Expo SDK 58) | Flutter |
|---|---|---|
| Código compartilhado com o backend | TypeScript em tudo: pacote @forja/core usado no app e na API | Dart no app, outra linguagem no servidor |
| Performance e animações | Nova arquitetura (Fabric, JSI) e animações no thread nativo | Excelente, motor Impeller próprio |
| Atualização sem passar pela loja | EAS Update entrega correções em minutos | Exige solução de terceiros |
| Web e painéis | Mesmo app roda na web (painel da academia num tablet ou navegador) | Web possível, menos madura para painéis |
| Contratação no Brasil | Maior oferta de devs JS/TS | Mercado menor |
TypeScript, Zod, JWT, rate limit, Prisma. Escolhido sobre Python e Go para reaproveitar o domínio do app sem tradução.
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).
API em ECS Fargate atrás de ALB, RDS Multi-AZ, ElastiCache, EventBridge e SQS para eventos, jobs agendados para evasão e push.
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
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
| Tabela | Papel | Índices e cuidados |
|---|---|---|
users | Atleta, gestor de academia ou lojista; plano, configurações e token de push | e-mail único; (role, onboarded); gym_id |
athlete_stats | XP, Brasas, nível, liga, XP semanal, sequência, protetores, conquistas e contadores | (league, weekly_xp) para ranking; espelho em Redis |
check_ins | Cada leitura de passe: método, resultado, XP e Brasas pagos | (gym_id, at) e (user_id, at); particionar por mês |
ledger_entries | Extrato imutável de XP e Brasas com referência de origem | (user_id, at); nunca atualizado, só inserido |
workout_plans · workout_sessions | Ficha gerada (JSON por dia) e séries registradas com volume e recordes | (user_id, finished_at) |
nutrition_plans · nutrition_days | Metas, refeições e suplementos; consumo diário e água | único (user_id, day) |
rewards · redemptions | Catálogo em Brasas e vouchers emitidos | código do voucher único; baixa em transação |
campaigns · ad_daily | Anúncios nativos com orçamento, CPM, CPC e agregados diários | único (campaign_id, day) |
challenges · churn_scores · push_logs | Desafios por período, risco de evasão calculado pelo job, notificações enviadas | (scope, ends_at); (user_id, computed_at) |
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
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.
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.
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.
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.
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.
20 emblemas em quatro raridades, do primeiro check-in ao Inquebrável (100 dias). Cada um paga XP uma única vez.
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.
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ível | Título | XP acumulado |
|---|---|---|
| 2 | Aprendiz da Forja | 150 |
| 5 | Ferreiro | 1.057 |
| 10 | Forjador | 3.464 |
| 15 | Mestre do Aço | 6.677 |
| 25 | Titã | 14.982 |
| 40 | Lenda da Forja | 31.202 |
| 50 | Lenda da Forja | 44.118 |
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.
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; }
| Pasta | Conteúdo |
|---|---|
packages/core | Domínio, contrato da API, gamificação, nutrição, treino, coach, evasão, passes QR e simulador. 20 testes. |
apps/mobile | App Expo com 29 telas, tema claro, escuro e alto contraste, microinterações e build web de página única. |
apps/api | Fastify, 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. |
docs | Arquitetura, banco, fluxos, gamificação, monetização, código estrutural e roadmap em detalhe. |
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 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.
| Fase | Status no código | Pró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. |