Files
reaktor/producto.md
Jose Luis acbe4257ae docs: explain why base levels can't be edited from admin
The 96 base levels have JavaScript test() functions in their checks
that validate gameplay objectives. These can't be serialized to a
database — they need to stay as code. Custom levels from admin panel
work for tutorials/challenges but without the star check system.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 21:07:39 +01:00

6.6 KiB
Raw Blame History

Reaktor — Product Document

Vision

Reaktor es una plataforma web de sintesis modular que combina un sandbox creativo con un sistema de aprendizaje gamificado (SynthQuest). La plataforma permitira a los usuarios crear, aprender, compartir y descubrir sonidos sintetizados.


Producto Actual (v1 — Live)

Sandbox Mode

  • Sintetizador modular completo en el navegador (Tone.js)
  • 15+ tipos de modulos: Oscillator, Filter, Envelope, VCA, LFO, Mixer, Sequencer, Piano Roll, Keyboard, Drum Pad, CV→Gate, Delay, Reverb, Distortion, Scope, Output, Noise
  • Conexion visual de modulos con cables de audio/control/trigger
  • Canvas con zoom, pan, grid
  • Guardado/carga de presets (localStorage)
  • Export/import de patches como JSON
  • Demo Chiptune incluido

SynthQuest (Game Mode)

  • 12 mundos tematicos, 96 niveles progresivos
  • Sistema de 3 estrellas por nivel
  • Hints con penalizacion (max 2 estrellas)
  • Boss levels por mundo
  • Progreso persistente (localStorage)

Mobile

  • UI responsiva completa (bottom sheet, tab bar, touch panning, pinch zoom)
  • Keyboard y Drum Pad a pantalla completa
  • PWA instalable

Roadmap

Phase 0 — Estructura (monorepo)

Objetivo: Preparar la base tecnica para el backend sin romper nada.

  • Reestructurar a monorepo (packages/client + packages/server)
  • Actualizar Dockerfile (multi-stage: client build + server)
  • Docker Compose con PostgreSQL
  • Verificar que deploy funciona igual que antes

Phase 1 — Usuarios y Auth

Objetivo: Sistema de cuentas de usuario.

  • Backend API (Fastify + PostgreSQL + Drizzle ORM)
  • Registro por email + password (argon2)
  • Login con JWT (access token 15min + refresh cookie 30d)
  • Perfil de usuario (username, avatar, bio)
  • Roles: user, premium, admin
  • UI: modal de login/registro en el frontend
  • Auth context en React (user, isLoggedIn, role)
  • OAuth con Google/GitHub (opcional, puede ir en Phase 1.5)

Phase 2 — Sincronizacion de Datos

Objetivo: Los datos del usuario viajan con su cuenta, no con el dispositivo.

  • Sync de presets a la nube (offline-first, localStorage primary)
  • Sync de progreso de SynthQuest
  • Merge inteligente: last-write-wins por timestamp
  • Cola de sincronizacion offline (flush al reconectar)
  • Multi-dispositivo: login en otro dispositivo y tener todo

Phase 3 — Workshop / Comunidad

Objetivo: Compartir creaciones y descubrir sonidos de otros usuarios.

  • Publicar patches con titulo, descripcion, tags
  • Preview de audio (generado client-side con Tone.js Recorder)
  • Galeria publica: buscar, filtrar por tags, ordenar (popular/reciente)
  • Sistema de likes/favoritos
  • Cargar patch compartido directamente en el Sandbox
  • Perfil publico de usuario con sus patches compartidos
  • Comentarios en patches (v2, opcional)

Phase 4 — Panel de Administracion

Objetivo: Control total sobre la plataforma.

  • Dashboard con KPIs:
    • Usuarios totales, DAU, MAU
    • Patches compartidos (total, por dia)
    • Usuarios premium vs free
    • Niveles completados (metricas del juego)
  • Gestion de usuarios:
    • Lista, busqueda, filtros
    • Ver detalle de usuario (patches, progreso, rol)
    • Cambiar rol (user → premium → admin)
    • Banear/desbanear
  • Moderacion del Workshop:
    • Ver patches reportados/flagged
    • Eliminar contenido (soft delete)
    • Editar titulo/descripcion
    • Ver historial de moderacion

Phase 5 — Monetizacion (futuro)

Objetivo: Cursos premium y sostenibilidad.

  • Definir proveedor de pagos (Stripe, LemonSqueezy, Paddle)
  • Plan Premium: acceso a cursos avanzados de sintesis
  • Checkout flow
  • Gestion de suscripciones (portal del usuario)
  • Metricas de revenue en admin dashboard
  • Sandbox permanece gratuito

Phase 6 — Cursos (futuro)

Objetivo: Contenido educativo estructurado de pago.

  • Sistema de cursos con lecciones
  • Lecciones interactivas (como SynthQuest pero mas profundo)
  • Certificados de completado
  • Tracks tematicos: "Sound Design", "Beat Making", "Ambient Textures"

Stack Tecnico

Capa Tecnologia
Frontend React 18, Vite, Tone.js
Backend Fastify v5 (Node.js)
Base de datos PostgreSQL 16 + Drizzle ORM
Auth JWT + httpOnly refresh cookies + argon2
Storage Filesystem (Docker volume)
Deploy Docker + Docker Compose
Hosting montlab.dev (self-hosted)
Git Gitea (git.montlab.dev)

Principios de Diseno

  1. Offline-first — La app funciona sin internet. El backend es un extra, no una dependencia.
  2. Opt-in — Todo funciona sin cuenta. Login desbloquea sync + comunidad.
  3. Mobile-first — Cada feature se disena primero para movil.
  4. Progresivo — Cada phase se puede deployar independientemente.
  5. Simple — Preferir soluciones simples sobre arquitecturas complejas.

Metricas de Exito

  • Phase 1: 100 usuarios registrados en el primer mes
  • Phase 3: 50 patches compartidos en el Workshop
  • Phase 5: 10 suscriptores premium
  • Long-term: Reaktor como referencia en educacion de sintesis modular web

Notas Tecnicas

SynthQuest: Niveles base vs niveles custom

Los 96 niveles base (12 mundos × 8 niveles) estan hardcoded en ficheros JS (packages/client/src/game/levels/world1.js ... world12.js). Estos niveles no se pueden editar desde el admin panel porque contienen funciones test() en JavaScript que validan si el jugador ha completado el objetivo:

checks: [
  {
    star: 1,
    desc: 'Conecta el oscilador a la salida',
    test: (mods, conns) => {
      // Logica JS que inspecciona los modulos y conexiones
      return conns.some(c => c.from.moduleId === osc.id && ...);
    },
  },
]

Estas funciones test() no se pueden serializar en una base de datos — son codigo ejecutable que depende del contexto del engine. Para editar los niveles base hay que modificar directamente los ficheros JS y hacer deploy.

Los niveles custom creados desde el admin panel se almacenan en PostgreSQL y permiten definir titulo, descripcion, modulos disponibles y patch base (importado del Sandbox). Sin embargo, no soportan checks/objetivos custom porque requeririan escribir funciones JS. Los niveles custom se pueden usar para:

  • Tutoriales simples tipo "monta este circuito"
  • Challenges de la comunidad
  • Contenido adicional sin sistema de estrellas

Para añadir niveles con sistema de estrellas completo, hay que crear un fichero worldN.js con los checks en JS.


Documento vivo — actualizar conforme avanza el desarrollo.