People keep hitting me with this question. If you had to start fresh right now, what are you actually reaching for? Not in some hypothetical blog post way but like, tomorrow morning, real users, real deadline, three devs and a Figma file. Alright. Here's what I'd grab.
Next.js with the App Router for the framework. Look, I'm not gonna sit here and pretend it's the only viable option because it's not. Remix has gotten genuinely great, SvelteKit is a joy to write in, and Nuxt people seem weirdly happy all the time. But when I'm honest with myself? Next just has more surface area. More answered questions, more battle-tested patterns, more random packages that just work with it out of the box. At 2am when something's broken and you're googling frantically, that ecosystem depth is the difference between a fix and a meltdown.
TypeScript. Strict mode. This is the hill I'll die on, apparently. I've watched too many 'undefined is not a function' fires in production to care about the extra keystrokes. Writing types feels annoying in the moment, sure. But debugging without them feels way worse. I genuinely think every hour you spend annotating types saves you triple that in head-scratching later. Teams that resist it are usually optimizing for the wrong part of the job.
For styling, Tailwind. And yes I was one of those people who looked at it and thought 'this is the ugliest thing I've ever seen, why would anyone do this to their HTML.' Then a buddy convinced me to try it on an actual project and not just judge it from screenshots on Twitter. Turns out it's incredibly fast to work with. No naming debates, no context-switching between files, responsive stuff is just prefixes. The compiled CSS is tiny. I tried going back to regular CSS after and it felt like putting on wet socks.
Database is where it gets interesting because it genuinely depends on what you're building. If you don't need real-time (and most apps honestly don't), I'd go SQLite-based. Turso specifically. It's stupid fast, you skip all the connection pooling headaches, and they handle replication to edge locations which is a nice bonus. Throw Drizzle ORM on top for type-safe queries and you're cooking. Now if you DO need real-time, live cursors or collaborative editing or whatever, Supabase with Postgres is probably the move. Their subscription system is solid.
Auth. Please for the love of god use Better Auth or Clerk. Don't build it yourself. I know it feels like a fun weekend project but it's not, it's a liability. Homegrown auth is how indie projects get compromised. These services deal with OAuth flows, MFA, session tokens, account recovery, the whole mess. They cost almost nothing. The alternative costs you your users' trust.
Deployment: Vercel for anything Next.js shaped. It's opinionated as hell but those opinions happen to line up perfectly with how Next works so you end up fighting nothing. Preview environments on every PR, edge distribution, analytics baked in. For backend stuff that needs longer execution, background workers or cron jobs, I'd throw that on Railway or Fly.io and call it a day.
If there's a throughline to all of this it's that I want to make as few decisions as possible that aren't directly about the product. Routing? Solved. Types? Solved. Styling, database, auth, hosting? Solved, solved, solved, solved. I want the stack to be invisible so I can spend my actual brain cells on whatever makes this product worth using in the first place.
Will some of these picks look different in a couple years? Probably, yeah. That's kind of the point though. The specific tools change. The philosophy doesn't. Reach for boring, proven stuff in the places that don't matter, so you've got room to take swings in the places that do.
