Benchmarks
One app, built three ways to the same spec. Measured on Apple M1 · 8 cores, 2026-08-04.
| Metric | rshono | Next.js | TanStack Start |
|---|---|---|---|
| Initial payload, prerendered pagebrotli, document + JS + CSS | 60.2 kB | 162.3 kB | 98.8 kB |
| Cold production buildmedian of the trials | 429ms | 3.17s | 3.16s |
| Cold dev server startto a served /interactive | 504ms | 1.60s | 2.25s |
| Spawn to first responsefresh process | 268ms | 330ms | 529ms |
| Metric | rshono | Next.js | TanStack Start |
|---|---|---|---|
| / — prerenderedserved from disk | 35,103 rps | 6,414 rps | 4,962 rps |
| /ssr — 100 rowsrendered per request | 354 rps | 322 rps | 287 rps |
| /interactivethree client components | 1,375 rps | 676 rps | 975 rps |
| /api/healthno React on the path | 30,334 rps | 4,524 rps | 12,597 rps |
| Metric | rshono | Next.js | TanStack Start |
|---|---|---|---|
| IdleRSS before any load | 73.47 MB | 95.16 MB | 159.55 MB |
| After loadRSS high-water mark, 256 MB old space | 157.22 MB | 199.56 MB | 209.80 MB |
| Churn per 1k requestsgrowth ÷ requests served | 159.6 kB | 1.09 MB | 341.4 kB |
- Payload and size figures are exact. Timings are laptop numbers — treat spreads under ~10% as a tie.
- Throughput is a floor check. All three render through the same React, so
/ssrand/interactivelargely compare React with itself;/api/healthhas no React on the path and is where the frameworks themselves are visible. - Memory is a high-water mark, not retention — RSS includes garbage V8 has not collected, and each route is driven for a fixed eight seconds, so the server answering the most requests allocates the most. All three are given the same 256 MB old-space budget, and churn per 1k requests is the row that removes the bias.
- rshono loses on production install size: rshono 72.82 MB, Next.js 291.09 MB, TanStack Start 57.47 MB. Every metric is in the full report.
One spec file says what each app must do, and the payload runner asserts it — a route that stopped rendering the same thing fails the check rather than quietly reporting a smaller number.
pnpm --filter @rshono/benchmarks setup:apps
pnpm --filter @rshono/benchmarks benchpackages/benchmarks has the method and what it deliberately does not measure.