An hour in, Claude Code is suggesting the approach you ruled out together. Tomorrow’s session won’t know you ruled it out at all. Edith gives it a brain it maintains itself: past sessions distilled into notes, searched automatically in the next one, while you watch the retrieval happen.
OUT◈ EDITH · emptyNothing saved yet. Use save_note to add the first insight.
Edith [list_sessions]
OUT◈ EDITH · 12 session(s), 3 not yet captured○ 9f41c2ab the deploy script, again○ 5e0d77b1 moving the vault off iCloudread_session <id> to read one, then save_note what is worth keeping.
claudeConnected. Your brain is empty, and three of your recent sessions have never been read. Want me to go through them and save what is worth keeping?
The first thing that happens, in Claude’s own tool calls.
Why a chat gets worse as it goes
At the start, your AI knows what you decided and why. An hour later it is working from a summary of a summary: the reasoning is gone, and it suggests the approach you already threw out. Open a new chat and even that is gone, so you explain your project from scratch, again.
Edith gives it somewhere to put all that. What you decided, what broke, what you agreed not to do: written down as you work, and read back when it matters.
startwe use the next free port, never a fixed one
20 minthe config is rewritten to match
an hour… something about ports?
new chatso, what does this project do?
Without a brain, this is the shape of every long session.
Watch it remember
Edith serves your notes to Claude over MCP, and hosts that server inside the app. So a tool call and the glow are the same tick. A search dimly lights every note Claude considered. Opening one brightly lights the note it actually used.
youthe dev server says the port is already in use again
Edith [search_brain]"port already in use"
OUT◈ EDITH · 5 matches for “port already in use”░░░░░▓▓▓▓▓ dynamic-port-binding░░░░░▓▓▓ mcp-registration░░░░░▓▓ in-process-mcpread_note <id> for the full text.
Edith [read_note]dynamic-port-binding
OUT◈ EDITH · dynamic-port-binding✦ Dynamic Port Binding
claudeWe have been here before. Last time the fix was to bind the next free port and rewrite the MCP config to match. First I will check for a server left over from an earlier run.
Connect in one click, as the drawing at the top shows. Open Edith and it adds itself to Claude Code, so your next chat can already reach your notes. There is nothing to paste, no key to make, and no server for you to run: Edith is the server, and it only listens on your own Mac.
Then minimise it. Edith becomes a narrow panel docked to the left edge of your screen, drawing your brain and lighting the notes Claude reaches for. It never takes focus. Fold it to a strip the width of its rail, or shrink it to a small square in the corner.
This page is doing the same thing. The graph beside this note is the live view, drawn by the app’s own renderer. Hover a link and its note lights up, along with the road it is about to travel.
Ask Claude to review my recent sessions and save anything worth keeping. It reads your transcripts, works out what was learned, and writes the notes back. Edith runs no inference of its own to fill the brain, so there is no API key and no account. Claude reads and writes your notes through its own session, on the plan you already pay for. Edith is the store and the canvas.
youreview my recent sessions and save anything worth keeping
Edith [list_sessions]◈ EDITH · 12 session(s), 3 not yet captured
Edith [read_session]the 3 not yet captured◈ EDITH · session 5f2a1c0b
Edith [save_note]transcripts-are-trees
OUT◈ EDITH · note saved✦ transcripts-are-treeslinked → session-goes-quiet · 40 note(s) in the brain
Edith [save_note]most-jsonl-are-not-sessions
OUT◈ EDITH · note saved✦ most-jsonl-are-not-sessionslinked → transcripts-are-trees · 41 note(s) in the brain
Edith [save_note]atomic-config-writes
OUT◈ EDITH · note saved✦ atomic-config-writeslinked → mcp-registration · 42 note(s) in the brain
claudeSaved three notes and linked them to what was already here.
Another replay, with demo numbers. Each save puts a new note into the brain.
Some things you settle once and want followed every time: how this repo is deployed, what a review has to cover, how to write a commit message here. When your AI sees that shape in the brain, it can draft a skill from it, and Edith holds it in the Skills Forge until you look.
Nothing reaches your AI’s skills folder until you say yes. You read the draft, edit it, approve or throw it out. Edith ships five to start with, so the forge is not empty on day one.
youthat is the third time we have done the release dance by hand
Open it. Edith starts its brain server and connects itself to Claude.
Restart any Claude Code sessions that were already running, then ask Claude to review your recent sessions.
You need a Mac with Apple Silicon on macOS 13 or later, and Claude Code, in the terminal or the VS Code extension.
On Windows? There is a build at Edith for Windows. It is built and tested on Windows on every change, and unsigned, so Windows shows a warning before it runs.
When Claude reaches into the brain, you see exactly where it reached.
A search dimly glows what Claude considered. Opening a note brightly glows what it actually used. Saving one sends a ripple out from the new note. Highlights fade over thirty seconds.
Edith hosts the MCP server itself rather than spawning it. Every tool call emits an event straight to the renderer, which is why the light is instant.
Ask review my recent sessions and save anything worth keeping. Claude reads your transcripts with list_sessions and read_session, then writes the notes back with save_note.
Underneath, five things happen.
Stage
What happens
Watch
Edith watches ~/.claude/projects, waiting for a session to go quiet
Parse
The transcript becomes one canonical session, with abandoned branches skipped
Store
Markdown with YAML frontmatter, indexed in SQLite FTS5
Serve
An MCP server inside the app, over local HTTP
Light up
Every tool call emits an event straight to the renderer
Claude reads and writes your notes through its own session, on the plan you already pay for. Edith is the store and the canvas. It never calls a model to fill the brain, and there is nothing to sign up for.
There is one optional exception. When you import your own files you can ask Edith to distil them into concepts. That makes one API call, on an Anthropic API key of your own that you add in Edith and that is stored locally. Keeping files as written makes no call, and nothing else in Edith ever asks for a key.
Minimise Edith and it becomes a narrow panel docked to the left edge of the screen, drawing your brain and lighting up the notes Claude reaches for. The window and the panel are never up at the same time.
It never takes focus. It folds to a strip the width of the rail, or shrinks to a small square in the corner. Both are just the live graph.
With the window closed or minimised, the panel also opens on its own when a Claude session starts, and stays closed for the rest of a session once you close it. You can turn the automatic opening off under Connection.
A note is a Markdown file with YAML frontmatter. Files on disk are the source of truth. They live in ~/Library/Application Support/Edith/vault, and you can edit them in any editor.
---id: dynamic-port-binding
title: Dynamic Port Binding
type: concept
created: 2026-08-25
updated: 2026-08-25
origin: distilled
sources:
- session: 11111111-2222-3333-4444-555555555555
project: -Users-u-myapp
at: 2026-08-25T10:00:00Z
links: [mcp-registration]
---
Bind the next free port and rewrite the MCP config to match.
The frontmatter carries an id, a title, a type, when the note was created and updated, where it originated, the sessions it came from, and the notes it links to. The body is whatever was worth keeping. This page is laid out the same way.
A note records what you worked out. A skill makes your AI do it the same way next time, without being asked.
Your AI drafts the skill; Edith never writes one. It has no API key and no opinions, so the drafting happens in the session you already pay for, from what it read in the brain.
Drafts wait in the forge as Markdown with frontmatter, editable in any editor. You read one, change what you want, and approve it or throw it out. Only then does it land in your AI’s skills folder, where later sessions pick it up.
The queue is capped. A pile of twenty proposals never gets read, so Edith refuses more until you have caught up. Five starter skills ship with the app.
Add content imports .md, .markdown, .txt and .mdx files, or anything you paste. Files keep their existing frontmatter, so importing a Markdown vault preserves ids and links instead of duplicating notes.
Mode
What it does
API calls
Keep as written
Stores the file or text verbatim as a note
none
Distil into concepts
Runs the same extraction used on sessions
one
Distilling is the only thing in Edith that calls a model on its own. It is optional, and it runs on an Anthropic API key of your own, stored locally. Re-importing a file deepens the existing note rather than creating a duplicate, so syncing a folder repeatedly is safe.
On first launch, outside its own folder, Edith adds four things. Nothing else.
What
Where
Its server entry, so Claude can reach the brain
~/.claude.json, plus Claude Desktop’s config if you have it
A session-start hook that tells Claude the brain exists
~/.claude/settings.json
The /edith command
~/.claude/skills/edith
A handful of starter skills
~/.claude/skills/, managed from the Skills panel
Your config is safe. Registration merges a single key into ~/.claude.json, writes atomically, and backs the file up before the first modification. Your notes are plain Markdown in ~/Library/Application Support/Edith/vault.
Edith is source-available under the Functional Source License, Version 1.1, MIT Future License (FSL-1.1-MIT).
You can read, use, modify and share it for anything except offering it, or something substantially similar, as a competing commercial product or service. Each release becomes MIT-licensed two years after it is published.
The shape is the Aizawa attractor: a swirling disc threaded onto a vertical column, with particles that occasionally ride up the polar axis and dive back down the outside. It reads three-dimensional from every angle, and it exists only as motion.
ẋ = (z − b)x − dyẏ = dx + (z − b)yż = c + az − z3/3 − (x2 + y2)(1 + ez) + fzx3
With a = 0.95, b = 0.7, c = 0.6, d = 3.5, e = 0.25 and f = 0.1. In the app, about 5,200 anonymous motes give the shape its body, and every note is a named particle riding the same flow. Drag one away and the attractor reclaims it.