Point0by 1gr14
  • Menu
    • GitHub
    • Blog
  • Introduction
    • Overview
    • Getting Started
    • Full Overview
    • Benchmarks
    • Points
  • Points
    • Page
    • Layout
    • Component
    • Provider
    • Mountable
    • Query
    • Infinite Query
    • Mutation
    • Action
    • Subscription
    • Root
    • Base
    • Plugin
  • Methods
    • Validation
    • Loader
    • Context
    • Middleware
    • Loading & error
    • .with
    • Mapper
    • Transformer
    • Stage Methods
  • Core
    • Navigation
    • SSR
    • RSC
    • Socket
    • Request
    • Response
    • Error handling
    • Env
    • Head
    • MDX
    • Assets
    • File upload
    • OpenAPI
    • Query client
    • Events
    • Infer
  • Engine
    • Engine Config
    • Engine Runtime
    • CLI
    • Dev
    • Build
    • Compiler
    • Generator
    • Project MCP
    • Docs MCP
    • Importer
    • Public dir
    • Testing
    • Deploy
    • Bun or Vite
  • Extra
    • SsrStore
    • CookieStore
    • Basic Auth
    • CORS
    • Cache-Control
    • Compress
  • Examples
    • Basic
    • Vite
    • Better Auth
    • Socket
    • Capacitor
    • Expo
  • 1gr14
    • Home
    • Start0
    • Support
    • Education
    • Group
    • Blog
    • Author
  • Community
    • Discord
    • Telegram
  • Open Source
    • Point0
    • Route0
    • Error0
    • Flat
    • Agents Party
  • Account
    • Sign In
    • Sign Up
Point0by 1gr14
Building open-source software for the glory of the Lord Jesus Christ ☦️
With love for developers of all backgrounds around the world ❤️
Terms of ServicePrivacy PolicySergei Dmitriev 2026 😎

Benchmarks

  • Category: Introduction

On this page

  1. Summary
  2. Where Point0 wins: the loop you live in
  3. Types at scale: two different questions
  4. Navigation ships data, never HTML
  5. Streaming: opt-in, and what it buys
  6. Raw SSR: the price of not declaring data deps
  7. The DB reality check
  8. Reproduce

Every number on this page comes from the open benchmark repo: github.com/1gr14/point0-benchmarks. The setup: the same app — a small blog plus a SaaS-style dashboard — built four times (Point0, Next.js, TanStack Start, React Router), each in its framework's native idiom, rendering the same content from the same deterministic in-memory store. A Playwright parity gate (22 assertions per app) must be green before any number counts; results are medians over repeated runs; raw per-run JSON is committed. This page is the short read — the repo README carries the full method and all tables.

Measured on an Apple M1 Pro (August 2026): Point0 0.3.10, Next.js 16.3.0, TanStack Start 1.168.27, React Router 8.3.0, React 19.2.7 everywhere. Each framework runs on its own supported runtime — Point0 on Bun 1.3.14, the others on Node 22.21.1 — and every load number sits next to a bare Bun.serve / node:http floor, so runtime and framework tax stay separable.

In the tables, every competitor cell carries a small delta vs Point0: green means that framework is better on the metric, red means worse. Point0's own cells stay bare.

Summary

Point0Next.jsTanStack StartReact Router
Runtime (as shipped)BunNodeNodeNode
Prod build, L (+500 pages) ↓10.26 s11.85 s +15%18.82 s +83%4.53 s −56%
HMR, edit → DOM ↓14 ms42 ms 3.0×161 ms 11.5×152 ms 10.9×
Dev start, warm ↓1,281 ms1,991 ms +55%2,027 ms +58%1,296 ms +1%
Editor re-check, L ↓1.47 s1.26 s −14%1.50 s +2%1.42 s −3%
Cold type-check (CI), L · TS7 ↓6.74 s0.24 s −96%0.60 s −91%1.13 s −83%
First-load JS, /post (gzip) ↓152 kB135 kB −11%104 kB −32%103 kB −32%
Nav payload, dashboard → dashboard ↓473 B1,342 B +184%275 B −42%552 B +17%
Time-to-shell, /slow (streamed) ↓7 ms8 ms +14%3 ms −57%4 ms −43%
SSR /post, req/s c64 ↑ *1,166834 −28%3,388 +191%1,239 +6%
Prod cold start ↓463 ms759 ms +64%99 ms −79%629 ms +36%

↓ lower is better · ↑ higher is better. * Point0's SSR row is its warmed build (.onPrefetchPage, 0 re-renders) — the peer of the others' eager loaders; the default lazy build does 888 req/s.

