Lançando o LiftCrew AI: nossa jornada criando um aplicativo iOS de fitness com IA
Como a SEYSO SERVICES INC projetou, desenvolveu e lançou LiftCrew AI na Apple App Store — do primeiro commit de React Native a uma experiência de treino em grupo com Claude, sincronização em tempo real, análise de refeições por foto e assinaturas StoreKit 2.
1
Aplicativo iOS lançado
9
Tabelas do Supabase
4
Modos de desafio
60
FPS na interface
O desafio: treino em grupo na academia, personalizado por IA
A maioria dos aplicativos de fitness é otimizada para um único usuário. O LiftCrew começou com uma premissa diferente: as pessoas treinam melhor em grupo, mas um grupo de amigos raramente compartilha o mesmo nível de força. Nosso cofundador imaginou quatro pessoas fazendo o mesmo exercício, na mesma série, no mesmo momento — cada uma com o peso certo na barra para seu próprio corpo. Essa ideia aparentemente simples tornou-se o princípio central do produto: mesmo exercício, peso individualizado.
Criá-lo exigiu uma coordenação estreita entre um modelo de IA que entende programação de treinos, uma camada em tempo real que mantém um grupo distribuído sincronizado e uma experiência iOS nativa o suficiente para passar despercebida durante uma série pesada.
Por que React Native + Expo para iOS (e por que continua nativo o suficiente)
Escolhemos React Native 0.81 na Nova Arquitetura (Fabric + TurboModules) e Expo SDK 54 com expo-router 6 para navegação baseada em arquivos. Essa estrutura permitiu compartilhar uma única base de código entre iOS e Android e ainda usar módulos nativos de iOS onde a experiência importa: o módulo nativo expo-apple-authentication para Iniciar sessão com a Apple, StoreKit 2 nativo via react-native-purchases (RevenueCat), a galeria do iOS via expo-image-picker , e Reanimated 4.3 para animações a 60 fps na thread da interface.
O resultado é um aplicativo aprovado sem dificuldades na revisão da Apple (App Store Connect ID 6762237223, equipe C23ARGS845), que respeita as Diretrizes de Interface Humana da Apple e recebe atualizações OTA do pacote JavaScript via EAS — sem abrir mão do que os usuários de iOS realmente percebem.
A IA: Claude como treinador
O treinador de IA gera um plano por sessão quando um grupo inicia um treino. O modelo recebe a composição do grupo, as referências de 1RM de cada membro, o histórico recente de sessões, os equipamentos da academia e o objetivo do treino do dia. Retorna um plano JSON estruturado com exercícios, esquemas de séries e repetições e prescrição de peso por membro.
Usamos por padrão o Claude Haiku 4.5 pela velocidade e pelo custo, com escalonamento para o Claude Sonnet 4 para programação de treinos mais complexa e visão (análise de fotos de refeições). O ponto crucial: a chave de API nunca sai do servidor. Toda chamada de IA passa por um proxy serverless da Vercel em /api/generate-workout , autenticado com o JWT Supabase do usuário. O pacote do aplicativo não contém nenhum segredo — a única chave da Anthropic fica nas variáveis de ambiente da Vercel.
Além disso, adicionamos um cache de respostas de 1 hora no cliente (para que reabrir o mesmo plano não consuma tokens), substituição de exercícios durante a sessão (o modelo recalcula o peso substituto com base na intensidade relativa) e um limite deliberadamente curto de tentativas para que uma rede instável nunca impeça o usuário de treinar.
Sincronização do grupo em tempo real sem um backend próprio
As sessões em grupo são o coração social do aplicativo. Quatro pessoas em três academias diferentes precisam sentir que estão treinando juntas: quando alguém completa uma série, todos veem; quando o descanso termina, todos avançam; quando alguém bate um recorde pessoal, o grupo inteiro recebe confetes.
Em vez de criar um serviço próprio de tempo real, recorremos às transmissões do Supabase Realtime por WebSocket. Cada série concluída, avanço de exercício e mudança de estado de um membro envia um pequeno evento a um canal da sessão. O estado local do Zustand aplica a alteração de forma otimista e recorre ao AsyncStorage se a rede cair no meio da série — o levantamento é sagrado; a sincronização é feita na medida do possível.
A detecção de recordes pessoais roda no cliente usando a fórmula de Epley em comparação com o 1RM armazenado de cada usuário. Quando a sessão termina, o maior 1RM estimado por levantamento é salvo no perfil e publicado no feed do grupo. Recordes empatados mostram todos os vencedores, porque a interação social importa mais que o ranking.
Registro de refeições por foto com a visão do Claude
A nutrição originalmente seria uma tela de busca manual de alimentos. Descartamos a ideia após o primeiro protótipo — ninguém quer digitar «peito de frango, 142g» depois de um treino de pernas. Em vez disso, o usuário fotografa o prato e a capacidade de visão do Claude Sonnet retorna calorias e macronutrientes em um JSON estruturado que entra diretamente nos totais diários.
Por trás disso há uma calculadora BMR/TDEE de Mifflin-St Jeor que define as metas do usuário, anéis de progresso diário que se animam conforme as refeições são registradas e um histórico móvel de 5 dias persistido como coluna JSONB no perfil Supabase do usuário. Sair da conta e reinstalar não faz perder os dados — essa acabou sendo uma das decisões de maior impacto que tomamos.
Desafios em grupo: transformando treinos em uma temporada
Os desafios em grupo fazem os amigos continuarem participando. O aplicativo oferece quatro modos de pontuação — volume (total de kg levantados), sessões (quantidade de treinos concluídos), recordes pessoais (número de recordes pessoais) e sequências (dias consecutivos de treino). Quando uma sessão termina, os desafios em que o usuário participa contabilizam os resultados automaticamente e a classificação é atualizada para todo o grupo.
O mecanismo de pontuação fica inteiramente nas funções Supabase e no Postgres — não existe um serviço separado de desafios. As políticas RLS garantem que um usuário só veja desafios de grupos aos quais realmente pertence. É uma lição antiga: quando sua camada de dados é boa, você não precisa de muitos serviços.
As partes difíceis: pagamentos, testes grátis e revisão da Apple
Usamos RevenueCat com StoreKit 2 nativo no iOS e Google Play Billing no Android. A permissão de acesso é controlada por um único indicador pro ; os produtos são liftcrew_pro_monthly_v2 (CA$4.99/mês) e liftcrew_pro_yearly_v4 (CA$39.99/ano). O teste grátis de 15 dias é controlado pelo servidor na tabela subscriptions vinculada a auth.users.created_at — porque relógios de avaliação no cliente são um convite à manipulação de datas e ao abuso de reinstalações.
Um webhook do RevenueCat em /api/revenuecat-webhook espelha cada evento de assinatura no Supabase, para que um usuário com assinatura vencida tenha o acesso bloqueado na próxima abertura, mesmo que o cache de recibos esteja desatualizado. A tela de assinatura se fecha automaticamente assim que a permissão de acesso muda.
A revisão da Apple revelou uma exigência importante que não havíamos previsto: a diretriz 1.2 exige que conteúdo gerado por usuários ofereça uma forma de denunciar e bloquear outros usuários. Adicionamos a tabela user_reports , uma lista de bloqueios nas solicitações de conexão e uma RPC delete_own_account para que os usuários possam excluir a conta de ponta a ponta. O aplicativo passou na revisão no envio seguinte.
A arquitetura em um parágrafo
React Native 0.81 + Expo 54 no cliente. Zustand para estado, persistido no AsyncStorage e sincronizado com colunas JSONB do Supabase para preservar os dados após reinstalação. Supabase Postgres com RLS em nove tabelas para usuários, sessões, exercícios, conexões de grupo, academias, desafios, tokens push, assinaturas e denúncias. Supabase Realtime para sessões de grupo ao vivo. Funções serverless da Vercel para o proxy de IA, webhook do RevenueCat, envio de push e um agente de suporte de Gmail para Linear. Claude para IA. RevenueCat para pagamentos. EAS Build para compilação iOS/Android na nuvem. Bebas Neue e DM Sans na tipografia, verde-lima #d4ff5a sobre #0d0d0f no visual.
O que faríamos de novo — e o que não faríamos
- Faríamos de novo: chaves de IA no servidor atrás de um proxy autenticado por JWT. Inegociável.
- Faríamos de novo: colunas JSONB para estruturas de estado do usuário que evoluem (configurações, refeições, planos). Permitiram avançar mais rápido do que migrações de esquema permitiriam.
- Faríamos de novo: RevenueCat. A combinação webhook + StoreKit 2 se pagou na primeira vez que precisamos conciliar um reembolso.
- Não faríamos de novo: lançar sem incluir a conformidade com Apple 1.2 no escopo desde o primeiro dia. Sabíamos que precisaríamos de denúncia/bloqueio; deveríamos ter entregue isso na primeira versão.
- Não faríamos de novo: um relógio de avaliação no cliente — nem como solução provisória. Leve-o primeiro para o servidor.
Quer isso para seu aplicativo iOS?
O LiftCrew AI é um dos vários aplicativos iOS que a SEYSO SERVICES INC projetou e lançou. Se você tem uma ideia — com IA, fitness, produtividade ou B2B — e quer um parceiro que a leve de um esboço a uma publicação ativa na App Store, adoraríamos conversar. Swift nativo, SwiftUI, React Native, Expo, integração de IA, otimização para a App Store e as muitas exigências de conformidade da Apple: é isso que fazemos.
Pronto para criar seu aplicativo iOS?
Converse com a equipe que lançou o LiftCrew AI.