We use cookies and similar technology to understand how the product is used. Accept to help us improve, or reject to opt out — your choice is remembered across sessions.

ShipKitdemo
DashboardPricingPosts
Sign in

The boilerplate,
running.

This is not a mockup of ShipKit. It is ShipKit, deployed from a clean checkout, with auth, billing and an admin behind it.

Open the demoRead the docs
shipkit-demo.davrapps.dev
The ShipKit dashboard: a plan and usage card showing AI messages and file uploads against the period limits, beside a list of three recent projects.The ShipKit dashboard: a plan and usage card showing AI messages and file uploads against the period limits, beside a list of three recent projects.
Email
demo@shipkit.davrapps.dev
Password
DCzk63Jz9ZiVbzAa1!

Shared account, full rights. The database is wiped and reseeded nightly, so anything you break is temporary.

Four things you would otherwise write first

packages/auth

Sessions, roles, passkeys, 2FA

Better Auth with a role column the API actually reads. Email and password, OAuth providers, one-time codes, and recovery.

const session = await auth.api.getSession({ headers })
if (session?.user.role !== "admin") redirect("/login")
packages/entitlements

What a plan is allowed to do

Polar checkout and webhooks land here, and the rest of the app asks this package rather than reading a subscription row.

await can(user, "project.create")

packages/db

One schema, typed end to end

Drizzle against Postgres. The same types reach the API handler and the React component without a generation step.

export const projects = pgTable("projects", {
  ownerId: text("owner_id") .references(() => user.id),
})
apps/worker

Work that outlives a request

A separate process on the same queue, so a slow export or a retrying webhook never holds an HTTP response open.

# one command brings the whole stack up
bun run setup
# docker compose, db:push, db:seed

Fifteen more ship alongside them. The count is 18 packages in all, three of which the four cards above already named.

  • ai
  • analytics
  • cache
  • cli
  • content
  • email
  • entities
  • env
  • eslint-config
  • feature-flags
  • jobs
  • logger
  • storage
  • typescript-config
  • ui

Open any of it, then read the file behind it

  • DashboardOnboarding checklist, plan and usage meters for the period, recent projects.app/[locale]/dashboard/page.tsx
  • Account settingsTwo-factor enrolment, passkeys, and every active session with a device and a revoke button.app/[locale]/dashboard/settings/page.tsx
  • ProjectsA generated CRUD resource, produced by `bun run generate resource projects`.app/[locale]/dashboard/projects/page.tsx
  • PricingFree against Pro, monthly or annual. The button posts to /v1/checkout on the API and returns a live Polar session.app/[locale]/pricing/page.tsx
  • PostsA second generated resource, read through @workspace/entities. Useful mostly as a shape to copy.app/[locale]/posts/page.tsx
  • Sign upMake your own account instead of sharing the demo one. It is wiped with everything else overnight.app/[locale]/signup/page.tsx

Before you click around

Everything else is in the documentation.

ShipKit Demo

A public demo of the ShipKit boilerplate. The database resets nightly.

  • Pricing
  • Posts
  • Dashboard
  • Documentation
  • Privacy
  • Terms

Built with Next.js, Elysia and Bun.