A polyglot guide to picking the right stack: when Next.js fits, when Python and FastAPI win, when Go or Rust earn their keep. The stack serves the build.
By Lab Twelve, founder-engineer at Lab Twelve.

The right stack is the one that fits the build, not the one on the engineer's resume. Most web apps want Next.js and Postgres. Data and AI workloads want Python and FastAPI. Latency-critical or concurrency-heavy services want Go. A narrow set of performance-sensitive components want Rust. Lab Twelve is polyglot on purpose because forcing every problem into one favorite language is how good products get slow, expensive, or both.
This post is the practical version of an architecture decision. It is not a benchmark war. It is how to match a tool to a job so the build is cheaper to ship and easier to live with.
Before you name a language, name the workload. Stacks are answers to questions, and the question comes first:
Picking language first and bending the build to fit is the most common architecture mistake I see. It produces a Python web frontend that fights its own framework, or a Rust CRUD app that takes three times as long to write for no user-visible benefit. Match the tool to the job and the estimate drops.
Next.js is the default for most apps Lab Twelve ships, and the default exists for a reason. When your product is screens, navigation, forms, auth, and a database behind it, the App Router gives you server rendering, routing, and a React frontend in one coherent system. SEO works because pages render on the server. The marketing site and the product can share components and a design system.
Reach for Next.js when:
This covers the bulk of the published tiers: launch pages, micro apps, business apps, and most MVPs. A booking tool, a client portal, an internal approval dashboard. These are Next.js shaped, and pricing reflects that the path is well-worn. See where each tier lands in the 2026 cost guide.
The moment your build has a serious data or AI core, Python earns its place. The ecosystem for machine learning, data processing, and scientific computing has no real competition, and FastAPI gives you a clean, typed, async HTTP layer on top of it.
Reach for Python and FastAPI when:
A common and correct pattern is Next.js for the product surface and a FastAPI service for the AI or data work behind it. The browser talks to Next.js; Next.js talks to a Python service that does the inference. Each tool does what it is best at. That split is an architecture decision, and it is exactly the kind of thing the understand and architect phases exist to settle before code.
A Next.js front with a Python brain is not complexity for its own sake. It is two tools each doing the one thing it is best at.
Go is the answer when you need a service that is fast, concurrent, and boring in the best sense. It compiles to a single binary, handles thousands of concurrent connections without ceremony, and deploys with almost no runtime baggage.
Reach for Go when:
Go is rarely the right choice for the whole product, and almost never for the UI. It shines as a focused service: a webhook ingester, a notification fan-out, a proxy, a job runner that has to keep up. If a Node or Python service is buckling under connection count, Go is often the surgical fix.
Rust is the sharpest tool in the box and the most expensive to wield. You buy memory safety without a garbage collector and performance at the metal. You pay in development time, because the compiler is strict and the language is dense.
Reach for Rust when:
For a founder MVP, Rust is usually the wrong call for the whole app. The right call is Rust for the one hot component that needs it, wrapped in a service the rest of the system talks to. Reaching for Rust everywhere because it is fast is the mirror image of reaching for Python everywhere because it is familiar. Both ignore the build.
| Your build is mostly... | Strong default | Why | |-------------------------|----------------|-----| | User screens, forms, CRUD, content | Next.js + Postgres | SEO, one codebase, fast UI iteration | | ML inference, data pipelines, AI core | Python + FastAPI | Unmatched data and ML ecosystem | | High-throughput or real-time service | Go | Concurrency, predictable latency, tiny deploy | | A proven performance-critical hot path | Rust | Memory safety, no GC pauses, raw speed | | One marketing page with a form | Next.js (or static) | No backend needed; ship in days |
The table gives defaults, not laws. A real architecture often combines two of these: a Next.js product with a Python service, or a Go ingester feeding a Next.js dashboard. Polyglot does not mean chaotic. It means each boundary is drawn where the workload changes.
Choosing the wrong stack does not always crash. More often it just taxes you quietly. A web app written in a language with no good frontend story takes longer to build every screen. A data-heavy feature bolted onto a runtime with a weak data ecosystem fights you on every transformation. A simple CRUD app written in Rust ships in triple the time for zero user benefit.
Every one of those taxes shows up in your invoice, your timeline, or your maintenance burden. Matching the tool to the job is not a luxury. It is the cheapest decision you make, and it is made in the architecture phase before a line of code is committed.
When you run your app through the scope chat at /start, the scope determines the stack, not the other way around. The understanding phase surfaces whether your build is screen-heavy, data-heavy, or throughput-heavy. The architecture phase picks the tools that fit. You do not have to know the difference between FastAPI and Go to get the right one. You have to describe the build honestly. The polyglot choice is our job.
That is the value of one architect-engineer over a single-language shop: the recommendation is not biased by what the team happens to know. The stack serves your product.
Stack debates are mostly identity, not engineering. People defend the language they learned first. The professional move is to forget your preferences and ask what the build needs. Next.js for most apps. Python when there is a data or AI brain. Go for throughput. Rust for the rare hot path. Combine them at the seams where the workload changes, and refuse to combine them anywhere else.
If you have a build and you are not sure what it should run on, that is exactly what the scope chat is for. Describe it at /start, and the architecture comes back with the price. Compare tiers on pricing.
Get a fixed price in one conversation.
Describe your build and get a fixed price before you pay.
Start an AI scopeShare this post

The scope chat extracts a structured ScopeSpec from your brief, then the pricing engine returns a fixed quote with no invented prices.

Most non-technical founders chase a CTO when they actually need v1 in production. Here is how to tell the two problems apart before you give away equity.

A native mobile app costs more, ships slower, and is harder to change than a responsive web app. For most first versions, the web is the correct first bet.
Ready to scope your app?
Describe your build and get a fixed quote before you pay.
Start an AI scope