intent
The intent, in your words
The first thing you asked for becomes the summary. You search for it later the way you said it, not the way a model paraphrased it.
COAL keeps a record of your work outside any one tool: what you meant to do, what got made, and what comes next. It is open source, it lives in a folder on your machine, and any AI tool that supports MCP (the Model Context Protocol) can read it.
We are building it in the open. The implementation is written in Go and builds from source; there is no release yet. It runs the demo from a recorded Claude Code session, from capture to the resume line, and has been run against one live session. The first release captures from Claude Code only, and anything else you add by hand.
You use Claude, ChatGPT, Cursor and Claude Code in the same week. Each one makes things: an HTML page, a script, a plan, a decision. Each one forgets what you were doing when the session ends. The only index is which conversation it was in.
For each thing you are working on, COAL keeps one record, called an Intent Manifest.
intent
The first thing you asked for becomes the summary. You search for it later the way you said it, not the way a model paraphrased it.
artifacts[]
Pages, scripts and docs, copied in and addressed by their SHA-256 hash, so the record survives a moved file or a deleted chat. By default that means HTML, Markdown, Python and TypeScript; the list is a setting. Each one notes which tool made it.
state
When you last touched it, the next step, and the questions still open. This is what lets the next session start where the last one stopped.
Claude Code runs hooks at fixed points in a session. COAL listens to them. You do not fill in anything.
Claude Code is the only tool in the first release. Cursor, Codex CLI and Gemini CLI have hooks too, so each can get a small adapter that feeds the same capture contract.
Pages made in claude.ai or ChatGPT are not captured. In the first release you add them by hand with coal add. Importing Claude Code session logs exists as a first version, coal import claude-code. Importing chat exports is the Phase 2 item.
SessionStartCOAL finds the record for this folder and puts the next step on screen.
PostToolUseClaude writes budget.html. COAL registers it as an artifact. On the first write it creates the record, using your first message as the summary, and drops a small .coal marker in the project.
StopAfter each turn, COAL takes a quick note and gets out of the way.
SessionEndA job is queued and the hook returns at once. If Claude did not record the next step during the session, COAL extracts a short summary and next step from the transcript when the queue is next folded: at your next session start, or within seconds if coal serve is running.
Any tool connected to the COAL MCP server can search the record and open what it finds. Ask Cursor for the budget tracker you built in Claude Code and you get the same record. coal find does the same from the terminal.
$ coal find "budget" 019a3f2c Household budget tracker as a single HTML page active 6d ago 1 artifact Household budget tracker as a single HTML page
Open a session in a folder that has a record and the next step is on screen before you type.
~/projects/budget $ coal resume ◆ COAL: Household budget tracker as a single HTML page. Next: Add CSV export and a category edit dialog. 1 open question. ● You left off at CSV export. The page renders categories and a transaction form, with no persistence yet. One open question: keep data in localStorage, or let you pick a JSON file? Continue with CSV export?
coal resumeFinds the record for this folder and starts Claude Code with the resume as the first turn. You type nothing and it opens with where you left off.
claudeThe COAL line with the next step shows before you type. Whatever you say first, the reply opens by offering to continue from it.
Each record is one JSON file in ~/.coal/manifests/. You can read it with cat. Any tool can write one. The Intent Manifest schema is open, and the v0.1 draft is published at coalmine.io/schema/intent-manifest/0.1.json.
{ "$schema": "https://coalmine.io/schema/intent-manifest/0.1.json", "version": "0.1", "id": "019a3f2c-8e4b-7d31-9a5c-2f6b1c8d4e70", "rev": 3, "intent": { "summary": "Household budget tracker as a single HTML page", "source": "user" }, "status": "active", "artifacts": [{ "hash": "sha256:9f86d0…0a08", "title": "budget.html", "type": "html", "producer": { "tool": "claude-code" }, "versions": [{ "hash": "sha256:9f86d0…0a08", "createdAt": "2026-11-01T02:14:09Z", "producer": { "tool": "claude-code" } }] }], "state": { "lastActivityAt": "2026-11-01T02:41:33Z", "nextStep": "Add CSV export and a category edit dialog", "openQuestions": ["localStorage or a JSON file?"] }, "provenance": { "tool": "claude-code", "model": "claude-opus-5-5" }, "contexts": [{ "kind": "path", "key": "/Users/you/projects/budget" }] }
~/.coal/artifacts/, matching the latest entry in versions[], which keeps every version COAL recorded. A version whose body was not copied (possible secret, too large) keeps a salted blind hash and a skipped reason instead. The original path is kept too, but it can go stale..coal marker, SessionStart uses it to find the record.Every manifest is a JSON file and every stored artifact is a plain copy of the original, all under ~/.coal/. None of it needs COAL to open.
~/.coal/. No account. The only server is the daemon on your own machine.coal purge, which deletes an artifact body that holds a secret after you confirm; the record stays. When git is installed, every CLI or MCP change to a record is a commit, and the hooks' writes are committed in batches by the daemon or by the next coal command.Phase 1 is the MVP, about six weeks, and it ends with a week of real use. If COAL does not get used unprompted at least five times that week, the project stops there and the spec stays open.
Capture from Claude Code, find from any MCP tool, resume in the next session.
Import from chat exports (a first version of import from Claude Code session logs already exists), adapters for Cursor and Codex, semantic search with a local model.
Surface the right record at the right time, by rules you can read and edit.
Spec v1.0 with a second implementer, encrypted sync between your devices.
The implementation is written in Go. It began as a collaborator's proof of concept and was adopted as the Phase 1 implementation on 2026-11-07 (ADR-018). It builds from source with Go 1.27, runs the demo from a recorded Claude Code session, and has been run against one live Claude Code session: capture through the real hooks, find from the CLI and over MCP, the resume line at session start, and coal resume. There is no release yet, the web UI builds only with a package that is not published yet, and the bugs found so far are open issues. Read the spec, build it, and open an issue for anything that is wrong or unclear.
There are 9 diamonds in the walls on the way down.