the DELIVERED CITY
ALTITUDE 1½ — what npm actually installs for one consumer · sample-app-lit-vanilla · 33 delivered packages, 180,509 lines of code and 43,999 d.ts lines on disk, footprint from files and height from lines — measured at origin/main @ 3f55e419 (2026-10-31), closure of apps/sample-app-lit-vanilla
STRUCTURE SCHEDULE — delivered files · lines of code on disk · d.ts lines
| # | package | district | files | lines | d.ts lines |
|---|---|---|---|---|---|
| 1 | lodash-es 4.18.1 | registry | 644 | 22,193 | — |
| 2 | hono 4.13.14 | registry | 380 | 25,125 | 7,718 |
| 3 | @oxc-project/runtime 0.156.0 | registry | 232 | 5,198 | — |
| 4 | @uirouter/core 6.1.2 | registry | 162 | 26,255 | 15,854 |
| 5 | lit-html 3.3.3 | registry | 120 | 8,701 | 4,002 |
| 6 | lit 3.3.3 | registry | 77 | 436 | 585 |
| 7 | preact 10.4.8 | registry | 61 | 3,786 | 1,832 |
| 8 | @lit/reactive-element 2.1.2 | registry | 58 | 4,084 | 2,682 |
| 9 | @uirouter/dsr 1.2.0 | registry | 45 | 2,053 | 236 |
| 10 | d3-hierarchy 2.0.0 | registry | 35 | 2,688 | — |
| 11 | d3-interpolate 1.4.0 | registry | 28 | 1,219 | — |
| 12 | lit-element 4.2.2 | registry | 28 | 471 | 616 |
| 13 | @lit/context 1.1.6 | registry | 27 | 1,675 | 834 |
| 14 | @uirouter/sticky-states 1.5.1 | registry | 18 | 1,354 | 186 |
| 15 | marked 4.3.0 | registry | 16 | 11,676 | — |
| 16 | dompurify 3.4.17 | registry | 12 | 39,121 | 888 |
| 17 | d3-color 3.1.0 | registry | 8 | 1,211 | — |
| # | package | district | files | lines | d.ts lines |
|---|---|---|---|---|---|
| 18 | @lit-labs/ssr-dom-shim 1.6.0 | registry | 7 | 1,178 | 223 |
| 19 | tslib 2.8.1 | registry | 6 | 1,363 | 499 |
| 20 | @api-viewer/common 1.0.0-pre.10 | registry | 6 | 234 | 53 |
| 21 | @api-viewer/docs 1.0.0-pre.10 | registry | 5 | 379 | 49 |
| 22 | @uirouter/visualizer 7.2.1 | registry | 3 | 6,048 | 241 |
| 23 | lit-dialog 2.0.1 | registry | 4 | 382 | 92 |
| 24 | @api-viewer/tabs 1.0.0-pre.10 | registry | 3 | 316 | 53 |
| 25 | custom-elements-manifest 2.1.0 | registry | 0 | 0 | 767 |
| 26 | @types/marked 4.3.2 | registry | 0 | 0 | 650 |
| 27 | @types/dompurify 2.4.0 | registry | 0 | 0 | 135 |
| 28 | @types/trusted-types 2.0.7 | registry | 0 | 0 | 119 |
| 29 | sample-app-shared | workspace | 57 | 5,514 | 17 |
| 30 | lit-ui-router 1.19.0 | workspace | 50 | 3,597 | 3,477 |
| 31 | ui-router-server 0.7.1 | workspace | 46 | 3,389 | 1,976 |
| 32 | sample-app-routes | workspace | 11 | 730 | — |
| 33 | ui-router-navigation-location-plugin 1.2.0 | workspace | 2 | 133 | 215 |
| 34 | sample-app-lit-vanilla | the app, src | 11 | 646 | — |
TOTAL — 33 delivered packages · 180,509 lines of code · 43,999 d.ts lines · measured at origin/main @ 3f55e419 (2026-10-31), closure of apps/sample-app-lit-vanilla
GENERAL NOTES
Method: the production closure of apps/ (dependencies plus installed peers — pnpm auto-installs peers, so they are genuinely on disk), resolved through the pnpm store and measured as delivered: lines of .js/ per package directory, source maps and prose excluded, .d.ts drawn separately as the hatched annex. Workspace-linked members are measured by their built dist/ — the shape a registry install would deliver. Plenty of prior art measures this differently — bundlephobia and packagephobia weigh tarballs and install bytes, npmgraph draws the dependency graph — but this sheet measures what actually lands on disk, in files and lines, and stages it as a city with the consumer's own building standing in it for scale. Every count on the drawing and in these notes is read at build time from the plate www/ — measured at origin/main @ 3f55e419 (2026-10-31), closure of apps/sample-app-lit-vanilla — written after installing and building the ref itself, never the working tree. A package the drawing places that the plate does not carry, or a package the plate carries that no district draws, is a build error rather than a stale constant.
The consumer is a doormat in its own city. The app brings 646 lines of its own and receives 180,509 delivered lines of code plus 43,999 of type declarations — 279× its own mass. The router this repo exists to ship, lit-ui-router, delivers 3,597 lines over 50 files: one of the smaller buildings on the skyline it anchors, and 50× smaller than the city it stands in.
Four imports, 22,193 lines. lodash-es is delivered whole — 22,193 lines across 644 files — so the app can call isEqual, cloneDeep, get and set. The bundler tree-shakes almost all of it away, and sheet 9 charts what survives to the wire; the delivered city is the other measure, the one that installs, audits and updates. It is the fourth-tallest building here, behind dompurify, hono and @uirouter/.
One lit, and a server in a client demo. Scoped pnpm overrides (@api-viewer/docs>lit, @api-viewer/common>lit, lit-dialog>lit → ^3.3.3) hold the demo chrome to one lit major, so lit, lit-html, lit-element and @lit/ each stand once in this city. The oddest building is hono at 25,125 lines: ui-router-server names it a peer, so peer auto-install delivers a server framework into a client demo.
Note the vertical scale: 1 px ≈ 250 lines against sheet 7's ≈ 34. Drawn at the workspace's own scale, lodash-es alone would stand 653 px tall — the compression is the finding.
KEY
| delivered code — height = lines on disk | |
| type declarations (d.ts) annex | |
| lit-ui-router · the consumer | |
| district (how it got here) |