<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: KitBolt</title>
    <description>The latest articles on Forem by KitBolt (@kitbolt).</description>
    <link>https://forem.com/kitbolt</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3806512%2F1168c742-9c32-4ed9-acaf-012cc2f6748e.png</url>
      <title>Forem: KitBolt</title>
      <link>https://forem.com/kitbolt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/kitbolt"/>
    <language>en</language>
    <item>
      <title>I built a production-ready Next.js SaaS boilerplate — here's everything inside</title>
      <dc:creator>KitBolt</dc:creator>
      <pubDate>Mon, 30 Mar 2026 02:25:11 +0000</pubDate>
      <link>https://forem.com/kitbolt/i-built-a-production-ready-nextjs-saas-boilerplate-heres-everything-inside-57lj</link>
      <guid>https://forem.com/kitbolt/i-built-a-production-ready-nextjs-saas-boilerplate-heres-everything-inside-57lj</guid>
      <description>&lt;p&gt;I'm a 25 year old web developer. I started my career in 2022 and have been &lt;br&gt;
building websites and web apps for clients ever since — landing pages, custom &lt;br&gt;
web apps, business websites. Decent work, but always for someone else. Always &lt;br&gt;
on their timeline, their revisions, their requirements.&lt;/p&gt;

&lt;p&gt;I wanted to build something for myself. Something I own. Something that makes &lt;br&gt;
money while I sleep.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;KitBolt SaaS Starter&lt;/strong&gt; — a production-ready Next.js 14 boilerplate. &lt;br&gt;
This is the story of what's inside it and why I built it.&lt;/p&gt;


&lt;h2&gt;
  
  
  🤔 Why a boilerplate?
&lt;/h2&gt;

&lt;p&gt;Every SaaS application needs the same foundation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ User authentication (login, register, password reset)&lt;/li&gt;
&lt;li&gt;✅ Payment processing&lt;/li&gt;
&lt;li&gt;✅ A database&lt;/li&gt;
&lt;li&gt;✅ A user dashboard&lt;/li&gt;
&lt;li&gt;✅ Email notifications&lt;/li&gt;
&lt;li&gt;✅ An admin panel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every developer builds this from scratch. &lt;strong&gt;Every. Single. Time.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It takes &lt;strong&gt;3-4 weeks minimum.&lt;/strong&gt; And it's the most boring part of building a &lt;br&gt;
SaaS — because none of it is your actual product. It's just the plumbing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;KitBolt is that plumbing.&lt;/strong&gt; Pre-built, tested, and ready to go. Clone it, &lt;br&gt;
fill in your environment variables, and skip straight to building your actual &lt;br&gt;
product.&lt;/p&gt;


&lt;h2&gt;
  
  
  🛠 The Tech Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Framework&lt;/td&gt;
&lt;td&gt;Next.js 14 (App Router)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Language&lt;/td&gt;
&lt;td&gt;TypeScript (strict mode)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Styling&lt;/td&gt;
&lt;td&gt;Tailwind CSS + shadcn/ui&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth&lt;/td&gt;
&lt;td&gt;NextAuth v5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;Prisma + Supabase PostgreSQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payments&lt;/td&gt;
&lt;td&gt;Stripe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email&lt;/td&gt;
&lt;td&gt;Resend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blog&lt;/td&gt;
&lt;td&gt;MDX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment&lt;/td&gt;
&lt;td&gt;Vercel&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every piece of this stack is &lt;strong&gt;free to start.&lt;/strong&gt; The only costs are when you &lt;br&gt;
scale — which is exactly when you can afford it.&lt;/p&gt;


&lt;h2&gt;
  
  
  ⚡ What's Actually Built
&lt;/h2&gt;

&lt;p&gt;Let me walk you through every feature — not marketing speak, actual working code.&lt;/p&gt;


&lt;h3&gt;
  
  
  🔐 Authentication
&lt;/h3&gt;

&lt;p&gt;Full auth flow built with &lt;strong&gt;NextAuth v5:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Login with email and password&lt;/li&gt;
&lt;li&gt;Register with name, email, password&lt;/li&gt;
&lt;li&gt;Forgot password flow&lt;/li&gt;
&lt;li&gt;JWT session strategy&lt;/li&gt;
&lt;li&gt;Middleware that protects dashboard routes automatically&lt;/li&gt;
&lt;li&gt;Redirects authenticated users away from login/register&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Prisma schema includes &lt;strong&gt;User, Account, Session, and VerificationToken&lt;/strong&gt; &lt;br&gt;
models — exactly what NextAuth needs, nothing extra.&lt;/p&gt;


&lt;h3&gt;
  
  
  🗄️ Database
&lt;/h3&gt;

&lt;p&gt;One command to get your database live:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx prisma db push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Your Supabase PostgreSQL database is ready with all tables created. &lt;br&gt;
The schema includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Role-based access&lt;/strong&gt; — USER vs ADMIN&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan-based access&lt;/strong&gt; — FREE, STARTER, PRO&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All built right into the User model.&lt;/p&gt;




&lt;h3&gt;
  
  
  💳 Stripe Payments
&lt;/h3&gt;

&lt;p&gt;Full subscription billing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Checkout session creation via API route&lt;/li&gt;
&lt;li&gt;Webhook handler for &lt;code&gt;checkout.session.completed&lt;/code&gt; and &lt;code&gt;customer.subscription.deleted&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;User plan automatically updates in database after payment&lt;/li&gt;
&lt;li&gt;Billing page in dashboard shows current plan and upgrade options&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  📊 User Dashboard
&lt;/h3&gt;

&lt;p&gt;Four pages inside the authenticated dashboard:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Page&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dashboard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Welcome message, stats cards, getting started checklist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Billing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Current plan display, upgrade options with Stripe checkout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Settings&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Update name, change password, delete account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Admin&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full user management table — ADMIN role only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  📧 Email
&lt;/h3&gt;

&lt;p&gt;Two transactional email templates built with &lt;strong&gt;Resend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✉️ Welcome email — sent automatically on registration&lt;/li&gt;
&lt;li&gt;🔑 Password reset email — with secure expiring link&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are HTML emails that look great in any email client.&lt;/p&gt;




&lt;h3&gt;
  
  
  📝 Blog with MDX
&lt;/h3&gt;

&lt;p&gt;A fully functional blog:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write posts in &lt;strong&gt;MDX&lt;/strong&gt; (Markdown + JSX components)&lt;/li&gt;
&lt;li&gt;Reading time calculated automatically&lt;/li&gt;
&lt;li&gt;SEO metadata generated per post&lt;/li&gt;
&lt;li&gt;Two starter posts included out of the box&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🌙 Dark Mode
&lt;/h3&gt;

&lt;p&gt;Light and dark toggle built with &lt;strong&gt;next-themes.&lt;/strong&gt; Persists across sessions. &lt;br&gt;
Every single component supports both modes using Tailwind's &lt;code&gt;dark:&lt;/code&gt; prefix.&lt;/p&gt;




&lt;h2&gt;
  
  
  😤 The Hardest Parts
&lt;/h2&gt;

&lt;p&gt;Building the features was the easy part. Here's what actually gave me trouble:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔴 NextAuth v5 on Vercel&lt;/strong&gt;&lt;br&gt;
The middleware was too large for Vercel's free tier edge function limit (1MB). &lt;br&gt;
Had to rewrite it using &lt;code&gt;getToken&lt;/code&gt; instead of importing the full auth config. &lt;br&gt;
Took hours to debug.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔴 Supabase Connection&lt;/strong&gt;&lt;br&gt;
Direct connections don't work on IPv4 networks. Had to switch to the Session &lt;br&gt;
Pooler connection string with port 5432 instead of the direct connection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔴 Package Conflicts&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;@auth/prisma-adapter&lt;/code&gt; and &lt;code&gt;next-auth@beta&lt;/code&gt; pull in different versions of &lt;br&gt;
&lt;code&gt;@auth/core&lt;/code&gt; causing TypeScript errors. Fixed by casting the adapter as &lt;code&gt;any&lt;/code&gt; &lt;br&gt;
and aligning versions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Every one of these bugs took hours to find and fix. That's time a buyer of &lt;br&gt;
this boilerplate &lt;strong&gt;never has to spend.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🚀 The Live Demo
&lt;/h2&gt;

&lt;p&gt;See the full thing running here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://kitbolt-saas-starter.vercel.app" rel="noopener noreferrer"&gt;kitbolt-saas-starter.vercel.app&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Register a free account, explore the dashboard, check the billing page, read &lt;br&gt;
the blog. &lt;strong&gt;Everything works.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 What's Next
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;KitBolt SaaS Starter&lt;/strong&gt; is launching very soon at &lt;strong&gt;$49.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're a developer who's tired of rebuilding the same foundation on every &lt;br&gt;
project — this is for you.&lt;/p&gt;

&lt;p&gt;Follow the journey on Twitter: &lt;strong&gt;&lt;a href="https://x.com/kitboltdev" rel="noopener noreferrer"&gt;@kitboltdev&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Drop any questions in the comments — I read everything.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with ❤️ by KitBolt&lt;/em&gt;&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>saas</category>
      <category>webdev</category>
      <category>buildinpublic</category>
    </item>
  </channel>
</rss>
