← Back to feed
EngineeringArticle

Why We Ditched Next.js for TanStack Start (And Our Unified Stack Philosophy)

We switched from Next.js to TanStack Start and our velocity increased 40%. Here's why consistency beats novelty, and how our unified tech stack philosophy compounds value across portfolio companies.

We ditched Next.js. Not because it's bad — it's excellent for many use cases. But because we realized something fundamental: the framework matters less than the consistency.

After two years of building AI products across multiple portfolio companies, we've learned that the real competitive advantage isn't choosing the "best" tool for each project. It's choosing tools once, getting absurdly good at them, and reusing that expertise relentlessly.

Welcome to our unified stack philosophy.

The Problem: Framework Fatigue is Killing Velocity

Here's what was happening before we standardized:

Project A: Next.js 14 with App Router Project B: Next.js 13 with Pages Router Project C: Remix because "it's the future" Project D: Next.js 15 because why not

Every. Single. Project. Required. Learning. Again.

Not just learning—relearning. "Wait, how do we handle server actions in this version?" "Does this one support RSC?" "Which routing paradigm are we using here?"

The result? Our senior engineers spent 30% of their time just remembering which patterns worked in which framework version. New hires took 3-4 weeks to become productive. Debugging across projects meant context-switching through three different mental models.

That's not engineering. That's waste.

The Breaking Point: The Next.js 14 Migration

The moment we decided to switch wasn't dramatic—it was exhausting.

We had a portfolio company on Next.js 13 Pages Router. Production-stable, no issues. Then we started a new feature requiring SSR streaming. The docs said "just upgrade to App Router."

Three weeks later:

  • 47 files refactored
  • 12 "gotchas" that weren't in the docs
  • 5 packages incompatible with App Router
  • 2 senior engineers pulling all-nighters
  • 1 deployment that broke auth because server components work differently

The feature worked. But we'd spent more time fighting the framework than building the feature.

This wasn't Next.js's fault—it's evolving rapidly, which is good for the ecosystem. But for a venture studio building 6-8 products simultaneously, rapid evolution is a liability, not an asset.

Why TanStack Start?

We didn't choose TanStack Start because it's "better" than Next.js. We chose it because it aligns with how we want to build.

1. Client-First Philosophy

TanStack Start is unapologetically client-first with opt-in SSR. This matches our AI product reality: most of our apps are interactive SPAs with server-rendered marketing pages, not content-heavy websites.

Next.js forces you to think server-first. Which is great for blogs, e-commerce, and content sites. But for real-time AI applications with complex client state? It's friction.

Example: Our RAG-powered document assistant needs client-side state for:

  • Real-time streaming LLM responses
  • Document preview with annotations
  • Chat history management
  • WebSocket connections for collaborative editing

With Next.js App Router, this meant fighting RSC boundaries, understanding "use client" vs "use server," and debugging hydration mismatches.

With TanStack Start? Client by default. Add server functions where needed. Done.

2. Type Safety That Actually Works

TanStack Router (the foundation of TanStack Start) gives us end-to-end type safety from routes to params to loaders to components.

This means:

// Define route
export const Route = createFileRoute("/projects/$projectId/documents/$docId")({
  loader: async ({ params }) => {
    // params.projectId is typed as string
    // params.docId is typed as string
    return getDocument(params.docId);
  },
});

// Use in component - fully typed
function DocumentView() {
  const { projectId, docId } = Route.useParams(); // both typed!
  const document = Route.useLoaderData(); // typed from loader!
}

Contrast with Next.js dynamic routes:

// params might be string | string[] | undefined
// You're on your own for typing
function Page({ params }: { params: any }) {
  const docId = params.docId; // hope it's there
}

This isn't a small difference. Type safety in routing eliminates entire classes of bugs. Refactoring routes? TypeScript tells you every component that breaks. In Next.js? Runtime errors in production.

3. Vite Build Performance

