Un solo archivo HTML y tres archivos de datos: el navegador hace todo el trabajo y el progreso nunca sale de él. El C4 es chico; lo interesante son los flujos (cómo se arma y puntúa un simulacro, cómo nace una pregunta) y el modelo de datos que vive en el almacenamiento local. Haz clic en una caja; reproduce un flujo para ver el recorrido.
Cada caja es una pieza que existe por separado: la página, sus archivos de datos, el almacenamiento del navegador, las herramientas del repo y los dos servicios externos. Las líneas son llamadas reales: mecanismo y qué viaja.
Un fetch() de un JSON local lo bloquea el navegador cuando la página se abre con file://. Como scripts, los datos cargan igual desde un clon, desde el hosting o desde la Mac que graba los videos, sin servidor.
No hay cuentas ni backend que mantener, y nada que proteger del lado del servidor. El costo: el progreso no viaja entre navegadores. Se exporta a JSON; la importación todavía no existe.
Las capturas públicas necesitan datos creíbles y repetibles sin tocar el almacenamiento de nadie. ?sample=1 guarda todo en memoria y fija la semilla del azar: dos cargas dan exactamente el mismo estado.
ccs:progress es un solo objeto JSON con una entrada por certificación; ccs:cert y ccs:theme son preferencias.?sample=1 el mismo objeto vive solo en memoria y se pierde al cerrar la pestaña.El repo de trabajo es privado; el público es una exportación filtrada de un solo autor. La web se sube por archivo y la Mac graba los medios desde la URL pública.
Requisitos para estudiar: un navegador. Para las pruebas: Node 22 y el Chromium de Playwright. Para los videos: ffmpeg.
Qué gana: costo variable cero. Qué no gana: sincronizar el progreso, que es justo lo que obligaría a tener servidor.
| Decisión | Por qué | Descartado |
|---|---|---|
| Un archivo HTML sin framework ni build | Se abre desde disco, se audita leyendo un archivo y no envejece con sus dependencias | Un SPA con bundler: más rápido de escribir, más caro de mantener para 1 000 líneas |
Datos como scripts que llenan window | file:// funciona igual que el hosting | JSON con fetch(): falla abierto desde disco |
| Cada opción incorrecta lleva una etiqueta de trampa | El resultado enseña qué tipo de error cometes, y el validador rechaza una opción sin etiqueta | Solo marcar correcta / incorrecta |
| Reparto por resto mayor | El simulacro suma exactamente el largo del examen y ningún dominio se aleja más de una pregunta de su cuota | Redondear cada cuota y ajustar el último dominio |
| Puntaje lineal 100–1000 y aprobado en 720 | La escala real no es pública; una lineal ponderada es honesta y se explica en una línea | Inventar una curva que parezca la oficial |
| Repaso espaciado SM-2 simplificado por pregunta, con migración perezosa | Con 240 preguntas, repasar lo ya sabido desperdicia sesiones; el progreso guardado con la regla anterior se interpreta al leer y no se reescribe | La regla fija de 3 días de la primera versión; FSRS (más preciso, más difícil de explicar en una línea) |
| Enlace a la documentación solo si se verificó | Un script comprueba 200, el ancla y que la sección contenga el pasaje citado por la revisión; lo demás queda sin enlace y listado aparte | Enlaces escritos de memoria |
| Repo público nuevo de un solo commit | El historial de trabajo tenía datos personales del autor; el público es una exportación filtrada y auditada | Reescribir la historia del repo de trabajo |
| Modo muestra en memoria con semilla fija | Capturas reproducibles sin escribir en el almacenamiento del visitante | Capturar con un perfil real |