RepStack · Android · offline-first

Sua carga. Seu descanso. Seu ritmo.

Fichas, séries e timer de descanso que funcionam sem internet. Tudo fica no aparelho. Se quiser, sincroniza com a sua conta Google.

Kotlin + Jetpack Compose Android 8+ (minSdk 26) Room local · Firestore opcional
RepStack: treino A, Peito. Supino Reto, 4 séries de 8 a 10 reps. Timer de descanso em 01:58 com botões −15s, Pular e +15s. Série 1 concluída com 60 kg × 10.

Uma rotina. Três telas.

Monte a ficha uma vez. Depois é só abrir o dia e treinar.

O ciclo A/B/C segue sozinho: o app sabe qual é o próximo treino, lembra a última carga de cada exercício e sugere a progressão. Você só confirma as séries.

Capturas do RepStack com dados de demonstração.

01 / Ficha

Fichas que você controla, inclusive fora do app.

Crie, edite, duplique e ative fichas. Cada treino tem seus exercícios, séries, faixa de reps e descanso. Importa e exporta em JSON, então a ficha é sua e não do servidor.

Ciclo A/B/C
O próximo treino aparece na tela inicial com a estimativa de duração.
~45 exercícios de fábrica
Mais os seus. Substitua um exercício no meio do treino sem perder a ficha.
Ficha exemplo "Hipertrofia"
Vem pronta na primeira abertura para você treinar hoje.
Tela inicial do RepStack: ofensiva de 15 treinos, próximo treino A Peito com 6 exercícios, último treino C Perna com 7 PRs e recorde de Supino Reto de 70 kg × 10.
Detalhe de um treino concluído com séries, cargas e repetições.

02 / Execução

Carga, reps, descanso. Nada mais na tela.

Abas por exercício, a última carga sempre visível ("Última: 67,5 kg × 9 · há 6 dias") e um timer que não morre quando o celular bloqueia.

Timer em serviço de primeiro plano
Continua com a tela apagada e avisa com vibração e notificação quando acaba. −15s, pular, +15s.
Sugestão de progressão
Fechou a faixa de reps na última sessão? O app propõe a carga seguinte.
Resumo ao finalizar
Volume total, duração e os recordes batidos naquela sessão.
Treino em andamento com timer de descanso e registro de séries.

03 / Progresso

Recordes, volume e peso, desenhados a partir do que você registrou.

Gráficos de evolução de carga, volume por treino, frequência e peso corporal. Histórico agrupado por mês, com edição e exclusão de qualquer sessão: recordes, volume e ofensiva são recalculados.

Recordes pessoais
Por exercício, com data e repetições. Aparecem na tela inicial quando caem.
Metas
Treinos, frequência, volume ou peso corporal, com barra de progresso.
Widget
Ofensiva e próximo treino na tela inicial do Android.
Tela de progresso com recordes pessoais por exercício.
Tela de metas com barras de progresso.

Ofensiva

Uma regra simples para não parar.

A ofensiva conta treinos, não dias. Ela só cobra o mínimo que sustenta um ciclo: um treino por semana.

Bem-vindo de volta

RepStack

15 ofensiva

Treine até qua., 21/10 para manter a ofensiva. Recorde: 15.

+1  a cada treino concluído, no dia que for.

7 dias  sem treinar e a contagem zera. A tela mostra até que dia você ainda está dentro do prazo.

0 dias  de culpa. Editar ou excluir um treino do histórico recalcula a ofensiva junto com volume e recordes.

Relógio e Samsung Health

O relógio mede. O RepStack guarda no lugar certo.

Pelo Health Connect, nos dois sentidos. Funciona com Galaxy Watch, Google Fit e qualquer app que fale com o Health Connect. Opcional e desligado por padrão.

Enviar treinos concluídos

Cada treino vira uma sessão de exercício de força no Health Connect, com as séries nas notas. Edições e exclusões também vão.

ExerciseSessionRecord · Samsung Health lê "Exercício"

Importar do relógio

Frequência cardíaca média e máxima, calorias do treino e peso corporal. Ficam no resumo, no histórico e na aba Peso do Progresso.

Últimos 3 dias reconsultados ao voltar ao app · 1 mês ao ligar

Com os limites na mesa

O Samsung Health só grava calorias para treinos iniciados nele. FC depende de quantas medições o relógio fez. O app explica isso e traz o passo a passo das permissões.

Leitura só em primeiro plano · dados de até 30 dias antes da permissão

Seus dados

Tudo no aparelho primeiro. A nuvem é opcional.

O banco local é a fonte da verdade. Com login Google, o app sincroniza fichas, histórico, recordes, metas e exercícios com o Firestore, sem bloquear nada enquanto está offline.

Conflitos resolvidos pela hora da edição
A última escrita vence. O pull incremental usa a hora do servidor, então dois aparelhos com relógio desajustado não perdem mudanças.
Exclusões viajam
Apagar em um aparelho apaga no outro. Treinos em andamento nunca sobem, só os concluídos.
Backup completo em JSON
Exporta e importa fichas, histórico, recordes, metas e exercícios personalizados. Lê também o backup do app web antigo.
Sem migração destrutiva
Toda mudança no banco tem migração versionada. O app prefere falhar ao abrir a apagar os seus treinos.
users/{uid}/{plans | sessions | prs | goals | exercises}/{id}

{
  updatedAt:        1760979660000,
  serverUpdatedAt:  1760979661204,
  deleted:          false,
  json:             "{ ...a ficha, como no aparelho }"
}

Estrutura de cada documento no Firestore. O conteúdo é o mesmo JSON do backup.

Código aberto

Instale, treine, e leia o código se quiser.

Kotlin, Compose e Room. Testes com JUnit e Robolectric. O APK de debug sai em cada execução do CI.