BikeControl (SwiftControl)
Use Zwift Click, Zwift Play, Shimano Di2, or any Bluetooth controller with MyWhoosh, Rouvy, Zwift, and more. Free to try on iOS, Android, Windows, and macOS.
Record and track gym workouts for personal trainers and students.
AI translation
Registro e acompanhamento de treinos de academia para Personal e Aluno.
Sports & fitnessTypeScript · PLpgSQLGitHub @ThayllesOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Bora treinar? Registro e acompanhamento de treinos de academia para Personal/Instrutor e Aluno. Aplicação web mobile-first (PWA) em português do Brasil, com fuso de referência America/Sao_Paulo. O padrão decorativo de fundo é inspirado no calçadão de Copacabana (ondas em pedra portuguesa), aplicado de forma sutil.Read the full README ↗
Bora treinar? Registro e acompanhamento de treinos de academia para Personal/Instrutor e Aluno.
Aplicação web mobile-first (PWA) em português do Brasil, com fuso de referência America/Sao_Paulo.
| Elemento | Escolha | Por quê |
|---|---|---|
Verde Bandeira #009C3B | cor primária (ações, sucesso, "série feita") | verde da bandeira, energia e vitalidade |
Amarelo Ipê #FFC72C | destaque (recordes, timer, CTA) | o ipê-amarelo e o ouro da bandeira |
Azul Anil #002776 | texto forte, cabeçalhos | azul do círculo da bandeira |
Coral Pitanga #FF5A36 | alertas, "não feita", pesagem vencida | fruta bem brasileira, chama atenção sem ser agressiva |
Areia #FFF8E7 | fundo claro | lembra praia/calçadão |
| Tipografia | Baloo 2 (títulos) + Inter (texto) | Baloo tem cara de "papo de academia", arredondada e amigável |
| Logo | halter estilizado dentro de um losango verde-amarelo | releitura do losango da bandeira |
| Tom de voz | "Bora!", "Mandou bem!", "Partiu treino", "Tá pago ✅" | gírias de academia brasileira |
O padrão decorativo de fundo é inspirado no calçadão de Copacabana (ondas em pedra portuguesa), aplicado de forma sutil.
Pré-requisitos: Node.js 20+ e uma conta no Supabase (ou o Supabase CLI com Docker).
git clone https://github.com/thaylles/boratreinar.git
cd boratreinar
npm install
cp .env.example .env.local # preencha as variáveis
npm run dev # http://localhost:3000
As migrações SQL ficam em supabase/migrations/. O catálogo padrão é uma migração de dados gerada por python3 scripts/catalogo.py (as ilustrações, por python3 scripts/gerar-ilustracoes.py). O logo e os ícones saem de python3 scripts/gerar-icones.py (os PNGs são renderizados a partir dos SVGs gerados).
# Com Supabase CLI ligado a um projeto remoto
npx supabase link --project-ref SEU_PROJECT_REF
npx supabase db push
# Ou localmente (Docker)
npx supabase start
npx supabase db reset # aplica migrações + seed
Veja .env.example. Resumo:
| Variável | Onde | Descrição |
|---|---|---|
NEXT_PUBLIC_APP_URL | cliente/servidor | URL pública do app (links de convite, e-mails) |
NEXT_PUBLIC_SUPABASE_URL | cliente/servidor | URL do projeto Supabase |
NEXT_PUBLIC_SUPABASE_ANON_KEY | cliente/servidor | chave pública (anon) |
SUPABASE_SERVICE_ROLE_KEY | só servidor | usada pelo cron do relatório |
RESEND_API_KEY / EMAIL_FROM | só servidor | envio de e-mails (relatório e lembrete das 7h; sem elas, só a notificação no app) |
GEMINI_API_KEY / GEMINI_MODEL | só servidor | sugestões do relatório pelo Gemini (opcional; faixa gratuita no Google AI Studio) |
ANTHROPIC_API_KEY / ANTHROPIC_MODEL | só servidor | sugestões do relatório pelo Claude (opcional) |
CRON_SECRET | só servidor | protege a rota do cron |
Nenhum segredo vai para o repositório: .env* está no .gitignore (exceto .env.example).
npx supabase db push).https://SEU-DOMINIO/auth/confirm em Redirect URLs (para previews: https://*-SEU-USUARIO.vercel.app/auth/confirm).
{{ .SiteURL }}/auth/confirm?token_hash={{ .TokenHash }}&type=email&next=/personal e o de Reset password por
{{ .SiteURL }}/auth/confirm?token_hash={{ .TokenHash }}&type=recovery&next=/redefinir-senha.
Assim o link funciona mesmo se aberto em outro aparelho/navegador.vercel.json já agenda os crons (em UTC; Brasil sem horário de verão desde 2019):
0 1 * * 1 = domingo 22h em São Paulo;0 10 * * * = todo dia às 7h em São Paulo.
No plano Hobby da Vercel o cron pode disparar em qualquer minuto daquela hora; no Pro, no minuto exato.CRON_SECRET na Vercel — ela envia esse valor automaticamente no header Authorization das chamadas de cron.| Comando | O quê |
|---|---|
npm run dev | servidor de desenvolvimento |
npm run build | build de produção |
npm run lint | ESLint |
npm run typecheck | checagem de tipos |
npm run test:unit | testes de unidade das funções puras (telefone, WhatsApp, agenda, estatísticas do dashboard) |
npm run test:db | aplica as migrações num Postgres descartável (com stub do Supabase) e roda os testes SQL de RLS. Use PGHOST/PGPORT/PGUSER para apontar o servidor |
/cadastro e confirma o e-mail./convite/<token>. O cadastro é feito no servidor com a service role e a conta já nasce confirmada; um gatilho no banco valida o convite (pendente, não expirado, não revogado), exige o aceite do termo e o WhatsApp, e cria o vínculo com o Personal.SECURITY DEFINER no Postgres; as tabelas têm RLS e só permitem leitura do que cada perfil pode ver..gitignore, licença MIT, .env.examplevercel.json com cron do relatórioboratreinar, região São Paulo)main)npm run test:db)scripts/catalogo.py e scripts/gerar-ilustracoes.pyimage_credit já existe)apply_plans_to_students)fichas e sessoes_treino aplicadas no Supabase de produçãonpm run test:unit) para telefone, link do WhatsApp e cálculo da agendatraining_summary, training_overview, security invoker: o RLS decide o que cada um vê), com testes SQL e de unidadeweekly_reports com RLS (Personal só lê os seus; só o servidor grava) + testes SQL e de unidadepublic/sw.js): telas de treino abrem sem internet (rede primeiro, cópia local), estáticos e imagens em cache, página offline.html para o resto; cache de páginas apagado ao sair da contascripts/gerar-icones.py gera favicon, ícones do PWA e o logo)update public.profiles set role = 'admin' where email = '...')set_equipment_image) e testadas (14_admin.test.sql)