OpenAthlete
AGPLv3 endurance training platform: EU-oriented hosting, transparent CTL/ATL/TSB logic in code, self-hosting, and full export. Built in Grenoble.
Simulador de apostas de UFC com dinheiro fictício e odds reais.
Translation pending
Sports & fitnessPython · TypeScriptGitHub @lucasmagalhaeesOnlineOwner 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
brinque sem ter medo financeiro
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
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.Read the full 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.