Angular + NestJS boilerplate for B2B SaaS
Works with Claude Code & Cursor
Ship your B2B SaaS in days , not months
Organizations, roles, per-organization Stripe billing, 2FA, a helpdesk and a one-command deploy, already built, documented and tested. You start on the screens your customers pay for.
From $199, one-time. Pay once, build unlimited projects.
- Angular
- NestJS
- Prisma
- PostgreSQL
- Stripe
- Tailwind
- Nx
B2B customers expect all of this before they sign
- Organizations, units and tenant data isolation 40 hrs
- Roles and permissions per organization and unit 24 hrs
- Stripe subscriptions per organization, plan limits, webhooks 16 hrs
- Invitations, members, "who can grant what" 10 hrs
- Email verification, password reset, Google login 10 hrs
- TOTP two-factor with recovery codes 8 hrs
- Helpdesk with screenshots and staff replies 12 hrs
- Background jobs, mail queue, live notifications 10 hrs
- Audit log, rate limits, secure sessions 8 hrs
- Docker, HTTPS, migrations, CI 8 hrs
- Rewriting it when the first enterprise customer asks for units β hrs
= 146+ hours before your first real feature
const firstFeature = "this week";
Everything a B2B app needs,
already wired together
Not a pile of snippets. One codebase where tenancy, roles, billing and auth know about each other.
Organizations and units, isolated by default
- One login, many organizations, with a switcher in the header
- Units: a tree of branches or departments, with admins who manage only their subtree
-
Mark a model
// @tenantand every query is scoped to the active organization, failing closed without one -
// @ownedrecords: each user sees their own, admins see the people in their reach - Self-service signup: users create their own organization and become its admin
- Single-organization mode for internal tools and one-customer installs
- Time saved
- 40 hours
- Headaches
- 0
Roles and permissions that scale past "admin or not"
- Built-in hierarchy: platform admin, organization admin, unit admin, user
- Custom roles for the whole platform or for one organization
- Permission catalog generated from your code and enforced per route
- Nobody can grant or remove a permission they do not hold
- Invitations by email with roles and language, single-use and expiring
- Time saved
- 24 hours
- Headaches
- 0
Stripe subscriptions per organization
- Plans with limits (members, units, your own counters) and feature flags
- Free plan, no-card trial, Stripe Checkout and Customer Portal
- Webhooks applied idempotently
- One line to enforce a limit, one decorator to gate a feature
- Turn billing off and nothing is limited, no Stripe keys needed
- Time saved
- 16 hours
- Headaches
- 0
Authentication you would pass a security review with
- Email + password with verification, Google login, password reset
- TOTP two-factor with recovery codes and a shared failure budget
- Rotating refresh tokens with theft detection, capped sessions
- Audit log of 20+ security and admin actions, written in the same transaction
- Rate limits, Helmet, strict validation, soft delete everywhere
- Time saved
- 26 hours
- Headaches
- 0
Support built into the app
- "Report a problem" from any page, with screenshots
- A staff queue for you and for each organizationβs admins
- Replies and status changes notify the reporter in-app and by email
- Live in-app notifications over Postgres LISTEN/NOTIFY, no Redis
- Time saved
- 12 hours
- Headaches
- 0
Mail and background work that never blocks a request
- pg-boss job queue on the same Postgres, no extra infrastructure
- Every email goes through a queue, inserted in the same transaction
- Encrypted job payloads, retries with backoff, a dead-letter queue
- Email templates in English and Greek; the UI too, with a switcher
- Time saved
- 10 hours
- Headaches
- 0
From repo to HTTPS on one VPS
- Docker Compose with Caddy: automatic HTTPS, client, API, migrations
- Release workflow pushes images to GitHub Container Registry
- CI: format, lint, unit tests, build and 700+ API end-to-end tests
- Env validated at boot: the API lists every problem and refuses to start
- Time saved
- 8 hours
- Headaches
- 0
Made to be worked on with Claude Code or Cursor
- A CLAUDE.md with the conventions, so your agent follows the patterns
- A configure-env skill that writes and validates your .env, secrets included
-
A product generator:
nx g @core/plugin:product <name>and start building - Strict module boundaries and typed contracts catch what the agent gets wrong
- Time saved
- a lot of re-prompting
- Headaches
- 0
Tested like it is already in production
- API end-to-end tests against a real Postgres
- 736
- documentation pages, from quickstart to deploy
- 29
- security and admin actions in the audit log
- 20+
- command to generate your own product
- 1
Pricing
Skip the plumbing, start on your product
$100 off for the first 50 customers. After that, the regular price applies.
Solo
One developer, unlimited projects
- NestJS API + Angular client in one Nx monorepo
- Organizations, units and multi-tenant data isolation
- Roles and permissions, per organization and per unit
- Stripe subscriptions per organization, with plan limits
- Email + Google login, 2FA, invitations
- Helpdesk, audit log, live notifications, job queue
- Docker + Caddy deploy to one VPS, CI included
- Full docs and 700+ end-to-end tests
- Licence for 1 developer
Pay once. Build unlimited projects.
Team
Up to 10 developers in one company
- NestJS API + Angular client in one Nx monorepo
- Organizations, units and multi-tenant data isolation
- Roles and permissions, per organization and per unit
- Stripe subscriptions per organization, with plan limits
- Email + Google login, 2FA, invitations
- Helpdesk, audit log, live notifications, job queue
- Docker + Caddy deploy to one VPS, CI included
- Full docs and 700+ end-to-end tests
- Licence for up to 10 developers
Pay once. Build unlimited projects.
FAQ
Frequently asked questions
Something else? Email hello@keelmint.com
What do I get exactly?
Access to the private Keelmint repository: a full Nx monorepo with a NestJS API, an Angular client, Prisma and Postgres, the deploy files, the CI pipeline and the documentation site. You fork it and build your product next to the example one.
Who is it for?
Developers building software that companies buy: anything where customers have teams, admins, branches or departments, and pay per organization. If your users are all individuals, a simpler boilerplate will do.
Angular? Not React?
Angular 22 with standalone components and signals, spartan/ui and Tailwind on the client; NestJS 11 on the API. Both are typed end to end through shared contracts.
Can I build an app with a single organization?
Yes. Set organizations: 'single' in the product config: there is one built-in organization, no switcher, and roles, units and everything else keep working.
Does it work with AI tools like Claude Code and Cursor?
Yes, it is built for it. The repo ships a CLAUDE.md with its conventions and a skill that writes and validates your environment files. Lint rules and typed contracts catch the mistakes an agent tends to make.
Can I use another database?
Keelmint is built on PostgreSQL: tenant scoping, the job queue, live notifications and the migrations all rely on it. Any managed Postgres 17 or newer works.
How do updates work?
Your product lives next to the core libraries, not inside them, so you add the Keelmint repo as a second git remote and merge new releases. The docs describe each releaseβs migrations.
What does the licence allow?
Both let you build unlimited products, for yourself or for clients, and hand a client the source of the product you built for them. Solo covers one developer; Team covers up to ten in one company. Neither lets you resell or publish Keelmint itself, or use it to make another template or boilerplate. Read the full licence at /license.
What other costs are there?
Hosting (one small VPS runs it), an SMTP provider for email, and Stripeβs fees if you charge your customers. Keelmint itself is a one-time payment.
Can I read the documentation first?
Yes, it is public at docs.keelmint.com. Since you get the full source code, purchases are final once repository access is claimed; see the terms.