Skip to content
MagicFrog

Memory

Long-term memory in five dimensions that follows you across machines and sessions.

MagicFrog gives every conversation a long-term memory: a tree of Markdown notes that agents read on each session and can update as work progresses. Memory is organized into five dimensions, and the same note path can exist in several of them — the more specific dimension wins.

The five dimensions

Dimension Scope Roams with your account
account Shared across the whole account Yes
user One user's preferences and context Yes
agent One named agent, isolated per agent ID Yes
task One task (project), isolated per task ID Yes
device One computer only No — never leaves this machine

The first four form an override chain, from least to most specific: account < user < agent < task. When the same path exists in several chain dimensions, the merged (effective) view keeps only the most specific one. device sits outside the chain: its entries stay independent rows bound to this computer and never merge across machines.

Agent and task entries can be namespaced with an ID prefix — agent/<agentId>/notes/style.md applies only to that agent, and task/<taskId>/notes/progress.md only to that task. A path without an ID prefix applies to every agent and task.

Where memory lives

Memory is plain Markdown on disk; a text editor is a sufficient memory client. Each entry is one .md file with minimal frontmatter:

---
revision: 3
updated: 2026-10-20T09:12:00.000Z
---
Prefer functional array methods over for loops.
  • account, user, agent, and device entries live under memory/<dimension>/ in the MagicFrog data directory.
  • task entries live inside the project, at .magicfrog/memory/.
  • revision increments on every write. Writes can carry an expected revision; a write against a stale revision fails instead of silently overwriting.
  • device entries additionally record a machine frontmatter key binding them to the computer that wrote them; imports preserve that binding.

Older three-tier trees keep working with zero migration: legacy machine/ entries read as device memory and legacy project/ directories read as task memory, in place. New writes always land on a canonical dimension.

Layers are configuration

Each dimension has layers — path conventions inside the dimension root. Two layers exist by default in every dimension:

  • core (the dimension root itself), and
  • skills (the skills/ prefix).

Layers are defined in a layers.json file next to the memory tree, not in engine code: adding a layer for a team or workflow is a config edit, and new dimensions of work never require engine changes.

Markdown documents under a skills layer are discoverable as a skill source, alongside your repo and home-directory skills — memory notes that say "how to work" become loadable skills.

How memory reaches the agent

Before each session's context is assembled, the effective view of every dimension in scope is rendered into a single <memory> block, ordered most-specific first (task, agent, user, account, then device). When memory changes, the next update replaces the block and says so, so the agent never mixes old and new views.

A session contributes its task binding (the carrier session's task ID) and the agent IDs of everyone on its roster, so each participant sees the task dimension for that task and its own agent dimension — and not anyone else's.

Cloud roaming

The four chain dimensions (account, user, agent, task) are part of the cloud profile sync surface: their portable tree is what uploads and downloads across machines, and every entry's revision makes writes conflict-safe. Device entries never upload — local machine memory stays local.

To move memory by hand, the tree exports to a portable set of Markdown files and imports back; files carrying a machine/ or project/ prefix land in the device or task dimension respectively.