[ 001 · PRODUCTO EN VIVO · MUNDIAL 2026 ]
Gran DT Mundial
Mi grupo de WhatsApp quería un prode para el Mundial. Les ofrecí algo más grande: un Gran DT del Mundial completo. Mantuvo a seis amigos en tres países hablando todos los días durante un mes.
- [ ROL ]
- Diseño · desarrollo · operación, en solitario
- [ STACK ]
- Cloudflare Workers + D1 · JS vanilla
- [ TEMPORADA ]
- 11 jun – 19 jul 2026 · 104 partidos
- [ LIGA ]
- 6 equipos anotados · 4 jugaron todas las fechas
- [ DATOS ]
- 3 fuentes, cruzadas por dorsal + nombre
Empezó como un prode.
El grupo quería un prode, el que arma cualquier grupo argentino en un Mundial. Contraoferté: ¿y si nos construyo un Gran DT de verdad (presupuesto, fichajes, capitanes, puntaje en vivo) y lo jugamos como un trabajo?
Se anotaron seis amigos. Cuatro jugaron todas las fechas. Esa es toda la base de usuarios. Gente real con plata emocional real sobre la mesa, en un torneo que no espera los bugs de nadie: cuando un partido arranca a las 21:00, el cierre de formaciones funciona o el juego se rompe delante de todos tus conocidos.
Con el grupo repartido en tres países, la liga fue nuestro huso horario compartido. Todos amanecían con la misma tabla, discutían los mismos fichajes y le echaban la culpa al mismo árbitro.
[ CONDICIONES — PRESUPUESTO $0 · FREE TIER — DE GUARDIA: 1 — VENTANA: TORNEO EN VIVO ]
Mobile-first desde el día uno. La liga entera jugó desde el teléfono.
Equipo, mercado, prode,
centro de partido.
Armado de equipo con presupuesto, mercado de fichajes, un prode montado a cada partido y un centro de partido en vivo, en una UI oscura de marcador con una barra de pestañas flotante diseñada para los pulgares.
[ 9' · EQUIPO ]
Tu equipo en una cancha de verdad
15 jugadores, $205M de presupuesto, siete formaciones, dos capitanes. La cancha es la interfaz: tocás una posición para fichar, tocás un jugador para hacerlo capitán. De cada fecha jugada queda guardada la foto de tu once, comprobantes para el grupo.
[ 27' · PRODE ]
Dos juegos en uno
El prode que el grupo pidió al principio vive adentro de la liga: marcador exacto +3, ganador +1. El mejor de cada fecha se lleva +2 puntos en el Gran DT, así los dos juegos se alimentan entre sí en vez de partir el grupo.
[ 63' · CENTRO DE PARTIDO ]
Cada punto, explicado
Goles, tarjetas y cambios en una cronología a dos columnas, el once real en la cancha. Cuando termina el partido, cada punto del Gran DT queda detallado por jugador: minutos, goles, asistencias, valla invicta, MVP. Nadie tuvo que preguntar jamás por qué sacó 43.
[ 88' · ELIMINATORIAS ]
Un cuadro que se completa solo
La llave se resuelve automáticamente a medida que caen los resultados de grupos: equipos, horarios y sedes los escribe el motor de sincronización, nunca una mano. La única vista diseñada primero en ancho, porque un cuadro es un afiche de pared.
[ PANTALLA · ESCRITORIO — LA ÚNICA VISTA QUE SE GANA EL ANCHO ]
Tres decisiones con trade-offs reales.
El partido se ve en vivo. Los puntos, cuando termina.
Durante un partido ves el once real y cada gol al instante, pero los puntos del Gran DT quedan ocultos hasta el final. El dato en vivo es dato provisorio: un gol se revisa, una asistencia se reasigna. Publicar puntos a mitad de partido es retractarlos a mitad de partido.
[ NOTA DEL ÁRBITRO ] Menos dopamina durante los 90 minutos, cero retractaciones después.
Tres fuentes, cruzadas por dorsal.
Los resultados se reconcilian entre tres fuentes independientes, cruzando por dorsal más nombre, nunca el nombre solo. Lo ambiguo va a una cola de revisión manual en vez de a la tabla. Un resultado mal cargado en una liga de amigos no es un bug, es un escándalo.
[ NOTA DEL ÁRBITRO ] A veces los puntos llegan unos minutos tarde. Nunca llegan mal.
Estándares profesionales que nadie pidió.
Accesibilidad con criterio WCAG, y un panel de admin donde toda operación destructiva corre primero en seco y saca un backup antes de ejecutar. Para cuatro jugadores nada de esto era necesario. El único de guardia era yo, así que las barandas eran para mí.
[ NOTA DEL ÁRBITRO ] Días de trabajo que ningún jugador ve, hasta la vez que salvan el torneo.
Cómo un resultado llega a ser resultado.
El pipeline de resultados es la parte del producto que los jugadores no ven jamás y de la que dependen por completo. Corrió solo cada 30 minutos alrededor de cada partido, construido como un VAR: puede ser lento, no puede equivocarse.
openfootball
Resultados finales y goleadores. El esqueleto de cada resultado.
Wikipedia
Minutos jugados, tarjetas, vallas invictas. La capa de detalle.
ESPN
Completa lo que las otras dos no pudieron: asistencias, goles sin matchear. Cruzado por dorsal + nombre.
Lo que no matchea con certeza va al banco: una cola de revisión manual. No juega jamás. Los cambios de plantel funcionan igual: el detector de diferencias prefiere suprimir, porque un nombre viejo es cosmético y un ID equivocado corrompe el puntaje.
[ CRON */30 · DRY-RUN ANTES DE CADA OPERACIÓN DESTRUCTIVA · BACKUP AUTOMÁTICO · RENOMBRES REVERSIBLES SIN DEPLOY ]
La planilla del equipo.
Toasts con aria-live, modales con manejo real de foco y Escape, contraste AA sobre la paleta oscura, reduced-motion respetado globalmente, etiquetas para lectores de pantalla donde los emojis cargan significado.
Una tarjeta de 1080×1350 de tu equipo dibujada en canvas, a un toque desde el inicio. Diseñada para el grupo de WhatsApp, que es donde esta liga vivió de verdad.
Notificaciones push hechas a mano en el Worker (VAPID más cifrado, verificado antes de deployar). Un recordatorio unas dos horas antes del primer partido de cada fecha: suficiente para salvar la formación de un amigo, no tanto como para ser spam.
[ INCIDENCIA · DISCIPLINARIA ]
Un amigo, hundido en la tabla, declaró que la app era mufa y empezó a poner jugadores que jugaban contra Argentina, puramente para mufarlos.
El 19 de julio, España le ganó 1–0 a Argentina en la final. La última fecha corrió, el pipeline la puntuó y la tabla quedó quieta.
[ ÚLTIMA FECHA · PRIMER EMPATE EN TODO EL TORNEO · SIN DESEMPATE ]
Después de 104 partidos y ocho fechas de puntaje, los dos primeros, el mío y el de un amigo, terminaron clavados en 418 puntos. No habíamos empatado nunca antes, en nada, en todo el torneo. El juego no tiene desempate, así que termina exactamente así: compartido.
Una nota al pie, por honestidad: el prode se lo llevó un tercer amigo, 90 puntos contra nuestros 84 y 84. El empate es solo la tabla del Gran DT.