Changelog

What actually shipped, from real commit history.

Verified Doubao (豆包) support, local and remote

Doubao has no JSON config file — it's a point-and-click custom connector dialog (技能・连接器・伙伴 → 新建 → 新建自定义连接器) supporting both STDIO (for the local server: command + args + env) and HTTP (for the cloud endpoint: URL + custom headers, same x-api-key scheme as Cursor). Verified against a real Doubao client, both paths, including a successful add_memory call on the same account/memory graph used by the other clients.

Local deployments can now run the LLM and embedding fully local too

Added a pluggable embedding provider that talks to any OpenAI-compatible /v1/embeddings server — vLLM, Ollama, llama.cpp, and MLX all expose one as of 2026. Combined with pointing LLM_BASE_URL at the same kind of server, a local install can now avoid cloud API calls entirely, and skip the sentence-transformers/torch dependency when it does. Verified for real against a local Ollama server; the other three engines are documented as architecturally identical but not yet independently tested.

Fixed a startup delay that could get the server killed by a host's health check

The embedding model was loading synchronously at server startup, blocking it from responding to anything (including a liveness ping) for several seconds. Confirmed against a real container-deploy failure on Glama ("Container exited with code 1 before responding to ping"); the model now loads lazily on first use instead. Also restructured the README around a plain-language quickstart instead of leading with a full dev-environment setup.

Published to PyPI, plus a Dockerfile for container-based hosts

`pip install spomory` is now real — published to PyPI, with the local install path added to the official MCP Registry alongside the existing remote entries. A Dockerfile was added so directories like Glama that deploy from a container image can list Spomory too.

Point-and-click MCP setup verified for Cursor and Codex

Both clients' GUI-based "add a custom MCP server" flows are now verified end-to-end, local and remote alike — Codex's Plugins → Manage → MCPs form (STDIO and Streamable HTTP), and Cursor's Customize → MCPs editor. Also documented the remote connection's real url + headers JSON shape, which hadn't been spelled out before.

A one-call full reset, secrets that never reach the LLM, two more verified clients

Added forget_all_memory after a real user hit the wall forget_memory was deliberately designed around — clearing 4 stored facts meant 4 separate approval-gated calls. It's now one call, and also purges archived relation history so a wipe can't be resurrected later. Also added secret redaction (API keys, tokens, JWTs) before any text reaches the extraction LLM, covering both the authenticated write path and the public /demo/try endpoint. Cursor and Codex CLI are now verified against real installations, not just inferred from official docs.

A no-account demo endpoint, and retrieval that notices what keeps coming up

Added a rate-limited, unauthenticated /demo/try endpoint so anyone can try extraction and retrieval without registering. Retrieval ranking now gives a boost to facts that get restated — and the write path skips the LLM call entirely for low-information filler ("ok", "thanks") that could never contain an extractable fact, saving a real API call.

Hardened the public registration endpoint, submitted to two marketplaces

POST /users/register gained CORS, deduplication, rate limiting, and email verification — the difference between "works in a demo" and "can take public traffic." Relation updates now keep transaction-time history, so a fact's edit history is traceable. Submitted the official MCP Registry's server.json listing the same week.

At-rest encryption, staleness-aware ranking, and OAuth shipped together

Local storage is encrypted at rest by default. Retrieval ranking started factoring in how long it's been since a fact was last retrieved, so stale facts naturally lose relevance. A multi-tenant, OAuth 2.1-authenticated cloud MCP server went from scaffolding to verified in one push. Also found and documented a rendering bug that only real English input could expose — the one written up on the blog.

First real benchmark numbers published, and a regression caught the same day

Published the first real LoCoMo benchmark numbers in the README. Caught a Recall@10 regression during the same re-run, tracked down two separate causes, and fixed both — documented, not smoothed over. Added forget_memory, so a user can finally say "forget that I said X" and have it actually happen.

Verified against real Claude Desktop, trained GRPO on the full 140-sample set

Confirmed add_memory and search_memory both work end-to-end in a real Claude Desktop session — which surfaced a real macOS permissions bug (TCC blocking the MCP subprocess from reading ~/Documents) that got fixed the same day. Grew the RL training set from 27 to 140 real samples and ran a full training pass, after tracking down a reward-function bug that had briefly looked like "not enough data." Also deployed Postgres on a real GPU box that day.

The first two days: scaffolding through the first real benchmark run

Project scaffolding, pluggable LLM/embedding interfaces, the graph store, and HippoRAG-style retrieval. MCP tool wiring, memory-passport export, and a verified true-delete path. At-rest encryption for local storage. Cloud API auth/quotas, key management, and a deletion audit log. The first real LoCoMo benchmark numbers, and the GRPO training/policy scaffolding that later runs built on.