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.
Auth
Better Auth, RBAC, admin plugin, account export and delete.
Payments
Polar checkout, signed webhooks, subscription state.
File storage
Presigned uploads to MinIO locally, R2 in production, no AWS SDK.
Background jobs
BullMQ on the Redis you already run, drained by its own process.
AI
Streaming chat and RAG over pgvector.
Search
Postgres trigram search, no separate service.
Observability
LogTape logs, optional Sentry and PostHog.
OpenAPI
A generated spec, and an MCP server built from it.
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
Getting started
Clone to running stack.
Architecture
Which app owns what, and why the API is separate.
Rules
The conventions the codebase enforces, and the bug behind each one.
Deployment
Four processes, systemd, nginx, and the config that fails silently.
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.