LATEST RELEASESHIPPING SINCE 2026

Skip Six
Months Of
Boilerplate

A production-grade TypeScript SaaS starter built for Domain-Driven Design.

01Clone

One command. Bun pulls every workspace dep, Prisma generates the client.

02Generate

Plop scaffolds domain, application, infrastructure — wired into the DI container.

03Ship

Docker image builds with `bun run build`. Deploy to Fly, Render, your VPS.

STACK

Built on technology you already trust.

No exotic vendor lock-in. Standard, boring, battle-tested infrastructure — wired together so you don't have to.

BY THE NUMBERS

Density, quantified.

What you get on day one of cloning the repo.

459
tests passing
24
docs pages
10
bounded contexts
3
payment providers
3
i18n locales
0
mocks in CI

01 — IDENTITY

Auth that doesn't make you cry.

Email + password, OAuth, magic-link, TOTP 2FA, password reset, GDPR delete — pre-wired with sane defaults and rate limits the day you clone.

  • BetterAuth + argon2id sessions
  • OAuth (Google, GitHub, more)
  • Magic-link sign-in
  • TOTP 2FA + backup codes
  • Rate-limit per IP and per email
  • Password reset + email verify
Read the auth docs
iam.signIn.ts
import { iam } from '@app/iam';
 
const session = await iam.signIn({
email,
password,
totp: code, // throws on invalid 2FA
});
 
// session is an HMAC-signed httpOnly cookie
// rate-limited per IP and per email

02 — REVENUE

Take money the day you launch.

Three payment providers behind one port. Customer portal, signed webhooks in, signed webhooks out — the whole loop.

  • IPaymentProvider port: Polar, Stripe, MercadoPago
  • Provider-hosted checkout + customer portal
  • Idempotent, HMAC-verified webhook ingest
  • React Email receipts via the notifications module
  • Outbound webhooks to your customers (HMAC + retries)
  • Audit trail of every billing event
Read the billing docs
01

Checkout

POST /billing/checkout returns the provider-hosted URL.

02

Webhook in

HMAC-verified, idempotent, persists to your read model.

03

Portal

One-line redirect to the provider-hosted customer portal.

03 — TENANCY

Multi-tenant from t=0.

Workspaces, members, roles, invitations, API keys per tenant. The B2B primitives every paying customer asks for in week two.

  • Org workspaces with HMAC-signed switcher cookies
  • Member roles: owner, admin, member
  • Email invitations with expiring tokens
  • API keys scoped per tenant
  • Platform-admin impersonation, fully audited
  • Append-only audit log, event-sourced
Read the RBAC docs
A
Acme Inc
PRO PLAN
MEMBERS · 4+ Invite

04 — RELIABILITY

Sleep at night.

Tracing, errors, structured logs, readiness probes, background jobs on real Redis. The boring infra that pages someone if you skip it.

  • OTel auto-instrumentation (boots before Express)
  • Sentry: @sentry/bun + @sentry/nextjs
  • Pino structured logs with trace correlation
  • /readiness probe + /metrics endpoint
  • BullMQ background jobs on real Redis
  • Dead-letter queue + cron-style schedulers
Read the observability docs
OTEL TRACE · 245mstrace_id 7f3a…
  • POST /api/v1/checkout245ms
  • iam.requireAuth4ms
  • pg SELECT user18ms
  • redis GET plan:423ms
  • polar.createCheckout168ms
  • jobs.enqueue receipt6ms

05 — AI

AI primitives, not rebuilds.

Streaming chat over SSE on Express, tool use, structured output, per-tenant token budgets, RAG, and an MCP server scaffold.

  • Vercel AI SDK + Anthropic provider
  • SSE streaming on Express (no Vercel lock-in)
  • Tool use + structured output, type-safe
  • Per-org token budgeting + rate limits
  • RAG with pgvector + retrieval primitives
  • MCP server scaffold + assistant module
