Every language, framework, library, and Cloudflare service the SaaS Starter Kit actually depends on.
Pulled directly from the real package.json files and infra/*.ts — nothing here is aspirational.
| Purpose |
|---|
| Bun | Package manager and JS runtime for every package and script |
| TypeScript | Every package, strict mode |
| Purpose |
|---|
| Nuxt 4 | App framework — apps/app, apps/web, apps/login |
| Vue 3 | Component layer under Nuxt |
| Nuxt UI v4 | Component library (built on Reka UI + Tailwind) |
| Tailwind CSS | Styling, plus the forms, typography, aspect-ratio, container-queries plugins |
Pinia (@pinia/nuxt) | Client state — notifications store, teams store |
VueUse (@vueuse/nuxt) | Composable utilities |
@nuxt/image | Image optimization |
@nuxt/fonts | Web font loading |
@nuxt/scripts | Third-party script loading |
nuxt-svgo | SVG-to-component icons |
@nuxtjs/i18n | Internationalization |
@nuxtjs/seo | SEO/meta tags, sitemap, OG images (apps/web only) |
@unovis/ts / @unovis/vue | The team dashboard's chart (apps/app only) |
| Purpose |
|---|
tRPC (@trpc/server, @trpc/client, trpc-nuxt) | Type-safe API between apps/app's client and server |
| Zod | Input validation for every tRPC procedure |
| Purpose |
|---|
| PostgreSQL | Primary database — any standard instance (Supabase, RDS, Neon, self-hosted) |
| Drizzle ORM + Drizzle Kit | Schema, queries, migrations |
postgres (postgres.js) | The actual wire-protocol driver, via Hyperdrive |
| Purpose |
|---|
| OpenAuth.js | The independent auth server (apps/functions/src/auth.ts) — password, code, GitHub, Google providers |
| nuxt-authorization | Team-scoped RBAC (Bouncer-style abilities) |
otpauth | TOTP generation/verification for platform-admin MFA |
uqr | Client-side QR code rendering for MFA enrollment (zero runtime deps) |
Deployed entirely as code with SST (sst 4.14.0) and its Pulumi providers (cloudflare 6.20.0, command 1.0.1, random 4.17.0) — see SST.dev.
| Cloudflare service | Used for |
|---|
| Workers | Every deployed app (App, Auth, Web, Emails, Websockets, job/DLQ consumers, Cron) |
| Hyperdrive | Postgres connection pooling from Workers |
| KV | Auth credentials (AuthKV), rate-limit counters, small cached values |
R2 (via @nuxt-hub/core) | Blob storage — profile pictures, team logos |
| D1 | The docs site's content database (apps/web's search box) — @nuxt/content requires it on Cloudflare |
| Queues | Async job processing, plus a dead-letter queue |
| Durable Objects | The WebSockets server |
| Cron Triggers | Scheduled tasks |
| Custom Domains | Every Worker's public domain, DNS handled automatically |
| Purpose |
|---|
Stripe (stripe SDK) | Checkout, billing portal, webhooks |
Paddle (@paddle/paddle-js, @paddle/paddle-node-sdk) | Same, alternate provider — both can run in parallel |
| Purpose |
|---|
React Email (@react-email/components) | Templates (packages/emails/templates) |
@nuxfire/emails/mailer | Provider-agnostic sender — a vendored fork of AdonisJS Mail, adapted to run without the AdonisJS framework (packages/emails/mailer) |
| Resend, Mailgun, AWS SES, SparkPost, SMTP | Supported providers, one active at a time per config.ts flags |
| Purpose |
|---|
| Nuxt Content v3 | This documentation, the blog, FAQs, and legal pages — all Markdown |
| Shiki | Syntax highlighting for code blocks |
| Purpose |
|---|
| Hono | HTTP routing inside apps/functions (the auth issuer) |
ofetch | HTTP client used server-side |
valibot | Validation inside apps/functions (lighter than Zod for Worker bundle size) |
| Purpose |
|---|
| ESLint + Prettier | Linting and formatting, every package |
vue-tsc | Type-checking Vue SFCs |
@cloudflare/workers-types | TypeScript types for Workers runtime APIs |
| Drizzle Kit | Migration generation |