Point0by 1gr14
  • Меню
    • GitHub
    • Блог
  • 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
    • Главная
    • Start0
    • Поддержать
    • Обучение
    • Группа
    • Блог
    • Автор
  • Сообщество
    • Discord
    • Telegram
  • Опенсорс
    • Point0
    • Route0
    • Error0
    • Flat
    • Agents Party
  • Аккаунт
    • Войти
    • Регистрация
Point0by 1gr14
Создаю опенсорс во славу Господа Иисуса Христа ☦️
С любовью ко всем разработчикам на свете ❤️
Условия использованияПолитика конфиденциальностиСергей Дмитриев 2026 😎
You have unsaved changes

Benchmarks

  • Раздел: Introduction

On this page

  1. Summary
  2. The edit loop
  3. Types at scale: two different questions
  4. Navigation and payloads
  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: Point0 0.3.13, Next.js 16.3.2, TanStack Start 1.168.27, React Router 8.3.0, React 19.2.8 everywhere. Each framework runs on its own supported runtime — Point0 on Bun 1.4.0, 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
HMR, edit → DOM ↓20 ms54 ms 2.7×175 ms 8.8×157 ms 7.9×
Dev start, warm ↓972 ms1,924 ms +98%2,015 ms +107%1,263 ms +30%
Prod build, L (+500 pages) ↓7.49 s10.87 s +45%18.20 s +143%4.47 s −40%
Editor re-check, L ↓1.06 s0.82 s −23%1.07 s +1%0.96 s −9%
Cold type-check (CI), L · TS7 ↓6.85 s0.23 s −97%0.58 s −92%1.12 s −84%
First-load JS, /post (gzip) ↓150 kB136 kB −9%104 kB −31%103 kB −31%
Nav data payload, dashboard (gzip) ↓470 B1,335 B +184%274 B −42%254 B −46%
Time-to-shell, /slow (streamed) ↓7 ms10 ms +43%5 ms −29%5 ms −29%
SSR /post, req/s c64 ↑ *1,548882 −43%3,284 +112%1,156 −25%
Prod cold start ↓448 ms721 ms +61%100 ms −78%612 ms +37%
RSS idle ↓348 MB363 MB +4%173 MB −50%251 MB −28%

↓ 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 1,200 req/s.

The edit loop

This is where Point0's advantage is concentrated, and it is the part of the table you touch most often.

  • HMR lands in 20 ms against Next's 54 ms and TanStack's and React Router's ~160 ms. This is the loop that runs on every save.
  • Warm dev start is 972 ms — the only sub-second start of the four (React Router 1.26 s, Next 1.92 s, TanStack 2.02 s). Cold dev start is Point0's slowest row at 2.47 s: that is the first run of a project ever, when the compiler's first pass fills a persistent disk cache.
  • Production build at scale is second: 7.49 s for 500 pages, ahead of Next's 10.87 s and TanStack's 18.20 s. React Router's lean Vite pipeline is the build-speed leader at both sizes (1.64 s base, 4.47 s at 500 pages).

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 clear cost. Inferring everything end-to-end with zero annotations runs to 2.23M type instantiations at 500 pages — 6.85 s on native TS7, 17.45 s on the JS tsc — against Next's 0.23 s and TanStack's 0.58 s. You pay that in CI, and it is a real bill.

The per-edit re-check — the lag you feel while typing — does not separate the field. Point0 pages are isolated exports: there is no monolithic AppRouter type to re-instantiate on each keystroke, and the generated route map is just path strings.

Per-edit re-checkPoint0Next.jsTanStack StartReact Router
4 pages0.94 s0.61 s −35%0.91 s −3%0.61 s −35%
504 pages1.06 s0.82 s −23%1.07 s +1%0.96 s −9%

All four stay flat from 4 pages to 504, and at any given size they sit within a third of a second of each other. Point0 sits at the slow end of that band — which is another way of saying this metric will not decide anything for you. The structural outlier is React Router's cold check: its typed routes grow combinatorially, from 10k instantiations at 4 pages to 4.35M at 504 — the largest count of the four — though native TS7 still clears it in 1.12 s.

Navigation and payloads

After the first document, a Point0 navigation ships query data and never HTML. So do TanStack Start and React Router, and on the dashboard case — rich markup, tiny data, the shape of a real SaaS page — the three land close together: React Router 254 B, TanStack 274 B, Point0 470 B gzipped. At that scale the gaps between them do not matter. Next is the outlier at 1,335 B, because its RSC flight payload re-sends the rendered markup; the fair caveat is that Next prefetches every visible link, so those bytes move before the click rather than during it.

Felt latency does not differentiate either: a dashboard→dashboard click resolves in 30–33 ms on all four.

The other side of the ledger is first-load JS, and it is Point0's heaviest row: 150 kB gzipped against Next's 136 kB and TanStack's and React Router's ~103 kB. Point0 pays that once on the first load and collects on every click after.

Memory is a cost too, and it does not wash out. Against a bare Bun.serve + renderToString floor of 118 MB, Point0 idles at 348 MB — about 230 MB of framework tax — while TanStack sits ~38 MB above its Node floor. Point0 is the second-heaviest of the four at idle.

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 — Point0 in 7 ms via a .loading() fallback + .query({ suspend: 'server' }), and the 5–10 ms spread across the four is noise on a local server. The contrast row is Point0 with streaming off: the whole document waits for the slow block and nothing appears until ~1,515 ms. That is 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 at 3,284 req/s — a real and large lead — followed by warmed Point0 at 1,548, default Point0 at 1,200, React Router at 1,156 and Next at 882.

Point0's default is a render-to-discover loop: it renders, sees which queries the page needs, fetches them, re-renders — so you never declare a page's data dependencies, which none of the other three offer. That convenience costs ~22% (1,200 vs 1,548 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 is 6.5 kB raw vs TanStack's 3.8 kB, and gzip closes most of the gap: 2.19 kB vs 1.68 kB. Next's document is the largest of the four (8.9 kB raw, 2.44 kB gzipped), since RSC inlines its flight payload in a less compressible format.

Prod cold start is 448 ms — behind TanStack's 100 ms, ahead of React Router's 612 ms and Next's 721 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 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 differences stop existing:

DB delayPoint0Next.jsTanStack StartReact Router
0 ms0.90 ms2.00 ms0.39 ms1.23 ms
5 ms8.22 ms8.26 ms8.19 ms8.70 ms
20 ms25.14 ms25.82 ms25.16 ms26.01 ms

At 5 ms the four land within half a millisecond of each other; at 20 ms, within a millisecond. Those are noise, not rankings — no delta you could act on. Any app that touches a database lives in the second regime, so the raw-SSR ordering describes frameworks in a vacuum and stops describing your app the moment a real query enters the loop. That is the reasoning behind where Point0 spends its budget: HMR, dev start and navigation payloads are costs a faster database cannot refund.

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.

НазадFull OverviewДалееPoints

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