{"slug": "show-hn-multi-agent-coding-feels-like-pre-github-development", "title": "Show HN: Multi-agent coding feels like pre-GitHub development", "summary": "Motif Labs launched Motif, a self-hosted memory server for AI coding agents that collects sessions from Claude Code, Codex and Cursor onto infrastructure the user owns, installable via `npm i -g getmotif` on Node 22 or newer. The tool imports existing sessions on first run, keeps everything local with no account, cloud or API key, and lets teams share projects selectively while `motif ask` resumes past Claude Code and Codex sessions read-only on the machine that owns them. Cursor sessions are collected and searchable but not askable because Cursor has no resume command.", "body_md": "**Working memory for AI coding agents, yours, and your team's.**\n\n  Your AI sessions know things your repo doesn't: what was decided, what was tried, what broke.\n\n  Motif remembers it, keeps that memory honest, and puts it to work, from recall to pull requests.\n\n  Solo from the first minute; a team the moment you invite one. On infrastructure you own.\n\n[Website](https://www.getmotif.dev) ·\n  [Docs](https://www.getmotif.dev/docs.html) ·\n  [FAQ](https://www.getmotif.dev/faq.html) ·\n  [Changelog](https://github.com/motif-Labs/motif/blob/main/CHANGELOG.md) ·\n  [Roadmap](https://www.getmotif.dev/roadmap.html)\n\n<sub>Every decision, file and session your team's agents produced, drawn as one living graph. Hover a node for its confidence and how many ties it holds.</sub>\n\nClaude Code, Codex and Cursor each keep their sessions in their own format, on whichever laptop happened to run them. The work one developer's agent does is invisible to everyone else's, and to that developer's own agent next week, in a different tool. Every session starts cold and re-derives a decision somebody already made.\n\nMotif collects all of it onto a server you host, and hands it back when it is needed.\n\n```\nnpm i -g getmotif        # the binary is `motif`\nmotif up                 # server + live sync on 127.0.0.1:4680\nmotif mcp install        # register with Claude Code, Codex and Cursor\n```\n\nThat is the whole setup. Your existing sessions import on first run and your\nagents can query them immediately, no account, no cloud, no API key, and nothing\nleaves the machine. Prefer not to install anything? `npx getmotif up` does the\nsame thing. Node 22 or newer.\n\nWant to see it populated before pointing it at anything real?\n\n```\nnpx getmotif demo        # a team's week replays live, in five acts, you rule, the Weaver acts\n```\n\nSessions stream in, memory catches two of them contradicting each other, you pick the winner from the terminal, and the Weaver aligns a real (throwaway) git repository with your ruling, the diff on screen. No reader runs; your own history is never opened.\n\nMotif works in three movements, **remember**, **verify**, **act**, and every\nverb under them is a command you can run today.\n\nA small daemon watches Claude Code, Codex and Cursor on every machine and streams sessions to your server as they happen, attributed to the person and the tool that produced them. Nothing leaves your infrastructure, and there is no telemetry.\n\n<sub>The whole team's memory at a glance: the week's activity, the latest decisions, and what needs a human.</sub>\n\nJoining a team shares nothing by default, everything uploads as `personal` until\nyou say otherwise:\n\n```\nmotif projects team ~/work/payments-api      # this project goes to the team\nmotif projects exclude ~/personal --purge    # this one never does\n```\n\nA collected archive is still an archive. Asking is what makes it a participant.\n`ask` resumes a past session **read-only on the machine that owns it**, so the\nanswer comes from the agent that had the full context, not from a summary.\n\n```\nmotif ask 4f2a9c \"what did we rule out here, and why?\"\n```\n\nIt works on your own sessions and, with a teammate's daemon running, on theirs. Claude Code and Codex sessions can be asked; Cursor has no resume command, so Cursor sessions are collected and searchable but not askable.\n\n``` bash\n$ motif recall \"why do we fail open when the token service times out\"\n\n# Team context for \"why do we fail open when the token service times out\"\n\n## From past sessions\n\n**Auth middleware fails open when the token service times out, make it fail closed.**\n@ben, 12 days ago · `claude-code:88b19192`\n> Flipped it to fail closed, with one carve-out: the internal health route keeps\n> working so the load balancer does not pull every node when the token service blips.\n\n**The public API has no rate limiting, and it has to survive a restart.**\n@ada, 3 weeks ago · `codex:99bfccc0`\n> Fail open, and log loudly. Rejecting live payment traffic because a cache is\n> unreachable is worse than briefly serving unlimited requests. ADR-014.\n\n---\n230 tokens from 5 sessions. Cite session ids when you use this.\n```\n\nTwo teammates, two different tools, one answer with the reasoning still attached.\n**Your agents get the same bundle over MCP, without being asked**, you are not\nmeant to open a dashboard. One command registers Motif with all three:\n\n```\nmotif mcp install\n```\n\n| tool | what it does | \n|---|---|\n| `recall` | the distilled answer, decisions, human notes, cited excerpts, ~1.5k tokens | \n| `search_sessions` ·`list_sessions` | find the session | \n| `get_session` | read a transcript | \n| `ask_session` | **put a question to a past session** , the agent that lived it answers | \n\n`ask_session` is the unusual one: your Claude Code agent can question a Codex\nsession from three weeks ago, and the machine that owns it answers.\n\nAnd in the other direction, from the code back to the conversation:\n\n```\nmotif blame src/limiter.ts     # which sessions produced this file, freshest first\n```\n\n\"Why is this like this\" starts from the file itself: each hit names the person,\nthe tool, the session, and `motif show` opens the conversation.\n\n**Measured, not asserted.** Against **1.77M tokens** of real session history,\n`recall` answers **8 of 9** questions inside a 1,500-token budget, a median\nbundle of 1,496 tokens, **1,186× smaller** than the history it searched.\nReproduce it on your own corpus with `npm run bench`, or on the built-in demo\ncorpus (same numbers on any machine) with `npm run bench:demo`.\n\nEvery claim carries one **confidence** number, corroboration and a human's vouch\nraise it; conflict, staleness and age lower it, and recall ranks and labels by\nit, so an agent knows how much to trust each line.\n\nNo embeddings, no vector store, no API key. Ranking comes from full-text search over the graph the sessions already form, handoff lineage, shared files, shared entities, plus the notes people pinned. Every item says why it was picked.\n\nEverything the sessions form, decisions, files, topics, and the sessions that\nproduced them, is a graph, not a list. The **Weave** view draws it: entities\nare diamonds, sessions are dots, and edges are the real relationships (a session\nthat informs an entity, a note that contests another, a handoff lineage). It is\nthe same graph recall walks to answer in ~1.5k tokens instead of the whole\nhistory, now visible. Two entities a single session both touched are drawn as\n**related**, so decisions and the files and topics they shaped form one causal\nweave, and each entity is sized by its confidence. The same idea seen in two\nprojects is one knot, not two, so cross-project ties pull together. Hover any\nnode for its kind, confidence and how many ties it holds.\n\nAs sessions go idle the server distils them into entity notes: the decisions, the\nfiles they touched, the topics they belong to, each carrying the reasoning it came\nfrom. New knowledge **supersedes** old rather than overwriting it, and\ncontradictions are **flagged** instead of quietly piling up. A team session\nbecomes shared memory; a personal one becomes memory only its owner can recall,\nso distillation earns its keep whether you run a team or work alone.\n\n```\nMOTIF_LLM_PROVIDER=claude-code motif server      # uses your local CLI, no key\n# or: anthropic · openai · openai-compatible (Ollama, vLLM, OpenRouter)\n```\n\nThis is the one part that calls a model, and it is off unless you configure a provider.\n\nDistilled memory is a machine's claim about what your team decided. Claims age,\nand sessions contradict each other. Motif refuses to paper over either: a\ncontradiction is **flagged**, a note whose source files were reworked without it\nis marked **possibly stale**, and both wait for a person in the Review inbox,\nin the dashboard, or:\n\n```\nmotif memory review                    # proposals, conflicts (both sides), stale notes\nmotif memory admit 52                  # a proposed team decision enters recall\nmotif memory reject 52                 # ...or it never does, kept in the record\nmotif memory prefer 47 --over 12       # rule: this claim wins, that one is superseded\nmotif memory confirm 31                # vouch for a claim, verified beats machine-only\nmotif memory retire 8                  # out of service, never out of the record\n```\n\nA new team **decision** does not enter recall on its own: it lands as a\n**proposal** and waits for a human to admit it, so no single session's (or a\nwhole fleet's) inference becomes what the team relies on unreviewed. Files,\ntopics and personal notes are admitted on sight; conflicts are adjudicated as\nbefore.\n\nRulings never delete, and the ruling itself is recorded, who ruled, over what, and why. Recall serves the outcome: retired notes disappear, human-verified ones outrank machine-only ones, and an unresolved conflict is shown to agents with both sides and a warning, never as one quiet wrong answer.\n\nA ruling fixes the memory; the repository can still say what the losing claim\nsaid. And the record can see changes the repo never tested, a fix or a feature\nthat shipped with no test. The **Weaver** closes both, on projects you opt in:\n\n``` js\nmotif weaver enable ~/work/payments-api    # let the Weaver act here (draft PRs only)\nmotif weaver scan                          # untested fixes and features it could close\nmotif weaver run src/limiter.ts            # write the missing test → draft PR\n```\n\nWhen a ruling lands, or you queue a gap, a daemon holding the project claims the\njob, works in a **throwaway worktree**, and opens a **draft PR** on a `motif/`\nbranch, the ruling or the session that made the change cited in the body. The\nrails do not bend: your checkout is never touched, a default branch cannot be\npushed, an agreeing repo produces no PR, and a job born from personal evidence\nis never queued. The agent is handed the record's own context, the session that\nmade the change, so it writes the change instead of searching for it: pointed at\na receipt a human picked, never wandering, and cheap because it reads the graph\nrather than the whole tree.\n\nThe loop closes: `motif weaver resolve <id> merged|closed` records a PR's fate,\nand a fix born from a ruling that gets **closed** returns that ruling to review,\nthe record learning from what its own hands produced.\n\nNone of this asks anyone to change tools. A session started in one agent continues natively in another: Motif writes the target tool's own session file and registers the thread in its state database, so the tool opens it as its own history.\n\n```\nmotif handoff 4f2a9c --open                # continue it here, in the other tool\nmotif handoff 4f2a9c --to-member \"Ada\"     # hand it over, lands in THEIR tool\n```\n\n<sub>One command hands a live Claude Code session to a teammate. Their daemon materialises it as a Codex\nthread on their own machine, and `codex resume` opens it as history, not as a paste.</sub>\n\n<sub>The same conversation inside Codex on the other machine, including the question asked a minute earlier in Claude Code. Codex answers about work it never did.</sub>\n\nClaude Code ⇄ Codex in both directions, verified against Codex 0.151.0. Cursor sessions convert into either. The tool is a preference; the memory is shared.\n\nNone of this needs one to be worth running. `motif up` on a single machine makes\nyour own history queryable **and distils your own sessions into memory you can\nrecall**: the decision you made three weeks ago, in a tool you have since stopped\nusing, answered from the session where you made it, with its reasoning and\nconfidence attached, and `handoff` moves that session into whichever agent you\nuse now.\n\nYour solo work stays yours. A personal session is distilled into a **private**\nmemory only you can recall; if you later join a team it stays owner-only, never\nshown to anyone else, never counted toward another note's confidence, and never\nable to supersede a shared decision. The benchmark above was measured on one\ndeveloper's corpus.\n\nOne server per team, one daemon per machine.\n\n```\n# on the server\ndocker compose up -d                       # or: MOTIF_TOKEN=<token> npx getmotif server\n\n# on each developer's machine, once\nnpx getmotif connect https://motif.internal.yourco.dev \\\n  --token <team-token> --name \"Ada\" --email ada@yourco.dev\nmotif daemon install                       # start at every login\n```\n\n**Step by step, including the details that bite: [docs/TEAM-SETUP.md](https://github.com/motif-Labs/motif/blob/main/docs/TEAM-SETUP.md).**\n\nEverything lives in one SQLite file, that file *is* your team. Start the server\nagainst the same path and the team token, every member and all history survive a\nrestart; start it against a different one and you have a new, empty team. Backup\nis `cp`. Put TLS in front with any reverse proxy for teams outside a trusted\nnetwork.\n\n**Two credentials, two levels.** A *team token* is shared once and grants read\naccess plus the right to register. A *member token* is minted per person and\ndevice by `motif connect`; only its hash reaches the server. Every write is\nattributed to the token's owner, a claimed name or header changes nothing, so\nmembers cannot write as each other.\n\n**Filtering runs before upload.** Exclude globs keep whole trees local, and ten\nredaction patterns, API keys, AWS ids, GitHub tokens, JWTs, private key blocks,\nscrub secrets out of message text *and* tool inputs on the source machine.\nHandoffs and asks only ever execute on the machine that owns the session, through\nits own daemon. Full model in [SECURITY.md](https://github.com/motif-Labs/motif/blob/main/SECURITY.md).\n\n| Runtime | one process, one SQLite file, default port `4680` | \n| Footprint | ≈57 MB resident for server and daemon combined, ≈14 MB database at 130 sessions | \n| Network | no telemetry, no account, no API key, nothing leaves the machine until you connect | \n| Redaction | on by default, 10 patterns, applied before upload | \n| Retrieval | deterministic, FTS5 + the session graph + pinned notes, no embeddings | \n| Tests | 74, CI on Linux, macOS and Windows across Node 22 and 24 | \n| Package | [`getmotif`](https://www.npmjs.com/package/getmotif) , published from CI with provenance | \n| Licence | Apache-2.0 in full, no license key, no feature flags, no member limits | \n\n## **Every command, grouped**, or run `motif --help`\n\n**Finding things**\n\n| command | what it does | \n|---|---|\n| `motif list` | sessions across the team, newest first | \n| `motif list --project ~/work/api --limit 50` | narrow it | \n| `motif search \"idempotency\"` | full-text search over everyone's sessions | \n| `motif show <id>` | read a session as a transcript ( `--tools` ,`--json` ) | \n| `motif recall \"how does auth work\"` | the distilled answer, with citations | \n| `motif blame src/limiter.ts` | the sessions that produced a file, freshest first | \n\n**Working with a session**\n\n| command | what it does | \n|---|---|\n| `motif ask <id> \"why this way?\"` | the session answers, with its own context | \n| `motif asks <id>` | questions asked of it, and the answers | \n| `motif handoff <id> --open` | continue it in another tool, natively | \n| `motif handoff <id> --to-member \"Ada\"` | hand it to a teammate | \n| `motif handoff <id> --dry-run` | show what would be written, write nothing | \n| `motif comment <id> \"@Ben this broke Friday\"` | pin a note, notify a person | \n\n**Scope and privacy**\n\n| command | what it does | \n|---|---|\n| `motif projects list` | what syncs, and as what | \n| `motif projects team <path>` | make a project team-visible | \n| `motif projects personal <path>` | keep it to yourself | \n| `motif projects exclude <path> --purge` | never sync it, and withdraw what did | \n| `motif projects mode selected` | allowlist mode: nothing syncs until included | \n\n**Ruling on memory**\n\n| command | what it does | \n|---|---|\n| `motif memory review` | everything waiting for a human, evidence cited | \n| `motif memory prefer <id> --over <id>` | resolve a conflict; the loser is kept, superseded | \n| `motif memory confirm <id>` | vouch for a claim, it outranks machine-only ones | \n| `motif memory retire <id>` | out of recall, still in the record | \n| `motif demo` | an invented team to try all of this on | \n\n**Running it**\n\n| command | what it does | \n|---|---|\n| `motif up` | server + sync on this machine | \n| `motif server --port 4680 --host 0.0.0.0` | the team server | \n| `motif connect <url> --token <t> --name \"Ada\"` | join a team from this machine | \n| `motif daemon start` ·`install` ·`pause` | sync in the background, at login | \n| `motif status` ·`motif doctor` | health at a glance · diagnose with fixes | \n| `motif prune --older-than 90` | drop old raw sessions, keep distilled notes | \n| `motif mcp install` ·`motif skills` | teach your agents to use it | \n\nMotif is an independent project, not affiliated with or endorsed by Anthropic,\nOpenAI or Anysphere. It reads and writes files those tools keep on **your own\nmachine**, in formats that are private and undocumented, worked out from real\nfiles and from the tools' own open-source code where it exists. Nothing is\nscraped and no service is called on your behalf.\n\nTwo things follow, and you should know both before relying on it:\n\n- **Formats can change without notice.** Every reader parses tolerantly and never\nfails a whole sync on an unknown shape, and conformance fixtures pin what we\nunderstood at the time, but an upstream release can still break a handoff. A\nfailing fixture plus a corrected parse is the most useful pull request you can\nsend.\n- **`ask` runs under the session owner's own account.** When a teammate questions\nyour session,*your* daemon resumes it with*your* CLI and*your* subscription,\nand only ever for sessions you own. It is off unless you run the daemon, and`motif daemon pause` stops it.\n\nNew session readers are the most welcome contribution, Motif is only as useful\nas the tools it can collect from. [CONTRIBUTING.md](https://github.com/motif-Labs/motif/blob/main/CONTRIBUTING.md) has the\nsetup, the DCO sign-off and what a good pull request looks like here;\n[CLAUDE.md](https://github.com/motif-Labs/motif/blob/main/CLAUDE.md) has the invariants worth knowing before touching sync,\nhandoff or scope.\n\nApache-2.0, see [LICENSE](https://github.com/motif-Labs/motif/blob/main/LICENSE).\n\nEverything in this repository is Apache-2.0: no license key, no feature flags, and no limits on members, sessions or projects. Everything that is free today stays free.", "url": "https://wpnews.pro/news/show-hn-multi-agent-coding-feels-like-pre-github-development", "canonical_source": "https://github.com/motif-Labs/motif", "published_at": "2026-09-24 22:31:08+00:00", "updated_at": "2026-09-24 23:00:13.547145+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "developer-tools", "agent-protocols", "ai-products"], "entities": ["Motif", "Motif Labs", "Claude Code", "Codex", "Cursor", "Node.js"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/show-hn-multi-agent-coding-feels-like-pre-github-development", "markdown": "https://wpnews.pro/news/show-hn-multi-agent-coding-feels-like-pre-github-development.md", "text": "https://wpnews.pro/news/show-hn-multi-agent-coding-feels-like-pre-github-development.txt", "jsonld": "https://wpnews.pro/news/show-hn-multi-agent-coding-feels-like-pre-github-development.jsonld"}}