Two-lane multi-device sync of your memory database — durable HTTP push/pull through a per-user sync hub, with optional Realtime live updates as a speed layer.
Cloud sync replicates your local memory database across your devices through a
per-user sync hub — an ordered log of everything your devices write. It is
built into the worker: there is no daemon — the worker syncs on write. The
same process that records every observation also uploads it, and pulls the
other devices’ writes back down.
Two lanes, one source of truth. Everything durable travels over plain
HTTP: pushes append to the hub’s ordered log, pulls page through it with a
cursor. An optional Realtime channel rides alongside as a pure speed layer —
it only makes the next pull happen sooner. The channel can be dropped, disabled,
or wrong with zero data loss; the HTTP cursor is always the truth.
Three kinds of rows are replicated between your devices:
Observations — the compressed memories claude-mem generates from your sessions.
Session summaries — the per-session overview records.
User prompts — the prompts you typed. A prompt over 200 KB uploads as its first 200 KB plus a truncation note; the full prompt stays on the device that captured it.
When the sync hub supports it, agent work state also syncs: the to-do lists
and working state agents save, including each entry’s fields.Alongside the rows, three kinds of mutations travel through the same log
so later edits converge everywhere: session title changes, prompt→session
repairs (a prompt captured before its session registered is re-linked on
every device), and project remaps (worktree adoption and cwd-based moves
retarget the affected rows on every device).
Privacy: cloud sync uploads your observation narratives and your full
prompt text to the sync hub under your cmem.ai account. Don’t enable it if
that content must stay on your machine.
The database is the queue. Every synced table carries a synced_at column
(NULL = not in the log yet). After each write, the worker nudges a debounced
flusher that drains WHERE synced_at IS NULL and stamps rows on success. That
one mechanism handles live sync, offline catch-up, and retry. Rows written
after the SyncHub launch boundary start as NULL; anything that fails to
upload stays NULL until a later flush picks it up. Pre-launch local rows are
not treated as a cloud migration corpus.
Debounced: write bursts coalesce; the flusher runs ~1.5 s after the
last write (250 ms while the speed layer is connected), and only one
flush runs at a time.
Batched: ops drain in requests of up to 500 ops / 4,000,000 encoded
bytes. Each individual canonical body is capped at 256,000 encoded bytes.
Timeboxed: every request has a 30 s timeout — a dead network can
never hang the worker.
Retrying: a failed upload leaves rows NULL and retries on the next
write plus a capped exponential backoff (30 s → 10 min). The write
path is never blocked — sync failures cost nothing but delay.
Idempotent: the hub dedupes on origin identity, so a retried push can
never create duplicates.
Each device keeps a cursor into the hub’s log and pulls everything after
it — in pages, so a device that was offline for a week (or is brand new and
starts from zero) catches up the same way an active one stays current:
Session start: the worker pulls immediately before injecting context
(bounded to 1.5 s, so a dead network can’t stall your session), which
means memory written on another machine is there the moment you start
working.
Steady state: a short poll every 30 s while a session is active,
every 5 min when idle, suspended entirely after an hour of no activity.
Every push response also reports the log head, so an active device learns
about remote writes without waiting out the timer.
Applied like native writes: pulled rows keep their original timestamps,
carry their origin device, index into full-text and vector search through
the same paths native writes use, and are stamped so they can never be
echoed back up.
When enabled (the default), the worker also subscribes to a private Realtime
channel for your account. When another device pushes, the server broadcasts a
tiny “the log moved forward” signal and this device pulls right away —
multi-device convergence in about a second instead of a poll interval. The
channel is strictly advisory: it never carries your data, and any anomaly
(a dropped connection, a missed heartbeat, a malformed signal) simply closes it
and falls back to an HTTP pull, which is always correct. Set
CLAUDE_MEM_CLOUD_SYNC_WS to false to turn live updates off — sync stays
fully correct at poll latency. If the sync server does not offer live updates,
the worker stays on polling and checks again hourly.
Cloud sync is active when all three of the token, the user id, and the hub
URL are non-empty — there is no separate enable flag; blank any one of them to
turn sync off.
A cmem.ai Pro sync token and user id (from cmem.ai → Connect).
A sync hub URL in CLAUDE_MEM_CLOUD_SYNC_HUB_URL: https://sync.cmem.ai,
which the installer writes for you (source in services/sync-api/). A hub
URL pinned to the older Cloudflare Workers hub is moved to it automatically.
To connect, run npx claude-mem install in your terminal and choose CMEM
Pro. The installer signs you in through the browser, writes all three values
into ~/.claude-mem/settings.json (mode 0600), and restarts the worker. The
/cloud-sync skill in Claude Code checks status, points you to the installer
for setup, and verifies the installed client can reach SyncHub. It never asks
you to paste the token into the chat, because anything pasted there lands in the
session transcript. For CI or a remote box, see
headless setup.
Your cmem.ai sync token (from cmem.ai → Connect). Sent as Authorization: Bearer.
CLAUDE_MEM_CLOUD_SYNC_USER_ID
''
Your cmem.ai user id (from cmem.ai → Connect). All your devices share it — it names your hub log.
CLAUDE_MEM_CLOUD_SYNC_HUB_URL
''
Sync hub base URL. Empty = sync off.
CLAUDE_MEM_CLOUD_SYNC_WS
'true'
Live updates over Realtime. 'false' disables live updates (HTTP polling only); sync stays fully correct at poll latency.
CLAUDE_MEM_CLOUD_SYNC_DEVICE_ID
''
Stable identity of this machine. A fresh UUID is minted and persisted on first start. Don’t edit it: every row is attributed to its origin device.
CLAUDE_MEM_CLOUD_SYNC_DEVICE_NAME
machine hostname
Human-readable label for this device.
CLAUDE_MEM_CLOUD_SYNC_CONTENT_BATCH_SIZE
'40'
Ops per content flush page. 200-op pages timed out at 30s under hub projection_busy. Max 500.
CLAUDE_MEM_CLOUD_SYNC_REQUEST_TIMEOUT_MS
'90000'
Content-push AbortSignal timeout. Must exceed the hub’s 45s projection fetch; default matches the 90s projection lease.
A Hub accepts at most 64 distinct device ids per account. Existing devices
continue to sync normally at the limit; a new device receives
409 device_limit_exceeded. Status/metadata reads and renaming an unknown
device do not create phantom devices.
The worker exposes GET /api/sync/status (on the same port as the rest of the
worker HTTP API). It is registered unconditionally, so an unconfigured install
answers 200 rather than a 404 — callers can tell “not set up” apart from
“worker down”.
Every configured status request makes an authenticated, read-only
GET /v1/sync/status directly to SyncHub, including when all pending counts
are zero. The probe does not append an operation or advance a pull cursor.
hub.reachable: false and hub.error therefore expose a bad token, wrong Hub
URL, malformed response, timeout, or network failure
that an empty queue would otherwise hide.
pending — rows (and queued mutation ops) still waiting to upload. Counts
near 0 mean the hub’s log has everything this device wrote.
lastFlushAt — epoch ms of the last successful flush, null before the first.
lastError — message from the most recent failed flush, null when healthy.
It never contains the token.
hub — the most recent authenticated SyncHub probe. Treat
hub.reachable: true as the connectivity check; lastError: null alone is
not enough. Sequence and epoch fields remain decimal strings.
Not configured:
{ "configured": false }
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/schema.json","name":"Claude-Mem","description":"Persistent memory compression system that preserves context across Claude Code sessions","colors":{"primary":"#3B82F6","light":"#EFF6FF","dark":"#1E40AF"},"logo":{"light":"https://mintcdn.com/claude-memai/isTrgvnp4xMsB6Qs/claude-mem-logo-for-light-mode.webp?fit=max\u0026auto=format\u0026n=isTrgvnp4xMsB6Qs\u0026q=85\u0026s=8c72789f3a40f4bc4e04e8d856cc0497","dark":"https://mintcdn.com/claude-memai/isTrgvnp4xMsB6Qs/claude-mem-logo-for-dark-mode.webp?fit=max\u0026auto=format\u0026n=isTrgvnp4xMsB6Qs\u0026q=85\u0026s=64495405a74cac51e50402f7de2e9bb8","href":"https://github.com/thedotmack/claude-mem"},"favicon":"https://mintcdn.com/claude-memai/jV9X2ypm5ndblmrT/claude-mem-logomark.webp?fit=max\u0026auto=format\u0026n=jV9X2ypm5ndblmrT\u0026q=85\u0026s=e942fbef232548752e5a870be05a0601","navbar":{"links":[{"href":"https://github.com/thedotmack/claude-mem","label":"GitHub"}],"primary":{"type":"button","label":"Install","href":"https://github.com/thedotmack/claude-mem#quick-start"}},"footer":{"socials":{"github":"https://github.com/thedotmack/claude-mem"},"links":[{"header":"Resources","items":[{"label":"Documentation","href":"https://github.com/thedotmack/claude-mem"},{"label":"Issues","href":"https://github.com/thedotmack/claude-mem/issues"}]},{"header":"Legal","items":[{"label":"License (Apache-2.0)","href":"https://github.com/thedotmack/claude-mem/blob/main/LICENSE"}]}]},"seo":{"metatags":{"og:type":"website","og:site_name":"Claude-Mem Documentation","og:description":"Persistent memory compression system that preserves context across Claude Code sessions"},"indexing":"all"},"integrations":{"telemetry":{"enabled":false}},"contextual":{"options":["copy","view","chatgpt","claude","cursor"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"claude-memai","hasAudioNarration":false,"actualSubdomain":"claude-memai","customDomains":["docs.claude-mem.ai"],"gitSource":{"type":"github","owner":"thedotmack","repo":"claude-mem","deployBranch":"main","contentDirectory":"docs/public","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adfe84be44af86ba01cf382","collectionId":"d6466eb2-3bb6-45a2-abd6-77ca487c2cba","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adfe84be44af86ba01cf382"},"feedback":{"thumbs":true},"entitlements":{},"buildId":"6adfe84be44af86ba01cf382","clientVersion":"0.0.3990","searchFilterCounts":[{"language":"default","tag":"Get Started","count":20},{"language":"default","tag":"Configuration \u0026 Development","count":14},{"language":"default","tag":"Architecture","count":8},{"language":"default","tag":"Hosted Server","count":4},{"language":"default","tag":"Best Practices","count":4},{"language":"default","tag":"Cursor Integration","count":3},{"language":"default","tag":"Antigravity CLI Integration","count":1},{"language":"default","tag":"Grok Bot Integration","count":1}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"cloud-sync","slug":"/cloud-sync","pageMetadata":{"title":"Cloud Sync (cmem.ai Pro)","description":"Two-lane multi-device sync of your memory database — durable HTTP push/pull through a per-user sync hub, with optional Realtime live updates as a speed layer.","href":"/cloud-sync"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Two-lane multi-device sync of your memory database — durable HTTP push/pull through a per-user sync hub, with optional Realtime live updates as a speed layer.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Note,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`1`,id:`cloud-sync-cmem-ai-pro`,children:`Cloud Sync (cmem.ai Pro)`}),`\n`,_jsxs(_components.p,{children:[`Cloud sync replicates your local memory database across your devices through a\n`,_jsx(_components.strong,{children:`per-user sync hub`}),` — an ordered log of everything your devices write. It is\nbuilt into the worker: `,_jsx(_components.strong,{children:`there is no daemon — the worker syncs on write`}),`. The\nsame process that records every observation also uploads it, and pulls the\nother devices’ writes back down.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Two lanes, one source of truth.`}),` Everything durable travels over plain\nHTTP: pushes append to the hub’s ordered log, pulls page through it with a\ncursor. An optional Realtime channel rides alongside as a pure `,_jsx(_components.em,{children:`speed layer`}),` —\nit only makes the next pull happen sooner. The channel can be dropped, disabled,\nor wrong with `,_jsx(_components.strong,{children:`zero data loss`}),`; the HTTP cursor is always the truth.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`what-syncs`,children:`What syncs`}),`\n`,_jsx(_components.p,{children:`Three kinds of rows are replicated between your devices:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Observations`}),` — the compressed memories claude-mem generates from your sessions.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Session summaries`}),` — the per-session overview records.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`User prompts`}),` — the prompts you typed. A prompt over 200\\xA0KB uploads as its first 200\\xA0KB plus a truncation note; the full prompt stays on the device that captured it.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`When the sync hub supports it, `,_jsx(_components.strong,{children:`agent work state`}),` also syncs: the to-do lists\nand working state agents save, including each entry’s fields.`]}),`\n`,_jsxs(_components.p,{children:[`Alongside the rows, three kinds of `,_jsx(_components.strong,{children:`mutations`}),` travel through the same log\nso later edits converge everywhere: session `,_jsx(_components.strong,{children:`title`}),` changes, `,_jsx(_components.strong,{children:`prompt→session\nrepairs`}),` (a prompt captured before its session registered is re-linked on\nevery device), and `,_jsx(_components.strong,{children:`project remaps`}),` (worktree adoption and cwd-based moves\nretarget the affected rows on every device).`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Privacy:`}),` cloud sync uploads your observation narratives and your full\nprompt text to the sync hub under your cmem.ai account. Don’t enable it if\nthat content must stay on your machine.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`how-the-push-lane-works`,children:`How the push lane works`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`The database is the queue.`}),` Every synced table carries a `,_jsx(_components.code,{children:`synced_at`}),` column\n(`,_jsx(_components.code,{children:`NULL`}),` = not in the log yet). After each write, the worker nudges a debounced\nflusher that drains `,_jsx(_components.code,{children:`WHERE synced_at IS NULL`}),` and stamps rows on success. That\none mechanism handles live sync, offline catch-up, and retry. Rows written\nafter the SyncHub launch boundary start as `,_jsx(_components.code,{children:`NULL`}),`; anything that fails to\nupload stays `,_jsx(_components.code,{children:`NULL`}),` until a later flush picks it up. Pre-launch local rows are\nnot treated as a cloud migration corpus.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Debounced:`}),` write bursts coalesce; the flusher runs ~1.5\\xA0s after the\nlast write (250\\xA0ms while the speed layer is connected), and only one\nflush runs at a time.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Batched:`}),` ops drain in requests of up to 500 ops / 4,000,000 encoded\nbytes. Each individual canonical body is capped at 256,000 encoded bytes.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Timeboxed:`}),` every request has a 30\\xA0s timeout — a dead network can\nnever hang the worker.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Retrying:`}),` a failed upload leaves rows `,_jsx(_components.code,{children:`NULL`}),` and retries on the next\nwrite plus a capped exponential backoff (30\\xA0s → 10\\xA0min). The write\npath is never blocked — sync failures cost nothing but delay.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Idempotent:`}),` the hub dedupes on origin identity, so a retried push can\nnever create duplicates.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`how-the-pull-lane-works`,children:`How the pull lane works`}),`\n`,_jsxs(_components.p,{children:[`Each device keeps a `,_jsx(_components.strong,{children:`cursor`}),` into the hub’s log and pulls everything after\nit — in pages, so a device that was offline for a week (or is brand new and\nstarts from zero) catches up the same way an active one stays current:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Session start:`}),` the worker pulls immediately before injecting context\n(bounded to 1.5\\xA0s, so a dead network can’t stall your session), which\nmeans memory written on another machine is there the moment you start\nworking.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Steady state:`}),` a short poll every 30\\xA0s while a session is active,\nevery 5\\xA0min when idle, suspended entirely after an hour of no activity.\nEvery push response also reports the log head, so an active device learns\nabout remote writes without waiting out the timer.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Applied like native writes:`}),` pulled rows keep their original timestamps,\ncarry their origin device, index into full-text and vector search through\nthe same paths native writes use, and are stamped so they can never be\nechoed back up.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`live-updates-optional`,children:`Live updates (optional)`}),`\n`,_jsxs(_components.p,{children:[`When enabled (the default), the worker also subscribes to a private Realtime\nchannel for your account. When another device pushes, the server broadcasts a\ntiny “the log moved forward” signal and this device pulls right away —\nmulti-device convergence in about a second instead of a poll interval. The\nchannel is strictly `,_jsx(_components.strong,{children:`advisory`}),`: it never carries your data, and any anomaly\n(a dropped connection, a missed heartbeat, a malformed signal) simply closes it\nand falls back to an HTTP pull, which is always correct. Set\n`,_jsx(_components.code,{children:`CLAUDE_MEM_CLOUD_SYNC_WS`}),` to `,_jsx(_components.code,{children:`false`}),` to turn live updates off — sync stays\nfully correct at poll latency. If the sync server does not offer live updates,\nthe worker stays on polling and checks again hourly.`]}),`\n`,_jsx(Heading,{level:`2`,id:`requirements-and-setup`,children:`Requirements and setup`}),`\n`,_jsxs(_components.p,{children:[`Cloud sync is active when `,_jsx(_components.strong,{children:`all three`}),` of the token, the user id, and the hub\nURL are non-empty — there is no separate enable flag; blank any one of them to\nturn sync off.`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`A `,_jsx(_components.strong,{children:`cmem.ai Pro sync token and user id`}),` (from `,_jsx(_components.strong,{children:`cmem.ai → Connect`}),`).`]}),`\n`,_jsxs(_components.li,{children:[`A `,_jsx(_components.strong,{children:`sync hub URL`}),` in `,_jsx(_components.code,{children:`CLAUDE_MEM_CLOUD_SYNC_HUB_URL`}),`: `,_jsx(_components.code,{children:`https://sync.cmem.ai`}),`,\nwhich the installer writes for you (source in `,_jsx(_components.code,{children:`services/sync-api/`}),`). A hub\nURL pinned to the older Cloudflare Workers hub is moved to it automatically.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`To connect, run `,_jsx(_components.code,{children:`npx claude-mem install`}),` in your terminal and choose `,_jsx(_components.strong,{children:`CMEM\nPro`}),`. The installer signs you in through the browser, writes all three values\ninto `,_jsx(_components.code,{children:`~/.claude-mem/settings.json`}),` (mode `,_jsx(_components.code,{children:`0600`}),`), and restarts the worker. The\n`,_jsx(_components.code,{children:`/cloud-sync`}),` skill in Claude Code checks status, points you to the installer\nfor setup, and verifies the installed client can reach SyncHub. It never asks\nyou to paste the token into the chat, because anything pasted there lands in the\nsession transcript. For CI or a remote box, see\n`,_jsx(_components.a,{href:`/cmem-pro-headless`,children:`headless setup`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`settings`,children:`Settings`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Key`}),_jsx(_components.th,{children:`Default`}),_jsx(_components.th,{children:`Meaning`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CLAUDE_MEM_CLOUD_SYNC_TOKEN`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`''`})}),_jsxs(_components.td,{children:[`Your cmem.ai sync token (from `,_jsx(_components.strong,{children:`cmem.ai → Connect`}),`). Sent as `,_jsx(_components.code,{children:`Authorization: Bearer`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CLAUDE_MEM_CLOUD_SYNC_USER_ID`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`''`})}),_jsxs(_components.td,{children:[`Your cmem.ai user id (from `,_jsx(_components.strong,{children:`cmem.ai → Connect`}),`). All your devices share it — it names your hub log.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CLAUDE_MEM_CLOUD_SYNC_HUB_URL`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`''`})}),_jsxs(_components.td,{children:[`Sync hub base URL. `,_jsx(_components.strong,{children:`Empty = sync off.`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CLAUDE_MEM_CLOUD_SYNC_WS`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`'true'`})}),_jsxs(_components.td,{children:[`Live updates over Realtime. `,_jsx(_components.code,{children:`'false'`}),` disables live updates (HTTP polling only); sync stays fully correct at poll latency.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CLAUDE_MEM_CLOUD_SYNC_DEVICE_ID`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`''`})}),_jsx(_components.td,{children:`Stable identity of this machine. A fresh UUID is minted and persisted on first start. Don’t edit it: every row is attributed to its origin device.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CLAUDE_MEM_CLOUD_SYNC_DEVICE_NAME`})}),_jsx(_components.td,{children:`machine hostname`}),_jsx(_components.td,{children:`Human-readable label for this device.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CLAUDE_MEM_CLOUD_SYNC_CONTENT_BATCH_SIZE`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`'40'`})}),_jsxs(_components.td,{children:[`Ops per content flush page. 200-op pages timed out at 30s under hub `,_jsx(_components.code,{children:`projection_busy`}),`. Max 500.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CLAUDE_MEM_CLOUD_SYNC_REQUEST_TIMEOUT_MS`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`'90000'`})}),_jsxs(_components.td,{children:[`Content-push `,_jsx(_components.code,{children:`AbortSignal`}),` timeout. Must exceed the hub’s 45s projection fetch; default matches the 90s projection lease.`]})]})]})]}),`\n`,_jsxs(_components.p,{children:[`A Hub accepts at most 64 distinct device ids per account. Existing devices\ncontinue to sync normally at the limit; a new device receives\n`,_jsx(_components.code,{children:`409 device_limit_exceeded`}),`. Status/metadata reads and renaming an unknown\ndevice do not create phantom devices.`]}),`\n`,_jsx(Heading,{level:`2`,id:`status-endpoint`,children:`Status endpoint`}),`\n`,_jsxs(_components.p,{children:[`The worker exposes `,_jsx(_components.code,{children:`GET /api/sync/status`}),` (on the same port as the rest of the\nworker HTTP API). It is registered unconditionally, so an unconfigured install\nanswers `,_jsx(_components.code,{children:`200`}),` rather than a `,_jsx(_components.code,{children:`404`}),` — callers can tell “not set up” apart from\n“worker down”.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -s`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:' \"http://127.0.0.1:${'}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`CLAUDE_MEM_WORKER_PORT`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`}/api/sync/status\"`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Configured:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`16`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`16`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"configured\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"deviceId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"2f6b1c9e-7d41-4c1a-9b0e-3d5f8a2c6e10\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"pending\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"observations\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`0`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"summaries\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`0`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"prompts\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`2`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"mutations\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`0`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"tombstones\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`0`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"quarantine\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"count\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`0`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"latestReason\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`null`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"lastFlushAt\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`1783981042731`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"lastError\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`null`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"hub\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"checkedAt\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`1783981042800`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"reachable\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"epoch\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"1783981042000\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"headSeq\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"42\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"projectedSeq\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"42\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`null`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Every configured status request makes an authenticated, read-only\n`,_jsx(_components.code,{children:`GET /v1/sync/status`}),` directly to SyncHub, including when all pending counts\nare zero. The probe does not append an operation or advance a pull cursor.\n`,_jsx(_components.code,{children:`hub.reachable: false`}),` and `,_jsx(_components.code,{children:`hub.error`}),` therefore expose a bad token, wrong Hub\nURL, malformed response, timeout, or network failure\nthat an empty queue would otherwise hide.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`pending`}),` — rows (and queued mutation ops) still waiting to upload. Counts\nnear 0 mean the hub’s log has everything this device wrote.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`lastFlushAt`}),` — epoch ms of the last successful flush, `,_jsx(_components.code,{children:`null`}),` before the first.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`lastError`}),` — message from the most recent failed flush, `,_jsx(_components.code,{children:`null`}),` when healthy.\nIt never contains the token.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`hub`}),` — the most recent authenticated SyncHub probe. Treat\n`,_jsx(_components.code,{children:`hub.reachable: true`}),` as the connectivity check; `,_jsx(_components.code,{children:`lastError: null`}),` alone is\nnot enough. Sequence and epoch fields remain decimal strings.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`Not configured:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{ `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"configured\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`false`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`]})})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Cloud Sync (cmem.ai Pro)","description":"Two-lane multi-device sync of your memory database — durable HTTP push/pull through a per-user sync hub, with optional Realtime live updates as a speed layer.","href":"/cloud-sync"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Cloud Sync (cmem.ai Pro)","slug":"cloud-sync-cmem-ai-pro","depth":1,"children":[]},{"title":"What syncs","slug":"what-syncs","depth":2,"children":[]},{"title":"How the push lane works","slug":"how-the-push-lane-works","depth":2,"children":[]},{"title":"How the pull lane works","slug":"how-the-pull-lane-works","depth":2,"children":[]},{"title":"Live updates (optional)","slug":"live-updates-optional","depth":2,"children":[]},{"title":"Requirements and setup","slug":"requirements-and-setup","depth":2,"children":[]},{"title":"Settings","slug":"settings","depth":2,"children":[]},{"title":"Status endpoint","slug":"status-endpoint","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"claude-memai","siteName":"Claude-Mem","title":"Cloud Sync (cmem.ai Pro) - Claude-Mem","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-22T17:51:43.385Z","originalFileLocation":"cloud-sync.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Two-lane multi-device sync of your memory database — durable HTTP push/pull through a per-user sync hub, with optional Realtime live updates as a speed layer.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Claude-Mem\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/claude-memai/7NIUS2Cb5fgWKXUq/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/claude-memai/7NIUS2Cb5fgWKXUq/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/claude-memai/7NIUS2Cb5fgWKXUq/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/claude-memai/7NIUS2Cb5fgWKXUq/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/claude-memai/7NIUS2Cb5fgWKXUq/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/claude-memai/7NIUS2Cb5fgWKXUq/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/claude-memai/7NIUS2Cb5fgWKXUq/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/claude-memai/7NIUS2Cb5fgWKXUq/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/claude-memai/7NIUS2Cb5fgWKXUq/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Cloud Sync (cmem.ai Pro) - Claude-Mem\">\u003cmeta data-mint-head property=\"og:description\" content=\"Persistent memory compression system that preserves context across Claude Code sessions\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Claude-Mem Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.claude-mem.ai/cloud-sync\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://claude-memai.mintlify.app/_mintlify/api/og/v2?division=Hosted+Server\u0026amp;title=Cloud+Sync+%28cmem.ai+Pro%29\u0026amp;description=Two-lane+multi-device+sync+of+your+memory+database+%E2%80%94+durable+HTTP+push%2Fpull+through+a+per-user+sync+hub%2C+with+optional+Realtime+live+updates+as+a+speed+layer.\u0026amp;theme=facc5f5b3a236509be10cd4d\u0026amp;signature=ea29a3ffc5327f4ebe88db546ea58de544b2dae3beacfd8b936ef780e6ca5e46\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Cloud Sync (cmem.ai Pro) - Claude-Mem\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Persistent memory compression system that preserves context across Claude Code sessions\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://claude-memai.mintlify.app/_mintlify/api/og/v2?division=Hosted+Server\u0026amp;title=Cloud+Sync+%28cmem.ai+Pro%29\u0026amp;description=Two-lane+multi-device+sync+of+your+memory+database+%E2%80%94+durable+HTTP+push%2Fpull+through+a+per-user+sync+hub%2C+with+optional+Realtime+live+updates+as+a+speed+layer.\u0026amp;theme=facc5f5b3a236509be10cd4d\u0026amp;signature=ea29a3ffc5327f4ebe88db546ea58de544b2dae3beacfd8b936ef780e6ca5e46\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/claude-memai/7NIUS2Cb5fgWKXUq/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Claude-Mem\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#3B82F6\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.claude-mem.ai/cloud-sync\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/cloud-sync.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.claude-mem.ai/#organization\",\"name\":\"Claude-Mem\",\"url\":\"https://docs.claude-mem.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/claude-memai/isTrgvnp4xMsB6Qs/claude-mem-logo-for-light-mode.webp?fit=max\u0026auto=format\u0026n=isTrgvnp4xMsB6Qs\u0026q=85\u0026s=8c72789f3a40f4bc4e04e8d856cc0497\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.claude-mem.ai#website\",\"name\":\"Claude-Mem\",\"url\":\"https://docs.claude-mem.ai\",\"publisher\":{\"@id\":\"https://docs.claude-mem.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.claude-mem.ai/cloud-sync#webpage\",\"url\":\"https://docs.claude-mem.ai/cloud-sync\",\"name\":\"Cloud Sync (cmem.ai Pro)\",\"description\":\"Two-lane multi-device sync of your memory database — durable HTTP push/pull through a per-user sync hub, with optional Realtime live updates as a speed layer.\",\"dateModified\":\"2026-10-22T17:51:43.385Z\",\"isPartOf\":{\"@id\":\"https://docs.claude-mem.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.claude-mem.ai/cloud-sync#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.claude-mem.ai/cloud-sync#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Hosted Server\",\"item\":\"https://docs.claude-mem.ai/hosted-server\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Cloud Sync (cmem.ai Pro)\",\"item\":\"https://docs.claude-mem.ai/cloud-sync\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.claude-mem.ai/cloud-sync#article\",\"headline\":\"Cloud Sync (cmem.ai Pro)\",\"name\":\"Cloud Sync (cmem.ai Pro)\",\"description\":\"Two-lane multi-device sync of your memory database — durable HTTP push/pull through a per-user sync hub, with optional Realtime live updates as a speed layer.\",\"url\":\"https://docs.claude-mem.ai/cloud-sync\",\"mainEntityOfPage\":{\"@id\":\"https://docs.claude-mem.ai/cloud-sync#webpage\"},\"dateModified\":\"2026-10-22T17:51:43.385Z\",\"publisher\":{\"@id\":\"https://docs.claude-mem.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.claude-mem.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Claude-Mem\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Claude-Mem","nav":{"global":null,"groups":[{"group":"Get Started","icon":"rocket","pages":[{"title":"Introduction","href":"/introduction"},{"title":"Installation","href":"/installation"},{"title":"T3 Code Integration","href":"/t3code-integration"},{"title":"Getting Started","href":"/usage/getting-started"},{"title":"My Work: the local live viewer","href":"/usage/my-work"},{"title":"TeamBrain","href":"/usage/teambrain"},{"title":"OpenRouter Provider","href":"/usage/openrouter-provider"},{"title":"Gemini Provider","href":"/usage/gemini-provider"},{"title":"OpenAI-Compatible Provider (NVIDIA NIM \u0026 others)","href":"/usage/openai-compatible-provider"},{"title":"Multi-Key Rotation","href":"/usage/multi-key-rotation"},{"title":"Quota Fallback","href":"/usage/quota-fallback"},{"title":"Smart Memory Search","href":"/usage/search-tools"},{"title":"Knowledge Agents","href":"/usage/knowledge-agents"},{"title":"Claude Desktop MCP","icon":"desktop","href":"/usage/claude-desktop"},{"title":"Private Tags","href":"/usage/private-tags"},{"title":"Auto-Redaction","href":"/usage/auto-redaction"},{"title":"Memory Export/Import","href":"/usage/export-import"},{"title":"Memory Ingest","href":"/usage/memory-ingest"},{"title":"Manual Recovery","href":"/usage/manual-recovery"},{"title":"Folder Context Files","href":"/usage/folder-context"}]},{"group":"Cursor Integration","icon":"wand-magic-sparkles","pages":[{"title":"Cursor Integration","href":"/cursor/index"},{"title":"Cursor + Gemini Setup","href":"/cursor/gemini-setup"},{"title":"Cursor + OpenRouter Setup","href":"/cursor/openrouter-setup"}]},{"group":"Grok Bot Integration","icon":"robot","pages":[{"title":"Grok Bot Integration","href":"/grok-bot/index"}]},{"group":"Antigravity CLI Integration","icon":"terminal","pages":[{"title":"Antigravity CLI Setup","href":"/antigravity-cli/setup"}]},{"group":"Best Practices","icon":"lightbulb","pages":[{"title":"Context Engineering","href":"/context-engineering"},{"title":null,"href":"/progressive-disclosure"},{"title":"File Read Gate","href":"/file-read-gate"},{"title":"Smart Explore Benchmark","href":"/smart-explore-benchmark"}]},{"group":"Configuration \u0026 Development","icon":"gear","pages":[{"title":"Configuration","href":"/configuration"},{"title":"LiteLLM Gateway","href":"/configuration/litellm-gateway"},{"title":"Custom Anthropic-Compatible Backends","href":"/configuration/custom-anthropic-backends"},{"title":"Modes \u0026 Languages","href":"/modes"},{"title":"Telemetry","href":"/telemetry"},{"title":"Development","href":"/development"},{"title":"Troubleshooting","href":"/troubleshooting"},{"title":"Platform Integration Guide","icon":"plug","href":"/platform-integration"},{"title":"OpenClaw Integration","icon":"dragon","href":"/openclaw-integration"},{"title":"Hermes Agent Integration","icon":"feather","href":"/hermes-integration"},{"title":"Kimi Code Integration","icon":"terminal","href":"/kimi-integration"},{"title":"Qoder Integration","icon":"terminal","href":"/qoder-integration"},{"title":"Screenpipe Integration","href":"/screenpipe-integration"},{"title":"Notion Export","href":"/notion-export"}]},{"group":"Hosted Server","icon":"cloud","pages":[{"title":"Hosted Server (Beta)","description":"Remote authenticated MCP recall, usage metering + quotas, and data deletion — how claude-mem's cloud server works today.","href":"/hosted-server"},{"title":"Cloud Sync (cmem.ai Pro)","href":"/cloud-sync"},{"title":"CMEM Pro (manual / headless)","description":"What npx claude-mem install writes for CMEM Pro — OAuth pairing, settings.json keys, and how to verify without the interactive installer","href":"/cmem-pro-headless"},{"title":"Backups","href":"/usage/backups"}]},{"group":"Architecture","icon":"diagram-project","pages":[{"title":"Architecture Overview","href":"/architecture/overview"},{"title":"Architecture Evolution","href":"/architecture-evolution"},{"title":null,"href":"/hooks-architecture"},{"title":"Hook Lifecycle","href":"/architecture/hooks"},{"title":"Worker Service","href":"/architecture/worker-service"},{"title":"Database Architecture","href":"/architecture/database"},{"title":"Search Architecture","href":"/architecture/search-architecture"},{"title":"PM2 to Bun Migration","href":"/architecture/pm2-to-bun-migration"}]}]},"title":"Cloud Sync (cmem.ai Pro) - Claude-Mem","buildId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","deploymentId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","dynamics":[],"chunks":[]}