Back to journal
EngineeringApril 30, 20261 min

The stack and tools I actually use

What I bring into projects in 2026, what I've thrown out, and why the same stack works for an online shop and a SaaS alike.


People often ask: "what's your stack right now?" Here's the long answer — because tooling choices directly shape cost of ownership and shipping speed.

Frontend

The baseline I bring to most projects:

  • Next.js 16 (App Router, RSC by default)
  • React 19use, server actions, optimistic updates
  • Tailwind CSS v4 — no config, via @theme inline
  • shadcn/ui + Radix Primitives — copy into the repo, don't pull as a dep

I used to spend a week on a "design system from scratch." Now shadcn gets me 80% of the UI in an evening, and the remaining 20% — that's the product.

Backend

ConcernToolWhy
APINext.js Route Handlers / tRPCSingle repo, types between client and server
DatabasePostgreSQL (Neon)Free tier, branching, no vendor lock-in
ORMDrizzleType safety without runtime overhead
AuthClerk / Auth.jsDepends on budget and SSO requirements
QueuesVercel QueuesOut of beta, replaced BullMQ for me

Drizzle example

Here's a minimal schema for a simple shop:

import { pgTable, serial, text, integer, timestamp } from "drizzle-orm/pg-core"
 
export const products = pgTable("products", {
  id: serial("id").primaryKey(),
  slug: text("slug").notNull().unique(),
  title: text("title").notNull(),
  priceMinor: integer("price_minor").notNull(),
  createdAt: timestamp("created_at").defaultNow().notNull(),
})
 
export type Product = typeof products.$inferSelect
export type NewProduct = typeof products.$inferInsert

No code generation, no prisma generate — everything is statically inferred.