尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Carnet de hincha del fútbol chileno. Marcas los partidos de tu club a los que fuiste al estadio y la app calcula tu efectividad como hincha (Mufómetro), tus clásicos, finales, rachas, el modo Infiltrado y rankings de hinchas por club.
Réplica funcional de TribunaStats (fútbol argentino), adaptada al fútbol chileno.
| Funcionalidad | Dónde | Detalle |
|---|---|---|
| Carnet de hincha (registro / ingreso) | /registro, /ingresar | Usuario + club. Sesiones con cookie httpOnly; contraseñas con scrypt. |
| Marcar partidos | /partidos | Filtros por temporada, competición y rival. Tres estados por partido: No fui, Fui, Infiltrado. Solo partidos del propio club y ya jugados. |
| Importar desde PuntoTicket | /importar | Pegas el correo de confirmación de compra (o subes el .eml) y se proponen los partidos que coinciden por fecha (±1 día) y rival. El hincha confirma; el correo no se guarda. |
| Mufómetro | /carnet | Efectividad = puntos obtenidos / en disputa en los partidos que viste. >60% cábala, 40–60% neutro, <40% yeta (mínimo 5 partidos). |
| Impacto real | /carnet | Tu efectividad vs. la del club en todas sus partidos de esas mismas temporadas. |
| Clásicos | /carnet, /clubes/[id] | Superclásico, Clásico Universitario, Porteño, de Colonias, etc. (data/catalog/rivalries.json). |
| Finales | /carnet, /clubes/[id] | Finales de playoffs, Copa Chile y Libertadores, con definición a penales. |
| Modo Infiltrado | /carnet | Partidos en la galería rival: cuentan para el Mufómetro y además se muestran aparte. |
| Rachas y partidos memorables | /carnet | Racha ganadora / invicta / sin ganar, mayor goleada, peor derrota, primer y último partido. |
| Desgloses | /carnet | Por temporada, competición, rival, local/visita. |
| Carnet público | /hincha/[usuario] | Privado por defecto; el hincha lo hace público al registrarse o desde /perfil. |
| Términos y privacidad | /terminos, /privacidad, /aceptar | Vigentes (Ley 19.628 / 21.719). Versiones en src/lib/legal.ts; al subir una versión, el hincha debe aceptarla en /aceptar. Consentimientos en la tabla consents. |
| Privacidad y datos | /perfil, /perfil/datos | Descargar mis datos (JSON), perfil público, cerrar todas las sesiones y eliminar la cuenta. |
| Rankings | /rankings, /rankings/[club] | Hinchas que más fueron, mayores cábalas y mayores yetas por club. |
| Historial de clubes | /clubes, /clubes/[id] | Récord histórico, por temporada, clásicos y finales. |
| Transparencia de datos | /datos | Cobertura por competición y resultado de los chequeos de calidad. |
data/
sources.json configuración de fuentes (URL, licencia, archivos por competición)
catalog/ catálogo versionado: clubes (+alias), competiciones, clásicos
corrections.csv correcciones confirmadas con evidencia (opcional)
crosscheck/*.csv segundas fuentes para marcar partidos como verificados (opcional)
raw/ descargas crudas (no versionadas)
scripts/
fetch.ts descarga los archivos de la fuente
ingest.ts parsea, normaliza nombres y carga partidos (idempotente)
verify.ts correcciones + verificación cruzada + chequeos de consistencia
src/
lib/db/ esquema SQL (SQLite y Postgres) y conexión con una interfaz común
lib/domain/ lógica pura: Mufómetro, rachas, clásicos, finales, normalización
lib/ingest/ parser Football.TXT, catálogo, CSV, chequeos de calidad
lib/repo/ acceso a datos (partidos, clubes, usuarios/asistencias, rankings)
lib/auth.ts sesiones (cookies) para Server Components / Server Actions
app/ Next.js App Router: páginas + server actions (actions.ts)
components/ UI (Mufómetro SVG, barras G/E/P, fila de partido, selector de asistencia)
tests/ Vitest: dominio, parser, repositorios y calidad de datos
DATABASE_URL. En desarrollo y en los tests se usa SQLite vía node:sqlite (Node 22.13 o superior).
lib/domain/stats.ts no conoce la base de datos: recibe partidos y
devuelve el carnet completo.fecha_local_visita) para deduplicar entre fuentes y hacer la
ingesta idempotente.La búsqueda y verificación de fuentes la hicieron dos agentes independientes: uno buscó plataformas y otro auditó la elegida.
Fuente principal: resultados de worldfootball.net, vía el espejo en formato Football.TXT
yorobot/cache.wfb.txt. Son unos 7.800 partidos:
El repositorio fuente no declara licencia, por eso los datos crudos no se versionan aquí: se descargan
con npm run data:fetch.
| Competición / período | Nivel | Evidencia |
|---|---|---|
| Primera, fase regular 2004–2023 | Alta | El campeón calculado desde los partidos coincide con el oficial en 21 de 21 torneos. Muestra aleatoria contrastada con prensa: 0 errores. |
| Finales 2003–2013 | Alta en el campeón | Los 17 campeones coinciden. Faltaban detalles (marcador de 90', penales), ya corregidos. |
| Playoffs 2004–2006 | Media-baja → corregida | 9 partidos corregidos con evidencia en data/corrections.csv. |
| Copa Chile 2015–2023 | Alta | Finales verificadas. |
| 2024 (liga y copa) | Baja | La copia se cortó en la fecha 23 de la liga y antes de las semifinales de la copa. |
data/corrections.csv guarda cada error confirmado con la URL de su evidencia. Se
aplican automáticamente en cada ingesta.data/crosscheck/ contiene partidos contrastados con fuentes independientes
(prensa, ESPN). Esos partidos quedan marcados verified = 1.Huecos conocidos:
Para la temporada en curso se recomienda API-Football (liga 265, plan de pago). Para 2001–2003 se recomienda RSSSF.
PuntoTicket, la ticketera de la mayoría de los partidos del fútbol chileno, no publica una API ni un programa de afiliados. Por eso la integración rápida se apoya en lo único que todo comprador tiene: el correo de confirmación de compra.
src/lib/ingest/tickets.ts hace el trabajo:
.eml (quoted-printable, base64 y HTML);10/08/2024, 10 de agosto de 2024, ISO);Capturas de la app en docs/capturas/.
npm install
npm run data:fetch # descarga datos crudos a data/raw/
npm run data:ingest # crea data/galeriastats.db y carga catálogo + partidos
npm run data:verify # correcciones, verificación cruzada y chequeos
npm run dev # http://localhost:3000
npm test corre la suite de Vitest y npm run lint hace el chequeo de tipos.
Requiere Node 22.13 o superior.
npm run demo:build genera demo/dist/index.html: una versión de la app en un solo archivo.
Vercel publica la app y su panel crea una base Postgres gratuita (Neon). En cada despliegue, el build
descarga y carga los partidos (vercel-build). Los archivos sin cambios se omiten, así que los despliegues
siguientes son rápidos.
DATABASE_URL sola.https://<proyecto>.vercel.app).Variable opcional: INGEST_FORCE=1 recarga todos los partidos en el próximo despliegue.
El repo también trae Dockerfile, railway.json y scripts/start.sh. Con ellos la app usa SQLite en
un volumen persistente montado en /data. En el primer arranque se descargan y cargan los partidos solos.
Variables opcionales:
DATABASE_PATH: por defecto es /data/galeriastats.db.REINGEST=1: fuerza a recargar los partidos en el próximo arranque.DATABASE_URL: si la defines, la app usa Postgres en vez de SQLite.