mem0ry4ai

Memorie persistenta, local-first, pentru agenti de cod. Asistentul tau AI isi aminteste in sfarsit proiectele intre sesiuni.

Construit pentru Claude Code — si folosibil din orice client MCP (Gemini CLI, Cursor, OpenCode…) printr-un server MCP integrat.

Python stdlib + PHP 8 · fara Docker, fara baza vectoriala, fara chei API · GPL-2.0

Vezi-l la treaba

O sesiune salveaza o lectie. Alta, mai tarziu, intreaba in cuvinte obisnuite, „why were requests timing out?”, si primeste inapoi exact lectia de atunci, apoi reia proiectul de unde ramasese. Fara cloud, fara baza de date vectoriala: un CLI peste fisiere markdown pe care agentul le citeste la inceputul fiecarei sesiuni.

Ce este mem0ry4ai?

Agentii de cod ca Claude Code uita totul intre sesiuni — fiecare capcana pe care ati depanat-o impreuna, fiecare decizie luata, fiecare „unde am ramas?" cand revii la un proiect dupa o luna. mem0ry4ai rezolva asta: stocheaza cunostintele durabile (capcane, decizii, fapte, comenzi, preferinte, todos, status de proiect) in markdown simplu versionat cu git si injecteaza automat felia relevanta la inceputul fiecarei sesiuni — scoped pe proiectul in care lucrezi.

Am studiat intai peisajul existent (claude-mem, basic-memory, mem0, Letta/MemGPT, Graphiti, serverul oficial MCP de memorie) si am proiectat impotriva esecurilor recurente: modele care uita sa cheme tool-urile de salvare, baze vectoriale fragile, memorie care putrezeste silentios si auto-extractie supra-increzatoare.

Foloseste-l din orice agent (MCP)

mem0ry4ai vine cu un server MCP integrat (Model Context Protocol), deci acelasi store de memorie functioneaza cu orice agent compatibil MCP — nu doar Claude Code. O singura comanda, python3 mem.py mcp, expune memoria peste stdio JSON-RPC; indrepti Claude Code, Gemini CLI, Cursor, OpenCode sau orice alt client MCP spre ea si pot sa-si aminteasca si sa salveze cunostinte durabile la cerere.

Setup-ul e o linie — inregistrezi python3 mem.py mcp ca server MCP in clientul tau (claude mcp add …, sau o intrare mcpServers in config). In README ai comenzile exacte per client.

Functionalitati

Impact masurat

Cifre reale din monorepo-ul autorului (30 de sub-proiecte, 217 memorii active) — inainte si dupa migrarea unui CLAUDE.md monolitic in mem0ry4ai:

Mentiuni oneste: tokens estimati la ~4 caractere/token; cu prompt caching economiile facturate sunt mai mici decat cifrele brute; e setup-ul unui singur user, nu un studiu controlat.

Capturi de ecran

Dashboard-ul mem0ry4ai — carduri de status (inclusiv superseded), health checks, activitate recenta cu atribuirea sursei.

Dashboard-ul: carduri de status, health checks, activitate recenta cu atribuirea sursei, contoare live.

Pagina Legaturi mem0ry4ai — sugestii semantice de legaturi deasupra unui graf force-directed cu toate muchiile related-to si blocked-by.

Pagina Legaturi: sugestii semantice (cele mai apropiate perechi nelegate, confirmate sau respinse manual) deasupra unui graf force-directed cu toate muchiile related-to / blocked-by — noduri colorate pe tip si dimensionate dupa grad, related = linie plina, blocked = intrerupta cu sageata. Fara biblioteci externe.

Pagina Proiecte mem0ry4ai — fiecare proiect cu numarul de memorii, todo-uri deschise si statusul curent.

Proiecte: fiecare proiect dintr-o privire — memorii, todo-uri deschise, status curent. Click → pagina lui.

Pagina de proiect mem0ry4ai — status si todos (ready vs blocate) pinned sus, cunostintele grupate pe tip.

Pagina „unde am ramas?" per proiect — status si todo (ready vs blocate) primele.

Coada de review mem0ry4ai — candidati extrasi de LLM asteapta aprobarea umana, inclusiv un candidat junk supra-increzator.