Read the AI docs
chat.route.ts
import { ai } from '@app/ai';
 
const stream = await ai.streamText({
model: 'claude-opus-4-7',
messages,
tools: { listUsers, search },
maxTokens: 4096, // per-org budget enforced
});
 
return stream.toResponse(); // SSE, typed

ARCHITECTURE

Domain-driven, layer-enforced.

Four layers, one rule: dependencies point inward. ESLint enforces it on every commit — there is no "oops, I imported Express in domain".

interfaces/http/
Express controllers, Zod schemas, route registration.
application/
Use cases, ports, DTOs. Orchestrates domain + infrastructure.
domain/
Entities, value objects, repositories. Pure, no I/O, no framework.
infrastructure/
Prisma repos, third-party adapters, mappers. Implements ports.
Dependencies point inward.
infrastructure/ implements ports.

domain/ cannot import express, @prisma/client, or anything from application/, infrastructure/, interfaces/. ESLint flat config enforces this.

BUILT FOR AGENTS

Claude Code and Cursor feel at home.

AGENT.md per bounded context. Plop generators that scaffold the full layer stack. OpenAPI typed contracts. Predictable file naming. Your AI pair-programmer doesn't hallucinate when the conventions are this consistent.

~/usedeploy
$ bun run plop endpoint
? Module name: notifications
? Endpoint name: send
? Method: POST

 application/use-cases/send.use-case.ts
 application/dto/send.dto.ts
 interfaces/http/send.controller.ts
 interfaces/http/send.schema.ts
 application/use-cases/send.use-case.spec.ts

$ bun run generate:api
 OpenAPI regenerated · 47 routes typed
  • AGENT.md per bounded context — the rules, in plain English, where the agent reads them
  • Plop generators scaffold domain + application + infrastructure + interfaces in one command
  • OpenAPI generated on every endpoint change — typed fetch client stays in lock-step
  • ESLint enforces DDD layering — agents can't accidentally cross boundaries
  • Branded ID types make foreign keys impossible to mix up
  • Result<T, E> over throw — agents see error paths in the type signature

Type-safe end-to-end. DDD bounded contexts. AI-streaming endpoints. 459 challenging tests.

UseDeploy is the production-grade foundation for the next generation of TypeScript SaaS applications.

TESTING

459 tests in the suite. Real Redis. No mocks in CI.

Domain unit tests, integration tests over a real Postgres + Redis, end-to-end tests over a real browser. The CI pipeline runs all of them on every commit.

$ bun run testPASS · 14.2s
modules/iam/use-cases/sign-in.spec.ts(24)
modules/iam/use-cases/totp.spec.ts(11)
modules/billing/adapters/polar.spec.ts(18)
modules/billing/use-cases/checkout.spec.ts(14)
modules/tenancy/use-cases/invitation.spec.ts(12)
modules/tenancy/use-cases/api-keys.spec.ts(9)
modules/observability/probes/readiness.spec.ts(7)
infrastructure/jobs/bullmq-runner.spec.ts(16)
PASS · 459 tests across 62 files in 14.21s

INTERNATIONALIZATION

Three languages, type-safe, day one.

next-intl with typed messages. Fumadocs i18n with dot-parser locale files. EN/ES/PT in the product AND in the docs site, missing-key fallbacks handled.

ENgetting-started.en.mdx

Get started

Clone the repo, install deps, run the dev server.

t('onboarding.start')
ESgetting-started.es.mdx

Empezar

Cloná el repo, instalá deps, corré el dev server.

t('onboarding.start')
PTgetting-started.pt.mdx

Começar

Clone o repo, instale deps, rode o dev server.

t('onboarding.start')

DEPLOY ANYWHERE

Runs where you want it to.

No platform lock-in. The Dockerfile is the source of truth — every target builds from the same image.

Docker

docker-compose for local + prod. Multi-stage Bun build, non-root, healthcheck.

Railway

