Dev Time Run Time e18e.dev
โ† All frameworks

TanStack Start

Version 1.145.3 ยท Measured 6/29/2026

Dev Time Performance

Prod Deps Dev Deps Dup. Deps node_modules node_modules (prod) Dep Install Size Graph
13 11 14 234.77MB 201.87MB 198.52MB View
Metric Avg Min Max
Install 1.85s 1.79s 1.89s
Cold Build 5.40s 5.22s 5.68s
Warm Build 5.32s 5.28s 5.36s

Build output size: 2.05MB

Duplicate Dependencies

14 duplicate dependencies detected across this starter's node_modules.

View 14 duplicate dependencies
  • lru-cache
    [duplicate dependency] lru-cache has 2 installed versions:
    11.2.6 via the following 4 package(s) unstorage@2.0.0-alpha.5, @asamuzakjp/dom-selector@6.8.1, @asamuzakjp/css-color@4.1.2, cssstyle@5.3.7
    5.1.1 via the following 1 package(s) @babel/helper-compilation-targets@7.28.6
    ๐Ÿ’ก Suggestions
    - Consider standardizing on version 11.2.6 as this version is the most commonly used.
    - Consider upgrading consuming packages as this may resolve this duplicate version.
    
  • @babel/code-frame
    [duplicate dependency] @babel/code-frame has 2 installed versions:
    7.27.1 via the following 1 package(s) @tanstack/start-plugin-core@1.145.3
    7.29.0 via the following 4 package(s) @babel/core@7.29.0, @babel/traverse@7.29.0, @babel/template@7.28.6, @testing-library/dom@10.4.1
    ๐Ÿ’ก Suggestions
    - Consider standardizing on version 7.29.0 as this version is the most commonly used.
    - Consider upgrading consuming packages as this may resolve this duplicate version.
    
  • js-tokens
    [duplicate dependency] js-tokens has 2 installed versions:
    4.0.0 via the following 2 package(s) @babel/code-frame@7.29.0, @babel/code-frame@7.27.1
    9.0.1 via the following 1 package(s) strip-literal@3.1.0
    ๐Ÿ’ก Suggestions
    - Consider standardizing on version 4.0.0 as this version is the most commonly used.
    - Consider upgrading consuming packages as this may resolve this duplicate version.
    
  • @tanstack/devtools-client
    [duplicate dependency] @tanstack/devtools-client has 2 installed versions:
    0.0.3 via the following 1 package(s) @tanstack/devtools@0.7.0
    0.0.5 via the following 1 package(s) @tanstack/devtools-vite@0.3.12
    ๐Ÿ’ก Suggestions
    - Consider upgrading consuming packages as this may resolve this duplicate version.
    
  • @tanstack/devtools-event-client
    [duplicate dependency] @tanstack/devtools-event-client has 2 installed versions:
    0.3.5 via the following 1 package(s) @tanstack/devtools-client@0.0.3
    0.4.0 via the following 1 package(s) @tanstack/devtools-client@0.0.5
    ๐Ÿ’ก Suggestions
    - Consider upgrading consuming packages as this may resolve this duplicate version.
    
  • picomatch
    [duplicate dependency] picomatch has 2 installed versions:
    4.0.3 via the following 6 package(s) fdir@6.5.0, vite@7.3.0, tinyglobby@0.2.15, unplugin@2.3.11, @tanstack/devtools-vite@0.3.12, vitest@3.2.4
    2.3.1 via the following 2 package(s) anymatch@3.1.3, readdirp@3.6.0
    ๐Ÿ’ก Suggestions
    - Consider standardizing on version 4.0.3 as this version is the most commonly used.
    - Consider upgrading consuming packages as this may resolve this duplicate version.
    
  • @tanstack/router-utils
    [duplicate dependency] @tanstack/router-utils has 2 installed versions:
    1.158.0 via the following 1 package(s) @tanstack/react-start@1.145.3
    1.143.11 via the following 3 package(s) @tanstack/router-generator@1.145.2, @tanstack/router-plugin@1.145.2, @tanstack/start-plugin-core@1.145.3
    ๐Ÿ’ก Suggestions
    - Consider standardizing on version 1.143.11 as this version is the most commonly used.
    - Consider upgrading consuming packages as this may resolve this duplicate version.
    
  • source-map
    [duplicate dependency] source-map has 2 installed versions:
    0.7.6 via the following 1 package(s) @tanstack/router-generator@1.145.2
    0.6.1 via the following 1 package(s) recast@0.23.11
    ๐Ÿ’ก Suggestions
    - Consider upgrading consuming packages as this may resolve this duplicate version.
    
  • @rolldown/pluginutils
    [duplicate dependency] @rolldown/pluginutils has 2 installed versions:
    1.0.0-beta.40 via the following 1 package(s) @tanstack/start-plugin-core@1.145.3
    1.0.0-beta.53 via the following 1 package(s) @vitejs/plugin-react@5.1.2
    ๐Ÿ’ก Suggestions
    - Consider upgrading consuming packages as this may resolve this duplicate version.
    
  • srvx
    [duplicate dependency] srvx has 2 installed versions:
    0.10.1 via the following 3 package(s) @tanstack/start-plugin-core@1.145.3, crossws@0.4.4, nitro@3.0.1-alpha.2
    0.11.4 via the following 1 package(s) h3@2.0.1-rc.14
    ๐Ÿ’ก Suggestions
    - Consider standardizing on version 0.10.1 as this version is the most commonly used.
    - Consider upgrading consuming packages as this may resolve this duplicate version.
    
  • parse5
    [duplicate dependency] parse5 has 2 installed versions:
    7.3.0 via the following 3 package(s) cheerio@1.2.0, parse5-htmlparser2-tree-adapter@7.1.0, parse5-parser-stream@7.1.2
    8.0.0 via the following 1 package(s) jsdom@27.4.0
    ๐Ÿ’ก Suggestions
    - Consider standardizing on version 7.3.0 as this version is the most commonly used.
    - Consider upgrading consuming packages as this may resolve this duplicate version.
    
  • whatwg-mimetype
    [duplicate dependency] whatwg-mimetype has 2 installed versions:
    4.0.0 via the following 2 package(s) cheerio@1.2.0, jsdom@27.4.0
    5.0.0 via the following 1 package(s) data-urls@6.0.1
    ๐Ÿ’ก Suggestions
    - Consider standardizing on version 4.0.0 as this version is the most commonly used.
    - Consider upgrading consuming packages as this may resolve this duplicate version.
    
  • entities
    [duplicate dependency] entities has 3 installed versions:
    4.5.0 via the following 1 package(s) dom-serializer@2.0.0
    7.0.1 via the following 1 package(s) htmlparser2@10.1.0
    6.0.1 via the following 2 package(s) parse5@7.3.0, parse5@8.0.0
    ๐Ÿ’ก Suggestions
    - Consider standardizing on version 6.0.1 as this version is the most commonly used.
    - Consider upgrading consuming packages as this may resolve this duplicate version.
    
  • h3
    [duplicate dependency] h3 has 2 installed versions:
    2.0.1-rc.14 via the following 1 package(s) nitro@3.0.1-alpha.2
    2.0.1-rc.7 via the following 0 package(s) 
    ๐Ÿ’ก Suggestions
    - Consider upgrading consuming packages as this may resolve this duplicate version.
    

