soul v4.2.0

Principios

Las decisiones de fondo: por que soul se ve asi y no de otra forma.

1. Cero productos pagados#

Solo Workers, D1, R2, Cache API, Turnstile y cron. Nada de KV, Durable Objects, Queues ni Images. No es tacañeria: es lo que hace viable operar muchos productos pequeños a la vez. Un SaaS que no factura todavia tiene que costar practicamente cero.

Esta restriccion tiene consecuencias visibles en el diseño. El rate limiting, por ejemplo, usa D1 en vez de la Cache API —que seria mas rapida— porque la cache es por colo y un atacante que rota de region la evade.

2. Cache-first en lo publico#

Toda pagina publica se sirve desde caches.default con invalidacion explicita al cambiar el contenido. Asi las visitas normales no tocan D1.

3. D1 sin desperdicio#

D1 es el recurso escaso, asi que cada lectura cuenta:

  • Escrituras multiples van en db.batch([...]), que ademas es atomico.
  • Datos relacionados salen con un JOIN, nunca con N+1.
  • requireSessionWithOrg() resuelve sesion, usuario y organizacion en una consulta.
  • Desde la v4.1 las sesiones son stateless por defecto: el nombre y el isAdmin viajan firmados en el JWT, asi que una request autenticada normal no lee D1.

4. Multi-tenant desde el primer dia#

Toda tabla de negocio lleva org_id REFERENCES orgs(id) y todo query scopea por organizacion. No es opcional ni se agrega "cuando haga falta": agregarlo despues significa auditar cada consulta del proyecto.

5. Escapar siempre#

Todo contenido de usuario que se interpola en HTML pasa por escapeHtml(). Las funciones de @jun/soul/ui usan html\`\`, que escapa automaticamente lo interpolado, como JSX.

6. Sin build de frontend#

HTML renderizado en el servidor y JavaScript inline minimo. La interactividad sin recargar se resuelve con el patron AJAX propio de soul (data-ajax-target), no con un framework.

La libreria misma tampoco tiene build: se publican los .ts tal cual. Menos piezas que se puedan romper entre tu codigo y lo que corre en produccion.

7. Admision pull-based#

La contracara es igual de importante: lo que no se gana su lugar, sale. El CMS se elimino en la v4.0.0 tras cuatro versiones de crecimiento, porque era un tercio del codigo y el modulo menos adoptado.