尚未检测到更新。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.