The SaaS Starter

Ship your SaaS.
Skip the boilerplate.

Auth, organisations, RBAC, file uploads, emails and i18n — production-ready from day one. Built on Nuxt 4, Drizzle ORM and PostgreSQL.

$ npx nuxi init -t gh:domsen123/nuxt-drizzle

Node 22+ · pnpm · PostgreSQL

7

Feature slices

2

Auth methods

2

Languages

100%

TypeScript

01

Authentication  →

Session-based auth with httpOnly cookies. Microsoft Entra ID OAuth, anonymous sessions, email verification, and secure password reset flows included.

● session active
user: hey@example.com
provider: Microsoft Entra ID
expires: 7d · httpOnly cookie
○ anonymous session
converted on sign-up
02

Multi-tenancy  →

Organisations with member management and invitation flows. Fine-grained RBAC lets you model any permission structure from the start.

acme-corp owner 4 members
big-startup admin 2 members
my-project member 1 member
Roles: owner · admin · member
RBAC: resources × actions
03

File management  →

Shared upload pipeline with entity-type support. Avatar handling, storage-agnostic file service, and image optimisation via Nuxt Image.

PUT /api/files/upload
entityType: "user"
entityId: "usr_123"
avatar.jpg → optimised · CDN
report.pdf → stored · linked
04

Admin panel  →

Full admin dashboard with user management, role assignment, and user impersonation for debugging production issues.

domsen123 global_admin active
jane.doe member active
bob.smith member banned
→ impersonate user
→ assign roles
→ manage organisations
05

Internationalisation  →

English and German out of the box. Locale-aware dates, safe string interpolation, and language preference persisted to the database.

t('nav.settings')
→ "Settings" (en)
→ "Einstellungen" (de)
useLocaleFormat().formatDate(d)
→ "Oct 15, 2026" (en)
→ "15.10.2026" (de)
06

Type-safe database  →

Drizzle ORM on PostgreSQL. Vertical slice schemas, auto migrations, and a generic ItemService with filter, sort, and pagination.

users.readMany({
filter: {
role: { _eq: 'admin' },
},
sort: 'createdAt:desc',
limit: 10,
})
07

Email system  →

Liquid-templated transactional emails. Per-locale HTML and plain-text variants with automatic language fallback.

welcome.html.liquid (en)
welcome.de.html.liquid (de)
reset-password.html.liquid
reset-password.de.html.liquid
→ fallback to en if de missing

Start building
today.