Skip to content
Journal

stack

The exact stack we ship in 5 days (and why)

Next.js 16 on Cloudflare, Postgres via Drizzle, Stripe, Resend, PostHog, Better-Auth. Here's why each, and what we'd swap if we were starting over.

Sunny Goyal··7 min

The 5-day promise is a constraint that forces stack discipline. You can’t pick three new tools per project and learn them all on the founder’s dime. You pick a stack you know cold, you ship it, and you change it only when the math forces you to.

Here’s the stack, layer by layer, with the actual reason each one is on the list.

Frontend: Next.js 16 + React 19

Server components by default, App Router for layouts that compose, file-system routing that scales without a config file. We deploy it on Cloudflare Pages via the OpenNext adapter, same Next.js you’d run on Vercel, but with Cloudflare’s edge model and pricing.

Why not Remix or TanStack Start? They’re both excellent. Next.js wins on ecosystem (every UI library and tool is "Next.js-first"), on hiring (every other React engineer has shipped Next), and on RSC maturity. We’d revisit if Vercel ever did something that broke trust.

Styling: Tailwind v4 + shadcn/ui

Tailwind v4’s CSS-first config is a quiet revolution. No tailwind.config.ts, no JIT engine config, just @theme blocks in a global CSS file. Faster builds, fewer config files, easier to fork.

shadcn/ui isn’t a library, it’s a copy-paste set of accessible primitives built on Radix. We restyle them to match each project’s brand and own the source. Nothing to upgrade, nothing to fight when the maintainer changes the API.

Database: Cloudflare D1 (or Neon Postgres)

For most MVPs: D1. SQLite at the edge, generous free tier, zero infrastructure to manage. Fast for the read-heavy workloads MVPs actually have.

For Postgres-specific features (JSONB queries, PostGIS, full-text search beyond what SQLite offers): Neon. Same Postgres you’d run anywhere, but serverless and free for the first 0.5 GB.

Drizzle ORM on top of either. Type-safe queries that don’t require an ORM’s magic. Schemas commit alongside the migrations, code review catches schema regressions.

Auth: Better-Auth

Email + Google + magic links + passkeys, all from one library, all owning the database session. No MAU pricing cliff. No vendor lock to escape later.

Clerk and Auth0 are great products. They’re also $99–500/month past 10K users, and they own the user data. For a productized MVP service, Better-Auth’s free + DIY model wins because the founder ends up owning the auth surface they paid us to build.

Payments: Stripe

There’s no real second choice. Lemon Squeezy is interesting for digital goods. Paddle is interesting for international VAT handling. Both are slower-moving and have less ecosystem than Stripe. The 5-day timeline doesn’t have room for "let’s figure out the payment provider", it’s Stripe, and we’re fluent in checkout, customer portal, webhooks, and metered billing.

Email: Resend

Resend has the best DX in transactional email. React Email templates, audiences (newsletter), and a single SDK for both. AWS SES is cheaper at scale but the templating story is worse. We start everyone on Resend; if their economics ever justify SES (~50K sends/month plus), we migrate.

Analytics: PostHog

Funnels, replays, feature flags, and experiments in one bundle. Generous free tier. Self-hostable when you scale. We’d only swap to Plausible if a founder explicitly wanted no-cookie analytics.

Errors: Sentry

Boring, comprehensive, fast. Has good Next.js source-map support. Replaces 80% of the value of an APM at 5% of the cost.

AI: Anthropic Claude

For the MVPs that need an LLM call: Claude. Best models for the agentic / tool-using workflows MVPs actually need. The Anthropic API is also stable in a way that lets us not chase model upgrades every six weeks.

What we’d change if we restarted

Honestly: we wouldn’t. This stack has been forced through the test of "can we ship a working product in five days, on it, every week." Each replacement we’ve considered has either:

  • Slowed the build by half a day or more (auth providers with custom flows)
  • Added a recurring fee that founders eventually want to escape (hosted DB at scale)
  • Created a surface area we have to debug under deadline pressure (cute new ORMs)

The stack is the constraint that makes the timeline possible. We’ll change it when the math changes, not before.

You don’t pick a stack you love. You pick a stack you know.

Your idea. Live by Friday.