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.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Live scoring, standings and stats platform for Chile's Top 10 rugby league. Next.js + Fastify monorepo with automated data ingestion from ARUSA and Leverade.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
🏉 Rugby Chile — Itaú Top 10 Rugby Chile — Itaú Top 10 is an unofficial live portal for Chile's top-flight rugby-union league (ARUSA Primera División): live standings, results, fixtures, player stats, news, a fantasy game, and — the centerpiece — a Monte Carlo season-projection model (50k simulations, walk-forward backtest, coordinate-descent calibration on log-loss). Next.js + Fastify monorepo; data comes from the league's public feeds (Leverade + arusa.cl). Live demo: https://top10chile.vercel.app (Vercel + Render + Neon — ver DEPLOY.md). (El resto del README está en español.)README 전문 보기 ↗
Rugby Chile — Itaú Top 10 is an unofficial live portal for Chile's top-flight rugby-union league (ARUSA Primera División): live standings, results, fixtures, player stats, news, a fantasy game, and — the centerpiece — a Monte Carlo season-projection model (50k simulations, walk-forward backtest, coordinate-descent calibration on log-loss). Next.js + Fastify monorepo; data comes from the league's public feeds (Leverade + arusa.cl).
Live demo: https://top10chile.vercel.app (Vercel + Render + Neon — ver DEPLOY.md).
(El resto del README está en español.)
/proyeccion corre una simulación de Monte Carlo de lo que resta de temporada
(50.000 simulaciones) para estimar posiciones finales y probabilidad de título,
top-4 (playoffs), repechaje y descenso.
api/src/services/modelCore.ts): modelo aditivo determinista
de ataque/defensa + ventaja de localía + head-to-head, compartido por producción,
backtest y validación para que las tres nunca diverjan.h2hWeight).cd api
npm run backtest # corre el backtest y reporta accuracy / log-loss
npm run recalibrate # propone nuevos pesos (dry-run); --write para aplicar
La vista "Aciertos del modelo" es un termómetro read-only: compara lo proyectado
vs. lo real, pero no re-calibra sola. La re-calibración se hace a mano con
npm run recalibrate (recomendado cada 3-4 fechas, para no sobreajustar ruido).
Monorepo con npm workspaces. El web nunca toca la base de datos: todo pasa por la API.
rugby-chile/
├── web/ Next.js (App Router) — frontend + SSR. Puerto 3000.
├── api/ Fastify + Socket.IO — datos, scraping, modelo, live. Puerto 4000.
└── package.json (workspaces: web, api)
| Capa | Stack |
|---|---|
| Web | Next.js, React, Tailwind, shadcn/base-ui, TanStack Query, Zustand, socket.io-client, next-auth |
| API | Fastify, Socket.IO, Drizzle ORM (Postgres), node-cron, zod |
| DB | PostgreSQL (Neon en prod) — cache de arusa, historial, fantasy, auth, live_matches |
Convenciones de desarrollo (incluida una nota importante sobre la versión de Next.js de este repo): ver
web/AGENTS.md.
Todo lo que consumimos es público y sin autenticación:
finished): API JSON de Leverade
(api.leverade.com, torneo 1328550, 3 grupos = 3 divisiones)./match/{id}/results) — el JSON de Leverade no expone scores.minute_by_minute de arusa
(replica lo que hace el navegador anónimo en la página pública — sin bypass de auth)./admin/lineups, con modo "pegar texto" que parsea la nómina).
Opcionalmente se guarda el link al post público del club como fuente.arusa rate-limitea por IP (HTTP 429) cuando se le piden muchas páginas seguidas.
Por eso el scrape de marcadores: sirve de cache lo ya capturado (memoria + tabla
arusa_cache; el marcador final es inmutable → se guarda para siempre), solo pide un
puñado de partidos nuevos por llamada (fechas recientes primero), reintenta ante 429 con
backoff (circuit breaker) y pone en cooldown los partidos sin marcador. Así el backfill
de una temporada se completa solo en unos ciclos de 60 s y sobrevive a caídas de arusa.
Atribución. Los datos son propiedad de ARUSA (Asociación de Rugby de Santiago) y Leverade/Clupik. Este es un proyecto sin fines de lucro, sin publicidad y no afiliado a la liga ni a sus proveedores, hecho por un hincha con fines informativos. Todo scraper se identifica con un User-Agent propio que enlaza a este repo y respeta
robots.txt. Si algún titular de los datos quiere que se baje algo, se hace.
Requisitos: Node 20+, npm, y un PostgreSQL accesible (local o Neon).
# 1. Instalar dependencias (workspaces)
npm install
# 2. Variables de entorno
cp api/.env.example api/.env # DATABASE_URL, PORT, WEB_URL, JWT_SECRET
cp web/.env.example web/.env.local # DATABASE_URL, NEXTAUTH_*, NEXT_PUBLIC_API_URL
# 3. Crear las tablas (una vez)
cd api && npm run db:push && cd ..
# 4. Levantar web + api juntos
npm run dev
/health, rutas en /api/v1/*)La API, al arrancar, sincroniza arusa, reconstruye el historial del modelo y agenda los
cron jobs (poller de scores los fines de semana, noticias). Los datos de la liga llegan
solos; las nóminas se cargan a mano desde /admin/lineups.
Raíz
| Comando | Qué hace |
|---|---|
npm run dev | Web + API en paralelo (concurrently) |
npm run build | Build de web y api |
npm run test | Tests de web y api (vitest) |
API (cd api)
| Comando | Qué hace |
|---|---|
npm run dev | Fastify con tsx watch (hot reload) |
npm run build / start | Compila TS / corre el build |
npm run backtest | Backtest walk-forward del modelo |
npm run recalibrate | Propone/aplica nuevos pesos (--write) |
npm run db:push / db:studio | Drizzle: crear tablas / GUI |
Web (cd web)
| Comando | Qué hace |
|---|---|
npm run dev | Next.js dev |
npm run build / start | Build / servir prod |
npm run test | vitest |
npm run lint | eslint |
API (api/.env)
| Var | Uso |
|---|---|
DATABASE_URL | Postgres (Neon en prod) |
PORT | Puerto de la API (default 4000) |
WEB_URL | Origen permitido por CORS |
JWT_SECRET | Obligatorio — firma los cookies de sesión (la API no arranca sin él) |
Web (web/.env.local)
| Var | Uso |
|---|---|
NEXT_PUBLIC_API_URL | URL de la API |
NEXTAUTH_URL / NEXTAUTH_SECRET | next-auth |
DATABASE_URL | Solo si se usan features de DB en el web |
SEED_ADMIN_EMAIL | Email del admin a crear con db:seed (si falta, no se crea admin) |
Stack gratis (Vercel web + Render API + Neon Postgres). Paso a paso en
DEPLOY.md. El web solo necesita apuntar NEXT_PUBLIC_API_URL a la API.
web/src/lib/tournament.ts y
web/src/app/reglamento/page.tsx (el estado de cada partido se deriva de la fecha; una
fecha suspendida por lluvia se marca con postponed).POSICIONES.md.web/AGENTS.md.