soul v4.2.0

Que es soul

La infraestructura comun de los micro-SaaS de JUN, sobre Cloudflare Workers.

El problema que resuelve#

El costo de un micro-SaaS no esta en construirlo: esta en mantener varios a la vez. Sin una base comun, cada bug de seguridad, cada cambio de OAuth y cada mejora de permisos hay que hacerla N veces. @jun/soul resuelve una vez lo que todo SaaS necesita —autenticacion, organizaciones, roles, planes, panel de administracion— y lo presta a cada proyecto.

Un proyecto nuevo nace con todo eso funcionando desde el dia uno, y solo escribe lo que lo hace distinto: su logica de negocio y su identidad visual.

Los modulos#

Como se ve en la practica#

Un proyecto completo con login, organizaciones y panel de admin cabe en unas pocas lineas, porque lo unico que se escribe es el cableado:

TypeScript
import { Hono } from "hono";
import type { SoulEnv } from "@jun/soul";
import { securityHeaders } from "@jun/soul/ui";
import { auth, tenancy, admin, shell } from "./core";
import facturas from "./modules/facturas";

const app = new Hono<{ Bindings: SoulEnv }>();

app.use("*", securityHeaders({}));
app.route("/auth", auth.routes);      // login, callback, logout
app.route("/facturas", facturas);     // tu negocio, ya scopeado por org
app.route("/admin", admin.routes);    // panel de superadmin

export default app;

Las reglas que no se negocian#

soul existe para que operar muchos productos sea barato, y eso impone restricciones duras. Un cambio que rompa cualquiera de estas se rechaza:

  • Cero productos pagados de Cloudflare. Solo Workers, D1, R2, Cache API, Turnstile y cron. Prohibidos KV, Durable Objects, Queues e Images.
  • Una sola dependencia: hono, y como peer.
  • Sin build propio: se publican los .ts directamente.
  • Sin frameworks de cliente ni bundlers. HTML server-side y JS inline minimo.
  • Multi-tenant siempre: toda tabla de negocio lleva org_id y todo query scopea por org.
  • Cache-first en paginas publicas, con invalidacion explicita.

Que entra al nucleo#

Por eso webhooks y ratelimit salieron de licet, y credentials nacio de ver el mismo codigo dos veces (el portal OTP de Ply y las activaciones de licet). Y por eso en la v4.0.0 se elimino el CMS: era un tercio de la libreria y su pieza mas compleja, siendo la menos usada. Un CMS con bloques, categorias y SEO es un producto, no infraestructura.