Local-backend archives 0.10.1 (2026-10-20): Docker-mode local backends pull the Convex backend and dashboard images from ghcr.io/convex after Convex renamed its GitHub organization. Upgrade before the next image pull. An existing install can instead replace ghcr.io/get-convex/ with ghcr.io/convex/ in its compose file. The images are unchanged.
The crystal-memory OpenClaw plugin works on OpenClaw 2026.8+ through the typed hook runner: one prompt-build context block for recall and reinforcement, rate limiting on dispatch, and action-trigger warnings appended to the matching tool result. Older hosts keep the 0.10.0 hook path.
Each completed turn is captured exactly once. The `captureTurns` config key and the `MEMORY_CRYSTAL_CAPTURE_TURNS` environment override turn the plugin's own turn capture off, and OpenClaw 2026.8+ needs `allowConversationAccess` on the plugin entry.
v0.10.0 — 2026-10-05
`crystal_get_memory` is on both MCP servers and returns the full text of a visible memory after `crystal_recall` marks a result truncated. Channel and knowledge-base gating match recall, so a memory the caller may not see is reported as not found.
Both MCP servers share one message-lane contract. Callers can set `messageLimit`, `turnId`, and `excludeRecentMessagesMs` and receive trimmed, redacted `messageMatches`. `crystal_recall` no longer returns private-channel messages to an unscoped request.
New memories record the agent stamp known at creation. Capture writes an explicit or declared agent id, and extraction writes a stamp only when every source message carries the same label. Existing rows are not backfilled. Update and supersede never add, change, or remove a stamp.
Diagnostic logs redact user identifiers and email addresses, and identifier collection fails closed. Secret-shaped text is redacted on agent-facing reads. Update, edit, and supersede refuse a write that would replace a stored secret with a redaction placeholder unless `allowRedactedContent` is set.
Research-scoped API keys receive 401 on non-research endpoints. Stacks that cannot update should revoke scoped handoff keys rather than regenerate them.
Local installers default to reproducible, privacy-scrubbed 0.10.0 tar.gz and zip archives. Upgrades from 0.9.0, 0.9.1, 0.9.2, and 0.9.3 keep the existing local identity and data.
Recall can return early on a decisive identifier query, and new memories whose embedding fails are retried for about 31 hours. Work-channel memory visibility stays off unless `RECALL_WORK_CHANNEL_VISIBILITY` is turned on.
v0.9.3 — 2026-10-01
Local-backend artifact release: installers default to reproducible, privacy-scrubbed 0.9.3 tar.gz and zip archives; upgrades from 0.9.0, 0.9.1 and 0.9.2 keep local identity and data.
Unscoped message search and recent messages, wake (its recent block and its last-session block), `crystal_trace` snapshots and the message-derived counters of `reflect` no longer expose private peer or group conversations. The `crystal_recall` message lane is not changed by this release: an unscoped recall can still return messages from private channels; pass a `channel` to scope it. A later release changes the recall lane. 0.9.2 does not contain this fix. Versions 0.9.0, 0.9.1 and 0.9.2 are affected.
With the default empty allowlist, every bare-label channel is treated as private for unscoped requests. Set RECALL_WORK_CHANNEL_LABELS (comma separated) in the local Convex environment to keep chosen labels visible. Wake reads one channel, so pass channel to scope it.
Message search and recent requests carrying a channel or sessionKey are unchanged. Three exceptions: wake reads one channel only (pass channel; a sessionKey alone does not scope it); crystal_trace shows a private snapshot only to a request that names that snapshot's channel; reflect returns its counters only when the request carries a sessionKey (a channel alone no longer does).
convex/schema.ts is unchanged since 0.9.2, and nothing in the shipped delta is incompatible with 0.9.2, 0.9.1 or 0.9.0 data. Plugin, MCP-server and OpenClaw pins remain unchanged; the shared MCP health runtime version remains 0.9.0.
v0.9.2 — 2026-09-30
Local-backend artifact release: installers default to reproducible, privacy-scrubbed 0.9.2 tar.gz and zip archives; upgrades from 0.9.0 and 0.9.1 keep local identity and data.
Agent-facing reads redact secret-shaped text, writes refuse redaction placeholders that would replace stored secrets unless explicitly allowed, and revoked local API keys are rejected at authentication time.
The per-account request envelope uses multiplier 4 (MC_ACCOUNT_RATE_LIMIT_MULTIPLIER; 0 disables it) for finite-capacity accounts, and 429 responses report scope, limit, remaining requests and retry time. Installer-provisioned accounts use the unmetered self-hosted policy and remain unlimited. Separately, MC_MAX_ACTIVE_API_KEYS defaults to 150 for ordinary API-key minting; the local installer bridge is exempt.
Unauthenticated device-code lookup is removed.
The Docker installer handles missing provider keys without a controlling terminal. The 0.9.0 and 0.9.1 archives have the silent-exit defect; use a terminal or export the provider keys those versions prompt for.
v0.9.1 — 2026-09-29
Local-backend artifact release: installers default to reproducible, privacy-scrubbed 0.9.1 tar.gz and zip archives; upgrades from 0.9.0 preserve local identity.
Agent-facing memory, knowledge-base, checkpoint, trace and asset reads redact secret-shaped text, omit internal deduplication text and guard title and content edits containing redaction placeholders. Raw memory export remains unchanged.
Research writes enforce bound channel and promotion knowledge-base restrictions; durable findings are stored again with deferred embedding.
First boot shares a versioned bootstrap contract, handles spent tokens and bounds retries to one hour from the first attempt. The only shipped schema change is an optional bootstrap timestamp.
Asset uploads avoid repeated body reads, and invalid device codes count toward authorization rate limits.
Memory-by-id visibility protection is retained from 0.9.0. The full redacted-write guard and API-key revocation parity ship in 0.9.2. Plugin, MCP-server, OpenClaw pins and the shared runtime health version are unchanged.
v0.9.0 — 2026-09-07
Lean completed-turn capture persists once idempotently without per-turn inference; durable extraction remains bounded and demand-driven.
Default recall is bounded and deterministic across durable memory and recent unextracted messages. Knowledge bases, assets, and research remain available through explicit requests.
Organic cognition, Brain, derived graph/association ranking, raw-message vectors, and unconditional cognition schedules are retired. Legacy dashboard URLs redirect with a one-time explanation while authored memories remain available.
Plugin, local and hosted MCP, web, installer, documentation, and release identities align on v0.9.0.
Local-backend v0.9.0 artifact is published; --backend local installs succeed again after the live installer returned a 404 since 2026-09-08.
Local identities no longer derive from the local-backend version. The seed is API-key-only, and an existing usable local-auth.json identity is kept verbatim across re-runs and upgrades.
Upgrading from 0.8.x keeps your local identity. If you re-ran the installer while the 0.9.0 download was unavailable (2026-09-08 to this release), the installer restores your previous identity from its automatic backup.
The self-hosted archive is built with the same privacy scrubbing as the public source mirror, and builds are reproducible (SOURCE_DATE_EPOCH).
v0.8.22 — 2026-08-04
Recall results include provenance and staleness. Surfaced memories are reinforced, contradicted memories fade toward their successors, and time-sensitive queries favor recent information.
Hygiene worklists and daily-driver UX: stale-memory, graph-lint and concept-gap worklists turn "memory feels noisy" into a concrete list of ids, plus an L0 core tier, future-recall questions, and an overnight brief. crystal_health reports the worklist grouped by severity with triage context.
The installer is now table-driven. install.sh, install.ps1 and uninstall.sh read a capability table (install-assets/platforms.json) describing each platform's config path and format, MCP registration method, hook support and skills directory, instead of per-target shell functions. Adding a platform is a table row; behaviour for all nine existing targets is unchanged.
One account, multiple sign-in methods: password, Google and GitHub sign-ins unify onto a single identity instead of silently creating a second user row.
API-key callers can identify their own account. /api/mcp/auth, the new /api/mcp/whoami, /api/mcp/stats and recall diagnostics return the account email and name alongside the opaque userId, so identifying a key no longer requires a dashboard login.
Removed the misspelled crystal_supercede alias, which occupied a second agent-facing tool slot. crystal_supersede is the tool; the handler and the /api/mcp/supercede route still accept the old spelling so cached clients keep working.
Fixed plugin update integrity (checksums now cover only the files update.sh downloads).
v0.8.21 — 2026-07-22
Memory Crystal skill suite: the installer now ships five cross-CLI skills (crystal-brief, crystal-kb, crystal-architect, crystal-hygiene, crystal-checkpoint) to Claude Code, Codex CLI/Desktop, and OpenCode, with a freshness policy for stale-fact supersession. Opt out with --no-skills; skills only call crystal_* MCP tools and never edit agent config files.
Per-agent knowledge-base priority weights: an optional agentPriorities map scales a KB's contribution to ambient recall ranking per requesting agent, so an agent can read another persona's corpora on demand while its own knowledge keeps dominating auto-injection. Deliberate KB queries stay full strength and visibility is never affected.
OpenCode installation and knowledge-base agent access management are available. Proactive message distillation is opt-in.
Hosted production now runs on self-hosted Convex behind https://convex.memorycrystal.ai. Installers migrate managed configs still pointing at the retired generated hostname and refuse a decommissioned self-hosted URL with guidance.
Dashboard tabs renamed to Short Term Memory (/short-term-memory) and Long Term Memory (/long-term-memory), with permanent redirects and updated authenticated-route matching so existing links and deep-link sign-in flows keep working.
Duplicate non-KB saves are suppressed within the same scope. Near-duplicate merges preserve supersession links and never cross account or channel boundaries.
Installer --dry-run is strictly read-only again: it previously wrote real config files, including the API key, for the generic, Codex, Claude Desktop, OpenCode, and Hermes targets. Also fixed archive cleanup projection sync, projection backfill cursor stability, self-hosted recall latency and concurrency, and session-scoped plugin transcript search.
v0.8.20 — 2026-07-10
Durable research plane across Convex, HTTP, MCP, and the hosted dashboard: scoped collections, provenance/quarantine, artifacts, normalized items/variants, datasets, idempotent runs, rollups, promotions, lineage, bounded queries, export/restore, and durable job/shard orchestration.
Unified capacity policies now cover managed Free/Pro/Ultra/Unlimited and local self-hosting. Managed Unlimited and self_hosted_unmetered have no Memory Crystal product quota for request rate, memory/message/research records, research ingestion, storage admission, embedding calls, or graph enrichment; authentication and infrastructure safeguards remain enforced.
Local Convex supports embedded storage and optional Postgres deployment, with backup and restore commands.
Recall preserves MCP metadata, accepts the documented limit range, handles later ordinal wording, and recognizes repository slugs.
Permanent and empty KB deletion now pages high-fanout child relations before deleting parent memories, fixing archived zero-count KBs that exceeded Convex's 4,096-read transaction limit while preserving ownership checks and exact dashboard accounting.
v0.8.19 — 2026-07-08
Programmatic KB maintenance tools: upsert-by-key import (a chunk's `dedupeKey` replaces the matching chunk in place instead of appending — one key = one chunk), cursor-paginated `GET /api/knowledge-bases/{id}/memories` + `crystal_list_knowledge_base_memories` to enumerate every chunk with ids, and `POST /api/knowledge-bases/{id}/empty` + `crystal_empty_knowledge_base` to clear a KB while keeping its id/bindings. Each listed id works with `crystal_update` (edit in place) and `crystal_forget` (delete). Exposed on both the OpenClaw plugin and the MCP servers.
Security (P0): closed a cross-client recall leak on multi-client accounts. Non-KB memories tagged with a bare peer-capable scope (no `:<peerId>`) no longer prefix-match every peer (broad/absent peer recall fails closed), and per-client dossiers stored as knowledge-base chunks are now peer-filtered at the chunk level on every read path (recall, query_knowledge_base, wake, and the graph tools). Channel-less shared corpora are unaffected; verified with a multi-peer filter-replay simulation showing zero cross-peer leakage.
Time-based message retrieval: `POST /api/mcp/search-messages` accepts a time window (`fromMs`/`toMs` or ISO `startDate`/`endDate`) plus `offset` pagination, with the result cap raised 20→100 and `pagination`/`window` in the response — so agents can answer "what did X say last month about Y" and page the full set instead of assuming the first page is complete. `recent-messages` and the recall message lane honor the same window; all of it stays channel-isolated.
Fixed a Convex Database I/O blowout in the STM message-retirement pipeline (an O(N²) scan plus a churn loop) and cut recurring database bandwidth further (seek-only graph backfill, indexed KB text search, capped graph evidence); fixed permanent knowledge-base deletion and added reflection-history pagination.
Release/version surfaces now target v0.8.19.
v0.8.18 — 2026-07-02
Recall now surfaces 12 memories by default (was 10; cap still 20) with 800-character previews and a 12,500-character injection budget, shipped fleet-wide across the OpenClaw plugin, Hermes plugin, backend, MCP servers, and hooks.
Because compact recallText is on by default, the richer 12×800 window costs fewer tokens than the old 10×750 baseline — higher quality and lower cost.
The installer no longer pins the stale 2.5s auto-recall timeout that suppressed memory injection on large accounts; re-running the installer auto-migrates existing installs to the 8s default, and no recall-quality values are pinned anymore.
`/api/mcp/recall` honors the fleet-wide default limit for callers that omit `limit`, so hook and API clients get the same recall depth as every other surface.
Self-hosted mirror fix: the public mirror strips hosted-only cron registrations whose modules are excluded, so self-hosted deploys no longer fail on missing modules.
Closed all outstanding dependency security advisories (form-data, ws, vite, postcss, js-yaml patched; Wrangler 4 clears the rest) — npm audit is clean.
Release/version surfaces now target v0.8.18.
v0.8.17 — 2026-07-02
Recall now returns up to 10 memories by default across every client (hard cap 20), with 750-character previews and an ~11k-character injection window — both env-configurable via `MEMORY_CRYSTAL_MAX_MEMORIES` and `MEMORY_CRYSTAL_PREVIEW_CHARS`.
Hermes auto-recall budget raised 2.5s → 8s with timeouts counted separately from hard errors, so a slow first-turn recall no longer trips the circuit breaker and silently disables memory injection.
Peer-scoped agents no longer get zero knowledge-base results: every client resolves and sends an explicit `agentId`, and the backend falls back to broad user-scoped KB visibility instead of returning nothing when a channel-derived agent matches no KB.
Group channels (`discord:group:*`, `slack:group:*`) fail closed to exact-match visibility, and knowledge-base config-header chunks are tagged (`chunkKind`) and dropped from recall automatically.
New idempotent turn capture: `POST /api/mcp/turn` deduplicates by turn id, and the OpenClaw plugin natively captures completed turns on all channels — including Telegram/Discord peer sessions where host lifecycle events don't fire.
Token-efficient compact recall: extraction writes a telegraphic `recallText` alongside full content (never modified), injected by default for roughly 30–50% lower recall token cost; legacy memories compress lazily via a cost-bounded hourly backfill.
New `GET /api/memories` export: API-key-scoped, cursor-paginated, with store/category/date filters for migration and data-portability flows.
Codex Desktop is now auto-configured by the universal installer via the shared `~/.codex/config.toml`, and `crystal-doctor` gained advisory host-compatibility warnings backed by `testedWith` metadata in every plugin manifest.
All recurring background jobs moved off full-table user scans onto bounded, cursor-paginated rotations, cutting recurring database read costs.
Dashboard: branded confirm/alert dialogs replace native browser popups, and archived knowledge bases can be unarchived.
Release/version surfaces now target v0.8.17.
v0.8.16 — 2026-06-30
Recall ranking now treats knowledge-base `sourceRole` as a first-class signal, helping direct reference material such as brand voice guides, persona guardrails, and canonical references outrank unrelated artifacts.
Recall-style tools preserve and document `agentId`, `projectId`, and `repoSlug` across Codex, Claude, Hermes, OpenClaw, and MCP clients so repo-specific work can stay attached to the right project store.
Knowledge-base lookup remains separate from broad recall; KB list/query calls keep agent/channel visibility explicit while recall can still append scoped KB evidence when relevant.
Graph telemetry reports actionable enrichment separately from deterministic skips, so KB chunk fanout rows no longer make fully processed accounts look partially unenriched.
Docs and plugin guidance now distinguish recall, knowledge-base lookup, message search, and preflight usage for OpenClaw, Hermes, Claude, Codex, and MCP agents.
Release/version surfaces now target v0.8.16.
v0.8.15 — 2026-06-25
Recall payload de-duplication — `/api/mcp/recall` collapses byte-identical memories before the result limit so cloned copies no longer crowd out distinct results.
Near-duplicate chunk collapse — recall keeps only the highest-scored representative of overlapping source chunks (same title + identical long prefix), so the model no longer reads the same opening repeated many times; distinct memories are untouched.
Knowledge-base recall hits now honor the request category filter and de-duplicate against already-returned content, keeping category-scoped recalls and pre-flight checks focused.
Direct knowledge-base queries on owned permissive KBs resolve the KB's own agent id when `agentId` is omitted instead of returning nothing; strict peer-scoped KBs still require an explicit peer scope.
`crystal_recall` and `crystal_preflight` emit a compact structured index instead of a second verbatim copy of every memory and its ranking signals.
Memory consolidation no longer crashes on accounts with sensory bloat — the sensory fetch reads a single bounded page instead of looping a paginated query, restoring automatic sensory distillation.
Release/version surfaces now target v0.8.15.
v0.8.14 — 2026-06-14
Knowledge-base retrieval for peer-scoped agents — KB queries now authorize by runtime agent id instead of treating peer channels as hard KB content filters.
KB-scoped recall isolation — `/api/mcp/recall` honors singular `knowledgeBaseId` and plural `knowledgeBaseIds` as exclusive KB scopes so unrelated general memories are not returned.
OpenClaw KB tools now pass the runtime agent id by default, restoring training KB access for channel-scoped agent sessions.
Recall and embedding resilience — managed-embedding fallback, tiered KB vector depth, and cost-breaker degradation preserve paid recall quality under provider caps.
Version surfaces, Hermes metadata, installer defaults, and local-backend installer artifacts now target v0.8.14.
v0.8.13 — 2026-06-08
Prompt echo injection hardening — compact recall evidence now sanitizes echoed user prompt text before injecting the `Question:` label into model context.
Workflow skill injection and rendered recent-message match headers now reuse the same prompt-echo sanitizer, so instruction-like prompt lines are stripped consistently before model/tool exposure.
0.8-series roll-up notes now cover every release since the 0.8.0 major local-backend lane, including retention/reflection, admin/BYOK, cloud/self-hosted, Hermes, multimodal, cost-control, OpenClaw capture, and diagnostics work.
Release/version surfaces and local-backend installer artifacts now target v0.8.13.
v0.8.12 — 2026-06-06
`crystal_doctor` now reports hook registration API, registered hook names, registration time, last hook event, last resolved session/channel, and last hook skip reason.
Provider dispatch gaps are now explicit — doctor warns when Memory Crystal hooks are registered but no callbacks have fired since plugin load.
`crystal_status` includes a compact hook summary next to callback counters for faster runtime triage.
Release/version surfaces and local-backend installer artifacts now target v0.8.12.
v0.8.11 — 2026-06-06
OpenClaw channel capture hardening — peer-scoped policies now accept live provider-peer direct session keys like `telegram:<peerId>` when the hook context identifies the matching agent/account.
Fail-closed scoping — unidentified provider-peer direct sessions no longer degrade into a shared bucket, while exact scoped channel ids like `<scope>:<peerId>` are honored when OpenClaw supplies them.
Installer repair — plugin install assets serve `openclaw-hook.json` again and OpenClaw installer verification checks registered Memory Crystal memory tools instead of obsolete legacy hook output.
Automatic capture defaults — Hermes group/public writes now default on under scoped Automatic Capture Coverage and remain opt-out with `MEMORY_CRYSTAL_ALLOW_GROUP_WRITES=false`.
v0.8.10 — 2026-06-06
OpenClaw capture fallback — the plugin now registers `agent_end` and writes completed direct agent turns through `/api/mcp/turn` when older message hooks do not fire.
STM/LTM recovery — completed-turn capture stores the user and assistant transcript atomically and schedules on-demand long-term memory extraction.
Diagnostics — `crystal_doctor` now reports the `agent_end` callback counter so operators can distinguish hook dispatch from backend/auth problems.
v0.8.9 — 2026-06-06
OpenClaw latest support — the native plugin manifest now declares every registered tool in `contracts.tools`, matching OpenClaw 2026.6.1 plugin diagnostics.
Release hygiene — OpenClaw plugin metadata and installer defaults moved to v0.8.9 so updater installs pick up the latest manifest contract.
v0.8.8 — 2026-06-06
Hermes diagnostics — `crystal_doctor` reports backend, mode, queue, tool-surface, and scoping status in human-readable form.
Native provider boundary — Hermes lifecycle events create automatic snapshots while explicit `crystal_checkpoint` remains the manual Memory Checkpoint path.
Recall resilience — automatic Hermes recall uses a shorter timeout with stale cached-context fallback; explicit tool recalls keep the longer interactive timeout.
Queued capture — Hermes turn capture now runs through a bounded background queue with shutdown flushing and visible degraded/drop status.
Strict group and peer scopes — Discord-style group ids, sender/user aliases, opt-in group writes, and `MEMORY_CRYSTAL_AGENT_SCOPE` reduce accidental scope bleed.
Profile-aware install — the installer updates default, existing profile, and active `HERMES_PROFILE` plugin bundles without clobbering unrelated Hermes config.
Fallback-only provider tools — native provider memory remains primary, and exact bridge tools hide when MCP is configured unless explicitly forced.
Release hygiene — docs, changelog, installer defaults, Hermes metadata, and local-backend release assets moved to v0.8.8.
v0.8.7 — 2026-06-02
Convex cost breakers — recall, message search, and knowledge-base search now debit user and global emergency budgets before expensive vector/text search work.
Normal recall preserved — MCP recall, direct recall, message search, KB search, and prospective trace matching keep normal sources available until an explicit emergency threshold trips.
Message search efficiency — vector hits are batch-hydrated instead of fetching one message per result.
Hot-write reduction — API-key `lastUsedAt` updates use a one-hour freshness SLA, and recall access bookkeeping is scheduled off the response path where safe.
Production cost smoke — release tooling can parse Convex JSONL logs for vector/text query bytes, DB reads, OCC retries, and errors.
Cleanup and Organic polish — cleanup selectors/auth writes were tightened, Organic access/pricing docs were clarified, and admin sort indicators use conventional affordances.
Release hygiene — version surfaces, docs, changelog, installer defaults, Hermes metadata, and local-backend release assets moved to v0.8.7.
v0.8.6 — 2026-05-29
Multimodal asset memory — Convex Storage-backed upload metadata, ownership checks, quota accounting, checksums, authenticated access descriptors, processing state, derived memory links, and cleanup state now ship together.
Asset-aware recall — compact file-derived summaries can be recalled without exposing raw files, storage ids, or permanent public URLs to model context.
Dashboard asset operations — new asset and admin storage surfaces expose multimodal memory state, storage usage, and processing outcomes.
The public benchmark page includes results and source attribution for memory-score comparisons.
Provider settings, recall scope handling, and long-session payload handling have safer defaults.
Storage safety — malformed asset checksums are rejected, cleanup/enrichment failures remain observable, uploaded byte counts are recorded, and zero-byte metadata no longer inflates usage.
v0.8.5 — 2026-05-14
Hermes production readiness — Memory Crystal now registers as a native Hermes memory provider when available, with lifecycle-hook fallback for compatibility.
Automatic Hermes memory lifecycle — bounded wake/recall, turn capture, memory-write mirroring, session checkpoints, delegation capture, and provider tool handling now work without depending on model-initiated MCP calls.
Canonical turn capture — `/api/mcp/turn` stores completed user/assistant turns atomically and idempotently, then schedules on-demand long-term memory extraction.
Privacy-safe provider tools — provider fallback tool calls inject exact `sessionKey` and `channel` scope by default while preserving explicit scopes.
Hermes installer and uninstall hardening — installs write explicit mode/capture/recall/group-write flags, and the universal uninstall script now supports `--targets hermes`.
Diagnostics — `crystal_status` reports active lifecycle mode, backend auth, capture/recall toggles, hook counts, skip reasons, capture mode, and circuit-breaker state without secrets.
Release hygiene — version surfaces, docs, changelog, installer defaults, Hermes metadata, and local-backend release assets moved to v0.8.5.
v0.8.4 — 2026-05-05
Cloud/self-hosted launch path — signed-in onboarding, tenant launch pages, bootstrap recovery, API-key management, deploy-target gating, and cloud-only route protection keep hosted SaaS flows separate from self-hosted builds.
Self-hosted Docker services support tenant bootstrap and recovery, with local authentication.
Hermes Agent integration — the universal installer, web install tabs, docs, install asset routes, and `integrations/hermes/` package now support Hermes Agent.
Embedding calls apply daily limits before contacting providers, and graph enrichment tracks provider use.
Embedding migration safety — dual-write and reconcile paths keep extracted memory embeddings aligned while hot reads move away from large inline vectors.
Admin operations — admin settings and grant-tier surfaces cover provider/model/embedding controls while preserving secret staging and role gates.
Release hygiene — the release prompt, public mirror, and local-backend packaging now strip hosted cloud/admin/billing/pricing internals for v0.8.4.
v0.8.3 — 2026-04-30
Admin overview — a new admin landing page summarizes users, signups, paid/trialing subscribers, MRR, projected period revenue, and plan-level revenue by selectable range.
Admin user lookup — the user directory now resolves and searches auth profile names and emails alongside user IDs and billing IDs.
Cost analytics and BYOK accounting — admins get category spend, revenue, margin, unknown-cost flags, provider-key attribution, and normalized plan pricing including grandfathered Pro at $20 MRR.
Recall/reflection telemetry — surfaced memory/message retrieval, enrichment status, reflection logs, and retention cleanup status now line up across backend and dashboard views.
Peer-scoped KB tooling — hosted MCP/package MCP and the plugin expose knowledge-base creation while preserving stricter peer-channel recall/search behavior.
The local context engine reports queue, summary, and replay health more clearly.
Plugin version bump — OpenClaw plugin manifest/package metadata and installer defaults moved to v0.8.3 for this release.
v0.8.2 — 2026-04-28
Sensory retention — raw sensory memory content can now be summarized, tombstoned, or protected while durable recall text and dashboard totals remain intact.
Reflection surfaces — retention-aware reflection logs and a new dashboard reflection route make distilled memory state easier to inspect.
Universal installer — cloud, local, and self-hosted flows now cover OpenClaw, Claude, Codex, Factory Droid, generic MCP, and local backend targets with Codex hook support.
Provider-key separation — `GEMINI_API_KEY` and optional `OPENROUTER_API_KEY` are backend provider keys; `MEMORY_CRYSTAL_API_KEY` remains client bearer auth.
Local backend artifacts — installers default to release-versioned v0.8.2 backend packages and print the local Convex dashboard URL/admin key after setup.
Dashboard refresh — memory/message rendering, Organic pages, telemetry, admin, and the sharp flat visual hierarchy were updated together.
Backend-owned recall — legacy OpenClaw recall hooks now send query text to `/api/mcp/recall` so hosted/self-hosted backends own embedding and search.
Plugin version bump — OpenClaw plugin manifest/package metadata moved to v0.8.2 for this release.
v0.8.1 — 2026-04-27
Capture hygiene — leading recalled-context envelopes are stripped before user turns are written to STM across the OpenClaw plugin, shared hooks, web-served hook assets, and Convex backend.
Cleanup tooling — admins can dry-run or apply recalled-context STM cleanup with safe scope validation, malformed-row deletion, stale index reset, and exact-scope duplicate merge-delete handling.
Quota fix — MCP log writes skip wrapper-only synthetic user payloads before checking STM storage limits.
Dashboard readability — memory and message cards now render known pseudo-tag sections cleanly and keep a raw/full text disclosure for inspection.
Removed obsolete client-specific purge code — the unused Convex purge module and admin wrappers are gone.
v0.8.0 — 2026-04-25
Major local Convex developer backend — Docker-primary self-hosted Convex stack with pinned backend/dashboard images, local dashboard, health checks, reset/down/up lifecycle, and documented version pins.
One-switch local wiring — managed env overlays retarget the web app, MCP server, scripts, and OpenClaw plugin together while preserving production/cloud defaults.
Docs — docs/LOCAL_DEV.md now covers local Convex setup, seeding, doctor checks, rollback to cloud defaults, troubleshooting, and version-pin updates.
Included 0.7.17 capture observability — capture-stall telemetry, /api/mcp/metric ingestion, doctor smoke callback dumps, and assistant-side duplicate suppression are part of this 0.8.0 release note set.
v0.7.18 — 2026-04-25
Capture telemetry hardening — `crystalTelemetry` rows now expire, cleanup removes old telemetry, and `/api/mcp/metric` validates metric names, payload size, and scope length before insert.
Organic contradiction flow — contradiction scans now wait for ensemble writes, recently resolved pairs suppress re-alerts for 30 days, and daily alert budget is checked before expensive LLM work.
MCP contradiction passthrough — stdio and hosted write tools preserve backend `contradiction` / `contradictionCheck` metadata through text and structured responses.
Brain dashboard loading now uses the full page skeleton.
v0.7.16 — 2026-04-21
Infrastructure — default Convex HTTP host updated to `https://convex.memorycrystal.ai`. OAuth consent, MCP endpoints, and the plugin's default `convexUrl` now use the Memory Crystal custom domain instead of the Convex-generated subdomain. Existing installs require no action — the old URL continues to work; plugins organically upgrade on next installer run.
Security — patched 10 Dependabot advisories (2 HIGH, 8 MEDIUM) via root npm overrides: vite 7.3.2, hono 4.12.14, @hono/node-server 1.19.13. Supply-chain hygiene only — call-graph trace confirmed no runtime exposure (vulnerable vite dev server, hono serveStatic/toSSG/ipRestriction/cookie helpers are not invoked by Memory Crystal). No backend redeploy required.
Trigger lookup uses targeted indexes instead of broad memory scans.
Organic Pulse Engine intervals now clamp to one hour or longer; supported tiers are 1h, 2h, 4h, 8h, 12h, and 24h.
Each user can pause or resume their own Pulse Engine without affecting other tenants.
Maintenance read paths for duplicate checks, salience, consolidation, and decay now use targeted indexes and tighter budgets.
New crystal_update and crystal_supersede / crystal_supercede tools support in-place memory edits and atomic memory replacement with lineage.
v0.7.15 — April 19, 2026
Peer-first `guardChannel` fallback — recall, session KB listing, MCP filter-visible-memories, and both knowledge-base query paths no longer fall back to the management sentinel when a peer caller omits channel. Missing channel now fails-closed on KBs with a concrete peer scope instead of silently upgrading to management visibility.
`getKBMemoriesInternal` chunk-level peer scope filter — the internal KB-chunk reader now mirrors `runKnowledgeBaseQuery`'s admission rules so permissive shared KBs no longer leak cross-peer chunks on `by_knowledge_base` index reads.
Shared-mode agent writes now route to `scope:main-<agentId>` — two shared agents under the same scope stop bleeding captures into one bucket. Single-shared-agent installs stay on `scope:main` (backward compatible).
KB-scoped BM25 candidate pool — `runKnowledgeBaseQuery` forwards `knowledgeBaseId` into `searchMemoriesByText` so lexical candidates are filtered to the target KB instead of competing with the user's entire corpus.
MCP API-key paths forward `channel` filter — `crystal_why_did_we`, `crystal_who_owns`, `crystal_dependency_chain`, and `crystal_explain_connection` now respect the channel argument on the HTTP recall branch. Hosted MCP consumers previously saw unscoped, cross-channel results from these four tools.
Server-side error logs sanitized — `crystal_recall`, `crystal_trace`, and the HTTP listener run error messages through an inline redactor that scrubs Bearer tokens, `sk-*` keys, and query-string secrets before writing to stderr.
`stdio` is the default MCP mode — `CRYSTAL_MCP_MODE` defaults to stdio; operators who want the HTTP listener must set `CRYSTAL_MCP_MODE=http` explicitly.
Obsidian writer hardened — category is validated against the Convex enum and filenames include the memory id suffix to prevent same-millisecond collision.
Pressure-log Maps bounded — `pressureEventState` and `hostCompactState` evict via stale-first / oldest-first policy when they exceed 500 entries (2h staleness window). Closes a slow heap-growth path on long-lived gateway processes.
`/api/mcp-auth` proxy no longer forwards cookie / set-cookie — the proxy uses Authorization: Bearer only. Blanket cookie forwarding created a confused-deputy credential-relay risk.
Polar checkout `plan` param validated against an allowlist (free, pro, ultra, starter) before PRODUCT_IDS lookup. Invalid plans redirect without reflecting attacker-supplied value.
Login `redirectTo` guard — rejects any redirectTo that does not start with a single `/` (blocks `//`, `/\`, non-relative paths) and falls back to `/dashboard`.
Small DX fixes — memory-formatter regex footgun removed, agent-scope policy Map memoized via WeakMap, `crystal_search_messages` forwards `agentId`, no-context Convex client cached in stdio mode.
v0.7.14 — April 16, 2026
OpenClaw supports both peer-scoped and shared agents through `agentScopePolicies`. These settings partition visibility within an account; use separate accounts for independent tenants.
Installer/enabler now auto-upgrade to full context-engine mode when local SQLite is actually available, while preserving explicit user config if you already set `contextEngineMode`, `localStoreEnabled`, or `dbPath`.
Knowledge bases configured with permissive peer access can be queried from peer-scoped sessions.
Peer-scoped knowledge bases use strict peer visibility by default.
New peerScopePolicy flag for explicit opt-in to cross-peer shared knowledge bases. Default is strict per-user isolation.
Observability metrics for KB peer-scoping enforcement — mc.metric.kb-peer-block and mc.metric.kb-chunk-drop track cross-peer access attempts and filtering events.
Kill-switch available via MC_KB_PEER_STRICT=false env var for rollback if needed without redeploy.
Archiving a KB chunk now correctly decrements memoryCount and totalChars on its knowledge base.
KB vector recall scoped at the index — queries against a knowledge base now filter the vector search by knowledgeBaseId and archived=false up front, so small KBs aren't crowded out by the rest of the user's corpus.
crystal_trace reason wording — memories written via direct API (crystal_remember and similar) no longer falsely report as 'predates conversation tracking'; the handler distinguishes direct-API writes from genuinely pre-tracking memories.
v0.7.13 — April 15, 2026
Per-turn Convex recall now fires in reduced mode — assemble() previously gated recall on mode === 'full', which meant default installs (localStoreEnabled: false) silently dropped per-turn memory injection and answered from training-data inference instead. Only 'hook-only' mode skips recall now; 'reduced' and 'full' both fetch.
Hard assemble-path injection ceiling — the plugin caps per-turn injected context at 12k chars combined (system context + local messages), dropping oldest local messages first and then truncating the convex context. Prevents runaway prompt growth on hot long-lived sessions regardless of host compaction behavior.
Tier-aware per-memory cap with sentence-boundary slicing — recall content caps at 1200 chars for knowledge-base chunks (book/course/podcast excerpts) and 600 chars for auto-extracted notes, replacing the previous flat 350-char trim. Truncation prefers paragraph breaks and sentence terminators inside the cap window so KB definitions no longer end mid-sentence.
Transient-channel metadata — assemble() returns additive `contextUsage: { crystalInjectedChars, crystalInjectedMessageCount, ephemeral: true }` alongside the existing contract. Hosts that honor it can exclude Crystal injection from session persistence; no-op if the host ignores.
Rate-limited pressure telemetry — new one-line `crystal_pressure` log per session per minute when injection is trimmed or exceeds 60% of the ceiling. Attribution fields (`hostCompactInvoked`, `hostCompactTokensReclaimed`) let us tell whether the host compaction trigger fires at all.
Safer defaults for hot lanes — `localSummaryInjection` defaults to `false` (opt in per-agent when you want it) and `defaultRecallLimit` defaults to `4` instead of `8`. Existing installs that explicitly set either key keep their behavior.
KB ranking weight is restored to 0.25; per-memory text caps keep the injection budget bounded.
Installer + updater fixes — 0.7.13's two new plugin modules (pressure-log.js and memory-formatter.js) are now included in install.sh, the three parity-locked update.sh copies, and the /install-assets/plugin/ route allowlist. Earlier 0.7.13 installs crashed with 'Cannot find module ./pressure-log' until this landed; force-reinstall once to pick up the fix.
Post-install verification now checks the context-engine capability binding and the before_agent_start hook instead of grepping for tool names. OpenClaw's context-aware tool factory produces anonymous tool closures, so the old name-based verification always reported failure on 0.7.12+ installs even when the plugin was healthy.
Convex client bumped to ^1.35.1 across root, apps/web, and mcp-server workspaces.
v0.7.12 — April 14, 2026
OpenClaw tool-context compatibility — Memory Crystal now registers cloud-backed tools through OpenClaw’s context-aware tool factory so sessionKey and delivery context survive into tool execution even when the execute-time ctx is sparse. Stock OpenClaw main sessions like `<session-key>` now retain enough identity for shared-lane recall without requiring a peer id or client-specific config override.
Shared-lane recall unblocked — read-path tools (crystal_recall, crystal_search_messages, crystal_what_do_i_know, crystal_why_did_we, crystal_debug_recall, crystal_preflight, crystal_recent, crystal_wake, memory_search) now accept session channels with `main`/`default`/`unknown` peer suffixes instead of hard-erroring on `Cannot resolve a safe channel scope for this session`. Captures remain strict so multi-peer content still cannot cross-pollinate a named scope.
Trusted shared-agent recall fallback — read-path recall/startup flows can reuse scoped :main/:default/:unknown channels for trusted agent:* sessions like <session-key> without widening write-path inference.
Optional `channel` parameter added to the read-path tools so callers can pin a session-specific channel explicitly when the automatic resolver cannot infer one.
Backend persistence hardened — crystal-enable now treats explicit memory backend overrides as the deliberate migration lever, keeps persisted plugin config authoritative over generic CONVEX_URL drift, validates MCP routes before persisting, and rejects HTTP 404 targets by default.
Doctor backend provenance — crystal_doctor now reports backend source and classifies route validation failures more clearly.
Dashboard Knowledge Base detail panel now renders an explicit `no longer available on the server` notice when the list row refers to a KB the backend doesn't return, instead of spinning in an infinite `Loading…` state.
v0.7.9 — April 13, 2026
Transport contract rewrite — legacy SSE MCP transport was removed; hosted Memory Crystal now standardizes on Streamable HTTP `/mcp`, while command-launched local MCP uses explicit `stdio` wiring
Knowledge Bases dashboard hardening — legacy or partially backfilled knowledge-base rows are now normalized server-side and rendered safely client-side, preventing the `toLocaleString` crash on the KB page
Auth and hosted parity fixes — API-key recall semantics were tightened, graph-style MCP tools no longer degrade API-key clients into hard errors, and MCP auth proxy header forwarding is more complete
Runtime/config hardening — doctor and generated OpenClaw/plugin configs now emit `stdio`/`http` intentionally instead of legacy `sse`, local live health checks are auth-aware, and hook-config dry runs redact secrets
Security and convergence fixes — device authorization now rate-limits brute-force attempts, impersonation targets are revalidated, purge/cleanup flows converge correctly, and email/template paths no longer leak placeholders or full-table scan admin logs
v0.7.8 — April 11, 2026
Claude Code, Codex, and Factory Droid hook integrations now install shared Memory Crystal auto-capture and auto-recall paths with browser-based device auth and scoped channel/session propagation
Peer-scoped agent memory reliability fixes — malformed scoped writes are normalized, same-peer message fallback is restored at session start, and cross-client leakage protections remain intact
Installer hardening — Codex/Claude/Droid hook installers now preserve unrelated hooks, repair invalid Codex hook layouts, and public hook assets are served directly from the web app
SessionStart noise reduction — startup hooks now emit a compact memory-active summary instead of dumping the full wake briefing and long-form instructions
Knowledge base imports now auto-chunk raw text while preserving explicit JSON chunk arrays and delimiter-based chunk boundaries
Gateway-safe local store mitigation — local SQLite compaction is now explicit via `localStoreEnabled`, defaults off for non-opted-in runtimes, and uses WAL/file-cache guardrails when enabled
Docs/publishing workflow improvements — public docs pull now fails fast on dirty local docs, and main/stable/release alignment is ready for the `0.7.8` release lane
v0.7.6 — April 4, 2026
Gemini cost guardrails — cron throttling (~96% reduction in graph enrichment frequency), circuit breaker (3-failure abort), daily call cap via GEMINI_DAILY_CALL_CAP env var
Embedding error logging — embedText logs status code, model, and truncated error; batchEmbedTexts returns all-null on 429/5xx to prevent amplification
Peer-scoped recall isolation — replaced ad-hoc channel filter with isNonKnowledgeBaseMemoryVisibleInChannel for consistent behavior
Fix: bare-prefix memory leakage blocked — memories under agent: no longer leak into agent:user-1
Fix: agent-prefix memories now surface correctly in peer channel recalls
Fix: global memories excluded from peer-scoped recall results
Unified CRYSTAL_API_KEY env var — single API key for all Gemini access; GEMINI_API_KEY remains as fallback
Per-tier Gemini controls — Free=no managed Gemini, Pro=500 calls/day cap, Ultra=unlimited with BYOK support
v0.7.5 — April 3, 2026
Gemini-native embeddings — all embedding paths unified on Gemini; OpenAI embedding codepath hard-disabled
Recall Query Logging — every recall is logged to organicRecallLog for training signal; actual usage feeds back into trace generation and validation
Conversation-Reactive Pulses — plugin fires an Organic pulse every 5 user turns, triggering background inference on active conversations
Procedural Memory Auto-Extraction — Organic engine extracts skill-structured procedural memories with triggers, steps, pitfalls, and verification criteria
Skills Dashboard — new /organic/skills page with filterable skill cards showing structured metadata (triggers, steps, pitfalls)
Dashboard Sub-Navigation — Organic section split into Overview, Ideas, Traces, Ensembles, Skills, and Settings sub-routes with horizontal tab navigation
Content Security Scanner — regex-based scanning on all memory create and update paths blocks prompt injection, encoded payloads, and credential patterns
Admin Notification Emails — lifecycle emails for new signups, subscriptions, cancellations, and trial events via SendGrid
Idea Email Digests — hourly cron checks for pending ideas past configurable delay, sends digest with lease mechanism to prevent double-sends
MCP crystal_ideas + crystal_idea_action tools — list, star, dismiss, and mark ideas as read from any MCP client
Fix: trace dedup — duplicate predictions now boost existing trace confidence instead of creating new rows
Fix: prediction quality gate — blocks traces under 5 words plus 15-pattern generic blocklist
Fix: archiveMemoryById ownership check — cross-tenant access now properly blocked
Fix: Unicode normalization bypass in content scanner — NFKC normalization applied before scanning
Fix: title field scanning on create paths — content scanner now covers title in captureMemory, createMemory, and createMemoryInternal
Fix: permanent delete updates dashboard totals
Fix: NaN display guards with Number.isFinite() fallback in frontend
Fix: email opt-in by default — no emails sent until user explicitly enables in settings
v0.6.4 — March 30, 2026
Recall Confidence Scoring — recall results now include composite confidence scores with 7 ranking signal breakdown (vector, strength, freshness, salience, text match, continuity, access)
Confidence labels — memories tagged [HIGH CONFIDENCE] (>= 0.85) or [low confidence] (< 0.5) in both plugin injection and MCP server output
Mandatory Recall Acknowledgment — high-confidence memories trigger a directive requiring agents to reference them; prevents agents from ignoring recalled context
Intent-Triggered Deep Recall — plugin proactive recall now varies depth by classified intent: questions get 8 results, reflect gets 6, commands get 5 in decision mode, general gets 3
crystal_forget tool — archive or permanently delete memories via tool call; supports both soft archive (recoverable) and permanent deletion
MCP server parity — confidence labels, mandatory acknowledgment, and permanent delete ported to MCP server (v0.3.1) for Claude Code, Codex, and Factory Droid users
Expandable trace viewer — Organic dashboard traces now click-to-expand with full predicted query, context, source pattern, and timestamps
View All Predictions — lazy-loaded view showing up to 1,000 active prospective traces (raised from 200/500 cap)
Fix: pulse interval buttons no longer stuck disabled after first save
Fix: spend estimates re-price dynamically when model selection changes
Fix: sensory noise purge now scans all memories correctly with broadened pattern matching
Fix: full memory scan for telemetry stats with loading indicator
OpenRouter integration — organic model calls routed through OpenRouter for unified cost tracking across all providers
Standalone Knowledge Bases page with dedicated nav entry
v0.6.3 — March 29, 2026
Organic Memory Engine v2 — self-scheduling pulse engine replaces cron-based ticks for sub-minute intervals down to real-time (Live mode)
Multi-provider model selection — choose from 6 tiers across OpenAI, Google, and Anthropic: Potato (GPT-5 Nano), Low (Gemini 2.0 Flash-Lite), Medium (Gemini 2.5 Flash), High (GPT-4.1 Mini), Ultra (Gemini 3.1 Pro), Sonnet (Claude Sonnet 4.6)
Spend telemetry — estimated per-pulse cost in USD with daily/weekly/monthly projections on the Organic dashboard
Per-user pulse intervals — configurable from Live (0ms) through 60 minutes with clean tier selector UI
Knowledge Bases — first-class agent-scoped knowledge collections that are enrichable but never decay; replaces local training files with MC-backed queryable memory
Pulse terminology — renamed 'tick' to 'pulse' across UI and backend wrappers for cohesive product language
Inline help icons — tap-friendly metric explanations on all Organic dashboard cards (mobile-safe, no hover dependency)
Run history — recent pulse runs with duration, trace count, and cost visible on the dashboard
Open-sourced Organic Memory Engine, Knowledge Bases, crons, and schema — everything except the web app is now public
v0.6.2 — March 28, 2026
Organic Memory Engine — memory ensembles, contradiction detection, and resonance analysis run as background intelligence on your memory graph
Prospective traces — Memory Crystal now anticipates likely follow-up questions and pre-stages context before you ask
Parallel recall pipeline — organic traces serve alongside standard recall for richer, more anticipatory responses
Parallelized tick engine — ensemble clustering, contradiction scanning, and resonance detection now run concurrently per user
Safety caps on all background query paths — bounded collection prevents unbounded memory growth
Schema robustness — crystalSessions and crystalWakeState userId fields made optional for forward compatibility
joinedAt tracking on ensemble memberships — new/existing member classification now uses actual join time
v0.6.1 — March 27, 2026
Dynamic per-session channelScope override — agents can now switch channel scope at session start without changing plugin config
Per-call channel parameter on all MCP tools — pass channel on individual tool calls for fine-grained memory isolation
peekRateLimit utility and /api/mcp/rate-limit-check endpoint — check remaining rate limit budget before making calls
v0.6.0 — March 25, 2026
Lossless pre-compaction snapshots: full conversation is now saved before compaction runs — even if summarization loses nuance, the original is recoverable
crystal_trace tool: trace any memory back to the conversation snapshot that created it — drill from summary to raw messages
Prompt-aware context injection: local summaries are searched for relevance to the current prompt and injected before the LLM sees the context — surfaces buried but relevant memories
FTS5 with porter stemming: local summary search now uses proper full-text search with stemming, query sanitization, and bm25 ranking
Session-scoped search: local summary relevance search is now scoped to the active conversation — prevents cross-session context leakage
Snapshot validation: message arrays are validated (non-empty, valid roles, size cap), quota checks include incoming message count
Snapshot access control hardened: server-side userId enforcement, unauthorized access throws instead of returning null
Config flags wired: localSummaryInjection and localSummaryMaxTokens now actually control behavior (were declared but unused)
FTS backfill on upgrade: existing summaries are automatically indexed for search after plugin update
Fixed: install script 404 on openclaw-capture-plugin.js
v0.5.4 — March 24, 2026
Recent message window: agents now get the last ~30 messages (7k char budget) injected chronologically on every turn, not just semantic matches — solves post-compaction amnesia for in-flight work
Media capture: images, audio, video, and PDFs are now automatically captured alongside conversation turns — plugin detects attachments and uploads them to cloud storage fire-and-forget
Dashboard docs rewritten: 7 tool references, install guide for OpenClaw/Claude Code/Codex, MCP config examples, and troubleshooting section
Email verification now sends a 6-digit OTP instead of a long random token — fixes spam filter hits and gives users a clean code to type
Install command generator — paste your API key on the install page to get a ready-to-run personalized command for your platform
API key lastUsedAt tracking — dashboard now shows when each key was last used
Context engine ingest hook never fired — renamed ingestBatch to match OpenClaw's actual API. This is the root cause fix for context not accumulating in the local store.
tokenBudget field name — assemble and afterTurn now read payload.tokenBudget instead of payload.budget to match what OpenClaw actually sends.
Leaf compaction threshold lowered from 20,000 to 4,000 tokens — sessions were overflowing the context window before compaction ever triggered. Now fires after ~15-20 exchanges.
assemble tail-replacement — when local summaries exist, assemble now replaces older raw messages with summaries and keeps only the last 6 messages raw. Previously summaries were prepended but raw messages still all went through, so context size never actually dropped.
JSON schema fix — removed invalid required: false from channelScope field in openclaw.plugin.json (was crashing gateway config validator on update).
v0.4.1 — March 18, 2026
Install script updated to fetch all 14 v0.4.0 files including subdirectory structure (store/, compaction/, tools/, utils/) — was broken since v0.4.0, only fetched 7 flat files from the old layout.
Update script same fix, plus compaction/package.json added to file list.
Install-assets route renamed from [file] to [...file] catch-all to serve subdirectory paths; fixed path resolution from process.cwd() to import.meta.url anchor.
Non-ASCII box-drawing characters stripped from install.sh success banner.
channelScope config — set "channelScope": "myapp" (or any string) to namespace all captures and recalls as {channelScope}:{peerId}. Enables multi-tenant and per-client memory isolation.
migrate.sh --ingest-dir — bulk ingest arbitrary directories: --ingest-dir DIR (repeatable), --store, --category, --tags, --channel flags. When set, skips OpenClaw memory scan and processes specified paths only.
Dependencies: better-sqlite3 npm install step added to install.sh and update.sh with graceful fallback.
v0.2.5 — March 14, 2026
Streamable HTTP MCP server — connect Claude Code, Codex, Factory, and any MCP client via https://api.memorycrystal.ai/mcp
Cross-platform install: tabbed setup commands for OpenClaw, Claude Code, Codex, and Factory with platform badges
Browser-based device auth — installer opens your browser, you log in, API key is provisioned automatically