1
0 Comments

I built a SaaS boilerplate where switching Stripe → LemonSqueezy is a one-line env var change

A massive amount of glue code usually goes into "just" wiring auth, billing, teams, and admin. But the bigger problem with most starter kits isn't just setup time — it's vendor lock-in.

You buy a boilerplate, but the moment you need to switch from Stripe to LemonSqueezy or change your auth provider, you end up rewriting half the application logic.

So I built Codapult — a Next.js 16 boilerplate where the entire foundation is pre-wired, but every external dependency sits behind a unified adapter interface. Application code never imports a provider SDK directly.

What this looks like in practice:

  • PAYMENT_PROVIDER=stripelemonsqueezy or polar (checkout, webhooks, and portal adapt automatically)

  • AUTH_PROVIDER=better-authkinde (without modifying your application routes)

  • STORAGE_PROVIDER=locals3 or r2 (for seamless local dev vs. production setups)

Architecture & Features:

  • Adapter-First Design: Swap providers via environment variables without touching business logic.

  • Modular CLI: Comes with 70+ pre-built modules (waitlist, referrals, A/B testing, admin), but lets you purge anything you don't need via CLI to keep the codebase lean.

  • Modern Stack: Next.js 16, TypeScript, Tailwind CSS, and full source code ownership (one-time purchase).

Live demo: demo.codapult.dev

I'd love to get your thoughts on using adapter patterns for SaaS starters. Happy to answer any questions about how the provider abstractions work under the hood!

posted toAvatar for product Codapult
Codapult