OpenAthlete
AGPLv3 기반 지구력 훈련 플랫폼—EU 호스팅, 투명한 로직, 자체 호스팅·전체 내보내기 지원
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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.