Skip to main content

Overview

Ship is a pnpm + Turborepo monorepo built on a focused, modern TypeScript stack.
LayerStack
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
ToolingTurborepo · pnpm · Docker · drizzle-kit · TypeScript
On a high level Ship consists of these parts:

Web

API

Plugins

Scheduler

Migrator

Deployment

Two shapes

Both options share the same apps/web base (a landing page + an example server function). They differ in whether an API app exists:
  • PostgreSQL + TanStack Start — full-stack. apps/web talks to apps/api through 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:
  1. An endpoint declares .input(zodSchema).output(zodSchema).handler(...).
  2. pnpm --filter api build:types emits .d.ts files.
  3. The web app depends on "api": "workspace:*" and imports import type { AppClient } from 'api'.
Within the API, three codegen scripts keep the wiring in sync with the filesystem:
ScriptGeneratesRun after
scripts/codegen-router.tssrc/router.ts + src/contract.tsadding/removing an endpoint file
scripts/codegen-db.tssrc/db.ts (typed DbService per table)adding/removing a schema file
See How Ship works for the resource-owns-everything model behind this.

Dev dashboards

A running full-stack project exposes two local dashboards:

Running the app

pnpm start        # infra → migrate → scheduler → api + web
pnpm turbo-start  # dev via Turborepo (assumes infra already running)
Run infrastructure (PostgreSQL + Redis) on its own with pnpm infra, or individual services with pnpm --filter api dev / pnpm --filter web dev.