Dev TimeRun Timee18e.devBlog
โ† All frameworks

TanStack Start

Version 1.145.3 ยท Measured 6/29/2026

Dev Time Performance

Prod DepsDev DepsDup. Depsnode_modulesnode_modules (prod)Dep Install SizeGraph
131114234.77MB201.87MB198.52MBView
MetricAvgMinMax
Install1.85s1.79s1.89s
Cold Build5.40s5.22s5.68s
Warm Build5.32s5.28s5.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

FrameworkFirst PaintFCPINP
TanStack Start148.8ms148.68ms26.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

FrameworkFirst PaintFCPINP
TanStack Start120.6ms120.69ms29.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

FrameworkOps/secMedian LatencyBody SizeDuplication
Baseline HTML8411.206ms96.83kb1x
TanStack Start3153.146ms193.62kb2x

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

FrameworkPeak req/sPeak ConnectionsP99 @ 25P99 @ 50P99 @ 100Total Req.
Baseline HTML1,629.85020ms44ms107ms48,210
TanStack Start4254429ms4150ms4434ms1,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