Marrow

The product context layer for coding agents

Your coding agent has never been in the room.

Marrow puts it there. It turns transcripts, standups and interviews into decided vs open product truth, and serves your agent the slice that matters for its task.

Open the live demo

The demo needs local Postgres. The live demo needs nothing. Run from source ↓

Apache 2.0One PostgresHuman promotesMCP native

Works with Claude Code · Cursor · Codex · any MCP host

GuardedNo fact without provenance

Every status-bearing fact links back to an exact evidence span.

OperableSelf-host on one database

Postgres with pgvector. No Redis, Kafka, graph DB or vector service.

GovernedOnly a human promotes

Models propose facts as open. A human answer is what makes truth decided.

Context size, measured: 2.5x fewer tokens than a raw dump. How it is measured ↓

Prefer not to run it? Cloud waitlist ↓

01 · The room

Your product is decided in meetings, not in the repo.

Trial scope moves on a partner call. Pricing settles in a notes doc. Trial length is still being argued in a standup. None of it reaches the agent. Marrow ingests the raw room verbatim, as immutable evidence: rows are only ever appended, never edited, so every fact built on them keeps its footing.

EVIDENCE LOG · append only

interviews/design-partner.mdev_3f9ainsert only

standups/2026-06-02.mdev_77c1insert only

notes/pricing-call-2026-05-28.mdev_9b2einsert only

interviews/design-review.mdev_41c2insert only

EVIDENCE ev_3f9a · interviews/design-partner.md · excerpt

  1. Maya: Launch is Monday. The trial is the last call we have not made.
  2. Partner: We ran a card wall last quarter. Signups dropped forty percent overnight, and the ones who stayed churned anyway.
  3. Jonas: And every support ticket in week one was the card form. We cannot spend launch week on billing edge cases.

02 · The promote

Models propose. Only a human decides.

Marrow distills the sentence into a fact. It lands open, 0.60, model. Promoting it is your job, and nothing on this page will do it for you. Try it.

EVIDENCE ev_3f9a · interviews/design-partner.md · excerpt · 3 speakers · append only

  1. Maya: Then the wall comes down. Free trial, no card until they convert.
  2. Partner: That is the version I can sell internally. Our champions can start it the day they find it.
  3. Jonas: What about annual billing? Finance put it on the pilot deck.
  4. Maya: Annual billing needs its own call with finance. Not this week.
  5. Jonas: Noted. Parking annual billing as open, trial scope is decided.

A reenactment of the loop, running on this page. Nothing is saved.

03 · On the record

Disagreement stays on the record.

Superseded is struck, never deleted. Contested holds both sides, it does not average them. Open waits for you, not a timer. Four statuses, and your agent can always tell which one it is reading.

EVIDENCE ev_77c1 · standups/2026-06-02.md · excerptdecidedopencontestedsuperseded

  1. Priya: No-card signup shipped to staging like we agreed. QA started a trial this morning without a billing form in sight.
  2. Priya: The old plan where launch needed a card wall is dead, the free trial replaced it.
  3. Marco: The open one is trial length. I want the trial cut to 7 days, a long trial goes cold before anyone converts.
  4. Priya: Keep the trial at 14 days. Activation takes two weekends, teams hit the aha moment on the second one.
  5. Marco: We did not settle it. Parking it for the growth review.

04 · The slice

Your agent gets the slice, not the archive.

prepare_task returns the facts that matter for this task, each with status, confidence and source span. Never the whole brain, never a raw dump.

MCP · prepare_task({ task: "require a card at signup" }) → 4 facts

openFree trial, no card upfront0.60 model· Waiting on you, above
decidedPricing is per workspace, flat1.00 humanev_9b2e [62–103]
openTrial length: 7 days or 14 days0.60 model
entityAnnual billing0.85 modelev_3f9a [610–669]

trial length is still open (ev_77c1), asking before building.

CONTEXT SIZE · same task, two ways

raw dump of the room473 tokens

the Marrow slice190 tokens

2.5x fewer tokens, every fact still traced.*

* Synthetic fixture benchmark: 3 docs, 3 task questions, chars/4 heuristic; raw 473 tokens, Marrow average 190, 3.85 ms retrieval. No partner-data claim yet.

The agent sees what is decided now and what is still open, and Marrow raises a question when code drifts from a decided fact instead of letting the two quietly diverge. The same brain, live →

05 · The gate

Drift gets caught before it ships.

One gate around every agent task. It speaks MCP, so it serves any agent host: Claude Code, Cursor, Codex, or your own.

GATE · before, during and after the work

MCP

prepare_task returns the brief

The agent gets decided goals, decisions, contested facts, open questions and source spans for one task. It also gets a build or ask-a-human signal.

prepare_task({ task: "require a card at signup" })
CLI

loop --check scans the diff

New code is compared against decided truth. A contradiction creates an open question, a catch event, receipt data and the next accept or dismiss command.

marrow loop "require a card at signup" --check --unstaged
CI + daily

drift --ci and truth keep it current

CI annotates PRs, while the daily brief shows proposed goals, contested facts, unanswered gaps, pending catches and connector health.

marrow drift --ci && marrow truth

06 · Hands on

Run the loop right here.

A reenactment of npx @marrowhq/cli demo, the same loop the CLI runs on any machine with Postgres. Nothing is saved, and the run waits where the product waits: on you.

