• v3.8.0 cee8015ccc

    ric_harvey released this 2026-03-24 15:04:53 +00:00 | 317 commits to main since this release

    What's new

    Optional bearer token authentication

    OmniMem now supports built-in authentication on both the MCP server and web UI, enabled via environment variables:

    • MCP_AUTH_TOKEN — protects the MCP SSE endpoint (port 8765) using a custom FastMCP TokenVerifier subclass
    • WEB_UI_AUTH_TOKEN — protects the web dashboard (port 8080) using Starlette middleware

    Both are fully optional. When unset or blank, behaviour is unchanged from previous versions. No new dependencies required.

    The /metrics endpoint and /static/ assets are exempt from web UI auth so Prometheus scraping continues to work without credentials.

    Connection guides

    New guides/ directory with setup instructions for six coding agents:

    Agent Transport
    Claude Code Native SSE
    GitHub Copilot Native SSE
    Cursor SSE (known quirks)
    AWS Kiro Native SSE
    OpenCode Native SSE
    OpenAI Codex CLI Needs supergateway bridge

    Configuration

    Add to your .env:

    MCP_AUTH_TOKEN=your-secret-token      # Protects MCP endpoint
    WEB_UI_AUTH_TOKEN=your-secret-token   # Protects web dashboard
    

    Generate a secure token:

    python3 -c "import secrets; print(secrets.token_urlsafe(32))"
    

    Add the token to your Claude Code config:

    {
      "mcpServers": {
        "omnimem": {
          "type": "sse",
          "url": "http://localhost:8765/sse",
          "headers": {
            "Authorization": "Bearer your-secret-token"
          }
        }
      }
    }
    

    See docs/reverse-proxy.md for full documentation including reverse proxy examples.

    Full changelog: v3.7.1...v3.8.0

    Downloads
  • v3.7.1 09b137b9d5

    v3.7.1 Stable

    ric_harvey released this 2026-03-24 13:42:56 +00:00 | 320 commits to main since this release

    Fixed

    • Duplicate detection in web UI showing empty clusters: The duplicates page reported the correct number of clusters but displayed "0 memories, similarity ?" for each one. Root cause was a mismatch between the find_all_duplicates() return structure (flat list of dicts) and the Jinja2 template which expected named attributes (cluster.keys, cluster.max_similarity). Clusters are now returned as {"memories": [...], "max_similarity": float} and the template iterates correctly. Max pairwise similarity is now computed and displayed per cluster.
    Downloads
  • v3.7.0 f5cb1ec88b

    v3.7.0 Stable

    ric_harvey released this 2026-03-19 19:52:41 +00:00 | 321 commits to main since this release

    Title: v3: Web UI dashboard, telemetry, auto-maintenance, and MCP instructions

    Description:

    Summary

    This is the full v3 branch, covering versions 3.0.0 through 3.7.0. The headline feature is a web UI dashboard for browsing and managing memories outside of Claude Code,
    but there's a lot more in here.

    • Web UI dashboard (Starlette + Jinja2 + htmx) — browse memories with filters and pagination, semantic search, memory detail views, lifecycle management, create new
      memories with inline duplicate detection, project management (list/detail/edit/create/delete), RSS feeds CRUD with download/upload, experience tracking and graveyard
      views, duplicate scanning, contradiction detection, suppression management, and backup management with create/download/upload/delete
    • Telemetry and Prometheus metrics — per-memory recall_count and last_recalled counters updated on every recall, telemetry dashboard page in the web UI, and a
      Prometheus-compatible /metrics endpoint for Grafana integration
    • Auto-maintenance — automatic deduplication and contradiction scanning triggered every N briefing() calls per project (configurable via AUTO_MAINTENANCE_INTERVAL, default
    • MCP instructions injection — OmniMem now injects its own usage instructions automatically when Claude Code connects, so users no longer need to manually copy CLAUDE.md
      into every project
    • compile_project_context tool — auto-generates project context from stored episodic memories, useful for bootstrapping context on projects that already have memories but
      no explicit set_project_context() call
    • version() tool — returns the current OmniMem version
    • RSS worker file watcher — mtime polling with configurable interval and misfire_grace_time for robustness on sleeping machines
    • Reverse proxy docs — Traefik and Caddy examples covering both web UI and MCP server endpoints
    • Startup index migration — compares field counts against definitions and drops stale indexes so they get recreated with new fields

    Stats

    • 45 new files, 73 files changed, ~5,800 lines added
    • 43 commits
    • New Docker service: web_ui on port 8080
    • New test suites for recall counters, maintenance, and briefing maintenance

    Test plan

    • cd mcp_server && pytest tests/ — all existing and new tests pass
    • docker compose up -d — all four containers start and stay healthy
    • Web UI accessible at http://localhost:8080 — dashboard loads, navigation works
    • Browse memories, search, create, view detail, lifecycle actions all functional
    • RSS feeds page: list, create, edit, delete, download, upload
    • Projects page: list, detail, edit, create, delete
    • Telemetry page shows recall counts; /metrics returns Prometheus format
    • briefing() triggers auto-maintenance after configured interval
    • MCP instructions appear in Claude Code without manual CLAUDE.md setup
    • Reverse proxy docs: Traefik and Caddy configs work for both endpoints

    Downloads