2026-08-07 — marvelousdb: migración a API local sin Orchestrate/Marvel

Contexto: reescritura de marvelousdb (demo Express 2014) para correr 100% local sin Orchestrate (DBaaS muerto) ni Marvel API (ya no existe). Decisiones tomadas en sesión con usuario.

Decisiones

  • Arquitectura: API REST separada (api.js, puerto 3001) que lee los JSON de data/ en memoria y los indexa con FlexSearch; sitio (web.js, puerto 5050) que consume la API por HTTP. npm start levanta ambos con concurrently.
  • Dataset: conservar los 1402 personajes y ~30180 comics de Marvel como semilla. No filtrar dominio público ahora (criterio legal resbaladizo; Marvel reclama trademark). El esquema sirve para reemplazar con datos propios de dominio público (README de data/ documenta el esquema).
  • Thumbnails/URLs muertas: se dejan (i.annihil.us, marvel.com) tal cual; el navegador muestra placeholder de imagen rota. Migración a CDN propio = paso futuro.
  • Búsqueda: FlexSearch @^0.7.43 (CJS), tokenize forward, campo wiki.real_name busca también en aliases. Filtros post-search por gender/universe (tags manuales con el Map completo).
  • Gender: heurística sin dependencias (categoría “Women” → female; si no, conteo de pronombres en bio) replicando el paquete gender del import original.
  • Stack: Express 4 + express-handlebars 7 + handlebars helpers propios (paginación reescrita a mano, sin handlebars-paginate). Node >= 20, --env-file-if-exists=.env (funciona en Node 22+; máquina actual v25).
  • Eliminado: functions.js, data/import.js, data/package.json, dependencia orchestrate, express3-handlebars, q, handlebars-paginate.
  • Puerto web: 5050 por defecto porque el 5000 lo ocupa el Control Center de macOS en esta máquina (commplex-main).
  • Smoke tests: node:test contra la API real (12 tests; indexa el dataset completo ~7s).

Cómo correr

npm install
npm start        # API :3001 + web :5050
npm test         # smoke tests

Pendientes conocidos

  • Diseño/UI (CSS de 2014 con bourbon/neat; el usuario quiere rediseño).
  • Migrar thumbnails a CDN propio.
  • Dataset de dominio público real (renombrar/reesquemar).