Runtime Performance

Client Side Rendered Tests

Framework First Paint FCP INP
TanStack Start 148.8ms 148.68ms 26.36ms

Methodology

  • Each framework renders a table of 1000 rows with two UUID columns
  • Measured using Lighthouse flow with Chromium via Puppeteer for accurate browser metrics
  • First Paint and First Contentful Paint are measured on initial navigation
  • Interaction to Next Paint is measured by clicking the first row's detail link
  • Benchmarks run 5 times and results are averaged
  • Next.js wraps the client-side rendered table in a dynamic import with ssr: false to prevent build-time prerendering
  • TanStack Start, Nuxt, SvelteKit, and SolidStart disable SSR per-route
  • React Router uses route-level clientLoader functions with HydrateFallback so the client-rendered routes are not server-rendered
  • Astro uses client-only React islands for client-side rendered routes
  • Client-side rendered tests use each framework's normal production build because SPA-only build modes are not supported consistently across the frameworks being compared
  • Astro uses React for its client-side rendered test: the benchmark table and detail components are React islands rendered with client:only="react", which prevents Astro from server-rendering those components and lets them render only in the browser. Astro's ClientRouter is not used for this CSR test because it enables client-side transitions and soft navigation behavior rather than client-only rendering.

Server Side Rendered Tests

Framework First Paint FCP INP
TanStack Start 120.6ms 120.69ms 29.5ms

Methodology

  • Each framework renders a table of 1000 rows with two UUID columns
  • Measured using Lighthouse flow with Chromium via Puppeteer for accurate browser metrics
  • First Paint and First Contentful Paint are measured on initial navigation
  • Interaction to Next Paint is measured by clicking the first row's detail link
  • Benchmarks run 5 times and results are averaged
  • The measured route is /server-side-rendered, and detail navigation uses /server-side-rendered/:id.

Server Side Throughput Tests

Framework Ops/sec Median Latency Body Size Duplication
Baseline HTML 841 1.206ms 96.83kb 1x
TanStack Start 315 3.146ms 193.62kb 2x

Methodology

  • Each framework renders the dedicated /ssr-throughput route with a table of 1000 rows and UUID id/name columns
  • This route intentionally does not render the exact same table as the browser SSR and load tests: it omits detail links and framework link components so router, prefetch, and navigation metadata do not dominate the request-handler throughput measurement
  • Mock HTTP requests bypass TCP overhead so this measures request-handler rendering throughput rather than full server throughput
  • Data is loaded asynchronously to simulate real-world data fetching
  • Duplication factor indicates how many times each UUID appears in the response (1x = optimal, 2x = includes hydration payload)
  • Benchmarks run for 10 seconds using tinybench
  • Frameworks are invoked through their production request handlers where possible. Web API handlers are called with Request objects; Node.js handlers are called with mock IncomingMessage and ServerResponse objects.
  • Next.js renders the throughput table as a client component, matching the setup from PR #94, so the benchmark compares traditional server-rendered React + hydration work instead of making Next.js render every table row as React Server Components
  • Inspired by eknkc/ssr-benchmark

Server Side Load Test

Framework Peak req/s Peak Connections P99 @ 25 P99 @ 50 P99 @ 100 Total Req.
Baseline HTML 1,629.8 50 20ms 44ms 107ms 48,210
TanStack Start 42 5 4429ms 4150ms 4434ms 1,289

Methodology

  • Each framework serves the server-rendered table route over a real local HTTP server
  • The measured route is /server-side-rendered, using the same 1000-row UUID table as the SSR request throughput and browser rendering tests
  • Load is applied in staged connection counts, from 1 through 200 concurrent connections, with each stage running for approximately 5 seconds
  • Peak requests/sec is the highest successful stage throughput observed during the staged run
  • P90 and P99 latency are compared at the 25-, 50-, and 100-connection stages for every framework, so latency is measured under the same concurrency pressure
  • Total requests cover the full staged load run, not only the peak stage