One-click deploy with railway.toml at root + apps/client. Postgres + Redis as managed plugins.

Supabase

Use Supabase Postgres + Auth as drop-in replacements. Schema and seeds compatible.

Your VPS

systemd units, Caddy reverse proxy, GitHub Actions CD. Self-host friendly.

Built for AI agents.

From AGENT.md conventions to branded ID types and Plop generators. UseDeploy is structured so Claude Code and Cursor can navigate, reason, and refactor without hallucinating.

Agent-readable conventions

Repo ships with CLAUDE.md and AGENT.md files documenting bounded contexts, conventions, forbidden patterns, and the WHY of each architectural choice. Drop in your own assistant config and ship.

Read the docs
CLAUDE.md
1  ## DDD layering (enforced by ESLint)
2
3  Each module under apps/server/src/modules/<ctx>/:
4
5    domain/          # entities, VOs — no I/O
6    application/     # use cases, ports, DTOs
7    infrastructure/  # Prisma repos, adapters
8    interfaces/http/ # Express controllers, Zod
9
10 domain/ cannot import express,
11 @prisma/client, or anything from
12 application/infrastructure/interfaces/.
13
14 ESLint flat configs enforce this.

VS THE FREE STARTERS

What "free" leaves you holding.

create-t3-app gives you a typed Next app and an OAuth login. The day you need invoices, invitations, or background jobs, you're shopping for the next 6 weeks of integration work.

FeatureuseDeploycreate-t3-appShipFastMakerkit
Email + password + 2FA + magic-linkOAuth only
Multi-tenant orgs + invitations + API keyspartial
RBAC with typed permissions
Billing — multiple providers3 (Polar/Stripe/MP)StripeStripe
Background jobs (BullMQ + real Redis)
Observability (OTel + Sentry + /metrics)
Outbound webhooks (HMAC + retries)
i18n (EN + ES + PT, typed)
DDD layering enforced by ESLint
Docs site scaffolded (Fumadocs)

Everything you need
for a one-time fee.

One payment covers the source, the docs, and 459 tests. No subscriptions, no license keys, no telemetry.

Pricing Guide
$15/ $50
one-time · lifetime updates on the $50 tier
  • Full source code, frozen forever
  • Unlimited projects, commercial use
  • 459 tests · 24 docs pages · 10 bounded contexts
  • 14-day money-back guarantee

FAQ

What you're going to ask anyway.

Can I get a refund?

Yes. 14 days, no questions asked, no "can you tell us why" form. We'd rather you walk than stay with a tool that doesn't fit.

Is the source open?

Yes. You get the full Git repo, MIT-licensed for commercial use within your projects. No obfuscation, no licence keys, no telemetry phoning home.

What stack does it use?

Bun runtime, Express server, Prisma + Postgres, Next.js client, BetterAuth, Polar/Stripe/MercadoPago billing, BullMQ + Redis, OpenTelemetry + Sentry + Pino, S3-compatible storage, Vercel AI SDK + Anthropic. Standard, boring, well-supported.

How long until I'm shipping?

First commit pushed in one evening. Real auth + org + first paying customer in a weekend. Full SaaS with custom domain in a week.

Does it come with tests?

459 of them. Domain unit tests, integration tests over a real Postgres + Redis, e2e tests over a real browser. CI runs all of them on every commit. No mocks in CI.

Can I use it for client work / agencies?

Yes, the licence covers unlimited projects and commercial use. Use it for your own SaaS, your client's SaaS, or both.

What about updates after I buy?

Lifetime updates on the $50 tier. Every release ships to your repo via the sync tool — selective overwrite, never destroys your business code.

MC
Since 2026 · v2.1.0 · Active development

MAINTAINER

Built and shipped by one engineer.

UseDeploy is built and maintained by Martin Coll — full-stack engineer, founder, and operator. Every line ships from one keyboard, with the agentic feedback loop turned on. No committee, no Discord cargo cult — just a maker who has shipped a SaaS before.