{"id":752,"date":"2026-03-21T23:08:58","date_gmt":"2026-03-21T15:08:58","guid":{"rendered":"https:\/\/pa.yingzhi8.cn\/index.php\/2026\/03\/21\/install-migrating-matrix\/"},"modified":"2026-03-21T23:30:57","modified_gmt":"2026-03-21T15:30:57","slug":"install-migrating-matrix","status":"publish","type":"post","link":"https:\/\/pa.yingzhi8.cn\/index.php\/2026\/03\/21\/install-migrating-matrix\/","title":{"rendered":"Matrix \u8fc1\u79fb\u6307\u5357"},"content":{"rendered":"<h1>Matrix migration<\/h1>\n<p>This page covers upgrades from the previous public <code>matrix<\/code> plugin to the current implementation.<\/p>\n<p>For most users, the upgrade is in place:<\/p>\n<ul>\n<li>the plugin stays <code>@openclaw\/matrix<\/code><\/li>\n<li>the channel stays <code>matrix<\/code><\/li>\n<li>your config stays under <code>channels.matrix<\/code><\/li>\n<li>cached credentials stay under <code>~\/.openclaw\/credentials\/matrix\/<\/code><\/li>\n<li>runtime state stays under <code>~\/.openclaw\/matrix\/<\/code><\/li>\n<\/ul>\n<p>You do not need to rename config keys or reinstall the plugin under a new name.<\/p>\n<h2>What the migration does automatically<\/h2>\n<p>When the gateway starts, and when you run <a href=\"\/gateway\/doctor\"><code>openclaw doctor --fix<\/code><\/a>, OpenClaw tries to repair old Matrix state automatically.<br \/>\nBefore any actionable Matrix migration step mutates on-disk state, OpenClaw creates or reuses a focused recovery snapshot.<\/p>\n<p>When you use <code>openclaw update<\/code>, the exact trigger depends on how OpenClaw is installed:<\/p>\n<ul>\n<li>source installs run <code>openclaw doctor --fix<\/code> during the update flow, then restart the gateway by default<\/li>\n<li>package-manager installs update the package, run a non-interactive doctor pass, then rely on the default gateway restart so startup can finish Matrix migration<\/li>\n<li>if you use <code>openclaw update --no-restart<\/code>, startup-backed Matrix migration is deferred until you later run <code>openclaw doctor --fix<\/code> and restart the gateway<\/li>\n<\/ul>\n<p>Automatic migration covers:<\/p>\n<ul>\n<li>creating or reusing a pre-migration snapshot under <code>~\/Backups\/openclaw-migrations\/<\/code><\/li>\n<li>reusing your cached Matrix credentials<\/li>\n<li>keeping the same account selection and <code>channels.matrix<\/code> config<\/li>\n<li>moving the oldest flat Matrix sync store into the current account-scoped location<\/li>\n<li>moving the oldest flat Matrix crypto store into the current account-scoped location when the target account can be resolved safely<\/li>\n<li>extracting a previously saved Matrix room-key backup decryption key from the old rust crypto store, when that key exists locally<\/li>\n<li>reusing the most complete existing token-hash storage root for the same Matrix account, homeserver, and user when the access token changes later<\/li>\n<li>scanning sibling token-hash storage roots for pending encrypted-state restore metadata when the Matrix access token changed but the account\/device identity stayed the same<\/li>\n<li>restoring backed-up room keys into the new crypto store on the next Matrix startup<\/li>\n<\/ul>\n<p>Snapshot details:<\/p>\n<ul>\n<li>OpenClaw writes a marker file at <code>~\/.openclaw\/matrix\/migration-snapshot.json<\/code> after a successful snapshot so later startup and repair passes can reuse the same archive.<\/li>\n<li>These automatic Matrix migration snapshots back up config + state only (<code>includeWorkspace: false<\/code>).<\/li>\n<li>If Matrix only has warning-only migration state, for example because <code>userId<\/code> or <code>accessToken<\/code> is still missing, OpenClaw does not create the snapshot yet because no Matrix mutation is actionable.<\/li>\n<li>If the snapshot step fails, OpenClaw skips Matrix migration for that run instead of mutating state without a recovery point.<\/li>\n<\/ul>\n<p>About multi-account upgrades:<\/p>\n<ul>\n<li>the oldest flat Matrix store (<code>~\/.openclaw\/matrix\/bot-storage.json<\/code> and <code>~\/.openclaw\/matrix\/crypto\/<\/code>) came from a single-store layout, so OpenClaw can only migrate it into one resolved Matrix account target<\/li>\n<li>already account-scoped legacy Matrix stores are detected and prepared per configured Matrix account<\/li>\n<\/ul>\n<h2>What the migration cannot do automatically<\/h2>\n<p>The previous public Matrix plugin did <strong>not<\/strong> automatically create Matrix room-key backups. It persisted local crypto state and requested device verification, but it did not guarantee that your room keys were backed up to the homeserver.<\/p>\n<p>That means some encrypted installs can only be migrated partially.<\/p>\n<p>OpenClaw cannot automatically recover:<\/p>\n<ul>\n<li>local-only room keys that were never backed up<\/li>\n<li>encrypted state when the target Matrix account cannot be resolved yet because <code>homeserver<\/code>, <code>userId<\/code>, or <code>accessToken<\/code> are still unavailable<\/li>\n<li>automatic migration of one shared flat Matrix store when multiple Matrix accounts are configured but <code>channels.matrix.defaultAccount<\/code> is not set<\/li>\n<li>custom plugin path installs that are pinned to a repo path instead of the standard Matrix package<\/li>\n<li>a missing recovery key when the old store had backed-up keys but did not keep the decryption key locally<\/li>\n<\/ul>\n<p>Current warning scope:<\/p>\n<ul>\n<li>custom Matrix plugin path installs are surfaced by both gateway startup and <code>openclaw doctor<\/code><\/li>\n<\/ul>\n<p>If your old installation had local-only encrypted history that was never backed up, some older encrypted messages may remain unreadable after the upgrade.<\/p>\n<h2>&#25512;&#33616; upgrade flow<\/h2>\n<ol>\n<li>\n<p>Update OpenClaw and the Matrix plugin normally.<br \/>\n   Prefer plain <code>openclaw update<\/code> without <code>--no-restart<\/code> so startup can finish the Matrix migration immediately.<\/p>\n<\/li>\n<li>\n<p>Run:<\/p>\n<\/li>\n<\/ol>\n<p><code>bash  theme={\"theme\":{\"light\":\"min-light\",\"dark\":\"min-dark\"}}<br \/>\n   openclaw doctor --fix<\/code><\/p>\n<p>If Matrix has actionable migration work, doctor will create or reuse the pre-migration snapshot first and print the archive path.<\/p>\n<ol start=\"3\">\n<li>\n<p>Start or restart the gateway.<\/p>\n<\/li>\n<li>\n<p>Check current verification and backup state:<\/p>\n<\/li>\n<\/ol>\n<p><code>bash  theme={\"theme\":{\"light\":\"min-light\",\"dark\":\"min-dark\"}}<br \/>\n   openclaw matrix verify status<br \/>\n   openclaw matrix verify backup status<\/code><\/p>\n<ol start=\"5\">\n<li>If OpenClaw tells you a recovery key is needed, run:<\/li>\n<\/ol>\n<p><code>bash  theme={\"theme\":{\"light\":\"min-light\",\"dark\":\"min-dark\"}}<br \/>\n   openclaw matrix verify backup restore --recovery-key \"&lt;your-recovery-key&gt;\"<\/code><\/p>\n<ol start=\"6\">\n<li>If this device is still unverified, run:<\/li>\n<\/ol>\n<p><code>bash  theme={\"theme\":{\"light\":\"min-light\",\"dark\":\"min-dark\"}}<br \/>\n   openclaw matrix verify device \"&lt;your-recovery-key&gt;\"<\/code><\/p>\n<ol start=\"7\">\n<li>If you are intentionally abandoning unrecoverable old history and want a fresh backup baseline for future messages, run:<\/li>\n<\/ol>\n<p><code>bash  theme={\"theme\":{\"light\":\"min-light\",\"dark\":\"min-dark\"}}<br \/>\n   openclaw matrix verify backup reset --yes<\/code><\/p>\n<ol start=\"8\">\n<li>If no server-side key backup exists yet, create one for future recoveries:<\/li>\n<\/ol>\n<p><code>bash  theme={\"theme\":{\"light\":\"min-light\",\"dark\":\"min-dark\"}}<br \/>\n   openclaw matrix verify bootstrap<\/code><\/p>\n<h2>How encrypted migration works<\/h2>\n<p>Encrypted migration is a two-stage process:<\/p>\n<ol>\n<li>Startup or <code>openclaw doctor --fix<\/code> creates or reuses the pre-migration snapshot if encrypted migration is actionable.<\/li>\n<li>Startup or <code>openclaw doctor --fix<\/code> inspects the old Matrix crypto store through the active Matrix plugin install.<\/li>\n<li>If a backup decryption key is found, OpenClaw writes it into the new recovery-key flow and marks room-key restore as pending.<\/li>\n<li>On the next Matrix startup, OpenClaw restores backed-up room keys into the new crypto store automatically.<\/li>\n<\/ol>\n<p>If the old store reports room keys that were never backed up, OpenClaw warns instead of pretending recovery succeeded.<\/p>\n<h2>Common messages and what they mean<\/h2>\n<h3>Upgrade and detection messages<\/h3>\n<p><code>Matrix plugin upgraded in place.<\/code><\/p>\n<ul>\n<li>Meaning: the old on-disk Matrix state was detected and migrated into the current layout.<\/li>\n<li>What to do: nothing unless the same output also includes warnings.<\/li>\n<\/ul>\n<p><code>Matrix migration snapshot created before applying Matrix upgrades.<\/code><\/p>\n<ul>\n<li>Meaning: OpenClaw created a recovery archive before mutating Matrix state.<\/li>\n<li>What to do: keep the printed archive path until you confirm migration succeeded.<\/li>\n<\/ul>\n<p><code>Matrix migration snapshot reused before applying Matrix upgrades.<\/code><\/p>\n<ul>\n<li>Meaning: OpenClaw found an existing Matrix migration snapshot marker and reused that archive instead of creating a duplicate backup.<\/li>\n<li>What to do: keep the printed archive path until you confirm migration succeeded.<\/li>\n<\/ul>\n<p><code>Legacy Matrix state detected at ... but channels.matrix is not configured yet.<\/code><\/p>\n<ul>\n<li>Meaning: old Matrix state exists, but OpenClaw cannot map it to a current Matrix account because Matrix is not configured.<\/li>\n<li>What to do: configure <code>channels.matrix<\/code>, then rerun <code>openclaw doctor --fix<\/code> or restart the gateway.<\/li>\n<\/ul>\n<p><code>Legacy Matrix state detected at ... but the new account-scoped target could not be resolved yet (need homeserver, userId, and access token for channels.matrix...).<\/code><\/p>\n<ul>\n<li>Meaning: OpenClaw found old state, but it still cannot determine the exact current account\/device root.<\/li>\n<li>What to do: start the gateway once with a working Matrix login, or rerun <code>openclaw doctor --fix<\/code> after cached credentials exist.<\/li>\n<\/ul>\n<p><code>Legacy Matrix state detected at ... but multiple Matrix accounts are configured and channels.matrix.defaultAccount is not set.<\/code><\/p>\n<ul>\n<li>Meaning: OpenClaw found one shared flat Matrix store, but it refuses to guess which named Matrix account should receive it.<\/li>\n<li>What to do: set <code>channels.matrix.defaultAccount<\/code> to the intended account, then rerun <code>openclaw doctor --fix<\/code> or restart the gateway.<\/li>\n<\/ul>\n<p><code>Matrix legacy sync store not migrated because the target already exists (...)<\/code><\/p>\n<ul>\n<li>Meaning: the new account-scoped location already has a sync or crypto store, so OpenClaw did not overwrite it automatically.<\/li>\n<li>What to do: verify that the current account is the correct one before manually removing or moving the conflicting target.<\/li>\n<\/ul>\n<p><code>Failed migrating Matrix legacy sync store (...)<\/code> or <code>Failed migrating Matrix legacy crypto store (...)<\/code><\/p>\n<ul>\n<li>Meaning: OpenClaw tried to move old Matrix state but the filesystem operation failed.<\/li>\n<li>What to do: inspect filesystem permissions and disk state, then rerun <code>openclaw doctor --fix<\/code>.<\/li>\n<\/ul>\n<p><code>Legacy Matrix encrypted state detected at ... but channels.matrix is not configured yet.<\/code><\/p>\n<ul>\n<li>Meaning: OpenClaw found an old encrypted Matrix store, but there is no current Matrix config to attach it to.<\/li>\n<li>What to do: configure <code>channels.matrix<\/code>, then rerun <code>openclaw doctor --fix<\/code> or restart the gateway.<\/li>\n<\/ul>\n<p><code>Legacy Matrix encrypted state detected at ... but the account-scoped target could not be resolved yet (need homeserver, userId, and access token for channels.matrix...).<\/code><\/p>\n<ul>\n<li>Meaning: the encrypted store exists, but OpenClaw cannot safely decide which current account\/device it belongs to.<\/li>\n<li>What to do: start the gateway once with a working Matrix login, or rerun <code>openclaw doctor --fix<\/code> after cached credentials are available.<\/li>\n<\/ul>\n<p><code>Legacy Matrix encrypted state detected at ... but multiple Matrix accounts are configured and channels.matrix.defaultAccount is not set.<\/code><\/p>\n<ul>\n<li>Meaning: OpenClaw found one shared flat legacy crypto store, but it refuses to guess which named Matrix account should receive it.<\/li>\n<li>What to do: set <code>channels.matrix.defaultAccount<\/code> to the intended account, then rerun <code>openclaw doctor --fix<\/code> or restart the gateway.<\/li>\n<\/ul>\n<p><code>Matrix migration warnings are present, but no on-disk Matrix mutation is actionable yet. No pre-migration snapshot was needed.<\/code><\/p>\n<ul>\n<li>Meaning: OpenClaw detected old Matrix state, but the migration is still blocked on missing identity or credential data.<\/li>\n<li>What to do: finish Matrix login or config setup, then rerun <code>openclaw doctor --fix<\/code> or restart the gateway.<\/li>\n<\/ul>\n<p><code>Legacy Matrix encrypted state was detected, but the Matrix plugin helper is unavailable. Install or repair @openclaw\/matrix so OpenClaw can inspect the old rust crypto store before upgrading.<\/code><\/p>\n<ul>\n<li>Meaning: OpenClaw found old encrypted Matrix state, but it could not load the helper entrypoint from the Matrix plugin that normally inspects that store.<\/li>\n<li>What to do: reinstall or repair the Matrix plugin (<code>openclaw plugins install @openclaw\/matrix<\/code>, or <code>openclaw plugins install .\/extensions\/matrix<\/code> for a repo checkout), then rerun <code>openclaw doctor --fix<\/code> or restart the gateway.<\/li>\n<\/ul>\n<p><code>Matrix plugin helper path is unsafe: ... Reinstall @openclaw\/matrix and try again.<\/code><\/p>\n<ul>\n<li>Meaning: OpenClaw found a helper file path that escapes the plugin root or fails plugin boundary checks, so it refused to import it.<\/li>\n<li>What to do: reinstall the Matrix plugin from a trusted path, then rerun <code>openclaw doctor --fix<\/code> or restart the gateway.<\/li>\n<\/ul>\n<p><code>- Failed creating a Matrix migration snapshot before repair: ...<\/code><\/p>\n<p><code>- Skipping Matrix migration changes for now. Resolve the snapshot failure, then rerun \"openclaw doctor --fix\".<\/code><\/p>\n<ul>\n<li>Meaning: OpenClaw refused to mutate Matrix state because it could not create the recovery snapshot first.<\/li>\n<li>What to do: resolve the backup error, then rerun <code>openclaw doctor --fix<\/code> or restart the gateway.<\/li>\n<\/ul>\n<p><code>Failed migrating legacy Matrix client storage: ...<\/code><\/p>\n<ul>\n<li>Meaning: the Matrix client-side fallback found old flat storage, but the move failed. OpenClaw now aborts that fallback instead of silently starting with a fresh store.<\/li>\n<li>What to do: inspect filesystem permissions or conflicts, keep the old state intact, and retry after fixing the error.<\/li>\n<\/ul>\n<p><code>Matrix is installed from a custom path: ...<\/code><\/p>\n<ul>\n<li>Meaning: Matrix is pinned to a path install, so mainline updates do not automatically replace it with the repo&#8217;s standard Matrix package.<\/li>\n<li>What to do: reinstall with <code>openclaw plugins install @openclaw\/matrix<\/code> when you want to return to the default Matrix plugin.<\/li>\n<\/ul>\n<h3>Encrypted-state recovery messages<\/h3>\n<p><code>matrix: restored X\/Y room key(s) from legacy encrypted-state backup<\/code><\/p>\n<ul>\n<li>Meaning: backed-up room keys were restored successfully into the new crypto store.<\/li>\n<li>What to do: usually nothing.<\/li>\n<\/ul>\n<p><code>matrix: N legacy local-only room key(s) were never backed up and could not be restored automatically<\/code><\/p>\n<ul>\n<li>Meaning: some old room keys existed only in the old local store and had never been uploaded to Matrix backup.<\/li>\n<li>What to do: expect some old encrypted history to remain unavailable unless you can recover those keys manually from another verified client.<\/li>\n<\/ul>\n<p><code>Legacy Matrix encrypted state for account \"...\" has backed-up room keys, but no local backup decryption key was found. Ask the operator to run \"openclaw matrix verify backup restore --recovery-key &lt;key&gt;\" after upgrade if they have the recovery key.<\/code><\/p>\n<ul>\n<li>Meaning: backup exists, but OpenClaw could not recover the recovery key automatically.<\/li>\n<li>What to do: run <code>openclaw matrix verify backup restore --recovery-key \"&lt;your-recovery-key&gt;\"<\/code>.<\/li>\n<\/ul>\n<p><code>Failed inspecting legacy Matrix encrypted state for account \"...\" (...): ...<\/code><\/p>\n<ul>\n<li>Meaning: OpenClaw found the old encrypted store, but it could not inspect it safely enough to prepare recovery.<\/li>\n<li>What to do: rerun <code>openclaw doctor --fix<\/code>. If it repeats, keep the old state directory intact and recover using another verified Matrix client plus <code>openclaw matrix verify backup restore --recovery-key \"&lt;your-recovery-key&gt;\"<\/code>.<\/li>\n<\/ul>\n<p><code>Legacy Matrix backup key was found for account \"...\", but ...\/recovery-key.json already contains a different recovery key. Leaving the existing file unchanged.<\/code><\/p>\n<ul>\n<li>Meaning: OpenClaw detected a backup key conflict and refused to overwrite the current recovery-key file automatically.<\/li>\n<li>What to do: verify which recovery key is correct before retrying any restore command.<\/li>\n<\/ul>\n<p><code>Legacy Matrix encrypted state for account \"...\" cannot be fully converted automatically because the old rust crypto store does not expose all local room keys for export.<\/code><\/p>\n<ul>\n<li>Meaning: this is the hard limit of the old storage format.<\/li>\n<li>What to do: backed-up keys can still be restored, but local-only encrypted history may remain unavailable.<\/li>\n<\/ul>\n<p><code>matrix: failed restoring room keys from legacy encrypted-state backup: ...<\/code><\/p>\n<ul>\n<li>Meaning: the new plugin attempted restore but Matrix returned an error.<\/li>\n<li>What to do: run <code>openclaw matrix verify backup status<\/code>, then retry with <code>openclaw matrix verify backup restore --recovery-key \"&lt;your-recovery-key&gt;\"<\/code> if needed.<\/li>\n<\/ul>\n<h3>Manual recovery messages<\/h3>\n<p><code>Backup key is not loaded on this device. Run 'openclaw matrix verify backup restore' to load it and restore old room keys.<\/code><\/p>\n<ul>\n<li>Meaning: OpenClaw knows you should have a backup key, but it is not active on this device.<\/li>\n<li>What to do: run <code>openclaw matrix verify backup restore<\/code>, or pass <code>--recovery-key<\/code> if needed.<\/li>\n<\/ul>\n<p><code>Store a recovery key with 'openclaw matrix verify device &lt;key&gt;', then run 'openclaw matrix verify backup restore'.<\/code><\/p>\n<ul>\n<li>Meaning: this device does not currently have the recovery key stored.<\/li>\n<li>What to do: verify the device with your recovery key first, then restore the backup.<\/li>\n<\/ul>\n<p><code>Backup key mismatch on this device. Re-run 'openclaw matrix verify device &lt;key&gt;' with the matching recovery key.<\/code><\/p>\n<ul>\n<li>Meaning: the stored key does not match the active Matrix backup.<\/li>\n<li>What to do: rerun <code>openclaw matrix verify device \"&lt;your-recovery-key&gt;\"<\/code> with the correct key.<\/li>\n<\/ul>\n<p>If you accept losing unrecoverable old encrypted history, you can instead reset the current backup baseline with <code>openclaw matrix verify backup reset --yes<\/code>.<\/p>\n<p><code>Backup trust chain is not verified on this device. Re-run 'openclaw matrix verify device &lt;key&gt;'.<\/code><\/p>\n<ul>\n<li>Meaning: the backup exists, but this device does not trust the cross-signing chain strongly enough yet.<\/li>\n<li>What to do: rerun <code>openclaw matrix verify device \"&lt;your-recovery-key&gt;\"<\/code>.<\/li>\n<\/ul>\n<p><code>Matrix recovery key is required<\/code><\/p>\n<ul>\n<li>Meaning: you tried a recovery step without supplying a recovery key when one was required.<\/li>\n<li>What to do: rerun the command with your recovery key.<\/li>\n<\/ul>\n<p><code>Invalid Matrix recovery key: ...<\/code><\/p>\n<ul>\n<li>Meaning: the provided key could not be parsed or did not match the expected format.<\/li>\n<li>What to do: retry with the exact recovery key from your Matrix client or recovery-key file.<\/li>\n<\/ul>\n<p><code>Matrix device is still unverified after applying recovery key. Verify your recovery key and ensure cross-signing is available.<\/code><\/p>\n<ul>\n<li>Meaning: the key was applied, but the device still could not complete verification.<\/li>\n<li>What to do: confirm you used the correct key and that cross-signing is available on the account, then retry.<\/li>\n<\/ul>\n<p><code>Matrix key backup is not active on this device after loading from secret storage.<\/code><\/p>\n<ul>\n<li>Meaning: secret storage did not produce an active backup session on this device.<\/li>\n<li>What to do: verify the device first, then recheck with <code>openclaw matrix verify backup status<\/code>.<\/li>\n<\/ul>\n<p><code>Matrix crypto backend cannot load backup keys from secret storage. Verify this device with 'openclaw matrix verify device &lt;key&gt;' first.<\/code><\/p>\n<ul>\n<li>Meaning: this device cannot restore from secret storage until device verification is complete.<\/li>\n<li>What to do: run <code>openclaw matrix verify device \"&lt;your-recovery-key&gt;\"<\/code> first.<\/li>\n<\/ul>\n<h3>Custom plugin install messages<\/h3>\n<p><code>Matrix is installed from a custom path that no longer exists: ...<\/code><\/p>\n<ul>\n<li>Meaning: your plugin install record points at a local path that is gone.<\/li>\n<li>What to do: reinstall with <code>openclaw plugins install @openclaw\/matrix<\/code>, or if you are running from a repo checkout, <code>openclaw plugins install .\/extensions\/matrix<\/code>.<\/li>\n<\/ul>\n<h2>If encrypted history still does not come back<\/h2>\n<p>Run these checks in order:<\/p>\n<p>&#8220;`bash  theme={&#8220;theme&#8221;:{&#8220;light&#8221;:&#8221;min-light&#8221;,&#8221;dark&#8221;:&#8221;min-dark&#8221;}}<br \/>\nopenclaw matrix verify status &#8211;verbose<br \/>\nopenclaw matrix verify backup status &#8211;verbose<br \/>\nopenclaw matrix verify backup restore &#8211;recovery-key &#8220;&#8221; &#8211;verbose<\/p>\n<pre><code>\nIf the backup restores successfully but some old rooms are still missing history, those missing keys were probably never backed up by the previous plugin.\n\n## If you want to start fresh for future messages\n\nIf you accept losing unrecoverable old encrypted history and only want a clean backup baseline going forward, run these commands in order:\n\n```bash  theme={\"theme\":{\"light\":\"min-light\",\"dark\":\"min-dark\"}}\nopenclaw matrix verify backup reset --yes\nopenclaw matrix verify backup status --verbose\nopenclaw matrix verify status\n<\/code><\/pre>\n<p>If the device is still unverified after that, finish verification from your Matrix client by comparing the SAS emoji or decimal codes and confirming that they match.<\/p>\n<h2>Related pages<\/h2>\n<ul>\n<li><a href=\"\/channels\/matrix\">Matrix<\/a><\/li>\n<li><a href=\"\/gateway\/doctor\">Doctor<\/a><\/li>\n<li><a href=\"\/install\/migrating\">Migrating<\/a><\/li>\n<li><a href=\"\/tools\/plugin\">Plugins<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Matrix migration This page covers upgrades from the pre [&hellip;]<\/p>\n","protected":false},"author":0,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-752","post","type-post","status-publish","format-standard","hentry","category-docs"],"_links":{"self":[{"href":"https:\/\/pa.yingzhi8.cn\/index.php\/wp-json\/wp\/v2\/posts\/752","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pa.yingzhi8.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pa.yingzhi8.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/pa.yingzhi8.cn\/index.php\/wp-json\/wp\/v2\/comments?post=752"}],"version-history":[{"count":3,"href":"https:\/\/pa.yingzhi8.cn\/index.php\/wp-json\/wp\/v2\/posts\/752\/revisions"}],"predecessor-version":[{"id":893,"href":"https:\/\/pa.yingzhi8.cn\/index.php\/wp-json\/wp\/v2\/posts\/752\/revisions\/893"}],"wp:attachment":[{"href":"https:\/\/pa.yingzhi8.cn\/index.php\/wp-json\/wp\/v2\/media?parent=752"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pa.yingzhi8.cn\/index.php\/wp-json\/wp\/v2\/categories?post=752"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pa.yingzhi8.cn\/index.php\/wp-json\/wp\/v2\/tags?post=752"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}