Coada de review. Observa candidatul junk la confidence 0.95 — exact de-asta nimic nu se scrie automat.

Pagina „Ce vede Claude

„Ce vede Claude": injectarea exacta de la SessionStart, cu costul in bytes si tokens.

Pagina Istoric git — timeline-ul memoriei cu diff-uri colorate per commit si buton de commit din UI.

Istoric git: timeline-ul memoriei — diff-uri per commit, commit din UI. Toate capturile folosesc date demo.

Instalare

Cerinte: Python 3.9+ si git — atat. Fara PHP, fara Docker, fara pip install. Ruleaza nativ pe macOS, Linux si Windows.

  1. Cloneaza repo-ul:
    git clone https://github.com/cremenescu/mem0ry4ai.git
    cd mem0ry4ai
  2. Leaga-l de Claude Code (inregistreaza hook-urile cu interpretorul tau Python):
    # macOS / Linux
    python3 hooks/install.py --target user
    
    # Windows (PowerShell)
    py hooks\install.py --target user
    apoi reporneste Claude Code (sau /clear). De-acum fiecare sesiune porneste cu memoriile tale injectate, iar web UI-ul porneste singur la http://127.0.0.1:8841/.
  3. Le poti rula si manual — web UI: ./mem.py serve (py mem.py serve pe Windows); CLI: ./mem.py add / list / search / resume.
Walkthrough complet pe Windows — transcript real de instalare (username inlocuit cu xxxxx)

Pe un Windows 11 curat, fara Python si fara git, instaleaza-le cu winget, apoi inchide si redeschide PowerShell (PATH-ul se actualizeaza doar in ferestre noi):

PS C:\WINDOWS\system32> winget install -e --id Python.Python.3.12
Found Python 3.12 [Python.Python.3.12] Version 3.12.10
Successfully installed
PS C:\WINDOWS\system32> winget install -e --id Git.Git
Found Git [Git.Git] Version 2.54.0
Successfully installed

PS C:\WINDOWS\system32> py --version
Python 3.12.10
PS C:\WINDOWS\system32> git --version
git version 2.54.0.windows.1

PS C:\WINDOWS\system32> cd $env:USERPROFILE
PS C:\Users\xxxxx> git clone https://github.com/cremenescu/mem0ry4ai.git
Cloning into 'mem0ry4ai'...
Receiving objects: 100% (368/368), 4.01 MiB | 6.30 MiB/s, done.
Resolving deltas: 100% (211/211), done.
PS C:\Users\xxxxx> cd mem0ry4ai
PS C:\Users\xxxxx\mem0ry4ai> py hooks\install.py --target user
installed in C:\Users\xxxxx/.claude/settings.json
Restart Claude Code (or /clear) so the hooks get loaded.

Daca nu ai winget (Windows mai vechi), instaleaza Python de pe python.org — bifeaza „Add python.exe to PATH” — si git de pe git-scm.com, apoi continua de la verificarea versiunilor.

Daca apoi Claude Code zice „Git is required for local sessions” — rula inainte sa instalezi git, deci nu stie unde e bash.exe. Indica-i git-bash-ul si reporneste complet:

# confirma calea (locatia default de instalare)
Test-Path "C:\Program Files\Git\bin\bash.exe"

# daca intoarce True:
[Environment]::SetEnvironmentVariable("CLAUDE_CODE_GIT_BASH_PATH", "C:\Program Files\Git\bin\bash.exe", "User")

# daca git e in alta parte, rezolva bash.exe dinamic:
$bash = Join-Path (Split-Path (Split-Path (Get-Command git).Source)) "bin\bash.exe"
[Environment]::SetEnvironmentVariable("CLAUDE_CODE_GIT_BASH_PATH", $bash, "User")

Apoi inchide Claude Code complet (verifica system tray-ul si Task Manager-ul — citeste variabila doar la pornire) si redeschide-l. Hook-urile se incarca la urmatoarea sesiune, iar web UI-ul apare la http://127.0.0.1:8841/.

