OpenTrailPaper
LilyGO T5S3 4.7" E-Paper PRO용 오픈소스 자전거 컴퓨터 펌웨어, 오프라인 지도·GPX 경로·FIT 기록·블루투스 센서 지원
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 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.