# Show HN: Cairn – self-hosted Shape Up tool with a code-aware PM agent

> Source: <https://github.com/cairnpm/cairn>
> Published: 2026-08-19 10:24:05+00:00

**The hard part of building software moved from how to what.**

Cairn is the PM agent that turns a dense, scattered stream of feedback into a roadmap you can actually reason about — open, self-hosted, built on Shape Up.

[ cairnpm.com](https://cairnpm.com) ·

[Self-host](/cairnpm/cairn/blob/main/DEPLOY.md)·

[Roadmap](/cairnpm/cairn/blob/main/ROADMAP.md)·

[How the agent works](/cairnpm/cairn/blob/main/docs/intake.md)·

[Contributing](/cairnpm/cairn/blob/main/CONTRIBUTING.md)

AI made shipping cheap: *how* to build something is no longer the bottleneck. The
scarce skill now is deciding **what** to build — and in what order — in a roadmap
that fills up faster than anyone can read it. Cairn is built for that exact moment:
**an agent does the sorting** (read, deduplicate, shape, route) so your judgment
goes to the decision, not the pile.

**🪨 An agent, not a form.** Paste a Slack thread, a bug report, or a whole meeting transcript. The intake agent extracts the distinct signals, recontextualizes each one, deduplicates against the backlog, and proposes where it belongs — you confirm. Writing only ever happens on confirmation.**🔍 Grounded in your real code.** Link your product repo (read-only GitHub App or a local path) and the agent checks what's*actually shipped*before it shapes: it dedupes against reality — citing`file:line`

, not a stale ticket — grounds each pitch in the real architecture, and answers "is X built yet?" by reconciling the roadmap with the code. Zero-egress: the repo is grepped locally, never sent anywhere.**🧗 Shape Up, natively.** Pitches with a real problem and an appetite, a betting table to choose what's worth doing, hills to track in-flight work, frozen scope once a bet is placed. The method is the product, not a template.**🧹 Anti feature-factory.** No artificial caps, no vanity metrics. The backlog is meant to stay*small*: duplicates get merged, noise gets discarded, shaping is a discipline — not a place where requests go to die.**🔌 Bring your own LLM key.** The agent runs on your Anthropic key. No data detour through us — there is no "us" in the loop.**🏠 Self-hosted, you own the data.** One Node process, one embedded SQLite file. No external database, no telemetry, no account on someone else's server.**🔓 Source-available.** Read every line, audit it, run it for free forever. It even becomes Apache-2.0 over time (see[License](#license)).

Intake |
Conversational agent: triage → clarify → propose → commit. Reads `.docx` /images, splits transcripts into N features, dedupes, attributes every change. |
Code-aware |
Link the product repo; the intake greps it to dedupe against what's shipped and ground specs. Read-only, zero-egress — GitHub App (short-lived tokens, self-host manifest flow) or a local clone. |
Backlog |
Shaped features with problem · appetite · solution · rabbit holes · no-gos. Manually-assigned shapers. |
Betting table |
Collaborative deliberation: members vote, the owner validates → it bets features and opens a hill. |
Hills |
In-flight cycles with builders, periods and frozen scope. |
Workspace |
Email + password auth, token invitations, roles, avatars, full attribution/audit trail. |

Cairn is a **single container** backed by an embedded SQLite file — no external
database. Bring an Anthropic API key (or add it later in the UI) and a place to
keep `/data`

. Pick whichever fits:

**One-click on Render:**

**Docker Compose** (recommended for your own server):

```
git clone https://github.com/cairnpm/cairn && cd cairn
cp .env.example .env        # set NUXT_SESSION_PASSWORD (and your Anthropic key)
docker compose up -d        # → http://localhost:3000
```

Also supported — **Fly.io**, plain **Docker**, backups and env vars: see
** DEPLOY.md**. Prebuilt images are published to

`ghcr.io/cairnpm/cairn`

.First boot creates a single owner account — `ceo@cairn.local`

/ `cairn`

— change the
password right away. The workspace starts **empty**; set `CAIRN_SEED_DEMO=1`

to load a
demo backlog/hills/team for a tour.

```
pnpm install
echo 'ANTHROPIC_API_KEY=sk-ant-…' > .env
pnpm dev            # http://localhost:3000
pnpm test:members   # hermetic auth/invitations test suite
```

`cairn`

is a thin HTTP client over the running server, so an agent can ground itself
on the roadmap and feed signal into the intake — no second write path.

```
export CAIRN_URL=http://localhost:3000
export CAIRN_EMAIL=agent@your-workspace   # use a DEDICATED, least-privilege account:
export CAIRN_PASSWORD=…                    # the cached session can hit any endpoint it's a member of

pnpm exec cairn features --status shaping  # reads: features / feature <id> / hills / betting / overview
pnpm exec cairn capture "les users veulent le mode sombre"   # → {session_id, state, agent_message, proposal}
pnpm exec cairn capture --session <id> "priorité haute"      # answer a clarify turn
pnpm exec cairn commit --session <id>                        # finalise a single proposal
pnpm exec cairn commit-batch --session <id> --segments a,b   # finalise a decomposed (batch_review) capture
```

Output is JSON by default (`--pretty`

for humans). The session cookie is cached in
`./.cairn/`

**relative to the working directory** — run from the workspace root. The
command surface is a closed allowlist (reads + intake); it's an agent guardrail, not a
security boundary — a real boundary is the account's own permissions.

Cairn is free to **run, read, modify and self-host** — for any purpose except
re-selling it as a competing hosted product. That single restriction is what lets
a small team keep building it in the open instead of behind a closed door.

It's licensed under the ** Functional Source License** (FSL-1.1-ALv2):
two years after each release, that version automatically becomes

**Apache-2.0**. So the protection is temporary and the openness is permanent — you're never locked out of your own infrastructure, and our infra is never in your critical path.

Today everything is free and self-hostable. Team/organisation capabilities (SSO, multi-workspace, advanced integrations) may later require a license key — the core always runs without one. See the

[roadmap].

(Vue 3) + Nitro — SSR app and single write gateway[Nuxt 4](https://nuxt.com)— embedded database, zero native deps`node:sqlite`

+ Tailwind v4 — dark, calm UI[shadcn-vue](https://www.shadcn-vue.com)via a thin provider interface (swap-able; deterministic offline fallback)[Anthropic Claude](https://www.anthropic.com)

Issues and PRs are welcome — see ** CONTRIBUTING.md** for the
setup, commit convention and how routing decisions are tested. Be kind; assume
good intent.

[FSL-1.1-ALv2](/cairnpm/cairn/blob/main/LICENSE) — source-available now, **Apache-2.0** two years after
each release. © 2026 The Cairn Authors. "Cairn" and the logo are trademarks and
are not covered by the code license.
