Your next SaaS starts
after auth, organizations and the plumbing.

SaaS Maker is an open-source starter for multi-tenant SaaS products. One command scaffolds three services — API, app and admin panel — with organizations, roles, invitations, sessions, email flows, tests, CI and deploys already wired. Your energy goes into the product, not the plumbing.

$ uvx saas-maker new my-saas

Apache-2.0 · Python 3.14 + React 19 · one command scaffolds and provisions the whole stack

A generated SaaS Maker app: the tours module list with search, status filter and row actions
Batteries included

Everything a SaaS needs before its first feature

The boring decisions are made and tested — multi-tenancy, auth, sessions, email, an admin realm, a design system. You add the modules that make your product yours.

Multi-tenant by organization

Every tenant table carries organization_id and every query filters by it. A row from another organization answers 404, never 403. Users can belong to several organizations and switch.

Auth done properly

JWT access + refresh tokens persisted and rotated; logout, logout-all and password changes revoke them. Email verification, password reset and per-IP rate limits on every auth endpoint.

Teams, roles, invitations

owner > admin > member with a single require_role dependency. Token-based invitations with expiration, delivered by email, accepted in the app.

A separate admin panel

Platform admins live in their own table and auth realm. Neutral gray UI on purpose, so it never gets confused with the product.

A design system, not a theme

DESIGN.md defines the tokens, components and copy tone. One --brand-hue variable re-brands the whole app; shadcn/ui + Tailwind 4 underneath.

Tests, CI and deploys

pytest against real migrations, Vitest + Testing Library, GitHub Actions per repo (lint, typecheck, tests, audit, Docker build) and Kamal 2 configs for all three services.

Three services, three repos

Each service is its own repo and deploys alone

The API, the tenant app and the admin panel share nothing but an HTTP contract. Each one has its own git history, CI pipeline, Dockerfile and Kamal config — so they scale, ship and roll back independently.

Kamal 2 · one image per service

Layers, isolation rule, endpoints and test conventions are written down in each service's CLAUDE.mdbrowse the template.

Quickstart

From zero to a running SaaS

1

Scaffold

uvx saas-maker new my-saas

The wizard asks for the name, slogan, brand color, Postgres, and optionally your deploy and SMTP details — then downloads the pinned template, brands it, writes every .env and secrets file, installs dependencies, creates the database and runs the migrations.

2

Run

cd backend  && make dev
cd frontend && npm run dev
cd admin    && npm run dev

API on 8090, app on 5190, admin on 5191. Register in the app to get your first organization; create the first platform admin with one script.

3

Deploy

cd backend  && kamal deploy
               kamal db-migrate
cd frontend && kamal deploy
cd admin    && kamal deploy

Each service ships with Kamal 2 from its own config/deploy.yml — backend first, then the SPAs (kamal setup only once per service, to install Docker and the proxy). Postgres runs as a Kamal accessory on the same server.

Prerequisites: uv, Node 24 and a local PostgreSQL (or the optional docker-compose with Postgres + Mailpit).

Generator

A tenant-scoped module in one command

Like rails generate, but for a multi-tenant SaaS. It writes the model, migration, schemas, service, controller and tests on the backend; types, hook, list, form, delete dialog, badge, page, route, sidebar entry and tests on the frontend — and wires them at the generator anchors.

uvx saas-maker generate module tour \
  --label Tour --label-plural Tours --icon Map \
  --fields "name:str:Nombre,base_price:money:Precio por persona,\
           kind:choice(activity=Actividad|package=Paquete):Tipo,\
           duration_days:int:Días,notes:text?:Notas" \
  --status "active=Activo,draft=Borrador,archived=Archivado"
backend/app/{models,schemas}/tour.py
backend/app/services/tour_service.py
backend/app/controllers/tours.py
backend/alembic/versions/…_add_tours_table.py
backend/tests/test_tours.py
frontend/src/types/api.ts · hooks/useTours.ts
frontend/src/components/features/tours/*.tsx
frontend/src/pages/ToursPage.tsx (+ .test.tsx)
+ main.py · models/__init__.py · router · Sidebar
The generated form dialog: a decimal price input, two selects for the closed lists and the status select

The generated code mirrors the projects reference module. For shapes that aren't a plain CRUD, the saas-maker-add-module skill has the manual checklist. CLI on GitHub · PyPI.

Agent skills

Teach your coding agent the conventions

The rules of a SaaS Maker project — isolation, layers, quality gates, design tokens, deploy order — packaged as installable Agent Skills. Your agent reads them on demand and extends the project the right way, pointing to the project's own docs instead of guessing.

$ npx skills add SaaS-Maker-Stack/skills --skill '*'

saas-maker-primer

Invoke first. The three services, the non-negotiables, how to apply an external DESIGN.md without breaking the system, and which skill to load next.

saas-maker-cli

saas-maker new and generate module: the wizard, every option, the --fields/--status DSL, what gets written and what to run right after.

saas-maker-add-module

The checklist for a tenant-scoped resource by hand: backend, frontend, anchors, the isolation rule and the cross-org test.

saas-maker-deploy

Ship and operate on a server with Kamal 2 — backend, frontend, admin in order; migrations, first admin, logs, rollback.

Works with Claude Code, Cursor, Codex, Gemini CLI and more — the open Agent Skills standard. Browse the skills.

Stack

Boring, modern, typed

Backend Python 3.14 · FastAPI · SQLModel · Alembic · PostgreSQL · PyJWT · uv · ruff
Frontend React 19 · TypeScript 6 · Vite 8 · React Router 8 · TanStack Query · shadcn/ui · Tailwind CSS 4
Admin Same stack as the frontend, separate auth, neutral palette
Quality pytest against real migrations · Vitest + Testing Library · GitHub Actions per repo
Ops Kamal 2 · Docker · Postgres accessory · Mailpit in dev