the ENTRY QUARTERS
ALTITUDE 2⅞ — the same wire, cut by published package · every exported entry priced alone · 35 doors in 12 package quarters, footprint from minified bytes and height from gzipped, dependencies external — counted at origin/main @ 3f55e419 (2026-10-30)
STRUCTURE SCHEDULE — minified bytes → gzipped bytes, deps external · note
| # | package | door | minified | gzipped | note |
|---|---|---|---|---|---|
| 1 | lit-ui-router | . | 36,488 | 9,801 | the flagship door |
| 2 | lit-ui-router | ./pure | 35,719 | 9,585 | 216 gz cheaper — registration off |
| 3 | lit-ui-router | ./register | 13,496 | 4,370 | the umbrella — shared core once |
| 4 | lit-ui-router | ./ui-router.register | 4,490 | 1,870 | one element |
| 5 | lit-ui-router | ./ui-view.register | 13,107 | 4,330 | one element |
| 6 | lit-ui-router | ./context | 1,519 | 758 | the context seam, split out |
| 7 | lit-ui-router-effect | . | 2,547 | 1,102 | the whole effect layer |
| 8 | lit-ui-router-mobx | . | 1,300 | 491 | the Lit binding over the mobx store |
| 9 | lit-ui-router-signals | . | 1,723 | 635 | the Lit binding over the signals |
| 10 | lit-ui-router-ssr | . | 5,226 | 2,439 | the prerender bridge |
| 11 | lit-ui-router-ssr | ./client | 7,854 | 3,130 | the browser half — hydrateRoot |
| 12 | lit-ui-router-ssr | ./register | 2,126 | 976 | the served <ui-view>, registered |
| 13 | lit-ui-router-ssr | ./testing | 473 | 254 | counts the served elements a boot kept, for tests |
| 14 | ui-router-navigation-location-plugin | . | 2,567 | 1,151 | the whole plugin |
| 15 | ui-router-server | . | 20,495 | 7,949 | 1852 gz shy of the flagship |
| 16 | ui-router-server | ./redirects | 9,525 | 3,887 | redirect machinery |
| 17 | ui-router-server | ./matcher | 6,758 | 2,918 | standalone matcher |
| 18 | ui-router-server | ./hono | 5,576 | 2,649 | adapter |
| # | package | door | minified | gzipped | note |
|---|---|---|---|---|---|
| 19 | ui-router-server | ./fetch | 5,442 | 2,593 | adapter |
| 20 | ui-router-server | ./vite | 4,596 | 2,269 | adapter |
| 21 | ui-router-server | ./connect | 4,469 | 2,209 | adapter |
| 22 | ui-router-server | ./simulate | 1,220 | 668 | the headless-router recipe the pool builds — 668 b |
| 23 | ui-router-server | ./location | 1,167 | 626 | the server location service |
| 24 | ui-router-server | ./url-config | 562 | 363 | the mount's url config, shared with any router |
| 25 | ui-router-server | ./ssr | 3,201 | 1,494 | settle and dehydrate, for any renderer |
| 26 | ui-router-server | ./ssr/client | 1,866 | 987 | seed the boot transition, for any renderer |
| 27 | ui-router-server | ./prerender | 20,290 | 7,836 | the prerender loop — a static site from a mount table, no renderer |
| 28 | ui-router-effect | . | 770 | 464 | one route ref, no renderer |
| 29 | ui-router-signals | . | 1,787 | 804 | route signals, no renderer |
| 30 | ui-router-mobx | . | 970 | 459 | the observable store, no renderer |
| 31 | ui-router-registry | . | 0 | 20 | an empty emit, types only |
| 32 | ui-router-registry | ./effect | 0 | 20 | the effect adapter types, empty emit |
| 33 | ui-router-registry | ./mobx | 0 | 20 | the mobx adapter types, empty emit |
| 34 | ui-router-registry | ./signals | 0 | 20 | the signals adapter types, empty emit |
| 35 | eslint-plugin-lit-ui-router | . | 19,562 | 6,372 | the lint plugin — editor-side, never shipped |
GENERAL NOTES
Method: the same probe as sheet 10's doors strip, run to completion: every exported entry of the 12 publishable packages bundled alone with rolldown — minified, declared dependencies and peers external — which is the price a consumer's bundler pays at that door, and byte-for-byte the <pkg>-<label>-esm series CI uploads to codecov. Footprint is minified bytes, height gzipped. Every number is read at build time from the checked-in plate www/ — counted at origin/main @ 3f55e419 (2026-10-30), probed as git archive origin/main @ 3f55e419 + pnpm install --frozen-lockfile --silent (mise-provisioned pnpm) + turbo run build:js --filter — and a door the plate carries that the drawing does not place is a build error, not a stale constant. Sheet 10 is the unified view — one real app's bundle with all of these mixed by the bundler; this sheet cuts the same machinery by published package and entry point. The quarters don't sum and shouldn't: doors overlap (./ is . minus registration), which is exactly what the split view exists to show.
The twin towers are one building with two doors. . and ./ differ by 216 gzipped bytes — the whole cost of custom-element registration. The register economics run the other way: the two one-element doors sum to 6,200 gz while the umbrella ./ is 4,370, because each element door carries the shared element core with it. Take the umbrella or one element door; taking two per-element doors ships the core twice.
The server is a storefront, not a tower. Thirteen doors: an index at 7,949 gz, 1,852 under the client flagship; redirect and matcher wings at 3,887 and 2,918; four framework adapters — hono, fetch, vite, connect — packed within 440 bytes of one another, which is what thin skins over one core look like priced; and four doors that barely register, ./ at 987 bytes, ./ at 668, ./ at 626, and ./ at 363, the last the storefront’s cheapest — only lit-ui-router-ssr’s ./ (254) and ui-router-registry’s (20, an empty emit) undercut it.
Two more quarters, and one of them sits between the other two. lit-ui-router-effect enters at 1,102 gz through its one door. lit-ui-router-ssr has four: the prerender index at 2,439 gz, ./ — the browser half that adopts a served render — at 3,130, ./, which defines <ui-router> and a served <ui-view> in place of lit-ui-router/, at 976, and ./, which stamps the served elements before the boot and counts the ones it kept, at 254. The ssr quarter is drawn in the gap between the client and server quarters because that is where its declarations put it: it is the one package here that peers both lit-ui-router and ui-router-server (sheet 4 draws that bridge). npm serves it under latest at 0.7.0, the version its package.json carries at this ref.
Four more one-door quarters, the signals pair, the renderer-free effect ref and the mobx store. lit-ui-router-signals binds the router to a Lit host at 635 gz; ui-router-signals, ui-router-effect and ui-router-mobx, the renderer-free halves that hold one hook per router, enter at 804, 464 and 459 — each under the 1,830-byte element-door gap. npm serves them under latest at 0.3.0, 0.2.0, 0.2.0 and 0.2.0, the versions their package.json files carry at this ref.
Plugins price like footnotes. The mobx Lit binding enters at 491 gz and its store at 459, the navigation-location plugin at 1,151 — each cheaper than the 1,830-byte gap between ./ and its two element doors — and the effect and ssr index doors (1,102 and 2,439) each cost under half the flagship's own . door at 9,801. The expensive thing in this family is never the adapter; it is the state machine they all defer to, and that machine (sheet 10's @uirouter/) is external here by design.
Door 35 is not a door a browser opens. eslint-plugin-lit-ui-router (#676) is one of the family's two non-runtime published packages, so its quarter is drawn but its number means something different: 19,562 minified, 6,372 gz is what a lint host loads, once, at author time. It is priced here because the probe prices every published entry without exception — the honest thing for a ledger — and it is worth knowing that the plugin costs 65% of the flagship to a tool that already has Node's whole module graph resident. Nothing in it ever reaches a bundle: it peers ESLint alone — oxlint loads it as a JS plugin, unpeered — never @uirouter/ (sheet 2 leaves it off the plate for the same reason).
Doors 31–34 are empty emits. ui-router-registry ships types and nothing else: an app fills in its Register interface by module augmentation, and StateName, ParamsOf and the typed StateService narrow to that app's states inside the type checker. Its index door and the three adapter doors, ./, ./ and ./, which type the route state the ui-router-effect, ui-router-mobx and ui-router-signals hooks hand back, each bundle to 0 minified bytes and 20 gz — gzip's framing around nothing — so the floors draw them at the sheet's smallest lot, 12 × 12 × 6, and the index is the cheapest door on the plate. npm serves it under latest at 0.3.0; it peers @uirouter/ for the declarations it narrows, and no bundle carries a byte of it.
Why both views exist. The split view is the seller's ledger — what each door costs at the threshold. The unified view is the buyer's receipt — what one app's bundler actually made of them (it paid 8,057 of the flagship's 9,801). Codecov tracks the ledger per commit; sheet 10 audits the receipt.
KEY
| exported entry — height = gz, deps external | |
| a lit-ui-router door | |
| quarter = one published package · 35 doors, 12 packages |