Cold starts:

  • Next.js: 8-12 seconds
  • TanStack Start (Vite): 1-2 seconds

This compounds. Our engineers save ~45 minutes per day just from faster dev server starts. Across 6 engineers, that's 4.5 hours daily. Over a month, that's 90 hours saved—more than two work weeks.

4. Less Magic, More Control

Next.js has a lot of magic:

  • Automatic API routes in /pages/api
  • Automatic static optimization
  • Automatic code splitting
  • Automatic image optimization

Magic is great until it isn't. When something breaks, you're debugging the framework's decisions, not your code.

TanStack Start is explicit:

  • Want server functions? Define them explicitly
  • Want code splitting? Configure it
  • Want SSR? Opt in per route

Explicit > implicit when you're building products that need to ship reliably across multiple companies.

Our Unified Stack Philosophy

TanStack Start isn't alone. It's part of our complete standardized stack:

Frontend

  • TanStack Start: Full-stack React framework
  • TanStack Router: Type-safe routing
  • TanStack Query: Data synchronization (we use this EVERYWHERE)
  • Tailwind CSS: Styling (utility-first is perfect for consistency)

Backend & Infrastructure

  • Control Plane: Multicloud infrastructure (AWS, GCP, Azure—one interface)
  • PlanetScale: PostgreSQL (serverless, branching, no migration headaches)
  • Mirascope: LLM framework (Elegant agent orchestration, no need to learn a new framework)
  • TurboPuffer: Vector database (fast, simple, no pricing surprises)

Why This Stack?

Not because each tool is "the best." Because:

  1. Consistency compounds: Same tools across all projects = shared knowledge
  2. Onboarding is fast: New engineers learn once, contribute everywhere
  3. Debugging is faster: Same patterns, same tools, same solutions
  4. Cross-project improvements: Optimization in Project A helps Project B
  5. Maintenance is sane: One upgrade path, not six

The Results: Quantified Benefits

After 6 months on the unified stack:

Developer Velocity:

  • Onboarding time: 3-4 weeks → 1 week
  • Context switching overhead: ~30% → ~5%
  • Cross-project contribution: rare → common
  • "How does this work here?" questions: constant → rare

Deployment Reliability:

  • Deploy confidence: 60% → 95%
  • Rollback frequency: 2-3/month → 1/quarter
  • "Works on my machine" incidents: weekly → never

Engineering Satisfaction:

  • "I feel productive quickly": 40% → 90%
  • "I understand the stack": 50% → 100%
  • "I can help across projects": 30% → 85%

Actual Time Savings:

  • Dev server start time: 8-12s → 1-2s (~45 min/day/engineer)
  • Debug time (cross-project issues): 4-6 hours → 30-60 min
  • Knowledge transfer (between engineers): formal sessions needed → organic osmosis

What We Gave Up

Let's be honest about trade-offs:

1. Next.js Ecosystem

Next.js has more tutorials, more starter templates, more "copy-paste solutions" on Stack Overflow. TanStack Start is newer (currently in Release Candidate stage, approaching v1.0 stable), so you'll build more from scratch.

Why we're okay with this: We're a venture studio. We build custom products. Starter templates rarely match our needs anyway. We'd rather have a consistent foundation than 1,000 half-relevant tutorials.

2. Vercel Deployment Magic

Next.js on Vercel is genuinely magical. Push to GitHub, it deploys. Edge functions, image optimization, analytics—all integrated.

Why we're okay with this: TanStack Start's deployment flexibility is actually a massive advantage. Unlike Next.js (which pushes you toward Vercel), TanStack Start works seamlessly with multiple providers:

  • Cloudflare Workers/Pages: Full support with the Cloudflare Vite plugin—fast edge deployments globally
  • Netlify: Official deployment partner with first-class support
  • AWS, GCP, Azure: Deploy anywhere via Control Plane or direct deployment
  • Any Node.js environment: No vendor lock-in whatsoever

