Wings Cup.
Wings Cup es una plataforma social de pronósticos construida en torno al Mundial 2026, donde grupos de amigos compiten en salas privadas pronosticando el marcador de cada partido.
Resumen
Wings Cup es una plataforma social de pronósticos construida en torno al Mundial 2026, donde grupos de amigos compiten en salas privadas pronosticando el marcador de cada partido. Cada sala tiene un dueño, un código de invitación y su propia tabla de posiciones, con un sistema de puntuación ponderado que premia el marcador exacto por encima de la diferencia de goles, y esta por encima del simple resultado. El principal desafío de ingeniería fue la equidad: los pronósticos deben bloquearse en el instante en que comienza un partido, sin posibilidad de editarlos después. En lugar de confiar en los relojes de los clientes o en frágiles endpoints de cron por HTTP, el bloqueo se ejecuta dentro de PostgreSQL mediante Supabase pg_cron, lo que hace que las reglas se apliquen en la propia capa de datos.
Pilares clave
Salas privadas e invitaciones
Un flujo guiado de varios pasos para crear salas, cada una con un dueño, un código de invitación para compartir y enlaces de acceso para sumar amigos.
Motor de puntuación ponderado
Marcador exacto (+5), diferencia de goles (+3) y resultado correcto (+1): reglas configurables que convierten cada partido en una decisión estratégica.
Pronósticos bloqueados al inicio
Los pronósticos se congelan en el momento en que comienza un partido y se revelan a los demás miembros, lo que mantiene el juego a prueba de manipulaciones.
Tabla de posiciones en vivo
Las posiciones de cada sala se actualizan automáticamente a medida que se cargan los resultados, con seguimiento del avance en los 104 partidos.
Consola de administración de partidos
Un panel de administración para cargar resultados, controlar los estados de los partidos (Programado, En vivo, Finalizado, Aplazado) y bloquear en lote los pronósticos de partidos ya en curso.
Reglas aplicadas en la base de datos con RLS
Row-Level Security y tareas programadas se ejecutan en PostgreSQL mediante Supabase, de modo que el control de acceso y el bloqueo de pronósticos viven donde están los datos.
Bloquear pronósticos sin confiar en el cliente
La integridad de todo el juego depende de una sola regla: ningún pronóstico puede cambiar después de que comienza un partido. Depender del reloj del navegador o de una solicitud iniciada por el usuario permitiría que cualquiera editara un pronóstico después de ver cómo se desarrolla el partido.
La solución
El bloqueo de pronósticos se sacó por completo del cliente y se llevó a la base de datos. Una tarea programada se ejecuta mediante Supabase pg_cron y congela cada partido cuya hora de inicio ya pasó, mientras que una acción de administración puede bloquear en lote los partidos que ya están en curso. La regla se aplica del lado del servidor, en PostgreSQL, sin depender de ningún cliente.
"Equidad garantizada por el reloj de la base de datos, no por el navegador del jugador."
Visibilidad multi-tenant sin filtrar pronósticos
Las salas son competencias privadas: los miembros solo deben ver los pronósticos de los demás una vez que comienza el partido, y nunca los datos de salas a las que no pertenecen. Manejar esto mal filtra estrategia entre rivales o expone por completo a otros grupos.
La solución
Los límites de acceso se codificaron como políticas de Row-Level Security de Supabase, de modo que un miembro solo puede leer los pronósticos de las salas a las que pertenece y solo después de que se cumple la condición de revelado. La autorización vive en la base de datos, no dispersa en guards de la UI que son fáciles de eludir.
"Reglas de visibilidad expresadas como políticas RLS en lugar de verificaciones confiadas al cliente."
Todos los partidos y estados de un torneo
Un Mundial abarca 104 partidos entre la fase de grupos y las eliminatorias, cada uno pasando por los estados programado, en vivo, finalizado y aplazado, y cada cambio de estado repercute en la puntuación, el bloqueo y la tabla de posiciones.
La solución
El ciclo de vida de los partidos se modeló como estados explícitos con transiciones claras, acompañados de validación con Zod y stores de Pinia en el frontend. Finalizar un partido con un marcador final dispara el reparto automático de puntos: el administrador gestiona el estado y la puntuación sigue siendo un resultado derivado y determinístico.
"El estado del partido como única fuente de verdad que impulsa la puntuación automáticamente."
¿Listo para explorar el código?
Wings Cup es de código abierto y está disponible para revisión. Conoce las decisiones de arquitectura detrás de este proyecto.