OpenAthlete
AGPLv3 endurance training platform: EU-oriented hosting, transparent CTL/ATL/TSB logic in code, self-hosting, and full export. Built in Grenoble.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证brinque sem ter medo financeiro
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Brinque sem ter medo financeiro. No ar em https://oito-lados.vercel.app. Simulador de apostas de UFC com dinheiro fictício e odds reais. Você deposita quanto quiser de mentira, aposta no card da semana e o app acompanha as lutas ao vivo e fecha as apostas com o resultado oficial. Nenhum centavo de verdade entra ou sai. As telas acima vêm do teste automatizado, com lutadores e resultados inventados.查看完整 README ↗
Brinque sem ter medo financeiro.
No ar em https://oito-lados.vercel.app.
Simulador de apostas de UFC com dinheiro fictício e odds reais. Você deposita quanto quiser de mentira, aposta no card da semana e o app acompanha as lutas ao vivo e fecha as apostas com o resultado oficial. Nenhum centavo de verdade entra ou sai.
| Lutas | Cupom | Ao vivo | Carteira |
|---|---|---|---|
As telas acima vêm do teste automatizado, com lutadores e resultados inventados.
É uma página estática. O navegador consulta a API pública da ESPN para montar o card, ler as odds e acompanhar status, resultado e estatísticas.
O código é TypeScript em módulos (src/). O build do Vite gera dist/index.html, a página inteira num arquivo, com script e estilo dentro, e dist/sw.js, o service worker que guarda essa página no aparelho. É isso que os testes usam e o que vai para o ar.
| De onde vem | |
|---|---|
| Vencedor, método por lutador, vai até a decisão, linha principal de rounds | Odds publicadas pela casa (hoje DraftKings), via ESPN |
| Quedas, round exato, linhas alternativas de rounds, combinadas | Estimadas por um modelo próprio a partir das odds reais e do histórico dos lutadores. Aparecem com ≈ |
| Liquidação | Sempre o resultado oficial: vencedor, método, round, tempo e quedas |
| Cotação para trocar a moeda da banca | Frankfurter (api.frankfurter.dev), consultado só quando um depósito muda a moeda |
Saldo e apostas ficam no localStorage do aparelho. Com o login, uma cópia vai para o Supabase (plano grátis) e é juntada com a de outro aparelho; o aparelho continua sendo a fonte, e o app funciona sem o servidor. Uma função da Vercel, chamada uma vez por dia, mantém o banco acordado. Montar o projeto: supabase/README.md. A Carteira salva um backup em arquivo, que dá para mandar por mensagem, e restaura a partir dele; também copia e cola o backup como texto.
A especificação completa (endpoints, formato dos dados, modelo de preço e regras de liquidação) está em CLAUDE.md.
Precisa de Node 22 ou mais novo.
npm ci
npm run dev # servidor de desenvolvimento; abra o endereço que ele mostrar
npm run build # gera dist/index.html e dist/sw.js, o que é publicado
npm ci # Vite e TypeScript
pip install -r tests/requirements.txt
playwright install chromium
npm ci --prefix tests # arquivos do leitor de imagem usados no teste
scripts/verify.sh # confere os tipos, faz o build e roda tudo contra a página gerada
| Teste | O que confere |
|---|---|
tests/unit.cases.mjs | Os casos do núcleo: conversão de odds, modelo de preço, combinadas, cada regra de liquidação, o leitor de apostas e o histórico. Rodam duas vezes: no navegador, contra a página gerada (tests/unit.py), e no Node, contra o núcleo sozinho (tests/core.mjs) |
tests/contract.py | Os leitores da ESPN e do serviço de câmbio contra respostas reais gravadas em tests/fixtures/ |
tests/docs_check.py | A documentação contra o código: links, arquivos, constantes, chaves |
tests/e2e.py | O fluxo inteiro pela interface, com a ESPN simulada, do pré-luta ao resultado |
tests/settle.py | A liquidação quando a ESPN não responde tudo de uma vez: resultado que atrasa e resultado com nome desconhecido. E o app aberto com o card pela metade |
tests/pwa.py | O service worker, com a página servida por um servidor local: abrir sem conexão, aviso de versão nova e troca pelo botão |
tests/cov.py | Cobertura de código, medida pelo navegador durante os testes. O verify.sh falha abaixo de 95% das funções ou 90% do código |
tests/contract_live.py | A API real da ESPN e o serviço de câmbio. Roda toda semana no GitHub Actions e avisa se o formato mudar |
scripts/check_production.py | Depois de cada merge, se a produção está no commit da main e continua nele |
Tudo, menos os dois últimos, roda no GitHub Actions em cada PR e em cada push na main. Se mesclar vários PRs, faça um por vez e espere o deploy: merges em sequência já deixaram a produção numa versão antiga.
O projeto é mantido com ajuda de IA e tem um harness para ela não afirmar o que não verificou: um comando único de verificação, contrato com respostas reais da API, documentação conferida contra o código, um hook que impede o Claude Code de encerrar a tarefa com checagem falhando, e um registro do que foi e do que não foi verificado. As regras estão em CLAUDE.md; as decisões, em docs/decisoes.md; o registro, em docs/verificacao.md.
main.main. O CI roda os testes e a Vercel publica uma prévia do PR.main publica em produção.Configuração, uma vez só:
vercel.json já diz como construir (npm ci, npm run build, publicar dist/). A partir daí o deploy é automático.main exigindo PR e os checks checks, e2e (dark) e e2e (light). Assim só código testado chega à produção.No iPhone: abra a URL de produção no Safari, toque em Compartilhar e em Adicionar à Tela de Início.
index.html esqueleto da página, entrada do build
src/core/ lógica pura: odds, leitores da ESPN, preço, liquidação, cashout
src/app/ a página: estado, rede, telas e eventos
src/main.ts ponto de entrada
src/sw.js service worker: guarda o app no aparelho
api/keepalive.ts rotina diária que mantém o banco acordado
supabase/schema.sql tabela e regras de acesso do banco
supabase/README.md como montar o projeto do Supabase
package.json Vite e TypeScript, em versões exatas
vite.config.js build: a página num arquivo só, mais o service worker
tsconfig.json TypeScript em modo strict
vercel.json como a Vercel constrói e publica
scripts/verify.sh comando único de verificação
scripts/check_production.py confere a produção contra a main
tests/unit.cases.mjs casos do núcleo (preço, liquidação, leitor, histórico)
tests/unit.py os casos no navegador, contra a página gerada
tests/core.mjs os mesmos casos no Node, sem navegador
tests/keepalive.mjs a rotina diária, com a rede trocada
tests/schema_check.sh o schema num Postgres local
tests/cloud_live.py conferência do projeto do Supabase de verdade
tests/contract.py leitores da ESPN contra respostas reais gravadas
tests/contract_live.py conferência da API real da ESPN
tests/docs_check.py documentação conferida contra o código
tests/e2e.py teste ponta a ponta
tests/settle.py liquidação com a ESPN simulada segurando respostas
tests/mock_espn.py ESPN simulada, com lutadores fictícios
tests/pwa.py abrir sem conexão e trocar de versão
tests/cov.py cobertura de código medida pelo navegador
tests/package.json cópias locais do leitor de imagem para o teste
tests/fixtures/espn/ respostas reais da ESPN, reduzidas
tests/fixtures/fx/ resposta real do serviço de câmbio
docs/decisoes.md o que foi decidido e por quê
docs/verificacao.md o que foi verificado e o que não foi
docs/escala.md caminho de escala
docs/screenshots/ telas usadas neste README
.github/workflows/ci.yml testes em cada PR e push na main
.github/workflows/espn-contract.yml conferência semanal da API real
.github/workflows/producao.yml conferência da produção depois de cada merge
.claude/settings.json hook de parada do Claude Code
CLAUDE.md especificação e regras do projeto
É um MVP para um usuário, simples de propósito. O que muda se precisar crescer está em docs/escala.md.
Projeto de entretenimento. Não aceita, movimenta nem paga dinheiro real, e não é uma casa de apostas. Não tem vínculo com UFC, ESPN ou DraftKings; nomes e marcas pertencem aos respectivos donos. As odds são exibidas apenas como referência para a simulação.
MIT © 2026 Lucas Magalhães
Nos sistemas que não têm emoji de bandeira (Windows), as bandeiras vêm da fonte "Twemoji Country Flags", do pacote country-flag-emoji-polyfill (MIT, TalkJS), carregada da jsDelivr. A arte das bandeiras é do Twemoji, sob CC-BY 4.0.