Skip to content

SaaS Starter

The whole thing: marketing site, sign-in, dashboard, customer list, settings and billing. Eight routes, one runtime dependency.

8 routes8 pages · 30 blocks49 files · 6,047 lineslucide-reactAdded 8 Aug 2026

What's included

  • app/billing/page.tsx
  • app/customers/page.tsx
  • app/dashboard/page.tsx
  • app/globals.css
  • app/layout.tsx
  • app/login/page.tsx
  • and 12 more files
  • 8 pages it is built from, installed with it
  • Needs lucide-react

Works with

  • React
  • Next.js
  • Tailwind CSS
  • TypeScript

npx hoverlab init saas-starter ./my-app

Or over MCP, from your editor's agent — no account needed.

License

Free to read, copy and install, for personal and non-commercial projects. Shipping it in client work or a paid product needs Pro ($79 once). The source lands in your repo and stops being ours — no attribution, nothing to upgrade.

Was this useful?

Every screen

NewEvery section of a real product, ready to paste

Ship the interface you sketched

No component library to adopt, no design system to negotiate, no runtime to ship.

Trusted by teams shipping every day

NorthwindContosoInitechUmbrellaGlobexSoylentHooliVandelay

Everything, in one place

The parts you would otherwise rebuild on every project.

Fast by default

No runtime, no hydration cost, no waterfall. What you paste is what the browser paints.

Yours to keep

Copied code lives in your repo. Nothing phones home and nothing breaks when we ship.

Zero dependencies

Nothing to audit.

Composable

Every piece works alone or nested inside the next one up.

Accessible

Keyboard paths, focus rings and reduced-motion fallbacks included.

"It replaced our design system backlog."

Priya R., Staff Engineer

Built for everyone who ships UI

Whichever seat you are in, the work starts further along.

Frontend developers

Ship polish without the busywork

  • Stop rewriting the same hover and focus states
  • Drop a whole section in instead of assembling one
  • No runtime means no bundle-size regression

Designers

Close the gap between the mock and the build

  • Show stakeholders something live, not a screenshot
  • Tune spacing, colour and motion against real markup
  • Hand over a link instead of a spec document

Founders

Make an MVP feel like a funded product

  • A credible landing page in an afternoon
  • No design hire required to launch
  • Commercial use covered — ship it and charge for it

Learners

Read patterns that are actually in production

  • Every source is commented and idiomatic
  • Learn layout and motion by working example
  • Fork a piece and break it — nothing to set up

Paste it. Ship it.

No install step, no configuration file, no build plugin.

  • Copy the section straight into your project
  • Restyle it with your own tokens, not our overrides
  • Delete what you do not need — it is your code now
import { PricingTiers } from '@/components/pricing-tiers'import { FaqAccordion } from '@/components/faq-accordion' export default function Page() {  return (    <main>      <PricingTiers />      <FaqAccordion />    </main>  )}

What people say

From teams that ship on a deadline.

“We replaced a week of design polish with an afternoon. The parts that used to get cut for time are just there now.”
Priya RamanStaff Engineer, Northwind
“Dropped it in on a Friday and shipped Monday. No dependency argument with my team for once.”
Marco SilvaFounder, Ferrytale
“The thing I did not expect: it made our junior engineers faster, because the patterns are readable. They learn from what they paste.”
Alex ChenEngineering Manager, Contoso
“Our marketing site went from three weeks to four days. Same designer, same headcount.”
Dana WhitfieldHead of Design, Globex
“I stopped keeping a personal snippets file. That file had been following me between jobs for six years.”
Samir HaddadFrontend Lead, Initech

Simple, honest pricing

Start free. Upgrade when it starts paying for itself.

MonthlyYearlySave 20%

Free

Everything you need to try it properly.

Free
  • Up to 3 projects
  • Community support
  • Core component library
Most popular

Pro

For working developers shipping real products.

$19/month
  • Unlimited projects
  • Commercial license
  • The full library
  • Priority email support
  • Figma source files

Team

Shared access and billing for a whole team.

$49/month
  • Everything in Pro
  • Up to 10 seats
  • Shared component presets
  • SSO and audit log
  • Invoice billing