Where Point0 wins: the loop you live in

  • HMR lands in ~14 ms — within one frame — against Next's 42 ms and TanStack's and React Router's ~150 ms. This is the number you feel hundreds of times a day.
  • Warm dev start is the fastest at 1.28 s (React Router is right behind at 1.30 s; Next and TanStack take ~2 s). The cold row — 3.1 s, the slowest — is the first run of a project ever: the compiler's first pass fills a persistent disk cache and pays once per project.
  • Production build at scale is second: 10.3 s for 500 pages, ahead of Next's 11.9 s and TanStack's 18.8 s (at the base size Point0 is mid-pack: 5.1 s vs TanStack's 4.4 s). React Router's lean Vite pipeline is the build-speed leader at every size — 4.5 s for 500 pages, credit where due.

Types at scale: two different questions

Cold whole-project tsc and editor responsiveness are different metrics, and conflating them is the usual mistake.

The cold check is Point0's slow axis. Inferring everything end-to-end with zero annotations costs ~4,300 type instantiations per page: at 500 pages that's 2.23M instantiations — 6.7 s on native TS7, 17.4 s on the JS tsc — versus Next's 0.24 s and TanStack's 0.6 s. You pay that in CI.

The per-edit re-check — the lag you feel while typing — stays flat. Point0 pages are isolated exports: no monolithic AppRouter type to re-instantiate on each keystroke (the tRPC trap), and the generated route map is just path strings.

Per-edit re-checkPoint0Next.jsTanStack StartReact Router
4 pages1.38 s1.03 s −25%1.34 s −3%1.05 s −24%
504 pages1.47 s1.26 s −14%1.50 s +2%1.42 s −3%

Everyone holds flat here now (Next fixed its old per-edit degradation in 16.x); Point0 sits at the top of the band — ~0.2 s behind Next, in the same lane as TanStack — not multiples behind anyone. The outlier at scale is React Router's cold check: its typed routes explode combinatorially — 10k instantiations at 4 pages, 4.35M at 504, double Point0's count.

Navigation ships data, never HTML

After the first document, a Point0 navigation ships only query data. On a post→post click that's ~0.84 kB against Next's ~1.2 kB RSC payload (TanStack: ~0.63 kB, React Router: ~0.94 kB). The dashboard case — rich markup, tiny data, the shape of a real SaaS page — makes the split sharp: Point0 moves 473 B per click and TanStack 275 B, while Next re-sends the rendered markup as its flight payload — 1,342 B, roughly 3× Point0.

The other side of the ledger: first-load JS. Point0 is currently the heaviest of the four — 152 kB gzipped against Next's 135 kB and TanStack's and React Router's ~103 kB — the bundle price of the RSC/streaming machinery added through 0.2–0.3. Point0 pays once on the first load and collects on every click after.

Streaming: opt-in, and what it buys

Every framework here can stream a slow block into the same response after the shell. On a page with one 1.5 s query, all four ship the shell in single-digit milliseconds when streaming — Point0 in 7 ms via a .loading() fallback + .query({ suspend: 'server' }). The contrast row is Point0 with streaming off: the whole document waits for the slow block, and the shell arrives at ~1,510 ms. That's what streaming buys back — and Point0 makes it a per-query opt-in instead of an architecture decision.

Raw SSR: the price of not declaring data deps

On raw SSR throughput with in-memory data, TanStack leads (3,388 req/s), React Router and warmed Point0 are essentially tied (1,239 vs 1,166), Next is behind (834). Point0's default is a render-to-discover loop: it renders, sees which queries the page needs, fetches, re-renders — so you never declare a page's data dependencies, which none of the other three offer. That convenience costs ~24% (888 req/s); one opt-in hook (.onPrefetchPage(() => q.fetchQuery(...))) removes it.

Point0's SSR document carries data twice — markup plus the dehydrated React Query cache that makes every piece of data a live, cacheable query on the client. On a text-heavy post that's 6.5 kB raw vs TanStack's 3.8 kB — and gzip cuts the gap sharply: 2.2 kB vs 1.7 kB. Next's document is the largest of the four (8.9 kB raw, 2.4 kB gzipped): RSC inlines its flight payload, duplicating the same data in a less compressible format.

Prod cold start is 463 ms — behind TanStack's 99 ms, ahead of React Router's 629 ms and Next's 759 ms. Part of that is deliberate: Point0 imports the whole app at boot, so a broken page fails the process at deploy time, not on a user's first request.

The DB reality check

The raw-SSR numbers above measure frameworks in a vacuum — the loader is trivial, so framework CPU is the whole latency. Add one realistic DB query and the gap collapses:

DB delayPoint0Next.jsTanStack StartReact Router
0 ms1.15 ms1.76 ms +53%0.33 ms −71%1.01 ms −12%
20 ms27.14 ms25.48 ms −6%24.96 ms −8%26.07 ms −4%

At 20 ms of DB latency all four land within 25–27 ms; the framework becomes a 20–26% slice that keeps shrinking as queries get heavier. That's why Point0 spends its budget on what a database can't erase: HMR, navigation payloads, and the edit loop.

Reproduce

git clone https://github.com/1gr14/point0-benchmarks
cd point0-benchmarks
bun run setup   # installs all four apps + Playwright
bun run parity  # the gate — 22/22 must pass per app
bun run bench:all
bun run render  # regenerates the README from results/

Numbers are machine-dependent (except type instantiations and byte sizes, which are deterministic); the repo's manifest records the exact machine and versions behind every published table. If you find a setup that treats any framework unfairly — open an issue.

PreviousFull OverviewNextPoints

Enjoying Point0?

Give it a star on GitHub, ask questions, and follow what's new

Star Point0

A star on GitHub helps more developers find Point0
Star on GitHub

Start0

Point0 integrated into the Start0 SaaS boilerplate — the best way to use it
Explore Start0

YouTube

Tutorials, walkthroughs, and updates
YouTube

Discord

Questions and chat in English
Join Discord

Telegram

News channel and chat in Russian
ChannelChat

Twitter

Posts and updates
Twitter