DOCS · START HERE

Quickstart

Clone, run one command, and have specd running locally against a real Postgres in about five minutes.

On this page

specd is local-first and pre-1.0: you run it on your own machine, against your own Postgres, with your own model credential. There is no hosted service to sign up for.

Prerequisites

You needWhy
Node ≥ 22 and pnpm 10.32.1The workspace pins pnpm through packageManager. On Node 22–24, corepack enable once activates the pinned version automatically. Node 25 dropped corepack from the distribution — install pnpm yourself instead (npm i -g pnpm@10.32.1, or Homebrew).
DockerPostgres with the vector extension (pgvector/pgvector:pg17), provisioned by the repo's docker-compose.yml. Postgres is specd's only runtime dependency.
Go ≥ 1.25 (optional)Only to build the specd CLI. The platform runs without it.
A model credential (optional)The Claude Code CLI already signed in, or an Anthropic API key. Indexing, retrieval, the knowledge graph and health all work with neither — see Bring your own model.

The one-command path

terminal
git clone https://github.com/unitypark/specd.git && cd specd
pnpm install
pnpm demo

pnpm demo writes a .env if there is not one, builds the workspace packages, starts Postgres and waits for it to actually accept connections, applies migrations, seeds a project with a fixture repository already connected, and starts both dev servers — printing the URL and a login. Each step announces itself, so a failure names the step instead of arriving as a stack trace three steps later.

The same thing by hand

If you would rather see each step, this is exactly what pnpm demo automates.

  1. Clone and configure

    cp .env.example .env. The file only has to exist — the dev defaults work as-is, and nothing needs sourcing into your shell: the API, the migration runner and Next.js each load the repo-root .env themselves. Every value you would change for a real environment is commented with what it does and how to generate it.

  2. Install and build the workspace packages

    pnpm install, then pnpm --filter "./packages/*" build. The build is not optional and install does not do it for you — @specd/db and @specd/shared are imported through their gitignored dist/, so the API cannot start until they have been built once.

  3. Start Postgres

    pnpm infra:up. One container, specd-postgres (pgvector on Postgres 17), mapped to host port 5433 so it can never collide with a Postgres you already run on 5432. Data lives in a named volume and survives restarts.

  4. Create the schema

    pnpm db:migrate. Plain-SQL migrations applied in filename order, each in its own transaction, tracked in _specd_migrations. Idempotent, so it is also the command to run after pulling commits that added a migration.

  5. Seed a playground

    pnpm db:seed writes a small fixture git repository to onboard against, so you can walk the entire pipeline without connecting anything real.

  6. Run it

    pnpm dev starts the API on :4000 and the web app on :3000 in parallel. Ctrl-C stops both; Postgres stays up independently.

Verify it is actually up

terminal
curl http://localhost:4000/api/health
a healthy response
{ "status": "ok", "database": "up",
  "ai": "no platform key (BYO key per project)",
  "embeddings": "hash", "defaultModel": "claude-opus-5" }

"ai" reporting no key is normal and honest — agent runs will fail with a clear error until a project supplies one, and nothing else cares. If anything looks wrong, specd doctor reports config, server, database, embeddings, credential, identity and default project in dependency order and skips what an earlier failure makes unknowable.

What to do next in the app

Open localhost:3000, create an account, and the wizard walks the stations. Your first spec narrates that walk in detail; the short version is: register the seeded fixture repo, let Ground read it, merge the setup branch, draft a spec from a ticket, approve it, build it, merge.

You can also exercise the whole loop headlessly over the real HTTP API — steps that need a model are skipped and labelled, never silently passed:

terminal
pnpm --filter @specd/api loop

Common first-run problems

SymptomCauseFix
DATABASE_URL is required — copy .env.example to .envNo .env at the repo root yetcp .env.example .env, then retry.
Same error, but .env existsYou are not at the repo root, or the value is emptygrep DATABASE_URL .env from the repo root should print a real value — the loader looks there, not at the shell's cwd.
API cannot reach Postgrespnpm infra:up never ran, or Docker is downdocker ps should list specd-postgres as healthy.
EADDRINUSE on :3000 / :4000A previous pnpm dev is still runninglsof -nP -iTCP:3000 -sTCP:LISTEN, stop it, retry.
Schema-shaped error right after pullingNew migrations landedpnpm db:migrate — idempotent.
Web app renders but has no data in itThe API died at startup — often on a missing or stale packages/*/dist. node --watch keeps the crashed process alive, so pnpm dev still looks healthy.curl localhost:4000/api/health to confirm, read the API's own output for the reason, then pnpm --filter "./packages/*" build.

The longer list, including the day-two traps, is in Troubleshooting.

Next