Dev Time Run Time e18e.dev Blog
← All frameworks

Mastro

Version unknown · Measured 4/24/2026

Dev Time Performance

Measured using pnpm on GitHub Actions (ubuntu-latest, Node 24) based on the starter project set up by each framework's CLI.

Prod Deps Dev Deps Dup. Deps node_modules node_modules (prod) Dep Install Size Graph
2 2 0 29.16MB 3.36MB 27.39MB View
Metric Avg Min Max
Install 0.66s 0.52s 1.04s
Cold Build 0.34s 0.33s 0.36s
Warm Build 0.34s 0.33s 0.34s

Build output size: 0.01MB

Runtime Performance

SSR Performance

Measured on GitHub Actions (ubuntu-latest, Node 24) using custom SSR benchmark apps.

Framework Ops/sec Avg Latency Body Size Duplication
Baseline HTML 708 1.422ms 96.81kb 1x
Mastro 255 3.951ms 181.95kb 1x

Methodology

  • Each framework renders a table of 1000 rows with two UUID columns
  • Mock HTTP requests bypass TCP overhead for accurate rendering measurement
  • 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
  • Astro, Nuxt, and SvelteKit handle Node.js HTTP requests natively. React Router, SolidStart, and TanStack Start use Web APIs internally, so benchmarks include the cost of their Node.js adapter layers (@react-router/node, h3, and srvx respectively)
  • Next.js defaults to React Server Components (RSC), a different rendering model than traditional SSR. To keep the comparison fair, Next.js uses "use client" to opt out of RSC and use traditional SSR + hydration like most of the other frameworks
  • Inspired by eknkc/ssr-benchmark

SPA Performance

Measured on GitHub Actions (ubuntu-latest, Node 24) using Lighthouse flow with Chromium.

Framework First Paint FCP INP
Mastro undefinedms undefinedms undefinedms

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, TanStack Start, and React Router default to SSR with no per-route opt-out. Next.js wraps the SPA table in a dynamic import with ssr: false to prevent build-time prerendering. TanStack Start uses its built-in spa mode. React Router disables SSR entirely via ssr: false in its config. All other frameworks (Nuxt, SvelteKit, SolidStart, Astro) disable SSR per-route without a separate build.

MPA Performance

Measured on GitHub Actions (ubuntu-latest, Node 24) using Lighthouse flow with Chromium.

Framework First Paint FCP INP
Mastro undefinedms undefinedms undefinedms

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, TanStack Start, and React Router default to SSR with no per-route opt-out. Next.js wraps the SPA table in a dynamic import with ssr: false to prevent build-time prerendering. TanStack Start uses its built-in spa mode. React Router disables SSR entirely via ssr: false in its config. All other frameworks (Nuxt, SvelteKit, SolidStart, Astro) disable SSR per-route without a separate build.