

Platanus Hack 26 — Caracas (46 horas)
Track: 🧊 Three-Dimensional
Despliegue: mus3o.onrender.com · Código: Repositorio GitHub
![]() | ![]() |
| Portada. Pegas tus apuntes o adjuntas un PDF. | Tus apuntes se vuelven un museo. Un PDF de pediatría, 8 salas. |
![]() | ![]() |
| Cada concepto es un objeto sobre su pedestal. | Cada ficha cita la línea de tus apuntes de donde sale. |
![]() | ![]() |
| Mundo vivo: entras a la pintura real del tema, recreada en 3D, y Aris te cuenta lo que ves. | Curva del olvido: lo que no repasas se agrieta y se rompe. |
![]() | |
| Modo VR con un visor de cartón y el celular. |
Estudiar temarios densos, apuntes académicos o documentación técnica en documentos bidimensionales planos genera una rápida saturación cognitiva. La retención pasiva de listas y textos lineales se degrada drásticamente en pocas horas debido a la curva natural del olvido humano y la falta de anclajes contextuales.
mus3o convierte apuntes libres, documentos estructurados o un tema en un palacio de la memoria 3D navegable en primera persona, generado proceduralmente en el navegador:
No está en tus apuntes.Utilizado desde la Grecia clásica por Simónides de Ceos, aprovecha la corteza retroesplenial y el hipocampo humano (evolutivamente diseñados para la navegación espacial) para almacenar datos abstractos. mus3o automatiza este proceso:
Museo → Salas → Conceptos.ringAngles) empezando junto a la puerta de entrada y avanzando en sentido de lectura mnemotécnica.El cliente calcula la retención de cada concepto con el modelo exponencial de Hermann Ebbinghaus:
R = e^(−Δt / S)
Donde Δt son los días transcurridos desde el último repaso y S es la estabilidad del recuerdo.
S × 2.5, máx. 365 días). Un fallo la desploma a 0.3 días.R se refleja en la geometría del tótem:
R ≥ 0.85: Intacto (escultura de yeso blanco).0.60 ≤ R < 0.85: Agrietado (fisuras visibles).0.30 ≤ R < 0.60: Roto (hasta 20 fragmentos de yeso en el suelo).R < 0.30: Olvidado (pedestal en ruina, repaso urgente).El proyecto es un monorepo con TypeScript estricto ("strict": true) y más de 750 pruebas unitarias automatizadas (Vitest) sobre el contrato, el servidor y la lógica del cliente:
platanus-hack-26-ve-team-5/
├── apps/
│ ├── web/ # Frontend SPA: Vite, React 18, React Three Fiber, Zustand, Tailwind
│ └── server/ # API REST & Streaming: Express, Claude SDK, Zod, Proxy de medios
├── packages/
│ ├── shared/ # Contrato universal tipado: esquemas Zod, verificación de citas, límites
│ └── dungeon-core/ # Motor de navegación procedural para mazmorras adaptadas
└── dev-ai-toolkit/ # Herramientas de soporte y skills del equipo
┌────────────────────────────────────────────────────────────────────────┐
│ NAVEGADOR (Client-Side Privacy-First) │
│ Ingesta local de archivos (PDF, DOCX, XLSX, CSV, JSON, TXT, Imágenes) │
│ Extracción de texto puro en navegador (pdfjs-dist, mammoth, excel) │
│ Truncamiento y delimitación: <user_notes> │
└───────────────────────────────────┬────────────────────────────────────┘
│ POST /api/generate-museum (JSON ≤ 8 MB)
┌───────────────────────────────────▼────────────────────────────────────┐
│ SERVIDOR EXPRESS (Bajo Costo & Resiliencia) │
│ 1. Rate Limiting por IP (10 req/min) & Exclusión de Health Checks │
│ 2. Deduplicación In-Flight (Promesas compartidas en paralelo) │
│ 3. Verificación de Caché de Disco (Atomic .tmp rename) │
│ 4. Control de Presupuesto Diario (Tope: 200 generaciones/día) │
│ 5. Pipeline Low-Token DSL con Claude Sonnet 5.5 (Prompt Caching) │
│ 6. Parser Tolerante de DSL a Árbol de Museo │
│ 7. Verificación de Citas contra los apuntes (`verifySources`) │
│ 8. Hidratación 3D: Biblioteca Local (80 items) → Poly Pizza → Haiku │
└───────────────────────────────────┬────────────────────────────────────┘
│ Museum validado por MuseumSchema
┌───────────────────────────────────▼────────────────────────────────────┐
│ MOTOR 3D EN CLIENTE (React Three Fiber & Three.js) │
│ Layout matemático euclidiano: Grilla de salas, vanos y corredores │
│ Render: DynamicTotem, MeshPortalMaterial, viento en GPU │
│ Modo VR Dual: WebXR (Android) / Cardboard Stereo con Sensor Fusion │
└────────────────────────────────────────────────────────────────────────┘
La IA solo elige conceptos, metáforas y citas. Todo lo demás es código nuestro, probado y medible:
| # | Pieza de ingeniería | Capa / Módulo | Qué hace |
|---|---|---|---|
| 1 | Pipeline Low-Token DSL | server / shared | Condensa cada concepto en 1 línea (PIECE: ...). Reduce tokens de salida de 10.925 a 1.847 (−69 %) y la entrega de 70 s a 27 s (2,6×), medido con IA real. |
| 2 | Prompt Caching | Anthropic API | Las reglas y el contrato fijos van en cache_control; la entrada repetida cuesta ~10 % del precio de lista. En nuestras mediciones durante el desarrollo, el 99 % de las lecturas pegó en caché. |
| 3 | Portales a Dioramas 3D ("Entrar al Cuadro") | web/diorama | Ventana con MeshPortalMaterial. Al pulsar E el jugador entra a una maqueta 3D con viento en GPU (aWind) y terreno facetado. |
| 4 | Verificación de citas (verifySources) | shared/sources | Busca cada cita en los apuntes (coincidencia exacta o subcadena común ≥ 60 %). Lo que no aparece se marca unverified: la alucinación no se oculta, se señala. |
| 5 | Curva de olvido + decaimiento 3D | web/memory | Modelo de Ebbinghaus desacoplado del render. Fragmentación de esculturas (20 fragmentos de yeso) y desvanecimiento del suelo según la fuerza del recuerdo. |
| 6 | Modo VR híbrido (WebXR + Cardboard) | web/vr | WebXR en Chromium Android; Cardboard con fusión de giroscopio y acelerómetro, proyección fuera de eje para ajustar la separación y un panel de ajuste en pantalla. |
| 7 | Dos modelos, cada uno en lo suyo | server/claude | Sonnet 5.5 para la estructura del museo y la visión de los cuadros; Haiku 5.5 sin razonamiento extendido para resumir fuentes largas y ayudar a Aris. |
| 8 | Biblioteca curada de modelos 3D (80 ítems) | seed/library | 80 objetos sembrados una sola vez con Sonnet y versionados en Git LFS. Se reutilizan a costo $0 en todos los museos. |
| 9 | Ingesta en el navegador | web/lib/files | PDF, Word, Excel, CSV y Markdown se extraen en el cliente (pdfjs-dist, mammoth, read-excel-file). Al servidor solo viaja texto; nada se guarda. |
| 10 | Caché multinivel y deduplicación in-flight | server/cache | LRU en memoria + escritura atómica en disco + unión de promesas concurrentes. Repetir un tema responde en < 10 ms y cuesta $0. |
| 11 | Layout procedural determinista | web/layout | Hasta 12 salas en árbol o DAG, con puertas y pasillos sin colisiones. Cero tokens gastados en posiciones. |
| 12 | Aris: reglas locales + voz | web/arisBrain | Responde por reglas al instante, consulta a Haiku solo cuando no sabe, y habla con Web Speech API (ElevenLabs opcional). Guía con A* hacia la sala que toca repasar. |
| 13 | Contrato Zod y aislamiento de prompts | shared/schema | Apuntes encerrados en <user_notes> con delimitadores saneados; validación del JSON de la IA y del localStorage en ambos extremos. |
| 14 | Proxy Wikimedia con filtro contextual | server/images | Obras y retratos de dominio público con lista blanca de hosts, reintentos, caché y filtro por país/contexto. |
| 15 | Normalización 3D y render sin basura | web/DynamicTotem | Modelos externos ajustados con <Resize><Center bottom>, descarte de mallas > 30 k triángulos y WeakMap para no recalcular por frame. |
El proyecto cuenta con un catálogo exhaustivo de 18 optimizaciones de producción, documentadas en docs/catalogo-optimizaciones.md:
cache_control, así la entrada repetida cuesta ~10 % del precio de lista. En nuestras mediciones durante el desarrollo, el 99 % de las lecturas pegó en caché..cache/museums mediante .tmp y rename atómico. Visitas recurrentes cuestan $0.00 USD.inFlight). Si 10 usuarios piden el mismo tema al unísono, se ejecuta una sola llamada a Claude.DIO/D_PROP) integrado en el prompt maestro. Evita llamadas HTTP redundantes y ahorra $0.024 USD por museo.thinking de Haiku 5.5, eliminando hasta 3.193 tokens de salida ocultos por llamada.max_tokens: Rango dinámico calibrado (2.000 a 5.000 tokens) según el volumen de caracteres de entrada.entrada, salida, caché leída y caché escrita, protegiendo la privacidad de los apuntes.Promise.allSettled: 18 descargas concurrentes de modelos 3D; si uno falla, no aborta el museo, sino que degrada suavemente a glifo.immutable para Assets 3D: Cabecera Cache-Control: public, max-age=31536000, immutable para binarios .glb. Red cero en visitas posteriores.MAX_DAILY_GENERATIONS) que protege el presupuesto ante bots.<Resize scale={0.7}><Center bottom>. ModelBoundary aísla fallos de Three.js.WeakMap para cachear conjuntos de conceptos en dioramas, eliminando asignaciones por frame y los micro-tirones del recolector de basura.useMemo de las listas de IDs y llamadas de olvido, previniendo recálculos $O(N)$ al tipear en el editor.localStorage (evitando Base64) y validación defensiva con MuseumSchema.safeParse al leer disco.| Métrica | Enfoque Convencional (JSON Monolítico) | mus3o Optimizado (DSL + Caching) | Impacto Obtenido |
|---|---|---|---|
| Costo por Museo (con diorama) | $0.178 USD | $0.036 USD | −79.7% de ahorro |
| Costo por Museo (sin diorama) | $0.117 USD | $0.019 USD | −83.7% de ahorro |
| Costo de Visita Repetida o Compartida | $0.178 USD | $0.000 USD | 100% gratis (Caché disco/LRU) |
| Tokens de Salida por Generación | 10.925 tokens | 1.847 tokens | −69.2% de tokens generados |
| Latencia de Entrega | 70 segundos | 27 segundos | 2.59× más rápido |
| Trabajo repetido por frame en dioramas | Recalcular el conjunto de conceptos cada frame | Cacheado en WeakMap | 0 asignaciones por frame |
| Escala: 1.000 alumnos generando un museo | ~$117 USD | ~$19–$36 USD | Cabe en el presupuesto de un aula |
<user_notes> y delimitadores XML saneados recursivamente con stripDelimiters. El system prompt instruye tratar el texto exclusivamente como datos pasivos.unverified.X-Content-Type-Options: nosniff, Referrer-Policy: strict-origin-when-cross-origin, y proxy de imágenes restringido exclusivamente a dominios oficiales de Wikimedia.| Capa | Tecnologías |
|---|---|
| Frontend & UI | React 18, Vite, TypeScript, Zustand (con persistencia separada), Tailwind CSS, Lucide Icons |
| Motor 3D & WebGL | Three.js, React Three Fiber (@react-three/fiber), @react-three/drei, shaders GLSL procedurales |
| Realidad Virtual (XR) | WebXR (@react-three/xr), Cardboard dual stereo camera, sensor fusion (devicemotion), off-axis stereo projection |
| Backend & APIs | Node.js 22, Express, @anthropic-ai/sdk, express-rate-limit, Zod, Vitest |
| Modelos de IA | Claude Sonnet 5.5 (claude-sonnet-5-5) y Claude Haiku 5.5 (claude-haiku-5-5) |
| Procesamiento de Archivos | pdfjs-dist (PDF), mammoth (Word .docx), read-excel-file (Excel .xlsx), parsers nativos CSV/JSON |
| Voz & Audio | Web Speech API (síntesis y reconocimiento en navegador), ElevenLabs API (eleven_multilingual_v2) |
| Assets 3D & Modelos | Biblioteca propia (80 modelos de catálogo en Git LFS), Poly Pizza API (CC0/CC-BY), KayKit Dungeon Pack |
| Infraestructura & Despliegue | Render (render.yaml, plan Starter sin arranques en frío), servidor Node que sirve la SPA y la API, caché en disco local del servicio, Git LFS para los assets |
Mentor: Anthony Nardelli
mus3o · Platanus Hack 26 Caracas
Un lugar que recuerda contigo.