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=stripe → lemonsqueezy or polar (checkout, webhooks, and portal adapt automatically)
AUTH_PROVIDER=better-auth → kinde (without modifying your application routes)
STORAGE_PROVIDER=local → s3 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!