Minor Changes
-
2526382: Sync the agent's global memory across your Chrome profiles. Point each profile at the same folder and everything the agent has learned about you —
memory/**— stays in step between them. Put that folder in Dropbox, iCloud Drive, Drive, or a git repo and it follows you across machines too. There is no server and no account: the folder is the sync channel. Turn it on in Settings → Memory, behind the sync icon in the panel header.The folder is a genuine markdown vault, not an export format.
memory/**mirrors exactly what Settings → Memory shows, so you can open it in Obsidian, grep it, hand-edit a note (edits are picked up), orgit loghow your agent's understanding of you changed. Sync metadata hides in a.openbrowse/dotfolder, and the path validator refuses dotted segments, so metadata can never be mistaken for a note.Setup names the folder for you. The hard part of linking was never the button — it was knowing which folder to pick again in the next profile, since Chrome won't let an extension preselect a path and the picker's remembered directory is per-profile. So the picker opens in Documents and suggests
Documents/OpenBrowse; and once one profile has linked, the others stop guessing — an unlinked profile says "your Work profile syncs memory to a folder named OpenBrowse; choose that same folder to join it," and picking a different folder warns you instead of leaving two profiles that both look linked while memory silently never converges. Discovery rides a ~150-byte hint inchrome.storage.sync(vault id, folder name, profile label — never a path, never note content), so it appears only when the profiles share a Google account with Chrome Sync on; without it there is simply no suggestion and setup works the same. Stop syncing withdraws the hint.Deliberately a visible folder rather than a dotfolder like
~/.claudeor~/.openbrowse: dotfolders are hidden in the OS file picker, and this is a folder you pick by hand in every profile. The dotfolder convention covers machine state you shouldn't browse — which is what~/.openbrowse/already holds for the MCP broker — while user-facing knowledge content lives somewhere visible, the way basic-memory defaults to~/basic-memoryand Obsidian vaults sit wherever you can find them. On macOS with iCloud Drive's Desktop & Documents option on,~/Documentsis already replicated, so the default gets cross-machine sync for free.Merging is three-way, not last-writer-clobbers-everything. Each profile keeps a baseline of
path → sha256as of its last sync, which is what distinguishes "I created this note" from "the other profile deleted it." Different notes edited in different profiles merge cleanly; only the same note edited in both is a conflict.- Conflicts keep both versions. The newer note wins by its
updatedfrontmatter date, falling back to file mtime — frontmatter first because backups and cloud clients disturb mtime while leaving the note's own record of its last real change intact. The losing copy is archived under.openbrowse/conflicts/and listed in the sync panel with Restore and Dismiss. It is deliberately kept outsidememory/**: agarry-tan (conflict).mdliving in the tree would get indexed, give the agent two notes for one entity, and make the bare-basename[[garry-tan]]link ambiguous — whichmemoryStore.graphfaithfully fans out to both, corrupting the graph. - Deletes propagate, but an edit always beats a concurrent delete. Deleting a note in one profile removes it in the others via a per-path tombstone. If you edited a note in one profile while deleting it in another, the edit wins and the note returns — losing a note you just wrote is worse than seeing one you deleted come back, and the restore is reported rather than silent. A note that merely vanished from the folder with no tombstone is restored, not treated as a delete, so a half-synced cloud folder can't cascade into erasing your memory. Tombstones expire after 90 days.
- First sync never deletes. With no baseline every path is new, so linking an already-populated folder unions the two trees. Stopping sync unlinks and deletes nothing, anywhere.
Sync is a checkpoint, and the UI is honest about why. Chrome does not reliably keep folder permission across browser sessions, and it can only be restored by a click — which a background service worker cannot produce (crbug.com/1359786). So sync runs from whichever surface is open: the side panel, the Alt+Space global chat, the home tab, and the Chrome new tab page, which between them cover every way a chat can start. A pass fires when a surface opens, when one returns to the foreground, after an agent run finishes, about three seconds after memory changes on disk, and on Sync now. Automatic passes share a ~10-second floor across tabs so several open new-tab pages don't turn tab switching into a sync attempt each; they also skip silently when permission has lapsed and never nag, showing a routine "Reconnect the folder" rather than an error. Only Sync now reports problems, because it's the one you asked for. One consequence of the same constraint: a run driven by an external MCP host has no page open, so memory it writes stays local until you next open a surface.
The folder is treated as untrusted input, because it may be shared, cloud-synced, or checked into a repo. Every incoming path is validated segment by segment — no traversal, no absolute paths, no backslashes, no dotfiles, no control characters — then required to resolve inside global
memory/**as markdown, and capped at 1,000 files and 1 MB each, with anything refused reported in the UI rather than swallowed. Sync uses SHA-256 rather than the index's 32-bit FNV-1a hash, because a collision here decides what gets overwritten or deleted rather than merely marking a cache stale. Anything you put in the vault'smemory/directory becomes readable by the agent, so point it at a folder only you control.Space-scoped memory (
spaces/<spaceId>/memory/**) does not sync:Space.idis a per-profile UUID with no portable identity, and matching spaces by name would silently merge two unrelated projects that happen to share one. Explicit space pairing is the follow-up.Also corrects
docs/memory.mdx, which still documented the four memory tools removed in 0.15.0 (saveMemory,recallMemory,updateMemory,deleteMemory), claimed memories live in "extension storage" rather than as OPFS files, and said editing a memory requires approval when only Delete does. - Conflicts keep both versions. The newer note wins by its