Project memory for coding agents
A workspace can hold what a coding agent needs to know about a project, so every session in a repository starts knowing it: what the project is, what the team has decided, what is still missing, what you have told the agent about how you work, and the skills written for it.
It works with Claude Code, through the same plugin that keeps coding sessions, and needs the CodeKasten app installed in the workspace. The sidebar then has Projects (agents), Skills, Gaps, Facts and Memory.
What is kept
| Who sees it | Versioned | Holds | |
|---|---|---|---|
| Project profile | the workspace | yes, on the branch | one per repository: its name, default branch, stack and commands |
| Skill | the workspace | yes, reviewed through a merge | instructions for a kind of task, written like a Document |
| Fact | the workspace | no, live | something that holds for the project: a convention, a decision and why, how a thing works |
| Gap | the workspace | no, live | something missing or wrong that nobody is fixing now. Open, in progress or closed |
| Memory | you alone | no, live | how you work and what you asked the agent to do or not do |
Facts, gaps and memory are not part of a branch: they are there at once, never committed or merged, and a member of the workspace can change a fact or a gap even while main is protected. A guest sees none of them, and a viewer reads but does not write. Memory is read by nobody but its person.
A skill is a Document: it has the Document's editor and page, and it lives on a branch. An agent can only propose one, which is made on its session's branch with the status Proposed. A person reads it, merges the branch, and approves it by setting its Status to Approved: click the status at the top of the skill's page and pick it (an admin or owner can do that on a protected main; anybody else on a branch of their own, merged afterwards). Retired takes a skill out of the sessions without deleting it.
Each kind shows what it is at the top of its page: a gap its Status (Open, In progress, Closed), Severity (Low, Medium, High), area and project; a fact its status (Active, Retired) and project; a memory its Kind (About the person, Feedback, Project, Reference). Click one to change it. The text a fact, a gap or a memory says is the page itself.
What a session starts with
When a session begins in a repository that has a .codekasten.json, the plugin asks the workspace for a briefing and adds it to the session: the project's profile, its open gaps, your memory, the names of the skills that apply, and its facts, in at most 9,000 characters (Claude Code takes at most 10,000 from a plugin at the start of a session). When there are many facts each keeps its line and their texts are shortened; the agent finds the rest with search_knowledge. It also writes the approved skills into the repository as .claude/skills/ck-<name>/SKILL.md, which Claude Code finds like any skill. Those files belong to CodeKasten: they are kept out of git, written again at every start, and the plugin changes or removes only the ones it wrote.
A project's page has two extra tabs. Briefing shows a preview of what the agent is told. Connect Claude Code has the .codekasten.json for the repository and the steps to connect it.
What the agent does
The agent keeps these current through the workspace's MCP server: get_briefing, search_knowledge, save_memory, save_fact, gap, forget_knowledge, list_skills, get_skill and propose_skill. It keeps memory and gaps on its own; a skill is only ever a proposal. In Claude Code the plugin adds /remember, /gap and /propose-skill.
A key that is read only can read all of this and change none of it.
Not there yet
A board for gaps (the list groups them by status), reports over facts and gaps, and mirroring Claude Code's own local memory folder.