Cert Studio · app estática · HTML + JavaScript sin dependencias

Arquitectura de Cert Studio

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.

este repo persona o navegador servicio externo tráfico
Detalle

Haz clic en un contenedor

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.

Por qué datos en .js y no en .json

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.

Por qué el progreso no sale del navegador

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.

Por qué un modo muestra

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.

Secuencias · una por flujo · los mismos pasos que reproduce el C4
Ciclo de una pregunta en el repaso espaciado · "para hoy" = sin ver, fallada o con el intervalo SM-2 vencido
Modelo de datos · lo dinámico vive en localStorage (claves ccs:*), lo estático en data/*.js · pasa el cursor por una relación

Cómo se guarda

clave
ccs:progress es un solo objeto JSON con una entrada por certificación; ccs:cert y ccs:theme son preferencias.
respuesta
Por pregunta: veces vista, aciertos, fallos, el resultado de la última vez y cuándo. La fecha, la facilidad y el intervalo (SM-2) deciden cuándo vuelve.
simulacro
Fecha, tipo, puntaje, porcentaje ponderado, resultado por dominio, fallos y los ids usados: así el siguiente simulacro saca primero las preguntas que nunca salieron.
trampas
Un contador por tipo de distractor: cuántas veces elegiste una opción con esa etiqueta.

Lo que no se guarda

servidor
Nada. La página no hace ninguna llamada de red después de cargar.
muestra
Con ?sample=1 el mismo objeto vive solo en memoria y se pierde al cerrar la pestaña.
import
No hay importación de progreso: un respaldo JSON hoy solo se puede leer, no restaurar desde la app.
Despliegue · lo que hay y lo que cambiaría

Hoy un subdominio estático. Mañana cualquier hosting estático, sin cambiar una línea.

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.

Hoy · Hostinger + GitHub + Mac mini

exportación filtrada y auditada al repo públicoexport-public.sh
subida por TUS de 6 archivos, nunca borradeploy-cert.sh
solo responde por su subdominio; el resto, 404.htaccess
validador del banco + 36 pruebas de punta a puntaverify.sh
clip de 7 s y tres capturas desde la URL públicaMac · carril media

Requisitos para estudiar: un navegador. Para las pruebas: Node 22 y el Chromium de Playwright. Para los videos: ffmpeg.

→ mismos archivos →

Al escalar · más visitantes

CDN delante del estáticosin cambios en el código
miles de personas estudiando a la vezel cómputo es de cada navegador
progreso entre dispositivosnecesitaría cuentas y un backend
banco revisado por personashoy lo revisó un modelo

Qué gana: costo variable cero. Qué no gana: sincronizar el progreso, que es justo lo que obligaría a tener servidor.

Decisiones · con la alternativa descartada

Cada decisión dice qué se eligió, qué se dejó y por qué

DecisiónPor quéDescartado
Un archivo HTML sin framework ni buildSe abre desde disco, se audita leyendo un archivo y no envejece con sus dependenciasUn SPA con bundler: más rápido de escribir, más caro de mantener para 1 000 líneas
Datos como scripts que llenan windowfile:// funciona igual que el hostingJSON con fetch(): falla abierto desde disco
Cada opción incorrecta lleva una etiqueta de trampaEl resultado enseña qué tipo de error cometes, y el validador rechaza una opción sin etiquetaSolo marcar correcta / incorrecta
Reparto por resto mayorEl simulacro suma exactamente el largo del examen y ningún dominio se aleja más de una pregunta de su cuotaRedondear cada cuota y ajustar el último dominio
Puntaje lineal 100–1000 y aprobado en 720La escala real no es pública; una lineal ponderada es honesta y se explica en una líneaInventar una curva que parezca la oficial
Repaso espaciado SM-2 simplificado por pregunta, con migración perezosaCon 240 preguntas, repasar lo ya sabido desperdicia sesiones; el progreso guardado con la regla anterior se interpreta al leer y no se reescribeLa 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 aparteEnlaces escritos de memoria
Repo público nuevo de un solo commitEl historial de trabajo tenía datos personales del autor; el público es una exportación filtrada y auditadaReescribir la historia del repo de trabajo
Modo muestra en memoria con semilla fijaCapturas reproducibles sin escribir en el almacenamiento del visitanteCapturar con un perfil real