THE ALTITUDE ATLAS — DRAWING SETSHEET 11 / 14

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)

lit-ui-router — six doors ui-router-server — thirteen doors lit-ui-router-effect lit-ui-router-mobx eslint-plugin-lit-ui-router navigation-location-plugin lit-ui-router-ssr — four doors lit-ui-router-signals ui-router-signals ui-router-effect ui-router-mobx ui-router-registry 9 1 31 2 32 33 34 3 5 4 6 7 8 15 16 19 27 35 17 20 29 21 18 24 25 28 22 14 26 30 10 23 13 11 12 «.» and «./pure»: 216 bytes gz apart — the price of registration the two flagship doors: 9,801 · 7,949 — the client door leads the server by 1,852 the one-element doors sum to 6,200 gz — «./register» ships the shared core once, at 4,370 the lint plugin's door, 6,372 gz, and the registry's four: the five no browser ever opens four adapters within 440 bytes of one another — thin skins on one server core SCALE — 1 px of height ≈ 40 gz bytes PROBE — git archive origin/main @ 3f55e419 + pnpm install --frozen-lockfile --silent (mise-provisioned pnpm) + turbo run build:js --filter <each public member> + tools/bundle-probe (rolldown, minify, declared deps+peers external, annotations off)

STRUCTURE SCHEDULE — minified bytes → gzipped bytes, deps external · note

#packagedoorminifiedgzippednote
1lit-ui-router.36,4889,801the flagship door
2lit-ui-router./pure35,7199,585216 gz cheaper — registration off
3lit-ui-router./register13,4964,370the umbrella — shared core once
4lit-ui-router./ui-router.register4,4901,870one element
5lit-ui-router./ui-view.register13,1074,330one element
6lit-ui-router./context1,519758the context seam, split out
7lit-ui-router-effect.2,5471,102the whole effect layer
8lit-ui-router-mobx.1,300491the Lit binding over the mobx store
9lit-ui-router-signals.1,723635the Lit binding over the signals
10lit-ui-router-ssr.5,2262,439the prerender bridge
11lit-ui-router-ssr./client7,8543,130the browser half — hydrateRoot
12lit-ui-router-ssr./register2,126976the served <ui-view>, registered
13lit-ui-router-ssr./testing473254counts the served elements a boot kept, for tests
14ui-router-navigation-location-plugin.2,5671,151the whole plugin
15ui-router-server.20,4957,9491852 gz shy of the flagship
16ui-router-server./redirects9,5253,887redirect machinery
17ui-router-server./matcher6,7582,918standalone matcher
18ui-router-server./hono5,5762,649adapter
#packagedoorminifiedgzippednote
19ui-router-server./fetch5,4422,593adapter
20ui-router-server./vite4,5962,269adapter
21ui-router-server./connect4,4692,209adapter
22ui-router-server./simulate1,220668the headless-router recipe the pool builds — 668 b
23ui-router-server./location1,167626the server location service
24ui-router-server./url-config562363the mount's url config, shared with any router
25ui-router-server./ssr3,2011,494settle and dehydrate, for any renderer
26ui-router-server./ssr/client1,866987seed the boot transition, for any renderer
27ui-router-server./prerender20,2907,836the prerender loop — a static site from a mount table, no renderer
28ui-router-effect.770464one route ref, no renderer
29ui-router-signals.1,787804route signals, no renderer
30ui-router-mobx.970459the observable store, no renderer
31ui-router-registry.020an empty emit, types only
32ui-router-registry./effect020the effect adapter types, empty emit
33ui-router-registry./mobx020the mobx adapter types, empty emit
34ui-router-registry./signals020the signals adapter types, empty emit
35eslint-plugin-lit-ui-router.19,5626,372the lint plugin — editor-side, never shipped
FIG. 11The split view to sheet 10’s unified city: every exported entry of every publishable package bundled alone and priced — 12 package quarters, 35 doors, the codecov bundle-analysis series drawn as skylines.

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/atlas.lit-ui-router.dev/data/census-doors.json — 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 + tools/bundle-probe (rolldown, minify, declared deps+peers external, annotations off) — 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 (./pure is . minus registration), which is exactly what the split view exists to show.

The twin towers are one building with two doors. . and ./pure 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 ./register 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, ./ssr/client at 987 bytes, ./simulate at 668, ./location at 626, and ./url-config at 363, the last the storefront’s cheapest — only lit-ui-router-ssr’s ./testing (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, ./client — the browser half that adopts a served render — at 3,130, ./register, which defines <ui-router> and a served <ui-view> in place of lit-ui-router/register, at 976, and ./testing, 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 ./register 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/core) 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/core (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, ./effect, ./mobx and ./signals, 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/core 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
PROJECTTHE ALTITUDE ATLAS
SHEET TITLEthe ENTRY QUARTERS
SCALETWELVE PACKAGES
FORMENTRY QUARTERS
CLIENTlit-ui-router · simshanith
DATE / REV2026-10-30 · N
DRAWN BYFable (Claude, AI)
SHEET11 OF 14