La web se renderiza en el servidor y luego React la hidrata en el navegador: vuelve a pintar el mismo árbol y lo compara con el HTML que llegó. Si no coincide, no lo parchea — tira el HTML del servidor y repinta la página entera en el cliente. Es la forma cara de renderizar en servidor: pagas el render y luego lo tiras.
En consola salía el error #418 de React, que es ese desajuste en versión minificada. Unas veces aparecía y otras no, así que le fui dando largas durante semanas.
La parte que merece contarse
Lo que rompió el «unas veces sí y otras no» fue cargar la portada con Playwright cambiándole la zona horaria al navegador. Deja de ser intermitente en cuanto miras la variable correcta:
- 4
- husos horarios probados, 3 con la página rota
- 2
- días distintos escritos para el mismo instante
- 6
- ficheros tocados para arreglarlo
- 5
- pruebas que impiden que vuelva
La causa estaba repetida por medio proyecto, en la forma más inocente que tiene una fecha de escribirse:
A partir de las 22:00 UTC las dos mitades escribían días distintos para la misma fecha. React comparaba «16 de agosto» con «15 de agosto», veía dos textos que no encajan, y hacía lo que tiene que hacer.
El detalle que más rabia da: el robot de PageSpeed mide en UTC. Así que la nota que yo veía era siempre la del caso malo, mientras que en mi navegador, en Madrid, la web iba perfecta. Estuve mirando imágenes, fuentes y tamaño del bundle porque los números no cuadraban con lo que veía.
El arreglo
Mi primer intento fue fijar TZ=Europe/Madrid en el contenedor. Dejé de ver el error, claro: yo estoy en Madrid. Eso no arreglaba nada, solo ponía de acuerdo al servidor conmigo. Para alguien en México seguía roto igual.
El arreglo de verdad fue aburrido: una función formatearFecha() que lleva la zona escrita, y todas las fechas del sitio pasando por ahí en vez de por Intl a pelo. Seis ficheros, 94 líneas nuevas y 14 quitadas. Lo importante no es que la zona sea Madrid, es que sea una fija, la misma a los dos lados.
Y una prueba de regresión, porque este fallo no se ve mirando la pantalla:
Dónde está hoy
A 29 de agosto de 2026, cargando la portada de producción 16 veces repartidas entre Madrid, UTC, Los Ángeles y Tokio: el día se escribe igual en las cuatro y el <h1> está presente en todas. El desajuste por huso horario ya no aparece.
Lo que sigue mal, y lo digo yo antes de que lo encuentres tú
En esas mismas 16 cargas, 2 dieron un #418. Pero ya no sigue el patrón de antes: aparece y desaparece dentro del mismo huso, así que es otro fallo distinto del que cuenta este caso. Sospecho de algo que se calcula con el reloj en marcha en vez de con una fecha fija. Está sin resolver.
Y queda un sitio con la avería original intacta: la página de mi cuenta, que es un componente de cliente y sigue formateando fechas sin decir la zona. Está detrás del login, así que no la pisa ni el robot de PageSpeed ni casi nadie. Eso explica que siga ahí, no que esté bien.
Stack: Next.js 15, React, Docker, VPS autogestionado. Proyecto propio, sin nada confidencial: por eso está contado entero, con las cifras y las pruebas de aquella semana.