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 need | Why |
|---|---|
| Node ≥ 22 and pnpm 10.32.1 | The 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). |
| Docker | Postgres 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
git clone https://github.com/unitypark/specd.git && cd specd
pnpm install
pnpm demopnpm 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.
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.envthemselves. Every value you would change for a real environment is commented with what it does and how to generate it.Install and build the workspace packages
pnpm install, thenpnpm --filter "./packages/*" build. The build is not optional and install does not do it for you —@specd/dband@specd/sharedare imported through their gitignoreddist/, so the API cannot start until they have been built once.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.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.Seed a playground
pnpm db:seedwrites a small fixture git repository to onboard against, so you can walk the entire pipeline without connecting anything real.Run it
pnpm devstarts the API on:4000and the web app on:3000in parallel. Ctrl-C stops both; Postgres stays up independently.
Verify it is actually up
curl http://localhost:4000/api/health{ "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:
pnpm --filter @specd/api loopCommon first-run problems
| Symptom | Cause | Fix |
|---|---|---|
DATABASE_URL is required — copy .env.example to .env | No .env at the repo root yet | cp .env.example .env, then retry. |
Same error, but .env exists | You are not at the repo root, or the value is empty | grep 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 Postgres | pnpm infra:up never ran, or Docker is down | docker ps should list specd-postgres as healthy. |
EADDRINUSE on :3000 / :4000 | A previous pnpm dev is still running | lsof -nP -iTCP:3000 -sTCP:LISTEN, stop it, retry. |
| Schema-shaped error right after pulling | New migrations landed | pnpm db:migrate — idempotent. |
| Web app renders but has no data in it | The 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.