armonía viva · SPA estática · sin servidor

Arquitectura de Armonía Viva

Una aplicación de teoría musical que corre entera en el navegador: el motor de teoría, el audio y el estado viven en el cliente, y el hosting solo entrega archivos. Tres vistas: contenedores, flujos y despliegue. Haz clic en cualquier caja; reproduce un flujo para ver el recorrido.

este repo persona o entorno de trabajo servicio externo tráfico
Detalle

Haz clic en un contenedor

Cada caja es una pieza que corre por separado: el navegador de quien visita, un chunk que se descarga bajo demanda, el hosting de archivos o un servicio externo. Las líneas son llamadas reales: protocolo y qué viaja.

Por qué sin backend

La teoría musical se calcula con Tonal en el navegador y el sonido se genera ahí mismo. No hay base de datos ni API: nada que mantener vivo y cero costo variable. El único dato estático es un JSON con progresiones de ejemplo.

Por qué la galaxia es un chunk aparte

El módulo 3D trae three y react-three-fiber, que pesan mucho. Se importa con lazy() y solo se descarga al abrir esa pestaña (o al activar el fondo de agua), así la carga inicial se mantiene ligera.

Por qué el audio espera un gesto

Los navegadores bloquean el audio hasta que la persona interactúa. La app arranca el contexto en el primer clic o tecla, sin botón aparte, y si el piano de soundfont no carga cae a un sintetizador para no quedar muda.

Secuencias · una por flujo · los mismos pasos que reproduce el C4
Despliegue · lo que hay y lo que cambiaría

Hoy un directorio de archivos estáticos. Mañana el mismo directorio detrás de un CDN.

El resultado de npm run build es una carpeta dist/ con rutas relativas (base: "./"), así que funciona en la raíz de un dominio y en cualquier subcarpeta sin recompilar. El README la da por verificada servida desde /armonia-viva/ sin errores de consola. El hosting exacto de producción está por confirmar: este repo no trae script ni workflow de despliegue.

Hoy · hosting estático

tsc -b y vite build → dist/npm run build
rutas relativas, funciona en subcarpetabase "./"
chunk 3D con carga bajo demandalazy()
tutorial compartido resuelto con document.baseURIpublic/tutorial/
subida de dist/ (método: por confirmar)manual
soundfont del piano desde un CDN externosmplr

Pruebas del motor con vitest (npm test): teoría, acordes, modos, progresiones y galaxia. Sin pruebas de interfaz.

→ mismo dist/ →

Al escalar · CDN delante

mismo build, destino distinto (bucket + CDN)sin cambios de código
archivos con hash en assets/ cacheables mucho tiempoVite
servidor de aplicaciónno hace falta
soundfonts propios en vez del CDN externoindependencia

Qué gana: caché en el borde y un piano que no depende de un tercero. Qué no gana: velocidad de cómputo, que ya corre en el dispositivo de cada visitante.