Benchmarks
Real-world performance numbers for Litro and competing frameworks, measured on the same hardware with identical page content.
Framework Comparison
Identical minimal apps (2 routes, same content) built in SSG mode. Litro uses Lit + Nitro, Nuxt uses Vue + Nitro, Next.js uses React.
Build Time
Output Size
Avg Page Weight
Production Build Time
| Framework | Version | Mean | Median | p95 | Std Dev |
|---|---|---|---|---|---|
| litro | 0.8.1 | 1.20s | 894.0ms | 1.82s | 441.0ms |
| nuxt | 3.21.2 | 1.91s | 1.92s | 1.93s | 25.0ms |
| nextjs | 14.2.35 | 4.80s | 4.79s | 4.84s | 25.0ms |
Build Output Size
| Framework | Total Size | Relative |
|---|---|---|
| litro> | 35.3 KB | |
| nuxt> | 200.1 KB | |
| nextjs> | 702.8 KB |
HTML Response Size
| Route | litro> raw | litro> gzip | nuxt> raw | nuxt> gzip | nextjs> raw | nextjs> gzip |
|---|---|---|---|---|---|---|
/ |
4.4 KB | 2.0 KB | 1.2 KB | 0.6 KB | 3.9 KB | 1.5 KB |
/blog/hello |
1.6 KB | 0.8 KB | 1.3 KB | 0.7 KB | 4.9 KB | 1.6 KB |
HN Clone Benchmark
Five identical Hacker News clones (3 Litro adapters + Next.js + Nuxt), same fixture data, same routes (~100 pages), SSG mode. Tests realistic app complexity with data fetching, dynamic routes, and nested comment trees.
Build Time
Output Size
Avg Page Weight
† Next.js output includes RSC payload files (.txt) alongside HTML, inflating total on-disk size.
‡ Nuxt produces the smallest page weight because it does not duplicate data for hydration. Litro inlines a __litro_data__ JSON blob (~14 KB on the index page) and Next.js inlines RSC scripts (~25 KB) — both ship serialized data alongside rendered HTML so the client can hydrate. Nuxt prerenders the HTML and ships only a minimal metadata stub (~160 bytes), relying on the server-rendered markup without client re-rendering.
Production Build Time
| Framework | Version | Mean | Median | p95 | Std Dev |
|---|---|---|---|---|---|
| litro-lit | 0.8.1 | 1.53s | 1.35s | 1.88s | 252.0ms |
| litro-fast | 0.8.1 | 1.71s | 1.43s | 2.28s | 402.0ms |
| litro-elena | 0.8.1 | 1.52s | 1.18s | 2.26s | 522.0ms |
| nextjs | 14.2.35 | 5.23s | 5.24s | 5.31s | 63.0ms |
| nuxt | 3.21.2 | 2.46s | 2.47s | 2.50s | 27.0ms |
Build Output Size
| Framework | Total Size | Relative |
|---|---|---|
| litro-lit> | 2.4 MB | |
| litro-fast> | 2.1 MB | |
| litro-elena> | 1.8 MB | |
| nextjs† | 4.3 MB | |
| nuxt> | 1.4 MB |
HTML Response Size
| Route | litro-lit> raw | litro-lit> gzip | litro-fast> raw | litro-fast> gzip | litro-elena> raw | litro-elena> gzip | nextjs> raw | nextjs> gzip | nuxt‡ raw | nuxt‡ gzip |
|---|---|---|---|---|---|---|---|---|---|---|
/ |
44.5 KB | 8.8 KB | 37.4 KB | 8.4 KB | 28.8 KB | 7.9 KB | 43.0 KB | 6.0 KB | 18.0 KB | 4.6 KB |
/ask |
54.3 KB | 15.1 KB | 47.5 KB | 14.8 KB | 40.1 KB | 14.2 KB | 33.0 KB | 4.5 KB | 14.5 KB | 3.4 KB |
/show |
67.5 KB | 18.4 KB | 57.9 KB | 17.4 KB | 49.2 KB | 16.7 KB | 41.9 KB | 5.3 KB | 17.2 KB | 4.0 KB |
/story/47760529 |
61.0 KB | 14.7 KB | 51.3 KB | 11.2 KB | 47.7 KB | 10.8 KB | 62.1 KB | 15.8 KB | 28.6 KB | 9.7 KB |
/user/divan |
11.8 KB | 5.6 KB | 11.6 KB | 5.5 KB | 10.4 KB | 4.9 KB | 6.2 KB | 1.8 KB | 4.7 KB | 1.7 KB |
Lighthouse Performance
Headless Chrome Lighthouse audit on the statically prerendered output, median of 3 runs per route. All five apps serve the same HN content, so differences are architecture-driven rather than data-driven.
Loading strategy skews the score more than runtime speed does.
Next.js emits every JS bundle as <script async>, so its
~450 KB of chunks loads outside Lighthouse's measurement window and
contributes 0 ms to TBT. Litro emits <script type="module">
— ES modules are implicitly deferred, and the browser waits for
module fetch-and-evaluate before firing paint events, which adds
roughly half a second to FCP. Lit's shadow-DOM materialization adds
another ~100 ms. Nuxt hydrates a payload at parse time, producing
measurable TBT on list-heavy pages. Post-hydration, the in-browser
experience is comparable across all five — but Lighthouse weights
FCP/LCP/TBT inside a narrow window, and what loads in that window
dominates the result.
| Route | litro-lit | litro-fast | litro-elena | nextjs | nuxt |
|---|---|---|---|---|---|
/ |
100 | 100 | 98 | 100 | 97 |
/ask |
97 | 99 | 100 | 100 | 99 |
/show |
86 | 99 | 84 | 100 | 97 |
/story/47760529 |
88 | 100 | 100 | 100 | 77 |
/user/divan |
100 | 100 | 100 | 100 | 100 |
| Average | 94 | 100 | 96 | 100 | 94 |
These benchmarks measure static prerendering (SSG) only. Per-request SSR benchmarks — measuring TTFB, throughput, and latency under load — are planned for a future update.
Litro Internals: SSG vs SSR
Deep-dive comparing Litro's Static Site Generation and Server-Side Rendering modes on the docs site. Useful for choosing a deployment strategy.
Build Time
Output Size
Avg TTFB
Build Time
| Metric | SSG | SSR | Faster |
|---|---|---|---|
| Mean | 7.45s | 4.05s | SSR |
| Median | 7.46s | 3.82s | SSR |
| p95 | 7.51s | 4.58s | SSR |
| Std Dev | 57.0ms | 376.0ms |
Bundle Size
| Asset | SSG | SSR |
|---|---|---|
| Client JS | 1.2 MB | 1.2 MB |
| Client CSS | 7.6 KB | 0.0 KB |
| Server Bundle | 0.0 KB | 6.4 MB |
| Static HTML | 5.0 MB | 0.0 KB |
| Total | 10.7 MB | 13.3 MB |
Latency Under Load
| Route | SSG mean | SSG p97.5 | SSG p99 | SSR mean | SSR p97.5 | SSR p99 | Faster |
|---|---|---|---|---|---|---|---|
/ |
0.0ms | 0.0ms | 1.0ms | 28.5ms | 35.0ms | 37.0ms | SSG |
/docs/introduction |
0.2ms | 1.0ms | 1.0ms | 65.3ms | 79.0ms | 122.0ms | SSG |
/blog |
1.3ms | 3.0ms | 3.0ms | 57.5ms | 71.0ms | 109.0ms | SSG |
/blog/welcome |
0.0ms | 0.0ms | 1.0ms | 11.9ms | 22.0ms | 24.0ms | SSG |
Throughput
| Route | SSG req/s | SSG total | SSR req/s | SSR total |
|---|---|---|---|---|
/ |
20,519 | 225,693 | 344 | 3,788 |
/docs/introduction |
14,600 | 145,983 | 152 | 1,667 |
/blog |
4,910 | 49,096 | 172 | 1,718 |
/blog/welcome |
21,919 | 241,082 | 801 | 8,006 |
HTML Response Size
| Route | SSG raw | SSG gzip | SSR raw | SSR gzip | Smaller |
|---|---|---|---|---|---|
/ |
45.9 KB | 8.2 KB | 46.1 KB | 8.2 KB | SSG |
/docs/introduction |
67.6 KB | 12.7 KB | 67.7 KB | 12.7 KB | SSG |
/blog |
238.7 KB | 44.2 KB | 201.0 KB | 36.4 KB | SSR |
/blog/welcome |
27.0 KB | 7.1 KB | 27.1 KB | 7.1 KB | SSG |
Lighthouse Performance (SSG)
Headless Chrome Lighthouse audit of the prerendered docs site, median of 3 runs per route. SSR Lighthouse is not measured — the preview server already renders the same HTML the SSG build produces, so the score would be redundant. For a cross-framework comparison on identical app code, see the HN Clone Lighthouse table.
| Route | Score | FCP | LCP | CLS | TBT | SI |
|---|---|---|---|---|---|---|
/ |
80 | 2.41s | 4.74s | 0.000 | 0.0ms | 2.41s |
/docs/introduction |
63 | 4.88s | 9.76s | 0.000 | 37.0ms | 4.88s |
/blog |
72 | 3.32s | 5.58s | 0.000 | 0.0ms | 3.32s |
/blog/welcome |
63 | 4.66s | 9.61s | 0.000 | 34.5ms | 4.66s |
SSR Streaming
Streaming metrics are SSR-only. TTFB is time to first byte of the response; TTLB is time to last byte. Delta is how long the stream took to deliver the full payload.
| Route | TTFB | TTLB | Delta | Size |
|---|---|---|---|---|
/ |
0.0ms | 3.0ms | 3.0ms | 46.1 KB |
/docs/introduction |
0.0ms | 7.0ms | 7.0ms | 67.7 KB |
/blog |
1.0ms | 6.0ms | 5.0ms | 201.0 KB |
/blog/welcome |
0.0ms | 1.0ms | 1.0ms | 27.1 KB |
Litro