Compare plans

Every line, side by side.

Compare plans — features by plan
FeatureFreeProPopularTeam
Projects3UnlimitedUnlimited
Commercial licenseNot includedIncludedIncluded
Full component libraryNot includedIncludedIncluded
Figma source filesNot includedIncludedIncluded
Seats11Up to 10
SSO and audit logNot includedNot includedIncluded
SupportCommunityPriority emailDedicated

Frequently asked questions

Everything people ask before getting started.

Can I use this in a commercial project?

Yes. Everything here is yours to ship in client work and paid products, with no attribution required.

Do I need a specific framework?

No. The markup is plain HTML and the styling is utility classes, so it drops into any stack that can render an element.

How do updates work?

Copied code is yours — nothing reaches back into your project. Pull a newer version whenever you want it.

Is there a free tier?

There is. A large part of the catalog is free forever; the paid plan unlocks the rest and removes usage limits.

Come build with us

Most of what ships started as someone asking for it.

Live components in your current theme — switch routes, or the phone icon to check the mobile layout. Colours are this template’s Iris palette, which ships in app/globals.css. The indigo every SaaS reaches for, at a lightness that survives being link text as well as a button. The default, chosen rather than defaulted into.

Get it

49 files · .zip · nothing to configure · Pro

then

cd saas-starter
npm install
npm run dev

The archive contains the whole project — routes, blocks, theme tokens, Tailwind and PostCSS config, tsconfig and a .gitignore. One runtime dependency, and no Hoverlab dependency at all: it is your code from the moment it unzips.

For AI

The component, its props, the design tokens it expects and the command that installs it — as one prompt. Paste it into Claude, Cursor, v0 or ChatGPT and what they build around it will match the rest of the catalog instead of inventing its own system.

See the prompt

Routes

PathPageFile
/SaaS Landing Pageapp/page.tsx
/pricingPricing Pageapp/pricing/page.tsx
/loginSign-In Screenapp/login/page.tsx
/dashboardDashboard Overviewapp/dashboard/page.tsx
/customersCustomer List Screenapp/customers/page.tsx
/settingsAccount Settingsapp/settings/page.tsx
/billingBilling & Usage Screenapp/billing/page.tsx
404404 Pageapp/not-found.tsx

What you get

project root(8 files)

  • GETTING-STARTED.md
  • gitignore
  • next.config.ts
  • package.json
  • postcss.config.mjs
  • README.md
  • tailwind.config.ts
  • tsconfig.json

app/(10 files)

  • billing/page.tsx
  • customers/page.tsx
  • dashboard/page.tsx
  • globals.css
  • layout.tsx
  • login/page.tsx
  • not-found.tsx
  • page.tsx
  • pricing/page.tsx
  • settings/page.tsx

components/(31 files)

  • auth-login-card.tsx
  • bar-chart-panel.tsx
  • bento-features.tsx
  • billing-plan-summary.tsx
  • code-showcase.tsx
  • community-band.tsx
  • comparison-table.tsx
  • dashboard-activity-feed.tsx
  • dashboard-page-header.tsx
  • dashboard-shell.tsx
  • dashboard-stat-cards.tsx
  • data-table-pagination.tsx
  • data-table-sortable.tsx
  • data-table-toolbar.tsx
  • faq-accordion.tsx
  • footer-mega.tsx
  • hero-centered.tsx
  • invoice-history-table.tsx
  • logo-cloud.tsx
  • navbar-simple.tsx
  • not-found-404.tsx
  • persona-cards.tsx
  • pricing-tiers.tsx
  • settings-api-keys.tsx
  • settings-danger-zone.tsx
  • settings-nav-layout.tsx
  • settings-profile-form.tsx
  • settings-team-members.tsx
  • testimonial-grid.tsx
  • theme-provider.tsx
  • usage-meter-panel.tsx

Every file is listed. The 30 files in components/ are the blocks the pages import — each one has its own page if you want to read it on its own.

Project files

Everything except the blocks. Opens on app/globals.css — the file that makes the rest look right, since every block styles itself with bg-card and text-muted-foreground rather than literal colours.

