THE ALTITUDE ATLAS — DRAWING SETSHEET 10 / 14

the BUNDLED CITY

ALTITUDE 2⅞ — inside the wire: what the bundler kept · one production bundle: 14 package groups in 18 chunks, 126,866 gz, footprint from source kept and height from wire share — apps/sample-app-lit-vanilla · counted at origin/main @ 3f55e419 (2026-10-30)

the routing machine the demo chrome the app itself 1 2 3 4 5 6 11 12 9 7 10 13 14 8 the machine the skin wraps: core 26.0 KB gz (21.0%) — lit-ui-router itself is 7.9 KB (6.4%) one lit major here: 8.7 KB across 20 modules — no second copy rides in with the chrome marked + dompurify: 23.0 KB gz — 3× the router they document, parked in a lazy api-docs chunk what the swap left: lodash-es 7.5 KB — the true cost of four imports, 135 modules unmoved SCALE — 1 px of height ≈ 150 gz bytes apps/sample-app-lit-vanilla · counted at origin/main @ 3f55e419 (2026-10-30) THE SIX DOORS, PRICED — the codecov bundle-analysis series, from the same-ref probe plate (min+gz, deps external) . 9,801 gz ./pure 9,585 gz ./register 4,370 gz ./ui-router.register 1,870 gz ./ui-view.register 4,330 gz ./context 758 gz door "." prices at 9,801 gz — this app pulls 8,057: the app leaves 18% of the door on the shelf

STRUCTURE SCHEDULE — source bytes the bundler kept · gzipped wire share · modules · note

#package groupkeptwiremodulesnote
1@uirouter/core174.4 KB26.0 KB64the state machine: transition · url · state services
2lit33.8 KB8.7 KB20one lit major, no second copy
3lit-ui-router41.7 KB7.9 KB18the subject — directives and ui-view
4router plugins20.8 KB4.2 KB5dsr · sticky-states · nav-location
5runtime helpers5.3 KB1.2 KB4oxc · vite · tslib — the bundler tax
6@uirouter/visualizer116.8 KB24.2 KB1ships prebundled, opaque
7marked58.1 KB10.9 KB1one file, whole — lazy chunk
8dompurify63.9 KB12.0 KB1one file, whole — lazy chunk
9@api-viewer24.5 KB4.6 KB12docs · tabs · common
10lit-dialog2.8 KB617 b1the demo dialog, on the shared lit
11sample-app-shared60.9 KB13.0 KB41the demo the four sample apps share
12lodash-es63.3 KB7.5 KB135_baseClone graph — isEqual's family
13app own src11.2 KB2.4 KB8the vanilla shell and its views
14sample-app-routes2.3 KB528 b5the route table the sample apps and the docs site share

TOTAL — 14 groups in 18 chunks · 696,117 kept → 390,306 emitted → 126,866 gz · apps/sample-app-lit-vanilla · counted at origin/main @ 3f55e419 (2026-10-30)

FIG. 10One shipped bundle opened up: every package that survived tree-shaking as a building — footprint from source kept, height from gzipped wire share — and the machine the router wraps, the chrome that demos it, and the app that uses it stand as three districts summing to 123.9 KB.

GENERAL NOTES

Method: a generateBundle census on a real production vite build of apps/sample-app-lit-vanilla, run inside a materialized, installed archive of the measured ref rather than the working tree — apps/sample-app-lit-vanilla · counted at origin/main @ 3f55e419 (2026-10-30). Every rendered module is attributed to its package by an explicit grouping table whose misses land in a loud other row (this print: none), and every footprint, height, schedule row and door price is read from the checked-in plates at build time — a group the drawing places that the plate does not carry is a build error, not a stale constant. Footprint is post-tree-shake source kept; height is generateBundle: module renderedLength scaled by its chunk gz/rendered ratio — the honest wire share. Beside it, the repo's own codecov bundle-analysis probe (tools/bundle-probe, the <pkg>-<label>-esm series CI uploads) prices each exported entry at the same ref, read here from www/atlas.lit-ui-router.dev/data/census-doors.json. This closes the survey as a quartet: the source (7), what npm delivers (8), what the wire carries (9) — and here, who occupies those bytes. Sheet 11 is this sheet's split view: the same probe cut by published package, every entry priced alone. Whole bundle: 696,117 kept → 390,306 emitted → 126,866 gz in 18 chunks.

Reconciliation with sheet 9. The two sheets do not meet at an identity, and the reason is a rule: on sheet 9 a chunk counts where it is first claimed, so ui-router-visualizer.esm sits inside app: vanilla rather than beside it. Straight from the two plates: sheet 9's vanilla district is 132,598 gz over 19 files; this bundle is 126,866 gz over 18 chunks; the residual is 5,732 gz over 1 file. That file is the one emitted asset in the app's output that is not a chunk — the api-viewer custom-elements manifest, JSON a module census structurally cannot see, since it walks bundle entries of type chunk. The app's stylesheet is not in the gap: sheet 9's pattern table files .css under site css before the app districts are reached. So 126,866 + 5,732 = 132,598, and the named residual is a manifest, not a rounding error.

The library is a skin over the machine. The biggest building in the bundle is not the router package — it is @uirouter/core at 26.0 KB gz, 21.0% of the wire, 64 modules. lit-ui-router itself is the small accent building: 7.9 KB, 6.4%, 18 modules. The two independent measurements reconcile: the codecov door prices the bare . entry at 9,801 gz with deps external, and this app's census pulls 8,057 of it — the 18% difference is what the app's own imports leave on the shelf.

The chrome outweighs the machine. marked, dompurify and @api-viewer total 27.6 KB gz — more than the routing machine they document — and the prebundled @uirouter/visualizer adds 24.2 KB on its own, opaque to tree-shaking because it arrives already bundled. None of it is on the eager path: the panel renders behind a feature flag and rides a lazy api-docs chunk. This census counts who occupies the bundle, not when they arrive; sheet 9 draws the critical path. One lit major serves all of it — 8.7 KB gz across 20 modules, no second copy riding in with the docs-viewer stack, because a scoped pnpm override (^3.3.3, a floor, not a pin) holds @api-viewer/* and lit-dialog to it.

The app's own district is the small one. lodash-es is 7.5 KB gz from 135 modules and 63.3 KB of kept source — isEqual's _base* family, the largest module count in the bundle and its own chunk, which is what four imports truly cost once tree-shaking has done its work. Beside it, the app's own source is 2.4 KB and sample-app-routes — the route table the sample apps and the docs site import — is 2,346 bytes kept, 528 on the wire, one module: the smallest building on the map.

The runtime tax is near-zero. All bundler machinery — oxc decorator helpers, vite's preload helper and polyfill, a stray tslib — totals 5.3 KB kept, 1.2 KB gz, 0.8% of the kept source, in 4 modules. No duplicated-helper problem.

KEY

package group — height = gz wire share
lit-ui-router — the subject
ships prebundled — opaque to tree-shaking
district (role in the bundle)
PROJECTTHE ALTITUDE ATLAS
SHEET TITLEthe BUNDLED CITY
SCALEONE BUNDLE
FORMBUNDLED CITY
CLIENTlit-ui-router · simshanith
DATE / REV2026-10-30 · F
DRAWN BYFable (Claude, AI)
SHEET10 OF 14