This means our portfolio companies can choose their cloud provider based on their actual needs (compliance, cost, existing infrastructure), not our framework's preferences. One company uses Cloudflare for edge performance, another uses AWS for compliance, another uses GCP for ML integration—all running the same TanStack Start codebase.

3. Fewer "Ready-Made" Solutions

If we were building content-heavy sites (blogs, documentation, e-commerce), Next.js's server-first approach and extensive e-commerce integrations would be valuable. SSR by default, static generation, ISR—all excellent for content.

Why we're okay with this: We're building AI applications. Interactive dashboards, real-time data, streaming responses, client-heavy state. Client-first fits our reality better, and we'd rather have deployment flexibility than framework magic that works best on one platform.

When You Should NOT Switch

TanStack Start isn't for everyone. Stick with Next.js if:

  • You're building content-first: Blogs, marketing sites, e-commerce
  • You're solo/small team: Next.js's ecosystem will save you time
  • You're already productive: If Next.js works for you, don't fix what's not broken
  • You're okay with Vercel lock-in: If you're committed to Vercel's ecosystem and don't need multi-cloud flexibility

The Deeper Philosophy: Consistency > Novelty

This isn't really about Next.js vs TanStack Start. It's about engineering philosophy.

The tech industry worships novelty. New frameworks, new paradigms, new "best practices" every quarter. This is fine for individual developers exploring and learning.

But for a venture studio building products that need to:

  • Ship reliably
  • Scale predictably
  • Maintain sanely
  • Evolve sustainably

Novelty is expensive. Consistency compounds.

Every time you switch tools, you reset your expertise to zero. Every time you use different tools across projects, you fragment your team's knowledge. Every time you chase "the best," you waste time that could be spent building.

We'd rather be world-class at 6 tools than mediocre at 60.

Our Stack Selection Framework

How do we decide what goes in the unified stack?

1. Does it solve a real problem?

Not "is it interesting?" but "do all our projects need this?"

2. Can we master it?

Can our team become experts in 3-6 months?

3. Is it stable enough?

Not "production-ready" but "won't change fundamentally in 2 years"

4. Does it compose well?

Does it play nicely with our other tools?

5. Is the community healthy?

Will it be maintained? Will we find answers to hard questions?

TanStack Start (plus the rest of our stack) passes all five.

Looking Forward

We're not done. Our unified stack will evolve as:

  • TanStack Start reaches stable release
  • Better tools emerge for specific needs
  • Our portfolio companies expose new requirements

But we'll evolve deliberately. Not chasing hype. Not switching because "everyone's talking about it."

We'll switch when the benefits of a new tool clearly outweigh the cost of resetting our expertise and fragmenting our knowledge.

Until then? We're getting absurdly good at the tools we have.

Try It (Maybe)

If you're considering TanStack Start, here's my advice:

Start small: Build a side project or internal tool, not your main product Leverage TanStack Query: If you're already using React Query, TanStack Start feels natural Embrace type safety: The routing types are the killer feature—lean into them Read the migration guide: TanStack has excellent docs for migrating from Next.js Join the community: TanStack Discord is active and helpful

But also: if Next.js is working for you, don't switch. Seriously. The best framework is the one you're productive in.

For us? TanStack Start fits how we build. And more importantly, having ONE framework across all projects is the real win.


The Unified Stack Series

This is part 1 of our Unified Stack series. Coming next:

  • Part 2: Why We Chose Control Plane for Multicloud Infrastructure
  • Part 3: Mirascope vs LangChain: The LLM Framework Battle
  • Part 4: TurboPuffer: Fast Vector Search Without the Enterprise Tax
  • Part 5: PlanetScale PostgreSQL: Performance and Control Over Platform Lock-in

Want to see how we build AI products with our unified stack? Check out our About page or reach out to discuss your AI project.

Grey Haven
Grey HavenApplied AI Venture Studio