Overview
Ship is a pnpm + Turborepo monorepo built on a focused, modern TypeScript stack.
On a high level Ship consists of these parts:
Web
API
Plugins
Scheduler
Migrator
Deployment
Two shapes
Both options share the sameapps/web base (a landing page + an example server function). They differ in whether an API app exists:
- PostgreSQL + TanStack Start — full-stack.
apps/webtalks toapps/apithrough a fully typed oRPC client. Add the Auth plugin and the web app gains sign-in/up, the authenticated app shell, and the client wiring. - TanStack Start web-only — no
apps/api. Backend logic runs as server functions inside the Start server. No database or auth unless you add them.
End-to-end type safety
Types flow from the API to the web app through TypeScript declarations — no codegen, no shared types package:- An endpoint declares
.input(zodSchema).output(zodSchema).handler(...). pnpm --filter api build:typesemits.d.tsfiles.- The web app depends on
"api": "workspace:*"and importsimport type { AppClient } from 'api'.
See How Ship works for the resource-owns-everything model behind this.
Dev dashboards
A running full-stack project exposes two local dashboards:- API reference — a Scalar UI at http://localhost:3001/docs (raw OpenAPI 3.1 at
/spec.json), served in-process by Hono in non-production. - Database browser — Drizzle Studio at https://local.drizzle.studio, started with
pnpm dashboard.
Running the app
pnpm infra, or individual services with pnpm --filter api dev / pnpm --filter web dev.