Written by Huifer, solo developer and maintainer of TanStack Ship. I tested ShipFast and TanStack Ship on the same benchmark SaaS spec — auth + Stripe + admin + blog + UTM — over 8 days. The build time and runtime numbers in this post are from that exercise. ShipFast wins on community momentum; TanStack Ship wins on edge performance and lock-in avoidance.
Verified sources: TanStack Ship GitHub org · TanStack Start docs · Cloudflare Workers docs Last updated: 2026-07-23 · Changelog
TL;DR: ShipFast is the right pick if you want a Next.js + Vercel starter with the largest community and the most third-party integrations already wired. TanStack Ship is the right pick if you care about cold start, edge coverage, egress cost, and avoiding vendor lock-in to Vercel. Both ship the same business modules — auth, billing, UTM, i18n, admin, AI tooling — but they get there on different runtimes. The numbers below are from an 8-day benchmark I ran on the same SaaS spec.
TL;DR — Who Each Is For
Pick ShipFast if you want to ship a Next.js SaaS this weekend, you are comfortable being inside Vercel's runtime, your audience is mostly North America and EU, and you value community size over edge coverage. ShipFast has the larger community (35k+ stars at last check), the longer track record (2023), and the most drop-in third-party integrations.
Pick TanStack Ship if you care about sub-50ms cold starts, want zero-egress on assets, need to deploy to 300+ edge locations, want type-safe routing without server-only boundaries, or want your starter to be portable between Cloudflare, Vercel, and Netlify without rewrite. TanStack Ship is younger (2025) and has a smaller community (~3k stars), but it ships on TanStack Start and Cloudflare Workers — a runtime combination that produces different performance characteristics.
Both are legitimate choices. The wrong choice is picking one for the wrong reason. The rest of this post is the measurements and the decision tree.
How I Benchmarked Both
The benchmark was a 5-route SaaS spec: a marketing landing page, a sign-up route, a Stripe checkout route, a UTM-tracked blog index, and a single product detail page. The same SaaS, the same feature set, the same database schema (Postgres for ShipFast, D1 for TanStack Ship — different engines but the same logical tables). The same load profile: 200 req/s peak, 30 req/s sustained, synthetic traffic from 8 regions across NA, EU, and APAC. Both deployed to production with their respective one-click deploy buttons.
The numbers below are p50 / p95 percentiles measured at the edge over 8 days. The cold-start number was measured by killing the deployment instance at 04:00 UTC and timing the first request after a fresh container start. The TTFB numbers were measured under steady-state load. Egress cost came from the Vercel / Cloudflare billing dashboards.
What I Did Not Measure
Two dimensions I did not benchmark: long-tail maintainability and the cost of hiring. Both depend on team familiarity, which I cannot measure in 8 days. The community-size numbers (35k vs 3k stars) are a proxy for "how easy is it to find an answer on Stack Overflow," but they are not the same thing. Take them as directional, not definitive.
Stack Comparison: TanStack Start vs Next.js, Cloudflare vs Vercel
ShipFast runs on Next.js 15 + Vercel. The runtime is Vercel's serverless functions for SSR/RSC, Vercel KV for state, Vercel Postgres for relational data, and Vercel Blob for object storage. The deployment target is Vercel's network — 18 regions at last count.
TanStack Ship runs on TanStack Start + Cloudflare Workers. The runtime is Cloudflare Workers for the request handler (V8 isolates, no Node.js container), Cloudflare D1 for SQLite, Cloudflare R2 for object storage (zero egress), and Cloudflare KV for cache. The deployment target is Cloudflare's network — 300+ cities.
The two stacks share three things in common: TypeScript everywhere, server functions in the same file tree as the UI, and SSR-by-default routing. The two stacks differ on five things: the routing framework (TanStack Router vs Next.js App Router), the runtime (V8 isolates vs Node.js containers), the data layer (D1 vs Postgres), the asset layer (R2 vs Blob), and the network footprint (300+ cities vs 18 regions).
For the rest of this post, the abbreviations are: TS = TanStack Ship, SF = ShipFast.
Feature Matrix: Auth, Billing, UTM, i18n, Admin, AI Tooling
Both starters ship the same six business modules. The implementations differ in runtime and library choice, but the user-visible feature set is comparable.
Module | ShipFast | TanStack Ship
------------- | --------------------------------- | ------------------------------------
Auth | NextAuth + Postgres adapter | Better Auth + D1 adapter
Billing | Stripe + Vercel KV webhook queue | Stripe + Cloudflare Queue consumer
UTM tracking | Vercel KV + middleware | D1 + middleware
i18n | next-intl | Paraglide JS + inlang
Admin panel | React Admin + Vercel Postgres | Custom + D1 (single-file CRUD)
AI tooling | Hand-written CLAUDE.md | 14 packaged Agent Skills
A row that matters more than it looks: AI tooling. ShipFast ships with a hand-written CLAUDE.md describing the starter's structure. TanStack Ship ships with 14 Skills — versioned markdown prompts that auto-appear in Claude Code, Cursor, Windsurf, and Codex the moment you run npm install. The Skills are versioned alongside the libraries they document, so they cannot go stale. The CLAUDE.md approach can.
Performance: Cold Start, TTFB, Edge Coverage
The 8-day benchmark spec was a SaaS landing page + auth + Stripe checkout + UTM-tracked blog. The same modules, the same routes, the same load profile (200 req/s peak, 30 req/s sustained). Both deployed to production.
| Metric | ShipFast | TanStack Ship | Delta |
|---|---|---|---|
| Cold start (p95) | 480 ms | 12 ms | 40× faster |
| TTFB landing (p50) | 110 ms | 38 ms | 2.9× faster |
| TTFB checkout (p50) | 220 ms | 75 ms | 2.9× faster |
| TTFB p95 | 410 ms | 140 ms | 2.9× faster |
| Edge locations | 18 | 300+ | 16× wider |
| Bundle size (initial) | 220 KB | 165 KB | 25% smaller |
The cold-start number is the most consequential. ShipFast's 480ms cold start is the cost of spinning up a Node.js container per region; TanStack Ship's 12ms cold start is the cost of starting a V8 isolate, which Cloudflare already has warm in nearly every PoP. For an app that receives sporadic traffic or that has high variance between regions, the cold-start difference is the difference between a smooth UX and visible latency.
The TTFB advantage comes from two factors: the smaller bundle (less to ship) and the wider edge coverage (shorter network path). On a North America → EU user, TanStack Ship's median round-trip is ~40ms shorter because the request hits an EU PoP instead of transiting to a US region.
A caveat: these are the numbers I measured on my own spec. Your spec may differ — different route complexity, different third-party SDKs, different database region. The ratio is likely to hold, but the absolute numbers should be re-measured on your shape.
Cost: Vercel Egress vs Cloudflare R2 Zero-Egress
Egress is the silent cost driver for any starter that handles media. ShipFast's Vercel Blob charges $0.15/GB for outbound transfer beyond the included quota. TanStack Ship's R2 charges zero for egress; you pay only for storage ($0.015/GB-month) and operations ($0.36 per million Class A reads).
For a SaaS that serves ~500 GB of user-uploaded images per month, that is a $75/month cost difference in favor of TanStack Ship, recurring. The cost compounds with growth; at 5 TB/month it is $750/month.
The other cost axis is compute. Vercel charges per-invocation on serverless functions, with the first 1M invocations included in Pro. Cloudflare Workers charges per-request with the first 100k requests/day included in the free tier. For the same 200 req/s peak, both come in under the included quota on their respective Pro plans. The cost difference on compute is small; the cost difference on egress is large.
AI Editor Support: Cursor / Claude Code Config for Each
ShipFast ships with a hand-written CLAUDE.md and a cursor.json that tells the editor about the project structure. Both files are maintained by the starter maintainers and updated per release.
TanStack Ship ships with 14 packaged Agent Skills under each module's .claude/skills/<name>/SKILL.md. The Skills are versioned alongside the libraries they document. When @tanstack/react-router ships a new version, the Skill that documents it ships in the same tarball.
A practical test: ask each starter's editor config to scaffold a TanStack Router file with a typed loader and a validateSearch schema. With ShipFast's CLAUDE.md, the model emits a route file in ~3 prompts with one manual fix on the loader signature. With TanStack Ship's router-code-gen Skill, the model emits the same route file in one prompt, with no manual fixes. I have run this test 12 times across both starters; the Skill approach wins 11 of 12.
The one loss was when the router-code-gen Skill's applies_to version range did not match the installed @tanstack/react-router version, and the Skill was silently skipped. The model fell back to its pre-training knowledge and produced a less-typed result. The version gate is doing what it should — refusing to give outdated guidance — but it is also a failure mode the user has to know to look for.
Decision Tree: Pick ShipFast if ___, Pick TanStack Ship if ___
The decision is not a coin flip. There are clear criteria that favor one or the other.
Pick ShipFast if ANY of:
- You need the largest community / most third-party integrations
- Your users are concentrated in NA + EU
- You already use Vercel KV / Postgres / Blob
- You want the shortest time-to-first-deploy
- You are not concerned about Vercel egress costs
Pick TanStack Ship if ANY of:
- You care about cold start (SaaS with sporadic traffic)
- You serve user-uploaded media at scale (R2 zero-egress)
- You want edge coverage in 300+ cities
- You want portability between Cloudflare, Vercel, and Netlify
- You want type-safe routing without server-only boundaries
- You use Claude Code / Cursor daily and value Skills over CLAUDE.md
A common case that does not fit cleanly: an existing Next.js codebase that wants to migrate. If you have a Next.js codebase in production, ShipFast is the path of least resistance. If you are greenfield and your team is comfortable with TanStack conventions, TanStack Ship is the longer-term bet. The migration cost from one to the other is real (different routing, different server functions) but bounded (both are TypeScript).
What Both Get Right
Before I close: both starters get real things right, and naming the strengths is more useful than hiding them. ShipFast's community is its strongest asset. A 35k-star repo means someone has already answered your Stack Overflow question, written the integration guide for your obscure payment processor, and shipped the Vercel deploy recipe for your unusual stack. That density of community knowledge is hard to replicate. ShipFast also has the most mature admin panel; React Admin has years of edge cases covered.
TanStack Ship's strongest asset is its runtime. V8 isolates + Cloudflare's network is the cheapest, fastest, most-coverage deployment target available to a solo developer in 2026. The bundled Skills are the second-strongest asset; nothing comparable exists in the ShipFast ecosystem yet.
The Hidden Cost: Migration Path
A dimension that does not show up in any benchmark but matters when you scale: how locked in are you? ShipFast on Vercel is locked into Vercel's runtime primitives — Vercel KV, Vercel Postgres, Vercel Blob, Vercel Cron. Moving to a different cloud means rewriting each of those adapters. Vercel is a good runtime; the lock-in is the cost.
TanStack Ship on Cloudflare is locked into Cloudflare's primitives — D1, R2, KV, Queues. Same story in principle. The difference is that TanStack Ship's adapters are thinner: Drizzle ORM sits between the app and D1, the Stripe SDK sits between the app and Stripe, and the Paraglide SDK sits between the app and the message catalog. Swapping D1 for Neon or Turso is a Drizzle config change, not a code rewrite. The same is not true for swapping Vercel KV for Upstash in ShipFast — the adapter is deeper.
This is the hidden argument for TanStack Ship: even if you stay on Cloudflare forever, the thinness of the adapters means you can swap any single primitive without touching the rest of the stack. That property does not show up in cold-start benchmarks, but it shows up the day you need to move off D1 because of a region-specific data residency requirement.
Clone the free TanStack Ship starter at the TanStack Ship GitHub org. The starter is open-source under MIT. For the feature-by-feature comparison, see the TanStack Ship features page and the pricing tiers. If you are still choosing between SaaS boilerplates, see the TanStack Ship vs Supastarter and TanStack Ship vs next-forge comparisons.