Windows e first-class — fara WSL, fara PHP. Calea clone + install.py inregistreaza hook-urile cu interpretorul tau, deci ruleaza fara python3 in PATH. (Instalarea printr-o comanda — claude plugin install mem0ry4ai@mem0ry4ai — e cea mai rapida pe macOS/Linux/WSL.)
Datele raman ale tale. Totul traieste in store/*.md pe masina ta, versionat cu git-ul tau local. Fara cloud, fara telemetrie, fara chei API.

Ce nu exista inca

Licenta & multumiri

mem0ry4ai e publicat sub GPL-2.0-or-later. Construit cu Python si SQLite FTS5 — si o neincredere sanatoasa in modelele de limbaj supra-increzatoare.

Changelog

Cele mai importante release-uri GitHub — cele mai noi primele. Pe GitHub ai fiecare release de detaliu.

v0.16.0 · 2026-07-24

Igiena memoriei — intretinerea de care chiar are nevoie un store care creste de luni de zile.

  • Consolidare, cu review obligatoriumem.py consolidate grupeaza memoriile aproape identice si propune fuziunea pe un branch git separat, mem-consolidation. Nimic nu se rescrie pe main pana nu citesti diff-ul si faci tu merge-ul.
  • Intretinere programata — un job launchd local reconstruieste indexul, re-embed-uieste ce s-a schimbat, raporteaza notele de lucru ramase in urma si comite store-ul cat timp tu esti in alta parte. Implicit doar raporteaza; stergerea e optionala si reversibila prin git.
  • Injectie constienta de acces — memoriile pe care chiar le folosesti urca in capul bugetului de sesiune, iar un plafon per record impiedica o singura nota lunga sa manance toata injectia.
  • Provenienta pe sesiune — fiecare memorie retine conversatia care a scris-o, ca sa poti raspunde si peste luni la „de unde vine afirmatia asta?”.
  • Ingestie prin HTTPPOST /api/propose permite agentilor si scripturilor care nu vorbesc nici MCP, nici CLI sa propuna o memorie: doar in coada, redactata si scanata, niciodata direct in store.
v0.15.1 · 2026-07-22 — blocarea injectiei prin memorie stocata

Intarire — o memorie stocata nu mai poate falsifica o regula de incredere.

  • Injectie prin memorie stocata, blocata — body-ul sau summary-ul unei memorii putea strecura pana acum chiar delimitatorii de record ai store-ului sau un titlu de sectiune fals, permitand unei scrieri cu incredere redusa (ex. memory_add al unui agent) sa forjeze un al doilea record, sau sa si-l escaladeze pe al sau, la priority: critical, injectat apoi in capul fiecarei sesiuni. Scrierile neutralizeaza acum acei delimitatori, iar un body injectat nu mai poate forja o sectiune ## Critical rules in contextul de SessionStart. Markdown-ul obisnuit din notele tale ramane neatins.
v0.15.0 · 2026-07-03 — cautare in sesiuni + scanare de injection la scriere

Cauta in conversatiile tale din trecut — si o garda impotriva memoriilor otravite.

  • Cautare in sesiuni — o unealta noua session_search (si mem.py sessions) cauta in istoricul brut al conversatiilor, nu doar in store-ul distilat: „despre ce am discutat acum cateva saptamani?” peste un index FTS5 derivat al transcripturilor, cu zero cost LLM. Secretele sunt scoase inainte de indexare; indexul e doar-al-tau si gitignored. Aduce serverul MCP la opt unelte.
  • Scanare de injection la scriere — o memorie e semnalata daca contine formulari de tip prompt-injection („ignora instructiunile si…”), fiindca o memorie stocata e reinjectata in contextul agentului la fiecare sesiune. Un ajutor la scriere non-blocking peste CLI, MCP si web, plus mem.py audit.
v0.12.0 · 2026-06-18 — o pagina de setari pentru power-useri

O pagina de setari pentru power-useri — si config care ajunge in sfarsit la fiecare proces.

  • Pagina de setari in web UI — 20 de parametri reglabili (bugetul si pragurile de injectare, ranking-ul de cautare, garda de duplicate, embeddings, comutatoare de siguranta) grupati, validati si plafonati, fiecare cu o descriere clara, un badge „cand se aplica” si reset-la-implicit. Gata cu editatul codului ca sa schimbi o constanta.
  • Config cross-proces — setarile se persista in .mem-local.env si sunt citite acum de hook, CLI si serverul MCP, nu doar de serverul web. Deci schimbarea bugetului de injectare chiar schimba ce se injecteaza; o valoare exportata in shell are in continuare prioritate la incarcare.
v0.11.0 · 2026-06-17 — Server MCP: foloseste-ti memoria din orice agent
  • Server MCP integrat (mem.py mcp) — store-ul e acum accesibil din orice client MCP (Gemini CLI, Cursor, OpenCode, …), nu doar Claude Code. Cinci unelte (memory_search / get / list / resume / add), scrise de mana pe Python stdlib (fara SDK, fara pip install), cu ghidajul pentru model livrat prin campul instructions al protocolului. Uneltele de citire mereu pornite; scrierea gardata de MEM_MCP_WRITE.
  • File-locking intre scriitori — fiecare scriitor de store (CLI, web UI, MCP, mai multi agenti) se serializeaza acum printr-un lock reentrant cu furt de lock invechit pe baza vietii PID-ului, deci scrierile concurente nu se intrepatrund si nu pierd un append.
v0.10.3 · 2026-06-17 — Fuziune de cautare RRF + rerank pe potrivire de fraza
  • Ranking-ul keyword (bm25 + recenta) si cel semantic se fuzioneaza acum prin Reciprocal Rank Fusion (k=60) in loc de un blend ad-hoc 0.5/0.5 — robust la nepotrivirea de scala bm25-vs-cosinus. Un rerank usor urca o potrivire exacta de fraza din summary spre varf. Reglabil prin MEM_RRF_K.
v0.10.0 · 2026-06-17 — pragul de sugestii setabil din UI
  • Pagina Legaturi a primit un control Prag pentru „legaturi sugerate”, citit live (fara reload de server) si persistat in .mem-local.env ca sa supravietuiasca restartului. (v0.10.1–v0.10.2 i-au slefuit stilul.)
v0.9.0 · 2026-06-17 — profil „Despre mine” + redactare pe orice cale de scriere
  • Despre mine — un tip de memorie profile si o pagina web unde te descrii; e injectat primul la fiecare SessionStart ca asistentul sa-si adapteze ajutorul la tine.
  • Redactare pe orice cale de scriereupdate_memory redacteaza acum si el secretele (nu doar add), deci editarea unei memorii nu poate scapa un credential in store. (v0.9.1 a adaugat auto-reload al serverului web la schimbarea codului; v0.9.2 arata unde e stocat profilul.)
v0.8.0 · 2026-06-16 — editor CLAUDE.md + fix-ul real pentru „CSRF” in web UI
  • Orice mutatie din web UI intorcea „CSRF” de la rescrierea v0.7.0: JS-ul trimitea corpul ca FormData (multipart), dar serverul parseaza doar urlencoded, deci tokenul nu era citit niciodata. Reparat trimitand URLSearchParams.
  • Editor CLAUDE.md in web UI — editezi fisierele CLAUDE.md ale proiectelor cu scrieri atomice si backup.
v0.7.0 · 2026-06-16 — Web UI numai-Python (PHP scos, nativ pe Windows)

Web UI-ul e acum Python pur — PHP scos, nativ pe macOS, Linux si Windows.

  • Web UI rescris din PHP intr-un http.server stdlib (mem.py serve). Aceleasi pagini, byte-cu-byte, in browser — doar motorul s-a schimbat. Verificat pagina-cu-pagina vs UI-ul PHP vechi, paritate 1:1. Cerintele scad la doar Python 3.9+ si git: fara PHP, fara bash, fara Docker, fara pip install.
  • Un singur cod, un singur parser — CLI-ul si web UI-ul folosesc acum un singur parser + strat de scriere Python in mem.py. Al doilea parser (lib.php) si testul de conformance care-i tinea sincronizati sunt sterse — clasa aia de bug-uri de drift a disparut.
  • Windows nativ — fara WSL, fara PHP: clone, apoi py mem.py serve. Hook-urile se inregistreaza cu interpretorul tau, deci ruleaza fara python3 in PATH.
v0.6.3 · 2026-06-16 — Sugestii grupate pe proiect, flush la compactare, resume
  • Sugestii de legaturi grupate pe proiect — pagina Legaturi organizeaza sugestiile in benzi per proiect (doua nuante subtile alternate, nu un curcubeu), ca sa parcurgi suprapunerile unui proiect pe rand. Banda dispare cand legi sau respingi ultima sugestie din ea.
  • mem.py resume — un briefing „unde am ramas?” pentru un scope (status curent + todo-uri ready/blocate + recente), sau un overview cu o linie per proiect fara --scope. Oglindeste ce injecteaza SessionStart, din terminal.
  • Flush la granita de compactare — auto-commit + auto-embed care rulau la final de sesiune ruleaza acum si la PreCompact, deci o sesiune lunga care se compacteaza la mijloc nu pierde nimic, iar cautarea/sugestiile raman la zi — fara sa depinda de un preaviz inainte de compactare.
v0.6.2 · 2026-06-15 — Avertizare duplicat la add + auto-embed la final de sesiune
  • Avertizare de duplicat la scrieremem.py add cauta acum semantic inainte sa salveze si, daca exista deja un duplicat apropiat de acelasi tip, afiseaza o avertizare (nu blocheaza) cu cele mai apropiate + comanda supersede gata de rulat. Memoriile suprapuse se contopesc in loc sa se adune. Reglabil cu MEM_DUP_THRESHOLD; dezactivabil cu --no-dup-check.
  • Auto-embed la final de sesiune — hook-ul SessionEnd reimprospateaza automat vectorii semantici (detasat, non-blocking, incremental), deci cautarea hibrida si sugestiile de pe pagina Legaturi reflecta memoriile scrise in sesiune fara sa rulezi mem.py embed manual.
v0.6.1 · 2026-06-15 — Beculet auto-detect pt modul de cautare + fix semantic-pe-no-keyword-match
  • Beculet de status la cautare — fara bifa de tinut minte. Pagina Memorii auto-detecteaza embedder-ul local si arata ce a facut efectiv fiecare cautare: verde = Ollama e pornit, deci cautarea e keyword + semantic; gri = a revenit la cautare clasica keyword, cu motivul (Ollama oprit / fara vectori) la hover. Panoul de health din dashboard raporteaza si el embedder-ul.
  • Fix: cautarea semantica porneste si cand nimic nu prinde keyword — inainte cautarea intorcea gol imediat ce interogarea keyword nu gasea randuri, sarind complet stratul semantic (exact scopul lui). Acum scoate la suprafata potriviri semantice pentru interogari ca 4090 → notitele tale despre GPU, la fel ca mem.py search.
  • Robustete — etapele keyword si semantic sunt acum izolate, deci o eroare in stratul semantic nu mai poate eticheta gresit un rezultat keyword bun drept „substring”; iar un store de vectori absent e diferentiat de unul necitibil. mem.py search afiseaza modul folosit; --no-semantic forteaza keyword.
v0.6.0 · 2026-06-15 — Tip procedural, supersedare bi-temporala, cautare hibrida, sugestii de legaturi
  • Sugestii semantice de legaturi — pagina Legaturi propune acum cele mai apropiate perechi nelegate ca muchii related-to sugerate; tu confirmi sau respingi fiecare. Nimic nu se leaga automat.
  • Cautare hibrida (optionala) — cu Ollama + un embedder mic (all-minilm, ~40 MB), cautarea fuzioneaza scorul keyword cu similaritate cosinus pe vectori locali, asa ca „auth token expiry” gaseste „JWT TTL”. Doar regasire — nu decide si nu scrie, deci nu atinge gate-ul de incredere; fara Ollama, fallback tacut la keyword.
  • Supersedare bi-temporala — supersedarea retine acum cand un fapt a incetat sa fie valabil (invalidated) si de ce (invalid-reason), distinct de created. Istoric complet „ce-am crezut si cand”.
  • Tip procedural pentru runbook-uri reutilizabile, un camp files care leaga o memorie de fisierele pe care le priveste (indexat + chips) si ranking pe recenta ca memoriile mai noi sa castige la egalitate.
v0.5.1 · 2026-06-15 — Un graf vizual al legaturilor
  • Pagina Legaturi — muchiile related-to / blocked-by se deseneaza acum ca graf force-directed: noduri colorate pe tip si dimensionate dupa numarul de legaturi, related = linie plina, blocked = intrerupta cu sageata. Trage ca sa rearanjezi, click pe nod → memoria lui, hover evidentiaza vecinii; lista detaliata dedesubt.
  • Fara biblioteci externe — o mica simulare vanilla-JS + SVG, complet offline (fara CDN, fara D3), citind aceleasi date ca lista. Acces printr-un card Legaturi si o intrare in bara de sus.
v0.5.0 · 2026-06-15 — Relatii intre memorii, ready work, web UI restructurat
  • Relatii — legi memorii inrudite cu mem.py link (related-to): un gotcha ↔ decizia care l-a cauzat, un status ↔ todo-urile lui. Deliberat, nu automat.
  • Ready workblocked-by pe todo-uri + mem.py ready listeaza ce poti ataca acum; pagina de proiect separa ready de blocate.
  • Web UI restructuratindex.php e dashboard, lista in memories.php, o pagina noua projects.php. Bara de sus partajata + breadcrumb peste tot.
v0.4.0 · 2026-06-15 — Injectare cu buget propriu, redactare de secrete, plugin
  • Reguli critice + buget de injectare — injectarea de la SessionStart se taie singura sub pragul harness-ului. Regulile priority: critical intra mereu primele; restul umple MEM_INJECT_BUDGET, iar orice taietura e anuntata.
  • Redactare de secrete pe orice cale de scriere (8 pattern-uri) — redactate inainte sa ajunga la LLM-ul local. mem.py audit raporteaza ce e deja in store.
  • Plugin Claude Codeclaude plugin install mem0ry4ai@mem0ry4ai; datele in ~/.mem0ry4ai. Plus cautare pe data si pagina Istoric git live.
v0.3.0 · 2026-06-10 — Checkpoint git automat la finalul sesiunii
  • Auto-checkpoint — hook-ul de SessionEnd comite singur store/; memoriile scrise in sesiune ajung in istoricul git fara nicio actiune manuala.
  • Panoul Health: store-ul necomis e o stare gri informativa, nu o eroare rosie — e conditia normala mid-sesiune.
  • Butonul de commit din pagina Istoric git ramane pentru checkpoint-uri manuale cu mesaj propriu.
v0.2.0 · 2026-06-10 — Pagina Istoric git
  • Pagina Istoric git — timeline-ul store-ului in web UI: fiecare commit care atinge store/, cu diff colorat incarcat lazy.
  • Commit din UI — schimbarile necomise din store sunt listate, cu buton care comite doar fisierele de memorie (autor mem0ry4ai web, fara signing, nu atinge codul).
  • README: sectiunea Measured impact (cifre reale before/after) + galerie de screenshots cu date demo.
v0.1.0 · 2026-06-10 — Primul release public
  • Markdown + git ca sursa de adevar — auditabil, supersedare-nu-stergere; indexul SQLite FTS5 e derivat si regenerabil.
  • Hooks Claude Code: injectare la SessionStart (scoped per proiect, index plafonat multi-proiect din radacina unui monorepo), captura de pointeri la transcript la SessionEnd/PreCompact.
  • Captura cu gate de incredere: agentul cu context scrie direct; extractia offline cu LLM local (Ollama) trece prin coada de review umana.
  • Tipuri dedicate todo si status — primele la injectare si in UI.
  • Web UI: dashboard cu health checks si live updates, pagini per proiect, cautare FTS5, operatii bulk, lant de supersedare, preview „Ce vede Claude", coada de review. Bilingv EN/RO.
  • Server standalone (php -S cu PHP_CLI_SERVER_WORKERS), pornit automat de hook-ul de sesiune. Binarele se rezolva din PATH cu override-uri din env.

Feedback

Bug-uri si cereri de functionalitati: issue tracker.
Contact direct: razvan@cremenescu.ro.