Why I Chose BetterAuth Over NextAuth
After evaluating NextAuth, Clerk, Lucia, and BetterAuth - here's why BetterAuth won for vibestacks and what made the difference.

Authentication is one of those decisions that affects everything else in your stack. Spent a good while evaluating NextAuth, Clerk, Lucia, and BetterAuth before making a choice.
Honestly most of them handle the basics fine. OAuth, email/password, sessions - its all pretty similar to set up. Where things get interesting is when you need to add stuff later.
What Made Me Go With BetterAuth
The plugin system basically.
Want magic links? Theres a plugin. Two-factor auth? Plugin. Phone OTP, passkeys, enterprise SSO with SCIM? All plugins you just add without rewriting your whole auth setup.
For a boilerplate this is huge. Someone building an MVP doesnt need enterprise features, but the agency selling to corporates definitely does. I can support both without maintaining two different auth systems which would be a nightmare.
The Integrations Helped Too
- Cloudflare Turnstile for bot protection
- Stripe integration for handling payments during signup
- Pretty much every OAuth provider you can think of
These arent hacked together afterthoughts. They actually work properly out of the box which saved me a ton of debugging time.
Its Not Perfect Though
BetterAuth is still pretty new compared to NextAuth. Smaller community, less stackoverflow answers when you get stuck on weird edge cases. The documentation is good but theres definitely moments where you're reading source code to figure things out.
If having a massive community and years of battle-testing is important to you, NextAuth is probably the safer choice.
Why Not Clerk?
Clerk is honestly great if you dont mind the hosted solution. The UI components are polished and it just works.
But for a boilerplate I wanted something self-hosted. People have different requirements around data residency and vendor lock-in. Didnt feel right forcing a specific auth provider on everyone who uses vibestacks.
Why Not Lucia?
Lucia is solid and I almost went with it. Very minimal, gives you full control.
The downside is you're building more yourself. For my own projects thats fine, but for a boilerplate I wanted more batteries included so people can ship faster without wiring up every auth flow manually.
The Tradeoff I Made
Flexibility over ecosystem size. I'd rather have something I can extend cleanly than fight with an opinionated library when requirements change.
So far no regrets but we'll see how it holds up for the long term.
Next up: How I set up Stripe webhooks that actually supports both usage-based and subscription billing and one-time payments.
Got questions about auth setup? Email me at raman@vibestacks.dev or find me on LinkedIn.
Read more

Tailwind CSS v4: What Changed and Why It's Better
No more tailwind.config.ts. Tailwind v4 moves configuration to CSS, drops JavaScript, and ships 2x faster. Here's everything that changed.

Why We Use cn() and cva() for Component Styling
String concatenation for Tailwind classes is a mess. Here's how cn() and cva() make conditional styling clean, type-safe, and maintainable.

Stop Trusting process.env: Type-Safe Env Variables in Next.js
process.env fails silently and leaks secrets. Here's how t3-env catches missing env vars at build time, not production.