ShipKit docs

Overview

What ships, what is optional, and what is declared but not wired.

ShipKit is a monorepo built around five non-negotiables: Bun as the runtime, Next.js 16 for product UI, Elysia for the API, Drizzle + Postgres for data, and Better Auth for identity. Everything else is a layer that was added when a real project needed it.

There is a running instance with a shared demo account. Most questions about what a feature actually does are answered faster by clicking it than by reading this.

What ships

Each of these is documented, not merely listed.

Outbound webhooks are signed to the Standard Webhooks spec, retried five times, and replayable from the admin. They are covered on the background jobs page, because they ride the same queue.

What is optional

Nothing above blocks a first run. Payments, email, storage, AI, Sentry and PostHog are inert until their environment variables are set, and the app boots without any of them. The environment reference states what each one does when unset.

What is declared but not wired

OTEL_EXPORTER_OTLP_ENDPOINT and OTEL_SERVICE_NAME validate as environment variables, but no exporter ships and nothing emits spans. If you need tracing, the configuration surface exists and the SDK does not.

Multi-tenancy is not in the base product either. Every resource is owned by its creating user; there is no organization plugin and no activeOrganizationId. Organizations and teams are restorable from the multitenancy skill.

Where to start

When not to use this

You want a static site or a one-off internal tool. Reach for Next.js on Vercel directly and skip the API, the worker and the queue.

On this page