marrow demo · reenactment · nothing is saved

$ npx @marrowhq/cli demo

Ingested interviews/design-partner.md as ev_3f9a. Append only.

The wider room is already on file: ev_77c1 standup, ev_9b2e pricing call.

Distilled 1 decision, 2 entities. Every fact carries a span.

openFree trial, no card upfront0.60 model

"Free trial, no card until they convert" · maya · [00:11:27]

The loop raised a question: "annual billing" has no decision behind it.

And one for you:

Decision [decided] Free trial, no card upfront

Confidence 1.00 (human). Recorded in this reenactment only.

$ prepare_task({ task: "require a card at signup" })

decidedFree trial, no card upfront1.00 human
decidedPricing is per workspace, flat1.00 human
openTrial length: 7 days or 14 days0.60 model
entityAnnual billing0.85 model

agent: trial length is still open (ev_77c1), asking before building.

4 task-scoped results, each carrying status + provenance. Still open: 1 question.

The same slice you read above. Explore it live → Star the repo →

07 · Workflows

One context layer, every agent workflow.

Brief the agent

Task-scoped decided and open facts before a line is written.

prepare_task({ task: "…" })

Gate a risky diff

Compare new code against decided truth, catch the contradiction.

marrow loop "<task>" --check --unstaged

Annotate PRs in CI

Drift annotations land on the pull request, with receipts.

marrow drift --ci

Answer why it is like this

Any fact traces to the exact sentence in the room that made it true.

trace_to_source

Keep truth fresh

The daily brief: proposed goals, contested facts, gaps, catches.

marrow truth

Review as the human

The question loop in a browser. Your answers promote facts.

marrow web

Works with Claude Code · Cursor · Codex · any MCP host.

08 · Open source

100% open source. One Postgres. No asterisks.

Everything this page just did is in the repo. The demo you can run, the MCP server your agent talks to, the drift gate, the question loop. Apache 2.0, self-hosted on one Postgres with pgvector, no Redis, no Kafka, no vector service.

  • The four sacred things are never gated: decided vs open, provenance, the question loop, task-scoped retrieval.
  • Bring your own model key. Default Claude, never assumed.
  • Evidence is append only. Your Postgres, your record.

If the loop earned it, the star is how you say build more of this.

INSTALL · @marrowhq/cli

RUN FROM SOURCE · github.com/ElxMaj/marrow

09 · Cloud

Yours to run. Or ours to run for you.

The core is Apache 2.0 on one Postgres, yours for good. Managed cloud is planned, not generally available today. The target org layer includes hosted brains, SSO, RBAC, audit, backups and support. The four sacred things are never gated: decided vs open, provenance, the question loop, task-scoped retrieval.

Free · Pro · Team · Enterprise. Pricing is not final and we will not pretend it is.

Cloud is a short waitlist while the core hardens. We store the address and nothing else. No tracking. Prefer email?

10 · Questions

The skeptic round.

Does Marrow read my codebase?

Only when you ask it to: the one-time onboarding scan at setup, and the diff checks you run with --check. The room is the source of truth, never the repo. Marrow watches the gap between what the room decided and what the code does, then raises that gap as a question. It never rewrites product truth from code.

Why not Notion RAG, or an AGENTS.md?

Retrieval over docs returns text. Marrow returns status-bearing truth: decided vs open, confidence, and the exact source span, kept current by the room instead of stale hand edits. An AGENTS.md is where task conventions belong; the product decisions behind them are what Marrow serves.

Why not Lore, Tenet, or another code memory tool?

They distill from git: what the repo does and how it changed. Marrow distills from the room: what the code should do, decided by people. The room is the one source a code memory tool cannot reach. Run both if you like; they answer different questions.

What if we don't record meetings?

Most decided truth is already written down: standups in Slack, decisions in Linear or Notion, customer notes, pasted call summaries. Marrow ingests markdown, text and transcript files the same way, and the connectors pull from the tools directly. Recording helps, it is not required.

Where does my data go?

Self-hosted data is stored in your Postgres. Distillation sends selected evidence to the model provider you configure unless you use a local provider. Connector tokens are encrypted at rest before they touch the database, and you bring your own model keys.

Will it slow my agent down?

Retrieval is task-scoped and bounded: about 2.5x fewer context tokens than a raw dump on the synthetic benchmark, with average retrieval under 5 ms on the fixture run. Every distill, search and drift check is recorded, so you can see latency and cost yourself.

Is the evidence really immutable?

Marrow's application paths and migrations expose append-only evidence writes. Corrections create new evidence rows, so every decided fact keeps tracing to the exact source span it came from. A self-hosted database admin still controls their own Postgres.

How mature is it?

Early. The local core covers the hero loop end to end: ingest room evidence, distill provenanced truth, serve task-scoped briefs over CLI and MCP, and raise drift catches with receipts. The benchmark is synthetic until partner data exists.

The full comparisons, including when to pick the other tool, live in docs/compare. Anything else: open an issue, ask in discussions, or email support@marrowhq.com. We answer.

The others remember the code. The code was never in the room.

Put your agent in the room.

Star on GitHub

This page holds 7 facts: 1 decided · 2 open · 2 contested · 1 superseded · 1 entity. Every one traced.

Set in Archivo, Geist and Geist Mono, self-hosted. Built with Next.js, exported as static HTML. No tracking.