Overview
A full-featured Nuxt 4 SaaS starter with auth, payments, email, and AI wired in.
The Nuxt template is a full-featured SaaS starter built on Nuxt 4, Vue 3, and the Nitro server. It ships with authentication, a PostgreSQL database, payments, transactional email, internationalized content, and AI features already wired together so you can focus on your product instead of plumbing.
Auth, database, email, and content/i18n are integrated end to end. A few surfaces — the newsletter and parts of the dashboard — are working examples or UI starters you'll adapt to your product before launch. The feature status table below spells out each one.
Tech stack
| Concern | Library |
|---|---|
| Framework | Nuxt 4, Vue 3, Nitro server |
| Language | TypeScript |
| Auth | Better Auth (email/password + GitHub/Google OAuth, admin plugin) |
| Database | PostgreSQL + Drizzle ORM (node-postgres) |
| Payments | Multi-provider factory — ZPay (default) + Creem |
Resend + Vue Email (@vue-email) | |
| i18n | @nuxtjs/i18n (prefix_except_default) |
| Docs & blog | Nuxt Content v3 (Markdown collections) |
| AI chat | Vercel AI SDK (@ai-sdk/vue) via Vercel AI Gateway |
| AI media | Replicate (image / video / audio) |
| Styling | Tailwind CSS v4 + shadcn-vue (new-york) |
| Dark mode | @nuxtjs/color-mode (class-based) |
| SEO | @nuxtjs/sitemap + @nuxtjs/robots with the shared site config |
| Icons & images | @nuxt/icon (Lucide) + @nuxt/image |
| Tooling | ESLint, pnpm |
Feature status
Throughout these docs, features are labelled consistently:
- Integrated — connected end to end in the template.
- Example — a working reference implementation that still needs product-specific policy, limits, or data.
- UI starter — a designed surface backed by mock/static data or unfinished actions.
| Area | Status | Scope |
|---|---|---|
| Authentication | Integrated | Email/password, required verification, reset, GitHub/Google OAuth, account linking, admin plugin |
| Route protection | Integrated | Client app/middleware/{auth,admin}.ts guards redirect/403; the API handlers do the authoritative checks (server/middleware/auth.ts only attaches context) |
| Database | Integrated | node-postgres + Drizzle, auth and payment schemas (Postgres-only; the Prisma stub was removed) |
| Payments | Example | Multi-provider factory (ZPay default + Creem), login-required create route, signed webhooks for selected events |
| Email / contact | Integrated | Resend delivery for contact, verification, and reset — all routed through Vue Email templates via sendEmail |
| Newsletter | UI starter | subscribe-newsletter.vue template only; no subscription route or persistence |
| AI chat | Example | Vercel AI Gateway streaming (gpt-5.2); auth-gated via requireAiAuth + Zod; no quotas/moderation/cost caps yet |
| AI media | Example | Replicate image/video/audio create + polling; auth-gated via requireAiAuth + Zod; no quotas/cost caps yet |
| Content & i18n | Integrated | Per-locale Nuxt Content collections and locale routing are wired; Chinese docs/blog content is not included yet |
| Dashboard / admin | UI starter | Static dashboard data and placeholder order/billing/security pages; admin users, subscription read, and profile update are connected |
| Storage | Example | Authenticated, size-limited image upload to local public/uploads; declared MIME is trusted, so add signature validation and durable storage |
Application surfaces
- Marketing — landing page, blog, legal, contact, and about pages under the
(marketing)route group. - Authentication — login, register, forgot/reset password under
app/pages/auth/, using theauthlayout. - Dashboard — authenticated dashboard, account, settings, and admin pages
under
(dashboard), using theuserlayout. - Content — Nuxt Content–powered docs (you are reading them now), blog, and legal collections, split per locale.
- Payments — pricing CTAs, a ZPay/Creem checkout flow, and payment/ subscription tables.
- Email — verification, password reset, and contact delivery via Resend + Vue Email.
- AI — a streaming chat assistant plus image, video, and audio generation pages.
Start here
Follow this path for the fastest route from clone to a running, deployable app:
