Overview
Ship is a pnpm + Turborepo monorepo built on a focused, modern TypeScript stack.| Layer | Stack |
|---|---|
Web (apps/web) | TanStack Start (SPA) · TanStack Router · TanStack Query · shadcn/ui · Tailwind v4 |
API (apps/api) | Hono · oRPC · Drizzle ORM · PostgreSQL · better-auth · Socket.IO |
| Tooling | Turborepo · pnpm · Docker · drizzle-kit · TypeScript |
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'.
| Script | Generates | Run after |
|---|---|---|
scripts/codegen-router.ts | src/router.ts + src/contract.ts | adding/removing an endpoint file |
scripts/codegen-db.ts | src/db.ts (typed DbService per table) | adding/removing a schema file |
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.