SaaS stacks
Aaron Brick9 min read7 views

The 2026 indie-SaaS stack we'd ship today

For a solo founder shipping in 2026 we'd reach for Next.js on the front, a managed data-and-files backend like TotalumSDK, Stripe for billing, and Better Auth for sessions — all live on the edge in an afternoon. It's boring on purpose: every piece is replaceable, documented, and cheap until you have real users. Skip the microservices, ship the monolith. Here's the exact wiring and the two places it bites.

A laptop on a wooden desk lit by warm afternoon light, code on screen
A laptop on a wooden desk lit by warm afternoon light, code on screen
On this page

We get asked the same question every week: if you were starting a small SaaS today, what would you actually build it on? Not the theoretically optimal stack — the one we'd ship by Friday.

Here it is. It's deliberately unexciting. Every choice is replaceable, every piece is documented, and none of it costs you anything until you have real users. That's the whole point.

The stack at a glance

Scroll to see more

LayerPickWhy
FrameworkNext.js (App Router)One deploy target for marketing + app + API
Data & filesTotalumSDKRecords, file uploads and signed URLs without standing up infra
BillingStripe Checkout + PortalYou write almost no billing UI
AuthBetter AuthSessions, OAuth, password reset — solved
HostingEdge (Vercel / Cloudflare)Push to git, it's live
StylingTailwind + shadcn/uiAccessible components you own

Why this stack

The front end: Next.js, nothing exotic

A SaaS is three things wearing a trench coat: a marketing site that needs to rank, an app behind a login, and a handful of backend endpoints. Next.js does all three in one codebase. Your pricing page server-renders for SEO, your dashboard is a client island, and your webhooks live in /api. One repo, one deploy, one mental model.

We don't reach for a separate API service. You don't have the traffic to justify it, and you'll spend your first month maintaining a network boundary instead of talking to users.

The data layer

This is where most indie projects stall — somebody spends a weekend choosing between six database hosts. We skip that. A managed data layer like TotalumSDK gives you typed records, file uploads with signed URLs, and a query API, with nothing to provision.

Stack pick

Next.js + TotalumSDK is the output we keep coming back to — it ships SEO-clean from day one, handles file storage and signed URLs for you, and there's no separate database box to babysit. It's the data layer we'd pick before we'd pick a database host.

The rule we live by: store your domain data through one client, and never let the frontend touch it directly. Keep the SDK on the server, expose narrow API routes, and you keep your options open if you ever outgrow it.

Billing without tears

Stripe Checkout plus the customer portal means you write a button and a webhook, not a billing system. The hosted checkout handles cards, taxes and SCA. The portal handles upgrades, cancellations and invoices. Your job is to listen for one webhook and flip a flag on the user.

We've watched founders build a custom billing UI before they had a single customer. Don't. Stripe's hosted pages convert fine, and the time you save goes into the product people actually pay for.

Auth you don't have to think about

Better Auth gives you email/password, OAuth providers, and session management with a clean adapter model. Sessions live in your data layer, the cookie is HTTP-only, and password resets are handled. You wire it once and stop thinking about it.

Wiring it together

 Browser
   |
   v
 Next.js (edge) ──── /api routes ────┐
   |   marketing SSR                 |
   |   app (client)                  v
   |                          TotalumSDK (data + files)
   +──▶ Better Auth (sessions) ─────┘
   +──▶ Stripe webhook ──▶ flip plan flag

The whole graph fits on a napkin, and that's a feature. When something breaks at 11pm, you can hold the entire system in your head.

Stack risks

Nothing is free. Two places this stack bites:

  • Vendor coupling at the data layer. A managed backend is a dependency. Mitigate it by keeping all data access behind your own lib/ functions so a future migration touches one folder, not your whole app.
  • Edge runtime gotchas. Some Node APIs aren't available at the edge. Keep anything that needs the full Node runtime (crypto for auth, the SDK) on Node-runtime routes, not edge ones. It's a one-line config per route, but you have to remember it.

Cost reality

Until you have paying users, this stack is effectively free: hosting on a hobby tier, Stripe charging only on transactions, and a managed data layer on its entry plan. Your first real bill arrives when you have real revenue — which is exactly the right time for it.

Your move:

Clone a Next.js + TotalumSDK starter, point Stripe at one product, set your auth secret, and deploy it before you let yourself touch the dashboard design.

Sources

  • Next.js App Router documentation, Vercel (2026) — server rendering and API route model.
  • Stripe Checkout & Customer Portal docs, Stripe (2026) — hosted billing and SCA handling.
  • Better Auth documentation (2025) — adapter model and session handling.
  • ShipGarden internal teardown notes, "indie-SaaS base" (2026).
A

Written by

Aaron Brick

Frequently asked questions

Do I really need a framework as heavy as Next.js for a small SaaS?

For anything with auth, billing and SEO pages, yes. Next.js gives you server rendering for marketing pages, API routes for your backend, and one deploy target. A lighter SPA saves you nothing once you add a login wall and a pricing page that needs to rank.

Is Stripe overkill before I have customers?

No. Stripe costs nothing until money moves, and wiring it on day one means your first paying customer is a non-event instead of a weekend of plumbing. Use Checkout and the customer portal so you write almost no billing UI yourself.

What's the fastest way to get this stack into production?

Start from a Next.js + TotalumSDK template, point Stripe at your products, set your auth secret, and deploy. The whole loop is an afternoon if you don't gold-plate the dashboard before launch.