0 KB JS by default · runtime bundling · alpha

Ship 0 KB JS by default.
When you do ship — only what rendered.

L5E is an HTML-first SSR framework for block-builder MPAs. Pages without an island or useClientJs emit zero script tags. When you opt in, the framework tracks each call inside a per-request context and bundles only those assets — one CSS link, one script tag, sized to what actually rendered.

$ npm create l5e@alpha my-app -- --template basic

Static tooling can't see your runtime composition

12 blocks possible. 3 actually render.
Watch what each strategy ships.

Strategy A

Single big bundle

92 KB3 used · 9 dead weight
Strategy B

Many tags in the HTML

24 tagsround-trips or inline blobs
L5E

Bundle what rendered

10 KB1 link · 1 script↳ 0 KB JS · 0 script tags if static

Strategy A & B are what build-time tooling must choose between when a route's composition is dynamic. L5E watches what your render pass actually touched and bundles that — nothing more.

02What it gives you

0 kb

Ship 0 KB JS by default

A page without an island, useClientJs, or swap+action emits zero <script> tags. No framework runtime, no hydration payload — just HTML.

render

Per-request bundling

useCss / useClientJs / island calls register into an AsyncLocalStorage context. Only rendered blocks contribute to the response.

output

One link, one script

When JS is needed, it ships as one bundled chunk. No inline blobs, no per-block tag spam, no waterfalls.

ssr

All-or-nothing

Render the whole page or fail clearly. No streaming, no half-rendered shells reaching the crawler.

cache

CDN-native headers

Loaders set max-age, s-maxage, swr, and Cache-Tag. The CDN handles fan-out, not the framework.

interactivity

Islands, swap, useClientJs

Vanilla DOM, swap+action fragments, or React islands — pick the lightest hammer for the spot.

platform

Plain Express + Vite

No bespoke routing DSL. Middleware, loaders, actions are first-class TypeScript you can read top-to-bottom.

Build a page the size it deserves.

L5E is alpha. Read the docs, try the basic template, file issues — feedback shapes v0.2.