Malla es un monorepo de Turborepo con seis Cloudflare Workers y un conjunto de paquetes compartidos. Todo corre en Cloudflare: Workers, Durable Objects, R2, KV, Queues, Workflows e Hyperdrive delante de Neon Postgres.
text
┌── Cloudflare for SaaS (customer domains + SSL)
visitor ──► sites Worker ──── KV (host → site, publish id)
│ R2 (snapshots, compiled CSS, assets)
│ Cache API (rendered pages)
└─ /api/*, /_auth/* ──► runner Worker ── SiteDatabase DO (tables, visitors)
editor ──► web Worker (Nuxt) ──► api Worker (Hono) ── Hyperdrive ──► Neon Postgres
│ ├─ R2 (uploads) ├─ AI Gateway
├─► canvas frames (sandboxed) └─► sites (publish), runner (test runs)
└─► realtime Worker: Durable Object per page (Yjs + presence)
Los Workers
webEl editor de Nuxt y las páginas de marketing. Hace de proxy de /api/** hacia la api mediante un service binding.
apiAPI REST con Hono: autenticación, sitios, páginas, CMS, formularios, integraciones, facturación, dominios, IA.
realtimeUn Durable Object por página: sincronización Yjs, presencia, checkpoints en Postgres.
sitesPublica snapshots y sirve cada sitio publicado, formulario y consulta de cliente.
runnerFlujos de trabajo de servidor, crons, ejecuciones durables, tablas nativas y autenticación de visitantes.
mcpEl servidor MCP para agentes, autenticado con claves de API del espacio de trabajo.
Seis principios
- Un solo formato de documento en todas partes. Las páginas, los componentes y el área de borrador del lienzo comparten la forma
PageDoc. - Un solo renderizador. El lienzo y el sitio publicado ejecutan el mismo
@malla/renderer, así que lo que ves es lo que se publica. - Un solo motor de flujos de trabajo. Los flujos de trabajo de cliente y de servidor comparten un formato JSON y
@malla/engine, con adaptadores distintos. - Lo integrado son plugins. REST, GraphQL y el CMS usan el mismo SDK de plugins que cualquier otro conector propio.
- Nunca hacer
evalde la entrada del usuario. Las expresiones se interpretan a partir de un AST; el código personalizado corre en isolates. - Los secretos nunca llegan al navegador. Las llamadas autenticadas a integraciones pasan por un proxy en el servidor.
De un gesto a la base de datos
GestoUn arrastre, la edición de un campo, una llamada a una herramienta de IA.
OpsOperaciones tipadas y validadas.
YjsSe aplican al Y.Doc y se pueden deshacer.
SalaSe sincronizan a través del Durable Object de la página.
PostgresSe guardan en checkpoints como JSON + estado Yjs.
Consulta El documento de página y Tiempo real.
Dónde viven los datos
| Datos | Almacenamiento |
|---|---|
| Usuarios, espacios de trabajo, sitios, páginas, CMS, formularios, integraciones, flujos de trabajo, facturación | Neon Postgres (Drizzle, vía Hyperdrive) |
| Documentos de página en vivo y registros de edición | SQLite del Durable Object de cada página, con checkpoints en Postgres |
| Tablas nativas, visitantes, sesiones, envíos de formularios | Durable Object SiteDatabase por sitio |
| Recursos subidos, snapshots publicados, páginas renderizadas | R2 |
| Enrutamiento por host, flujos de trabajo de servidor publicados, caché de derechos del plan | KV |
| Uso y analítica | Analytics Engine |
Paquetes compartidos
| Paquete | Función |
|---|---|
@malla/schema | Tipos y esquemas Zod: PageDoc, ops, estilos, datos, flujos de trabajo, CMS, tablas, planes |
@malla/expr | Parser e intérprete de expresiones, funciones integradas y metadatos de autocompletado |
@malla/engine | Motor de flujos de trabajo y registro de acciones para el navegador y el servidor |
@malla/renderer | Documento → HTML/CSS, runtime de los frames del lienzo, interacciones |
@malla/runtime | El runtime de islas que cargan los sitios publicados para enlaces de datos, formularios y flujos de trabajo |
@malla/publish | Publicación de snapshots y renderizado bajo demanda |
@malla/ydoc | Mapeo de documentos a Yjs |
@malla/plugin-sdk, @malla/plugins | Definiciones de plugins y los plugins propios: REST, GraphQL, CMS, Postgres, Supabase, Airtable, Google Sheets, Resend, Anthropic y OpenAI |
@malla/bundle | Bundles de sitio para plantillas, secciones y copiar entre sitios |
@malla/ai-tools | Esquemas de herramientas de IA y MCP que se compilan a ops |
@malla/db, @malla/auth-token | Esquema y migraciones de Drizzle; tokens firmados entre Workers |