all notes
2025-11-22Naman Barkiya

Our opinionated stack in 2026, and what we stopped using.

SingleBit's default product stack in 2026 is Next.js with App Router, Postgres, Drizzle, Tailwind with shadcn/ui, TanStack Query, and Clerk or Supabase Auth. The tools we stopped using include Prisma, Zustand-as-default, custom auth, and Notion-as-CMS.

The defaults we reach for and the tools we deliberately replaced after they failed the two-bad-weeks test.

Eighteen months of building under one roof with two people has turned our stack into a set of defaults we'd have to be convinced out of. Here is what we reach for by default in 2026, and, more usefully, what we used to use and stopped.

The current default stack

What we used to use and stopped

Prisma. We shipped four projects on it before switching to Drizzle. The developer experience is warmer, but the runtime behaviour, schema drift handling, and migration story had one too many bad nights. Switching wasn't cheap and we would do it again.

Zustand-everywhere. In the first year we reached for Zustand almost reflexively. Most of what we stored in it was server state, which belongs in TanStack Query, or URL state, which belongs in the URL. We now refuse client stores until we've proven we need one.

Chakra, then MUI, then Chakra again, then shadcn. The component library tourism ended when we realised the components we wanted were a handful of primitives plus our own design tokens, and shadcn plus a small internal library covers it.

Our own auth. We built auth ourselves on one project in 2024. It worked. It was not worth the six weeks of attention and the ongoing security surface. We will not do it again.

Vercel-everywhere. Excellent default; not always the right one. For sites with heavy regional traffic or heavy websocket workloads we now default to Cloudflare or, for India-heavy products, a region-matched provider.

Notion-as-CMS. Fast to prototype with, expensive to keep running in production. Every engagement that started on Notion migrated off inside four months. We now skip the migration.

The rule underneath the list

The rule: every piece of the stack earns its place by surviving a bad week. If it broke something we couldn't fix quickly the first time, we looked for a replacement. If the replacement also broke something, we went back. Two negative experiences, not one, are the signal.

This is not a stack to copy. It is a stack with reasons. The reasons are worth more than the list.


Heuristics

If the stack decision for a given project is ambiguous, we default to the Framer / Webflow / WordPress split for marketing sites and the Next.js plus Postgres default for anything with users.


Written 2025-11-22 by Naman Barkiya.

FAQ

Questions this usually surfaces.

Why did SingleBit switch from Prisma to Drizzle?
Prisma's developer ergonomics are better, but its runtime behaviour and migration story had one too many bad nights. Drizzle's closer-to-SQL model has been steadier across four projects.
When would SingleBit deviate from this stack?
When a project has a reason: heavy regional traffic, websocket workloads, commerce at scale, or an existing codebase we're extending. Default stack first, deviation with evidence.