app/globals.css
@tailwind base;
@tailwind components;
@tailwind utilities;

/**
 * Design tokens — the Iris palette.
 *
 * The indigo every SaaS reaches for, at a lightness that survives being link text as well as a button. The default, chosen rather than defaulted into.
 *
 * This file is the reason a pasted block looks right. Every block and page
 * styles itself with semantic classes — `bg-card`, `text-muted-foreground`,
 * `border-border` — rather than literal colours, so they inherit whatever
 * you define here instead of fighting it. Change a value below and every
 * section in the project moves with it. Change the hue on `--primary` and
 * `--ring` together and you have rebranded the site.
 *
 * Values are bare HSL channels, not `hsl(...)` calls. That is what lets
 * Tailwind compose them with an alpha suffix: `bg-primary/10` expands to
 * `hsl(var(--primary) / 0.1)`, which is impossible if the variable already
 * carries its own function wrapper.
 *
 * Every foreground/background pair below clears WCAG AA (4.5:1) in both
 * themes. If you retune one, check the pair rather than trusting the eye —
 * mid-lightness accents are the ones that fail.
 */

@layer base {
  :root {
    --background: 243 40% 99%;
    --foreground: 243 40% 10%;
    --card: 0 0% 100%;
    --card-foreground: 243 40% 10%;
    --popover: 0 0% 100%;
    --popover-foreground: 243 40% 10%;
    --primary: 243 72% 52%;
    --primary-foreground: 0 0% 100%;
    --secondary: 243 34% 96%;
    --secondary-foreground: 243 40% 20%;
    --muted: 243 24% 95%;
    --muted-foreground: 243 12% 40%;
    --accent: 268 50% 93%;
    --accent-foreground: 268 50% 20%;
    --destructive: 0 72% 47%;
    --destructive-foreground: 0 0% 100%;
    --border: 243 22% 90%;
    --input: 243 22% 90%;
    --ring: 243 72% 52%;

    --radius: 0.75rem;
  }

  .dark {
    --background: 243 38% 5%;
    --foreground: 243 15% 97%;
    --card: 243 30% 8%;
    --card-foreground: 243 15% 97%;
    --popover: 243 30% 8%;
    --popover-foreground: 243 15% 97%;
    --primary: 243 88% 76%;
    --primary-foreground: 243 42% 7%;
    --secondary: 243 24% 15%;
    --secondary-foreground: 243 15% 97%;
    --muted: 243 22% 15%;
    --muted-foreground: 243 12% 68%;
    --accent: 268 26% 18%;
    --accent-foreground: 268 45% 88%;
    --destructive: 0 62% 52%;
    --destructive-foreground: 0 0% 100%;
    --border: 243 20% 19%;
    --input: 243 20% 19%;
    --ring: 243 88% 76%;
  }
}

@layer base {
  * {
    @apply border-border;
  }

  body {
    @apply bg-background text-foreground antialiased;
  }

  /**
   * Global motion opt-out.
   *
   * Blocks guard their own animations with Tailwind's `motion-safe:`, but
   * third-party CSS and anything you add later will not. This is the
   * backstop: it neutralises every animation and transition on the page
   * for users who have asked the OS for reduced motion, rather than
   * relying on each author to remember.
   */
  @media (prefers-reduced-motion: reduce) {
    *,
    *::before,
    *::after {
      animation-duration: 0.01ms !important;
      animation-iteration-count: 1 !important;
      transition-duration: 0.01ms !important;
      scroll-behavior: auto !important;
    }
  }
}

More Full Product

Pro
Open the full page for this template

AI Assistant

The streaming answer, with its citations

An agent product’s working surface: transcript, reasoning, tool calls and the approval card, with sign-in and settings around it. Wiring a model in is your half.

4 routes4 pages14 blocksOrchid
Pro
Open the full page for this template

Agent Console

The approval queue, with its run trace

The operator’s half of an agent product: the approval queue it opens on, a run trace with tool calls, retries and cost, and the chat surface behind them.

6 routes6 pages20 blocksSlate