{"id":47663369,"url":"https://github.com/atlas-graph-academy/echomemory-cloud-openclaw-plugin","last_synced_at":"2026-05-01T07:02:40.512Z","repository":{"id":345016365,"uuid":"1179305980","full_name":"Atlas-Graph-Academy/EchoMemory-Cloud-OpenClaw-Plugin","owner":"Atlas-Graph-Academy","description":null,"archived":false,"fork":false,"pushed_at":"2026-04-22T22:38:05.000Z","size":3823,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-22T23:26:57.700Z","etag":null,"topics":["agent-memory","openclaw","openclaw-plugin"],"latest_commit_sha":null,"homepage":"https://www.iditor.com/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Atlas-Graph-Academy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-11T22:38:37.000Z","updated_at":"2026-04-22T22:08:14.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Atlas-Graph-Academy/EchoMemory-Cloud-OpenClaw-Plugin","commit_stats":null,"previous_names":["atlas-graph-academy/echomemory-cloud-openclaw-plugin"],"tags_count":33,"template":false,"template_full_name":null,"purl":"pkg:github/Atlas-Graph-Academy/EchoMemory-Cloud-OpenClaw-Plugin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Atlas-Graph-Academy%2FEchoMemory-Cloud-OpenClaw-Plugin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Atlas-Graph-Academy%2FEchoMemory-Cloud-OpenClaw-Plugin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Atlas-Graph-Academy%2FEchoMemory-Cloud-OpenClaw-Plugin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Atlas-Graph-Academy%2FEchoMemory-Cloud-OpenClaw-Plugin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Atlas-Graph-Academy","download_url":"https://codeload.github.com/Atlas-Graph-Academy/EchoMemory-Cloud-OpenClaw-Plugin/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Atlas-Graph-Academy%2FEchoMemory-Cloud-OpenClaw-Plugin/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32487739,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-30T13:12:12.517Z","status":"online","status_checked_at":"2026-05-01T02:00:05.856Z","response_time":64,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent-memory","openclaw","openclaw-plugin"],"created_at":"2026-04-02T11:45:37.207Z","updated_at":"2026-05-01T07:02:40.500Z","avatar_url":"https://github.com/Atlas-Graph-Academy.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Echo Memory Cloud OpenClaw Plugin\n\nOpenClaw plugin for syncing local markdown memories into EchoMem Cloud and making those memories retrievable from Slack through OpenClaw.\n\n## What This Plugin Does\n\n- scans `.md` files anywhere under your OpenClaw memory directory (subfolders included)\n- syncs markdown content into EchoMem Cloud\n- exposes manual commands for status, identity, sync, and search\n- registers an `echo_memory_search` tool so OpenClaw can use EchoMem during normal Slack conversations\n- adds Slack prompt guidance so memory retrieval can happen naturally on memory-dependent turns\n\n## What This Plugin Does Not Do\n\n- it does not auto-sync memories unless you enable it or manually trigger it\n- it does not force memory search on every Slack message\n\nThe plugin runs inside OpenClaw. It uses fixed internal EchoMem service endpoints and supports a one-click local email connect flow, plus manual API key setup if you prefer.\n\n## Before You Begin\n\nYou can connect entirely inside the local plugin UI.\n\n1. Open the local UI Setup sidebar\n2. Enter your email and click `Connect with email`\n3. Enter the 6-digit OTP from your inbox\n4. The plugin verifies or creates your EchoMemory account, writes a new scoped `ec_...` API key to `~/.openclaw/.env`, and refreshes into connected mode\n\nManual fallback:\n\n1. Expand `Advanced: enter API key manually` in the Setup sidebar\n2. Paste an existing `ec_...` API key and save\n3. If you need to manage keys on the website, open `https://www.iditor.com/api` after logging in\n\nRecommended API key scopes:\n\n- `ingest:write` for markdown sync\n- `memory:read` for retrieval and `/echo-memory search`\n\n## Required Config\n\n- `apiKey`: EchoMemory API key starting with `ec_`\n\nOpenClaw host requirement:\n\n- In `~/.openclaw/openclaw.json`, set `tools.profile` to `\"full\"`. The default `\"coding\"` profile is too restrictive for normal Echo Memory plugin usage and can block tool access or privacy-sensitive flows.\n\nOptional config:\n\n- `memoryDir`: absolute path to the markdown memory directory\n- `autoSync`: default `true`\n- `localUiAutoOpenOnGatewayStart`: default `true` on local desktop runs, but browser launch is skipped automatically for SSH/CI/headless sessions\n- `localUiAutoInstall`: default `true`; automatically runs `npm install` and `npm run build` for `lib/local-ui` when assets are missing\n- `syncIntervalMinutes`: default `15`, minimum `15`\n- `batchSize`: default `10`\n- `requestTimeoutMs`: default `300000`\n\nPath resolution order for `memoryDir`:\n\n1. `plugins.entries.echo-memory-cloud-openclaw-plugin.config.memoryDir`\n2. `ECHOMEM_MEMORY_DIR`\n3. `~/.openclaw/workspace/memory`\n\nSupported runtime `.env` locations:\n\n- `~/.openclaw/.env`\n\nLegacy one-release migration bridge:\n\n- if `~/.openclaw/.env` is missing, EchoMemory can still read `~/.moltbot/.env` or `~/.clawdbot/.env`\n- new saves and updated setup should go to `~/.openclaw/.env`\n\nSupported environment variables:\n\n- `ECHOMEM_API_KEY`\n- `ECHOMEM_MEMORY_DIR`\n- `ECHOMEM_AUTO_SYNC`\n- `ECHOMEM_LOCAL_UI_AUTO_OPEN_ON_GATEWAY_START`\n- `ECHOMEM_LOCAL_UI_AUTO_INSTALL`\n- `ECHOMEM_LOCAL_ONLY_MODE`\n- `ECHOMEM_SYNC_INTERVAL_MINUTES`\n- `ECHOMEM_BATCH_SIZE`\n- `ECHOMEM_REQUEST_TIMEOUT_MS`\n\nExample `~/.openclaw/.env`:\n\n```env\nECHOMEM_API_KEY=ec_your_key_here\nECHOMEM_MEMORY_DIR=C:\\Users\\your-user\\.openclaw\\workspace\\memory\nECHOMEM_AUTO_SYNC=false\nECHOMEM_LOCAL_UI_AUTO_OPEN_ON_GATEWAY_START=true\nECHOMEM_LOCAL_UI_AUTO_INSTALL=true\nECHOMEM_LOCAL_ONLY_MODE=false\nECHOMEM_SYNC_INTERVAL_MINUTES=15\nECHOMEM_BATCH_SIZE=10\nECHOMEM_REQUEST_TIMEOUT_MS=300000\n```\n\nExample `openclaw.json` config:\n\n```json5\n{\n  \"tools\": {\n    \"profile\": \"full\"\n  },\n  \"channels\": {\n    \"slack\": {\n      \"mode\": \"socket\",\n      \"enabled\": true,\n      \"groupPolicy\": \"allowlist\",\n      \"allowFrom\": [\"U1234567890\"], // replace with your slack user id\n      \"channels\": {\n        \"C0123456789\": { \"allow\": true }, // replace with your slack channel id\n      },\n    },\n  },\n  \"plugins\": {\n    \"entries\": {\n      \"echo-memory-cloud-openclaw-plugin\": {\n        \"enabled\": true,\n        \"config\": {\n          \"apiKey\": \"ec_your_key_here\",\n          \"memoryDir\": \"C:\\\\Users\\\\your-user\\\\.openclaw\\\\workspace\\\\memory\", // tweak it based on Mac or Windows environment\n          \"autoSync\": false,\n          \"localUiAutoOpenOnGatewayStart\": true,\n          \"localUiAutoInstall\": true,\n          \"syncIntervalMinutes\": 15,\n          \"batchSize\": 10,\n          \"requestTimeoutMs\": 300000,\n        },\n      },\n    },\n  },\n}\n```\n\nOlder configs may still include `baseUrl` or `webBaseUrl`. Those keys are deprecated, ignored by the plugin, and not needed for new installs.\n\n## Installation\n\n### Install from a local path\n\nVersion note:\n\n- on OpenClaw `2026.3.22+`, avoid bare plugin names during install because plugin source precedence changed\n- use an exact local path, `--link`, or the exact scoped npm package\n\nOn Windows, quote the path if your username or folders contain spaces:\n\n```powershell\nopenclaw plugins install \"C:\\Users\\Your Name\\Documents\\GitHub\\EchoMemory-Cloud-OpenClaw-Plugin\"\n```\n\nIf you are actively editing this repo and want OpenClaw to pick up changes directly, install it as a link:\n\n```powershell\nopenclaw plugins install --link \"C:\\Users\\Your Name\\Documents\\GitHub\\EchoMemory-Cloud-OpenClaw-Plugin\"\n```\n\nAfter installation:\n\n1. restart `openclaw gateway`\n2. keep the plugin config entry in `~/.openclaw/openclaw.json`\n3. set your `apiKey` and optional `memoryDir`\n\n### Successful load looks like this\n\nThese lines indicate the plugin was loaded successfully:\n\n- OpenClaw discovered the plugin path\n- `[echo-memory] No .env file found ... Using plugin config or process env.`\n- `[echo-memory] Installing local-ui dependencies...` on first run if `lib/local-ui/node_modules` is missing\n- `[echo-memory] Building local-ui frontend...` on first run if `lib/local-ui/dist/assets` is missing\n- `[echo-memory] Local workspace viewer: http://127.0.0.1:17823`\n- `[echo-memory] autoSync disabled` or normal sync startup logs\n\nThis warning is not fatal by itself:\n\n- `plugins.allow is empty; discovered non-bundled plugins may auto-load`\n\n## Slack Authorization\n\nIf Slack replies with `This command requires authorization`, the plugin is loaded but OpenClaw is blocking the command.\n\nThe usual fix is to authorize your Slack user ID in one of these places:\n\n- `channels.slack.allowFrom`\n- `channels.slack.channels.\u003cchannelId\u003e.users`\n\nExample:\n\n```json5\n{\n  \"channels\": {\n    \"slack\": {\n      \"groupPolicy\": \"allowlist\",\n      \"allowFrom\": [\"U1234567890\"],\n      \"channels\": {\n        \"C0123456789\": {\n          \"allow\": true,\n        },\n      },\n    },\n  },\n}\n```\n\nFor a narrow per-channel allowlist:\n\n```json5\n{\n  \"channels\": {\n    \"slack\": {\n      \"channels\": {\n        \"C0123456789\": {\n          \"allow\": true,\n          \"users\": [\"U1234567890\"],\n        },\n      },\n    },\n  },\n}\n```\n\nAfter changing Slack auth config, restart `openclaw gateway`.\n\n## Commands\n\n- `/echo-memory status`\n- `/echo-memory view`\n- `/echo-memory sync`\n- `/echo-memory whoami`\n- `/echo-memory search \u003cquery\u003e`\n- `/echo-memory graph`\n- `/echo-memory graph public`\n- `/echo-memory onboard`\n- `/echo-memory help`\n\n## Local UI\n\nThe plugin starts a localhost workspace UI during gateway startup and can auto-open it in the default browser on local desktop machines.\n\n- first run can automatically trigger `npm install` and `npm run build` under `lib/local-ui`\n- browser auto-open is skipped automatically for SSH, CI, and headless Linux sessions\n- when the gateway restarts, an already-open local UI tab reconnects and refreshes itself instead of spawning a redundant new tab\n- `/echo-memory view` returns the current localhost URL for the local markdown workspace UI and also tries to open the browser\n- natural-language requests can use the `echo_memory_local_ui` tool to get the exact live URL instead of guessing the port\n- the local markdown archive stays fully browsable even when no Echo Cloud API key is configured\n- a left-side hover rail in the local UI shows setup instructions, masked current values, and can save updated credentials into your local `.env` file\n- removing the API key from the sidebar forces `ECHOMEM_LOCAL_ONLY_MODE=true`, which suppresses any remaining API key from `openclaw.json`, `.env`, or inherited process env on future loads\n\nGraph link behavior:\n\n- `/echo-memory graph` opens `https://www.iditor.com/login?next=/memory-graph` so you log in again before accessing your private personal memory graph\n- `/echo-memory graph public` opens the shared public memories page at `https://www.iditor.com/memories`\n- the local workspace UI and the cloud memory graph are different surfaces: the local UI reads local markdown files on localhost, while graph commands open iditor.com pages\n- if the user asks to \"view memories\" without saying graph, public page, or iditor.com, prefer `/echo-memory view`\n\nOnboarding behavior:\n\n- `/echo-memory onboard` returns the full setup and usage guide\n- natural-language signup, account setup, API key, and plugin setup questions should trigger the onboarding tool during normal chat instead of generic model knowledge\n- if the plugin seems blocked by permission or privacy restrictions, check that `tools.profile` is set to `\"full\"` in `openclaw.json`\n\nRecommended Slack smoke test order:\n\n1. `/echo-memory whoami`\n2. `/echo-memory status`\n3. `/echo-memory sync`\n4. `/echo-memory search \u003cknown memory topic\u003e`\n\nIn channels, you may need to mention the bot depending on your Slack/OpenClaw setup:\n\n```text\n@OpenClaw /echo-memory whoami\n@OpenClaw /echo-memory search project timeline\n```\n\n## Natural Retrieval In Chat\n\nWhen the plugin is loaded, it registers an `echo_memory_search` tool and appends prompt guidance for Slack conversations.\n\nNormal chat retrieval works like this:\n\n1. a Slack message arrives\n2. OpenClaw builds the prompt\n3. the plugin tells the model that EchoMem search is available\n4. the model decides whether to call `echo_memory_search`\n5. if it calls the tool, EchoMem retrieval happens before the final reply\n\nThis means:\n\n- `/echo-memory search ...` is deterministic manual retrieval\n- normal chat retrieval is automatic but model-driven\n- memory search is not forced on every Slack message\n\nGood test prompt:\n\n```text\n@OpenClaw what do you remember about my notes on \u003ctopic\u003e?\n```\n\nWeak test prompt:\n\n```text\n@OpenClaw hi\n```\n\nIf prompt injection is disabled in OpenClaw plugin settings, manual search will still work, but the model will be less likely to use memory automatically in normal chat.\n\n## Search Behavior\n\nRetrieval is semantic, not raw full-text matching.\n\nThat means:\n\n- searching by topic or meaning usually works better than copying an exact phrase from markdown\n- `/echo-memory search` may return zero results if the query is too literal or too narrow\n- normal chat retrieval uses the same memory search path as the manual command\n\n## Troubleshooting\n\n### `plugin not found: echo-memory-cloud-openclaw-plugin`\n\nOpenClaw cannot find the installed plugin package yet.\n\nCheck:\n\n1. the plugin is actually installed\n2. the install path is quoted on Windows\n3. you restarted `openclaw gateway` after install\n\n### `error: too many arguments for 'install'`\n\nYour Windows path probably contains a space and was not quoted.\n\nUse:\n\n```powershell\nopenclaw plugins install \"C:\\Users\\Your Name\\Documents\\GitHub\\EchoMemory-Cloud-OpenClaw-Plugin\"\n```\n\n### Repo edits are not taking effect\n\nYou may have installed a copied plugin instead of a linked plugin.\n\nUse:\n\n```powershell\nopenclaw plugins install --link \"C:\\Users\\Your Name\\Documents\\GitHub\\EchoMemory-Cloud-OpenClaw-Plugin\"\n```\n\nIf a copied install already exists, uninstall it first or remove the stale extension directory before linking.\n\n### Slack says `This command requires authorization`\n\nThe fix is in OpenClaw Slack auth config, not in this plugin.\n\nAdd your Slack member ID to `channels.slack.allowFrom` or the channel-specific `users` list, then restart the gateway.\n\n### `/echo-memory search` returns no results\n\nCheck these in order:\n\n1. confirm the API key has `memory:read` or `mcp:tools`\n2. confirm the memories were actually imported with `/echo-memory status` and backend inspection\n3. try searching by topic or meaning, not only by a literal copied phrase\n4. if the problem persists, ask the service maintainer whether the deployed EchoMemory service is up to date\n\n### `.../rest/v1/api_keys 400`\n\nThis can be normal in older Supabase schema setups.\n\nEchoMem first tries to read `api_keys.scopes`. If that optional column does not exist, PostgREST may return `400`, then the code falls back to the legacy query. If the actual route continues and returns search or sync results, this `400` is not the root failure.\n\n### Timestamps do not match markdown filenames\n\nThis plugin sends the markdown filename and title information needed for date-based imports.\n\nExpected behavior:\n\n- embedded `YYYY-MM-DD` values in markdown titles or basenames should be used as the stored creation date\n- this should apply even if the filename contains other words around the date\n\nIf your imported timestamps still match import time instead of the markdown date, contact the EchoMemory service maintainer.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fatlas-graph-academy%2Fechomemory-cloud-openclaw-plugin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fatlas-graph-academy%2Fechomemory-cloud-openclaw-plugin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fatlas-graph-academy%2Fechomemory-cloud-openclaw-plugin/lists"}