Changelog
RSSAll notable changes to Remem.
- 0.3.3Release notes ↗
Fixed a crash-loop in the published Docker image when no config.toml is mounted, so the quickstart's config-less path actually works now.
What’s new
- Fixed: config-less startup crash-looped — the image’s default
CMDbaked in--config /etc/remem/config.tomlunconditionally, so following the quickstart’s own suggestion to skip mounting a config file causedremem-serverto crash-loop on a missing-file error instead of running on built-in defaults.entrypoint.shnow wires up--configonly when a file is actually mounted at that path, so both paths work: zero-config out of the box, or drop inremem-server.tomlto customize.
- Fixed: config-less startup crash-looped — the image’s default
- 0.3.2Release notes ↗
remem-mcp now ships inside the same server-latest image, so Claude Desktop and Claude Code users can run it with just Docker — no Rust toolchain required.
What’s new
remem-mcpbundled into the published image — after last release’s MCP container merge, running theremem-mcpstdio binary meant cloning the source and building it with Rust. It’s now compiled intorememorg/remem-community:server-latestalongsideremem-server, sodocker run --rm -i --network remem-network rememorg/remem-community:server-latest remem-mcp --server-url http://remem-server:4545works out of the box.- Claude Desktop and Claude Code setup docs updated to this Docker-based command as the primary path.
- 0.3.1Release notes ↗
MCP now runs in-process inside remem-server over Streamable HTTP — one container to deploy instead of two, with the standalone remem-mcp binary staying available as a stdio client.
What’s new
- MCP moved in-process —
remem-servernow mounts a full MCP (Streamable HTTP) endpoint at/mcp, replacing the separateremem-mcpcontainer and its SSE transport. Same 8 tools and 3 resources, same auth, one fewer service to run and monitor. - One container instead of two —
docker-compose.ymlno longer starts aremem-mcpservice, and the standalonedocker/remem-mcp.Dockerfileand its Docker Hub image (:mcp-*tags) are retired.remem-mcpremains a stdio-only binary for clients that need it — run it directly, or point a Streamable-HTTP client straight atremem-server’s/mcproute. Prebuilt images now ship as a singlerememorg/remem-community:server-*tag.MCP_TRANSPORT/MCP_PORT/MCP_HOSTenv vars, and Claude Desktop configs thatdocker execinto the oldremem-mcp-servercontainer, are gone — seecrates/remem-mcp/CLAUDE.mdfor current client-config examples. - Session cap on the new endpoint —
/mcprefuses new sessions past 1,000 concurrent, returning503instead of growing the session table without bound. - Two MCP tool bugs fixed in the stdio path:
update_memorynow forwardsemotional_valence/arousalfields, andsort_byonsearch_memories/list_recent_memoriesis forwarded correctly instead of being silently dropped. search_memoriesandlist_recent_memoriesgainedsort_by=accessed_atas a listing option, and results are now streamed rather than buffered in full forsort_by=created_at.
- MCP moved in-process —
- 0.2.0Release notes ↗
Durability hardening across the storage engine — crash-safe WAL replay, a checkpoint write barrier, per-memory write locking — plus a new on-demand backup endpoint and a safer default for active forgetting.
What’s new
- Crash-safe WAL replay — a process kill mid-write no longer fails to boot. On restart, replay recovers every complete record before a torn write and truncates the WAL there automatically; this previously required manual WAL surgery.
- Correct write ordering under concurrency — the WAL’s on-disk order now always matches the order writes are applied in memory, so replay can no longer resurrect the loser of a race between two writes to the same key. Removing a connection is now WAL-first too, closing the same class of gap for deletes.
- Checkpoint write barrier — the WAL is only truncated after every index (vector, graph, time-series, tag) and the in-memory write buffer have actually been flushed to disk. A failed checkpoint skips truncation and retries promptly instead of waiting out a full interval on the same cadence as a healthy one.
- Durable vector deletions — hard-deleting a memory’s embedding now survives a checkpoint and restart; previously a deleted vector could resurrect as a search result after a restart.
- Safer file replacement — segment manifest, chunk, and SSTable files
are fsynced before rename and their parent directory fsynced after, so
renames survive a crash on journaling filesystems like ext4. Any
.tmpfiles a crash leaves behind are now swept away automatically at startup. - Flush backpressure — if a memtable flush keeps failing (e.g. disk full), new writes are now rejected past 4 queued flushes instead of letting memory usage grow without bound.
- Per-memory write locking — concurrent reads/updates/deletes/promotions on the same memory are now serialized, so two operations racing on the same memory can no longer silently drop one’s update.
- Active forgetting now archives by default instead of hard-deleting —
memories that decay to zero health are archived unless you explicitly
opt in to hard-delete via
TaskConfig. - New: on-demand backups —
POST /api/v1/backuptriggers a checkpoint and streams a consistenttar.gzsnapshot of the data directory, with memory usage bounded regardless of dataset size. sync_writesnow defaults totrue, matching the shippedremem-server.toml— closes a gap where constructing the engine config directly (rather than through the config file) could silently run without durability.
- 0.1.2Release notes ↗
Security hardening: a production-mode startup guard, rate limiting on by default, constant-time API key checks with rotation support, and safer error responses.
What’s new
- Production startup guard — set
REMEM_ENV=productionand remem-server now refuses to start if auth is disabled, the API key is missing or looks like a placeholder, or CORS is left permissive. Catches an insecure config before it goes live instead of serving unsafely. - Rate limiting on by default — 100 requests/sec with a burst of 50, out
of the box. Previously off unless you opted in; the embedding endpoints are
CPU-bound, so an unlimited deployment was a cheap denial-of-service target.
Set
REMEM_RATE_LIMIT_RPS=0to disable. - API key rotation — a new
REMEM_API_KEY_SECONDARYis accepted alongside the primary key, so you can roll a key without a downtime window where no key is valid. - Constant-time API key comparison — closes a timing side-channel in the auth check.
- Safer error responses — internal errors (storage paths, I/O detail) now return a generic message to the client and log the detail server-side, instead of echoing internals back in the response body.
REMEM_ALLOW_AUTH_DISABLEDnow defaults tofalsein.env.example.
- Production startup guard — set
- 0.1.1Release notes ↗
Docker image fix: remem-server now builds correctly for arm64 (Apple Silicon), not just x86_64.
What’s new
- Fixed multi-arch Docker builds — the
remem-serverimage now detects the target platform and downloads the matching ONNX Runtime build (x64 or aarch64), instead of always linking the x64 binary. arm64 hosts (Apple Silicon, AWS Graviton) previously got a foreign-arch.sothat broke silently at runtime.
- Fixed multi-arch Docker builds — the
- 0.1.0Release notes ↗
Initial public release. Single-node Rust-based server and MCP with HNSW + CSR + LSM storage, 8 MCP tools, and full memory lifecycle.
What’s new
- Two Docker images:
remem-serverandremem-mcp - HNSW vector index with All-MiniLM-L6-v2 embeddings
- CSR relationship graph with auto-discovery
- Full memory lifecycle: TTL expiration, importance decay, promotion, archiving
- 8 MCP tools + 3 MCP resources
- REST API with OpenAPI docs at
/docs - Bearer auth
- Two Docker images: