Este repositorio define las reglas, formato del torneo y base tecnica para construir una app de prode del Mundial 2026.
Objetivo del juego:
- Cada participante crea su propio prode.
- En cada partido, el participante ingresa su pronostico de goles para ambos equipos.
- El juego recorre todo el torneo: fase de grupos, llaves eliminatorias y final.
- Gana quien sume mas puntos.
El sistema de puntuaciรณn es 100% configurable por torneo desde el panel de administraciรณn. Cada torneo almacena su configuraciรณn completa en formato JSON.
Cada fase del torneo tiene 4 parรกmetros configurables:
| Concepto | Descripciรณn |
|---|---|
| Resultado (outcome) | Acertar quiรฉn gana o si hay empate (1/X/2) |
| Resultado exacto (exact) | Acertar el marcador exacto (goles de ambos equipos) |
| Equipo en llave (bracketTeam) | Bonus por tener al equipo correcto en esa instancia de eliminaciรณn |
| Equipo lado incorrecto (bracketTeamWrongSide) | Bonus reducido si el equipo estรก en la fase pero por otra llave |
| Fase | Resultado | R. Exacto | Eq. en llave | Eq. lado incorrecto |
|---|---|---|---|---|
| Grupos | 1 | 1 | โ | โ |
| 32avos | 1 | 1 | 2 | 1 |
| Octavos | 1 | 1 | 3 | 1 |
| Cuartos | 1 | 1 | 4 | 2 |
| Semifinales | 1 | 1 | 5 | 2 |
| Final | 1 | 1 | 6 | 3 |
| Posiciรณn | Puntos |
|---|---|
| ๐ฅ Campeรณn | 10 |
| ๐ฅ Subcampeรณn | 6 |
| ๐ฅ Tercero | 5 |
- Desempate 1: mayor cantidad de resultados exactos.
- Desempate 2: mayor cantidad de puntos de bracket.
Cada participante debe tener:
- Usuario para iniciar sesion.
- Clave.
- Nombre (unico dentro del torneo).
- Fecha de alta.
- Estado (activo/inactivo).
Regla operativa inicial:
- Si no existe ningun usuario, el primero que se registra/inicia sesion se crea automaticamente como administrador.
- Luego de eso, los nuevos usuarios se crean desde el panel de administracion.
Roles:
- player: puede iniciar sesion y cargar su prode.
- admin: puede jugar y ademas administrar usuarios, reglas, bloqueo global y resultados.
Ejemplo:
- Juan Perez
- Maria Gomez
- Pedro Ruiz
Cada partido debe tener inputs para:
- Goles Equipo A (numero entero >= 0).
- Goles Equipo B (numero entero >= 0).
Reglas de carga:
- Solo se puede pronosticar antes del inicio del partido.
- Si el partido ya empezo, el pronostico queda bloqueado.
- Cada participante puede guardar un solo pronostico por partido (si edita, reemplaza el anterior mientras este abierto).
El torneo se divide en 12 grupos de 4 equipos.
| Grupo | Equipo 1 | Equipo 2 | Equipo 3 | Equipo 4 |
|---|---|---|---|---|
| A | ๐ฒ๐ฝ Mexico | ๐ฟ๐ฆ Sudafrica | ๐ฐ๐ท Corea del Sur | ๐จ๐ฟ Rep. Checa |
| B | ๐จ๐ฆ Canada | ๐ง๐ฆ Bosnia y Herz. | ๐ถ๐ฆ Catar | ๐จ๐ญ Suiza |
| C | ๐ง๐ท Brasil | ๐ฒ๐ฆ Marruecos | ๐ญ๐น Haiti | ๐ด Escocia |
| D | ๐บ๐ธ Estados Unidos | ๐ต๐พ Paraguay | ๐ฆ๐บ Australia | ๐น๐ท Turquia |
| E | ๐ฉ๐ช Alemania | ๐จ๐ผ Curazao | ๐จ๐ฎ Costa de Marfil | ๐ช๐จ Ecuador |
| F | ๐ณ๐ฑ Paises Bajos | ๐ฏ๐ต Japon | ๐น๐ณ Tunez | ๐ต๐ฑ Polonia |
| G | ๐ง๐ช Belgica | ๐ช๐ฌ Egipto | ๐ฎ๐ท Iran | ๐ณ๐ฟ Nueva Zelanda |
| H | ๐ช๐ธ Espana | ๐จ๐ป Cabo Verde | ๐ธ๐ฆ Arabia Saudita | ๐บ๐พ Uruguay |
| I | ๐ซ๐ท Francia | ๐ธ๐ณ Senegal | ๐ณ๐ด Noruega | ๐ฎ๐ถ Irak |
| J | ๐ฆ๐ท Argentina | ๐ฉ๐ฟ Argelia | ๐ฆ๐น Austria | ๐ฏ๐ด Jordania |
| K | ๐ต๐น Portugal | ๐จ๐ฉ RD Congo | ๐บ๐ฟ Uzbekistan | ๐จ๐ด Colombia |
| L | ๐ด Inglaterra | ๐ญ๐ท Croacia | ๐ฌ๐ญ Ghana | ๐ต๐ฆ Panama |
Clasifican 32 equipos:
- 1 y 2 de cada grupo (24 equipos).
- Los 8 mejores terceros.
La organizacion de cruces busca evitar que equipos del mismo grupo se crucen temprano.
Llave superior (referencia de cruces):
- Ganador Grupo A vs 3 C/E/F.
- Ganador Grupo B vs 3 A/C/D.
- Ganador Grupo E vs 2 Grupo F.
- Ganador Grupo F vs 2 Grupo E.
- Ganador Grupo I vs 3 G/H/J.
- Ganador Grupo J vs 2 Grupo I.
Llave inferior (referencia de cruces):
- Ganador Grupo C vs 2 Grupo D.
- Ganador Grupo D vs 3 B/E/F.
- Ganador Grupo G vs 3 I/J/L.
- Ganador Grupo H vs 2 Grupo G.
- Ganador Grupo K vs 2 Grupo L.
- Ganador Grupo L vs 2 Grupo K.
- Juegan los 16 ganadores de la ronda de 32.
- La llave superior y la llave inferior se mantienen separadas hasta la final.
- Participan 8 equipos.
- Sedes previstas en EE. UU.: Los Angeles, Kansas City, Miami y Boston.
- Semi 1: ganador de la llave superior (grupos A, B, E, F, I, J).
- Semi 2: ganador de la llave inferior (grupos C, D, G, H, K, L).
- Fecha: 19 de julio de 2026.
- Estadio: MetLife Stadium, Nueva Jersey (Nueva York).
- Partido: ganador Semi 1 vs ganador Semi 2.
Dato clave:
- El campeon jugara 8 partidos para levantar la copa.
Para una primera version:
- Gestion de participantes.
- Listado de partidos por fase.
- Formulario de pronostico por partido.
- Carga de resultados reales.
- Calculo automatico de puntos.
- Tabla de posiciones global.
Stack recomendado:
- Frontend/App: SvelteKit.
- Estilos: Tailwind CSS.
- Base de datos: Turso (libSQL).
- Acceso a datos: Drizzle ORM con driver libSQL.
- Adaptador de produccion: @sveltejs/adapter-node.
- Autenticacion actual: usuario + clave con sesiones persistentes en base de datos.
Variables de entorno necesarias:
- TURSO_DATABASE_URL
- TURSO_AUTH_TOKEN
- SESSION_DURATION_DAYS
- ORIGIN
Modelo de datos inicial sugerido:
-
participants
- id
- name
- active
- created_at
-
teams
- id
- name
- group_code
-
matches
- id
- stage (groups, round1, quarterfinal, semifinal, final)
- group_code (nullable)
- team_a_id
- team_b_id
- kickoff_at
- score_a (nullable)
- score_b (nullable)
- is_closed
-
predictions
- id
- participant_id
- match_id
- pred_a
- pred_b
- created_at
- updated_at
- unique(participant_id, match_id)
-
points
- id
- participant_id
- match_id
- points_awarded
- reason
Rutas de app:
- /participantes
- /partidos
- /pronosticos
- /tabla
- /admin/resultados
Endpoints server (ejemplo):
- GET /api/matches
- POST /api/predictions
- POST /api/results
- GET /api/leaderboard
- Inicializar proyecto SvelteKit con Tailwind y Flowbite.
- Configurar Turso y Drizzle.
- Crear esquema y migraciones.
- Seed de equipos y partidos de fase de grupos.
- CRUD de participantes.
- Formulario de pronosticos por partido.
- Modulo de resultados reales + calculo de puntos.
- Tabla de posiciones y desempates.
- Soporte completo de llaves hasta la final.
Inicio rapido recomendado (primera corrida):
pnpm bootstrapEste comando ejecuta instalacion, corre smoke test de health (que dispara auto-inicializacion), valida tablas/migraciones y chequea compilacion.
Ademas, en runtime la app auto-inicializa la base local en el primer arranque y completa columnas faltantes si detecta un schema parcial.
- Instalar dependencias:
pnpm install- Crear variables de entorno:
cp .env.example .env- Levantar la app:
pnpm dev- Abrir login y crear el primer usuario. Ese usuario sera administrador automaticamente si todavia no existe ninguno.
Comandos principales:
pnpm check
pnpm build
pnpm startBase de datos:
- La app usa Turso/libSQL.
- Si no se define TURSO_DATABASE_URL, por defecto usa file:local.db para desarrollo local.
- El schema base tambien esta definido en drizzle.config.ts y drizzle/0000_initial.sql.
Comandos utiles de base:
pnpm db:generate
pnpm db:pushContenedor:
- Hay Dockerfile listo para construir imagen Node y publicar el build de SvelteKit.
Healthcheck:
- Endpoint de verificacion: /health
- Incluye diagnostico de base: dbReady, schemaVersion y expectedSchemaVersion.
- Las claves ya no se guardan en texto plano: se hashean con scrypt.
- Las sesiones se almacenan en base de datos y la cookie es httpOnly.
- En produccion la cookie se marca secure automaticamente.
- Todas las validaciones sensibles siguen ejecutandose del lado servidor.
- Se pueden crear participantes con nombre.
- Se pueden cargar pronosticos para todos los partidos.
- Se pueden cargar resultados reales.
- Se calculan puntos automaticamente.
- Se visualiza ranking total ordenado por puntos.
- Se identifica ganador del prode al terminar la final.
Este README define la logica de negocio del prode y la estructura del torneo. Si FIFA ajusta cruces oficiales de ronda de 32, se actualiza esta seccion sin cambiar la base del sistema de puntuacion.
El stack de produccion usa:
- Cloud Run (Google): corre el servidor SvelteKit SSR
- Google OAuth: login con cuenta de Google
cp .env.cloudrun.example .env.cloudrun
# editar .env.cloudrun con tus valores reales
pnpm ship| Variable | Descripcion |
|---|---|
GCP_PROJECT_ID |
ID del proyecto GCP |
TURSO_DATABASE_URL |
URL de Turso DB |
TURSO_AUTH_TOKEN |
Token de Turso |
ORIGIN |
URL publica (ej: https://tu-dominio.com) |
GOOGLE_CLIENT_ID |
Client ID de Google OAuth |
GOOGLE_CLIENT_SECRET |
Client Secret de Google OAuth |
- docs/deploy-guia-completa.md โ Guia paso a paso de deploy a Cloud Run
- docs/cloudrun-deploy.md โ Deploy rapido a Cloud Run