Releases: bnimit/memor-ai
v0.8.0 — Dashboard as a managed service
Dashboard runs as a background service alongside the daemon
memor service install now starts both the daemon and the dashboard as managed user services that cycle in lockstep — so the dashboard is always live (http://localhost:8420) and is recycled whenever you stop/restart/uninstall the service. No more hand-starting memor dashboard or stray, out-of-sync processes.
What's new
- Two managed units — macOS launchd (
ai.memor.daemon+ai.memor.dashboard) / Linux systemd (memor-daemon+memor-dashboard) memor service install --no-dashboard— install only the daemonmemor service restart— stop + reinstall, to recycle onto a new binary afterpipx upgradememor service stop / uninstall / statusnow operate on both units- Dashboard port configurable via
MEMOR_DASHBOARD_PORT(default 8420); install warns if the port is already in use - Dashboard service runs with
--no-openso it never pops a browser tab on login/restart
Verified
Full launchd lifecycle exercised live on macOS (install → recycle → restart → uninstall), plus 298 passing tests.
Upgrade
pipx upgrade memor-cli
memor service restart # recycle running services onto 0.8.0Full Changelog: v0.7.1...v0.8.0
v0.7.1 — Fix Claude/Codex agent misdetection
Bugfix
Claude Code recalls were being logged — and shown on the dashboard — as Codex, even when Codex was never used.
Root cause: detect_agent() treated the presence of permission_mode as a Codex signal. Per the Claude Code hooks reference, permission_mode is a base field on every Claude Code hook input (default | plan | acceptEdits | dontAsk | bypassPermissions), so it can't discriminate between agents.
Fix: Per the OpenAI Codex hooks docs, Codex input carries model and a Codex-specific turn_id extension that Claude Code never sends. Detection now keys on those.
Changes
detect_agent: droppermission_mode, matchturn_id/model- Regression tests for both directions (Claude+
permission_mode→ claude;turn_id→ codex) - 287 tests passing
Upgrade: pipx upgrade memor-cli (or pip install -U memor-cli)
Full diff: v0.7.0...v0.7.1
v0.7.0 — Multi-Agent Support + Vec Storage Fix
What's Changed
Multi-Agent Support
- Claude Code, Codex CLI, and Copilot CLI — single
memor-hookbinary auto-detects which agent is calling it - Interactive installer —
memor install-hookprompts to pick your agent (or--agent claude|codex|copilot) - Agent tracking —
recall_logrecords which agent triggered each recall; dashboard shows per-agent breakdown with badges
Vec Storage Bloat Fix
- Fixed 47x storage overhead in sqlite-vec
vec0—INSERT OR REPLACEorphaned entries, deactivation paths left vec0/FTS dirty memor compactCLI command — rebuilds vec0 with right-sizedchunk_size, VACUUMs the database- Daemon auto-compact — detects bloat (>2x ideal chunks) and rebuilds during ingestion cycles
- Dashboard fix — cached store instance (no more intermittent
unable to open database file) - Dashboard cleanup — hide dormant projects with no memories or recall activity
Upgrade
pip install --upgrade memor-cli
memor compact --yes # one-time rebuild to reclaim bloated storageFull Changelog: v0.6.1...v0.7.0
v0.6.1 — Vec Storage Bloat Fix
What's Changed
Patch release fixing critical sqlite-vec storage bloat (554MB → ~12MB for the same data).
Fixes
- Vec0 storage bloat:
INSERT OR REPLACEon vec0 orphaned entries because SQLite changes the artifact rowid on replace. All deactivation paths (deactivate,deactivate_stale,decay_quality) now clean vec0 + FTS entries via centralized_deactivate_artifact() - Dashboard connection errors: Cached single
SqliteStoreinstance instead of creating one per API request (caused intermittentsqlite3.OperationalError: unable to open database file) - Dashboard noise: Hide dormant projects (only raw chunks, no memories or recalls) from the project list
New
memor compactCLI command — rebuilds the vec0 index with right-sizedchunk_size, re-embeds all active artifacts, VACUUMs the database. Run this once after upgrading to reclaim space.- Daemon auto-compact — detects when vec0 chunk count exceeds 2x ideal and triggers rebuild during ingestion cycles (without VACUUM to avoid exclusive locks)
Upgrade
pip install --upgrade memor-cli
memor compact --yes # one-time rebuild to reclaim bloated storageFull Changelog: v0.6.0...v0.6.1
v0.6.0 — Global Memories & Negative Feedback
What's New
Global Memories
Patterns that appear in 3+ projects are now automatically promoted to a _global scope. Global memories are recalled everywhere — your coding habits and preferences follow you into new projects from the first prompt.
- Cross-project clustering detects shared patterns automatically
- Source duplicates are deactivated (superseded by the global version)
- No manual tagging needed
Negative Feedback Signals
Memor now detects when recalled memories get corrected or contradicted by the user or assistant:
- User rejection: "no that's wrong", "we switched to X"
- Assistant contradiction: "however, looking at the current code, we actually use Y"
Corrected memories receive a quality penalty via Bayesian scoring ((uses - negatives + 1) / (recalls + 2)), making them less likely to be recalled next time.
Dashboard Updates
- Version badge in the topbar
- Hero metric grid fixed to 5 columns
- Global memory count shown in hero metrics
- Negative feedback column in memory quality table
Other
- Updated README with global memories and negative feedback documentation
Full Changelog: v0.5.1...v0.6.0
v0.5.1
v0.5.0
What's New
Counterfactual Eval Harness (CLI)
memor eval-counterfactual --project <name>— win/tie/loss scoring vs no-memory baseline using LLM judge- Builds cases from real session data, measures do-no-harm rate
- Developer tool requiring
ANTHROPIC_API_KEY— not on the dashboard (stays true to "no API keys" product promise)
ROI Trend Sparkline (Dashboard)
- SVG area sparkline in the Token ROI hero section showing daily tool call reduction %
- Gradient fill, dashed grid lines, hover dots with tooltips — Robinhood-style fintech aesthetic
- Backed by
get_roi_trend()grouping turn_metrics by day
Tests
- 227 tests passing (+12 new: 8 counterfactual eval, 4 ROI trend)
Full Changelog: v0.4.1...v0.5.0
v0.4.1
Fixes
- Dashboard bar chart visible —
.bar-stackCSS fix; bars now render as discrete pixel cells - Chart fills card height — flex layout instead of fixed 180px; x-axis pushed to bottom
- Token ROI hero banner — promoted from cramped third column to its own section above the chart grid
- "Extractive" → "No Distill" — clearer label in Project Breakdown table
Closes
- #8 (query complexity routing shipped in v0.4.0 + label rename in this patch)
v0.4.0 — Context Savings
What's New
Five architecture improvements to measure and prove real token savings:
Query Complexity Routing
Scores queries by word count, identifier density, and structure. Routes to SKIP (trivial, 0 tokens), LIGHT (simple, k=4, 500 tokens), or FULL (complex, k=8, 1500 tokens). Trivial prompts like "yes" and "ok" inject nothing; simple follow-ups get a lighter budget.
Session Context Window
Maintains a rolling window of the last 5 queries per session. When a user types a sparse follow-up ("try the other approach"), the retriever sees it enriched with recent conversational context.
Semantic Feedback
Adds embedding cosine similarity alongside existing n-gram matching in the feedback analyzer. Catches paraphrased reuse that verbatim n-gram matching misses.
Distillation Quality Gate + Faster Decay
- Extractive distiller gates chunks below a 0.3 signal score — filler text never becomes a memory
- Quality scores decay by 50% every 14 days for unrecalled memories
- Below 0.03 floor → auto-deactivate
- Compaction threshold lowered from 0.90 → 0.85
Turn-Level Token ROI
Parses transcripts turn-by-turn, counts tool calls per turn, correlates with recall events. New turn_metrics table, /api/roi endpoint, and dashboard "Token ROI" card showing "X% fewer tool calls with recall."
Stats
- 215 tests passing
- 17 files changed, +993 lines
- 8 new test files, 3 new modules
Install
pipx install --force memor-cli
# or
pip install memor-cli==0.4.0v0.3.0 — Hybrid retrieval & relevance gate
Retrieval-quality release. Memor now retrieves over two channels and refuses to inject when nothing is relevant.
Highlights
Hybrid retrieval (dense + lexical). Added a SQLite FTS5 / BM25 channel fused with the dense vector channel via Reciprocal Rank Fusion. Recovers exact identifiers, error strings, and API names that static embeddings blur together. The FTS index syncs on ingest and auto-backfills existing databases on first open — no re-ingest needed.
Absolute-similarity gate. Min-max normalization previously forced the top hit to look perfect regardless of its true cosine, so the relevance threshold could never reject anything. The gate now drops anti-correlated candidates before ranking — an off-topic prompt injects nothing instead of the least-bad guess. Validated on a real ~10K-artifact DB: off-topic queries now return no_hits with zero injected tokens. Tunable via MEMOR_MIN_SIMILARITY.
Recall guards (P0). Per-recall token-injection budget (default 1500, MEMOR_MAX_TOKENS) and trivial-prompt skipping so confirmations like "yes"/"lgtm" don't trigger recall.
Feedback & metrics (P1). Working implicit-feedback loop (detects whether recalled memories were actually used), session-level dedup so the same memory isn't re-injected within a session, and the dashboard "precision" metric renamed to the more honest "coverage".
Install
pipx install --force memor-cli # or: pipx upgrade memor-cliThen restart the daemon + hook so they pick up 0.3.0.
Full changelog: v0.2.0...v0.3.0