Built for modern teams

Ship your next SaaS in days, not months.

An opinionated Next.js starter with auth, payments, background jobs, and the modern tooling you actually want to ship with.

Dashboard preview showing a modern SaaS application

Built with the best

Next.js
Vercel
Inngest
Polar
Drizzle
Better Auth
Biome
shadcn/ui

Everything you need to ship fast

Stop wasting weeks on boilerplate. Primus gives you auth, payments, background jobs, and type safety out of the box.

Sarah
Just signed in with Google — took 2 seconds!
You
Session synced across all my devices
Tyler
Email/password works too — zero config
You
Better Auth handles it all.

Authentication

Better Auth with social login, email/password, and session management. Ready in minutes, not days.

Polar payment transactions dashboard

Payments

Polar integration for subscriptions, one-time payments, and webhook-driven billing. No Stripe complexity.

import { eq } from "drizzle-orm"

import { db } from "@/lib/db"
import { user } from "@/lib/db/schemas/core"
import { result } from "@/lib/either"
import { logger } from "@/lib/logger"

export async function getActiveUsers() {
    const query = await result.trycatch(
        () => db
            .select({
                id: user.id,
                name: user.name,
                email: user.email,
                createdAt: user.createdAt,
            })
            .from(user)
            .where(eq(user.active, true))
    )

    if (!query.ok) {
        logger.error({ err: query.error }, "Failed to fetch users")
        return result.fail(
            new Error("QUERY_FAILED", { cause: query.error })
        )
    }

    logger.info({ count: query.value.length }, "Fetched users")
    return result.pass(query.value)
}

Type Safety

End-to-end types with Drizzle ORM, t3-env, and strict TypeScript. Errors caught at compile time, not runtime.

user.createdevent
send-welcome-email
sync-to-crm
provision-workspace

Background Jobs

Inngest for durable workflows, scheduled tasks, and event-driven functions. Built-in retry and observability.

From clone to production in four steps

Primus removes the guesswork so you can focus on what makes your product unique.

One command to scaffold your project with the entire stack configured and ready.

Terminal
$ bunx degit supersterling/primus my-saas
cloned supersterling/primus#HEAD
$ cd my-saas && bun install
Resolving dependencies...
Installed 847 packages
Done in 4.2s

Built for serious projects

Where developer experience meets production readiness — designed to scale with your ambitions.

Battle-tested Stack

Every dependency is chosen for production. Better Auth for security, Drizzle for type-safe queries, Inngest for reliable background processing.

bun run checks
tsc --noEmit0 errors
biome check139 files
docref check42 refs
grit test18 rules
All checks passed in 1.8s

Developer Experience

Biome for instant linting, GritQL for custom rules, strict TypeScript, and patterns that scale. Your future self will thank you.

Pricing that scales with you

Start free, upgrade when you're ready. No surprises.

Free

Perfect for side projects and getting started.

Free forever.
Auth + social login
PostgreSQL database
Background jobs
Community support
Popular
Pro

Everything you need for a serious SaaS.

$29/month, billed monthly.
Everything in Free
Priority support
Custom domain
Analytics dashboard
Team collaboration
Webhook management
Advanced billing
Enterprise

For teams that need dedicated support and SLAs.

Custom pricing.
Everything in Pro
Dedicated support
SLA guarantee
Custom integrations
SSO / SAML
Audit logs

Frequently asked questions

Everything you need to know about Primus.

Start building today

Clone the repo. Configure your services. Ship your SaaS.

Free and open source