Changelog

RSS

All notable changes to Remem.

  1. 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 CMD baked in --config /etc/remem/config.toml unconditionally, so following the quickstart’s own suggestion to skip mounting a config file caused remem-server to crash-loop on a missing-file error instead of running on built-in defaults. entrypoint.sh now wires up --config only when a file is actually mounted at that path, so both paths work: zero-config out of the box, or drop in remem-server.toml to customize.
  2. 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-mcp bundled into the published image — after last release’s MCP container merge, running the remem-mcp stdio binary meant cloning the source and building it with Rust. It’s now compiled into rememorg/remem-community:server-latest alongside remem-server, so docker run --rm -i --network remem-network rememorg/remem-community:server-latest remem-mcp --server-url http://remem-server:4545 works out of the box.
    • Claude Desktop and Claude Code setup docs updated to this Docker-based command as the primary path.
  3. 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-processremem-server now mounts a full MCP (Streamable HTTP) endpoint at /mcp, replacing the separate remem-mcp container and its SSE transport. Same 8 tools and 3 resources, same auth, one fewer service to run and monitor.
    • One container instead of twodocker-compose.yml no longer starts a remem-mcp service, and the standalone docker/remem-mcp.Dockerfile and its Docker Hub image (:mcp-* tags) are retired. remem-mcp remains a stdio-only binary for clients that need it — run it directly, or point a Streamable-HTTP client straight at remem-server’s /mcp route. Prebuilt images now ship as a single rememorg/remem-community:server-* tag. MCP_TRANSPORT/MCP_PORT/MCP_HOST env vars, and Claude Desktop configs that docker exec into the old remem-mcp-server container, are gone — see crates/remem-mcp/CLAUDE.md for current client-config examples.
    • Session cap on the new endpoint/mcp refuses new sessions past 1,000 concurrent, returning 503 instead of growing the session table without bound.
    • Two MCP tool bugs fixed in the stdio path: update_memory now forwards emotional_valence/arousal fields, and sort_by on search_memories/list_recent_memories is forwarded correctly instead of being silently dropped.
    • search_memories and list_recent_memories gained sort_by=accessed_at as a listing option, and results are now streamed rather than buffered in full for sort_by=created_at.
  4. 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 .tmp files 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 backupsPOST /api/v1/backup triggers a checkpoint and streams a consistent tar.gz snapshot of the data directory, with memory usage bounded regardless of dataset size.
    • sync_writes now defaults to true, matching the shipped remem-server.toml — closes a gap where constructing the engine config directly (rather than through the config file) could silently run without durability.
  5. 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=production and 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=0 to disable.
    • API key rotation — a new REMEM_API_KEY_SECONDARY is 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_DISABLED now defaults to false in .env.example.
  6. 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-server image 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 .so that broke silently at runtime.
  7. 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-server and remem-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