Boots green with zero cloud keys

Stand your AI product on a finished base.

A light-themed AI-SaaS starter kit for Next.js. Auth, a credit-based billing ledger and a streaming AI chat, all running offline with zero cloud keys. Add your keys when you're ready to ship.

Your social proof goes here. Add real numbers once you ship.

No sign-up. No API keys. Clone → npm run dev → streaming AI chat in 60 seconds.

plinth.dev/chat

Credits

48 / 50

−1 / msg
How does the credit ledger work?
Each generation streams token-by-token and decrements one credit from your ledger. At zero, the route returns a clean limit reached state with an upgrade CTA
plinth-mock-1streaming · usage metered · −1 credit
Ask anything…

The boring 80%, already built on

Next.jsTSTypeScriptTailwindTursoSStripeOpenAIAnthropic
What you get

Everything an AI SaaS needs, except the part that's yours

Auth, billing, a credit ledger, and a streaming chat. All wired up, working offline, and swappable for the real thing behind a single env flag.

Usage ledger48 / 50 credits
chat completion−1
image describe−2
summarize doc−1

Credit-based AI billing

A real usage ledger — every generation decrements a credit, blocks at zero, and surfaces an upgrade flow. The one thing most kits fake, built for real.

Summarize this

Streaming AI chat

Token-by-token streaming with a live cursor. Mock provider by default; flip an env var for OpenAI or Anthropic — the UI never changes.

type Session = {
  userId: string;
  email: string;
  credits: number;
}

cookie today · Auth.js / Clerk tomorrow

Dev-mode auth

Cookie session that runs offline today and swaps for Auth.js or Clerk tomorrow. The app only depends on a tiny Session shape.

Top-up
Checkout
Webhook
Ledger +200
mock⇄STRIPE_SECRET_KEY

Mock Stripe, real flow

Checkout tops up the local ledger with zero keys, then becomes Stripe Checkout the moment STRIPE_SECRET_KEY is set. Same interface, both paths.

local.db
Turso

DATABASE_URL

Local-first database

libSQL writes to a local SQLite file out of the box. Point DATABASE_URL at Turso to go to production without touching the data layer.

--color-brand:#7C5CFC

one variable → every gradient, button & accent

Recolor in one line

Light, premium, and violet by default. Change --color-brand in globals.css and every gradient, button and accent follows.

From clone to shipped

Three steps, and the second one needs no keys

The demo-without-keys is the whole point — prove the product to yourself before you sign up for a single SaaS.

01

Clone & run

git clone, npm install, npm run dev. The kit boots with a local SQLite file, demo auth, and a mock AI provider — no .env required.

$ npm install && npm run dev
02

See it work, offline

Sign in with one click, open the chat, watch a response stream token-by-token, and see a credit decrement and a limit-reached upgrade flow.

$ open http://localhost:3000/chat
03

Add keys & ship

Drop in OPENAI_API_KEY, STRIPE_SECRET_KEY, and a Turso DATABASE_URL. Mock paths become real ones — the UI code never changes. Deploy.

$ vercel --prod
Pricing

Start free, upgrade when real users show up

Every tier runs locally first. Add Stripe to charge cards — the credit ledger is identical in mock and real mode.

Starter

Kick the tires. Everything runs locally, no card needed.

$0/ free forever

50 credits / month

  • Streaming AI chat (mock or real)
  • Credit ledger & usage meter
  • Dev-mode cookie auth
  • Local SQLite, zero config
Start building
★ Most popular

Pro

For the product you're actually shipping to real users.

$29/ per month

5,000 credits / month

  • Everything in Starter
  • Real Stripe checkout & portal
  • OpenAI / Anthropic streaming
  • Resend transactional email
  • Priority support
Upgrade to Pro

Scale

Usage-based billing for a product with traction.

$99/ per month

25,000 credits / month

  • Everything in Pro
  • Metered overage billing
  • Upstash rate limiting
  • Custom credit packs
  • SSO-ready auth swap
Talk to us
What buyers say

The kit you can demo the same hour you buy it

“Add a short customer quote here describing how this kit helped your team ship faster. Keep it specific and honest.”
CNCustomer NameRole, Company
“Another placeholder quote goes here. Highlight a concrete result — time saved, a feature shipped, or a problem solved.”
CNCustomer NameRole, Company
“One more placeholder quote. Swap in a real testimonial once you have permission to feature the reviewer.”
CNCustomer NameRole, Company
Questions

Frequently asked

Does it really run with no API keys?

Yes. With zero environment variables, auth is a demo cookie, the database is a local SQLite file, billing tops up a local credit ledger, and the AI streams a deterministic mock response. The whole purchase → credits → streaming-chat loop is demoable offline.

How do I switch to a real LLM?

Set OPENAI_API_KEY or ANTHROPIC_API_KEY. The mock branch in lib/ai.ts is replaced by a real streaming call — the chat UI and credit metering code never change.

How does the credit billing work?

Every generation decrements one credit from a ledger stored in the database, records the usage, and blocks at zero with a clean limit-reached state. Credit packs top the ledger back up — mocked offline, real Stripe Checkout when STRIPE_SECRET_KEY is set.

Is it light-themed, or is there a dark mode?

Plinth is intentionally light, premium, and violet. It's not another dark dashboard template. Recolor the entire kit by editing a single CSS variable, --color-brand, in app/globals.css.

What stack is it built on?

Next.js 15 App Router, TypeScript, Tailwind v4, and libSQL (local file or Turso). No heavyweight ORM, no forced multi-tenancy — small and clear on purpose.

Can I use it in a commercial product?

Yes. It ships under a permissive license for building unlimited end products. You can't resell the kit itself as a competing starter kit. See LICENSE.md for the full terms.

Still curious? hello@yourdomain.com

Ship the boring 80%. Start building the part that's yours.

Clone Plinth and have a streaming AI SaaS with real credit billing running in minutes — no cloud keys required.