π§ Centralaizer
A local-first, privacy-preserving centralized memory hub for AI agents β MCP-compatible, zero cloud egress.
What is Centralaizer?
Centralaizer solves the memory silo problem: every AI agent you use (Claude Desktop, Cursor, Copilot, Open WebUI, etc.) operates with its own isolated memory. Knowledge gained in one tool disappears the next day, in a different tool, or when a new conversation starts.
Centralaizer gives all your agents one shared brain β running entirely on your machine, with no data leaving your device.
It implements findings from 10 recent arxiv papers (2025β2026) on centralized agent memory, covering gaps in poisoning defense, multi-graph retrieval, episodic memory, privacy-preserving storage, and the stateless MCP protocol.
Architecture
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β AI Agents (your PC + browser) β
β Claude Desktop Β· Cursor Β· Open WebUI Β· VS Code β
ββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββ
β MCP protocol
ββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ
β Local MCP Server (localhost:3000) β
β Shared context store Β· Bayesian trust scoring β
β Per-agent provenance Β· PII masking β
ββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ
β Core Memory Engine β
β β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββ β
β β Semantic β β Episodic β βProceduralβ βRelatio-β β
β β (vector) β β(sessions)β β (skills) β β nal β β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββ β
β β
β Memory manager: dedup Β· decay Β· conflict resolution β
ββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ
β Local Storage (100% on-device) β
β SQLite + FTS5 Β· ChromaDB Β· DuckDB knowledge graph β
ββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ
β Local LLM Runtime (Ollama) β
β Qwen3 32B / Llama 3.3 70B Β· nomic-embed-text β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Research Foundation
Centralaizer is built on findings from 10 arxiv papers (2025β2026):
| # | Paper | Gap addressed |
|---|---|---|
| 1 | Memory as a Service β MaaS (2506.22815) | Memory silos between agents |
| 2 | SuperLocalMemory (2603.02240) | Local-first + poisoning defense |
| 3 | MemPrivacy (2605.09530) | PII leaks to cloud LLMs |
| 4 | MAGMA (2601.03236) | Flat vector retrieval gaps |
| 5 | CA-MCP (2601.11595) | Stateless MCP servers |
| 6 | Rethinking Memory Mechanisms (2602.06052) | Missing episodic + procedural types |
| 7 | Memory as Asset (2603.14212) | No personal memory ownership |
| 8 | Memory for LLM Agents (2603.07670) | No dedup/decay/conflict management |
| 9 | MemOS (2507.03724) | No memory layering or viewer UI |
| 10 | Mem0 / State of Memory 2026 (2504.19413) | Local embeddings + multi-hop retrieval |
Features
β Currently implemented
- Local-first storage β SQLite + FTS5 + ChromaDB + DuckDB, all on-device
- MCP server β one endpoint (
localhost:3000/mcp) that any MCP-compatible agent connects to - Four memory types β semantic, episodic, procedural (skills), relational (graph)
- Bayesian trust scoring β every write is scored; low-trust writes go to quarantine
- PII masking β spaCy NER + regex strips emails, phones, API keys before any LLM call
- Multi-signal retrieval β vector similarity + FTS5 full-text + knowledge graph expansion
- Memory manager β automatic deduplication, decay scoring, conflict detection
- Skill promotion ladder β draft β active β crystallized based on usage
- Shared context store β session state shared across agents in multi-step workflows
- Local embeddings β
nomic-embed-textvia Ollama (768-dim), 100% on-device - Memory Viewer UI β full web dashboard at
localhost:3001- Dashboard with live, clickable stats (cards filter/drill into detail modals)
- All memories with search + filter; click any row for full content
- Quarantine queue with approve/reject
- Skill library with add + promote
- One-command setup β
./setup_and_run.sh(guided installer) or Docker (docker compose up) - Memory export β download the whole hub as a portable
.zipof JSON - Claude Code auto-recall hook β injects relevant memories into every prompt automatically
- Browser bridge β a Chrome extension brings the hub to ChatGPT / Gemini / Qwen
π Planned (Phase 2)
- Tauri desktop app β wraps the web UI as a native macOS/Windows/Linux app (~5MB binary, open-source, no Electron)
- Personal memory layer β per-user memory slice with explicit promote-to-shared
- Memory import β restore/merge from an exported
.zip(export already shipped) - Persisted agent reputation β trust priors currently reset on restart
- Temporal + causal graph edges β richer knowledge graph beyond semantic similarity
- Auto-summarize before archive β Ollama call before decaying old memories
Screenshots
The Memory Viewer at http://localhost:3001 (populated with the demo dataset β see Loading demo data).
Dashboard β live stats, the quarantine review queue, and recent memories with trust + decay:

All memories β search/filter by type & owner; click any row for the full content:

Quarantine β low-trust / speculative writes held back for human approval:

Skills β the draft β active β crystallized promotion ladder:

Getting started
Quick start (recommended)
One command installs everything and launches the app:
git clone https://github.com/lestercoyoyjr/Centralaizer.git
cd Centralaizer
./setup_and_run.sh
setup_and_run.sh is a guided bootstrapper. It:
- finds a suitable Python (prefers 3.12, accepts 3.11+);
- prints a plan of everything it will install β with download sizes β and marks what's already present;
- asks for confirmation before downloading anything;
- installs the virtualenv + pip packages + spaCy model + Ollama + the
nomic-embed-textembedding model; - starts the Ollama server and launches
main.py.
It's idempotent β re-running only fills in what's missing.
| Flag | Effect |
|---|---|
--yes |
skip the confirmation prompt |
--no-run |
install only; don't launch the app |
--with-reasoning |
also pull the optional qwen3:32b reasoning model (~20 GB) |
--with-dev |
also install dev/test dependencies (pytest, ruff, mypy) |
--open-extension |
reveal the browser-bridge extension folder to load into Chrome |
macOS note: the script installs Ollama via the official
ollama-appHomebrew cask. The bareollamaformula ships without the model runtime (llama-server) and cannot produce embeddings β don't use it.
Once running:
| Service | URL |
|---|---|
| Memory Viewer UI | http://localhost:3001 |
| MCP endpoint | http://localhost:3000/mcp |
Prerequisites
- macOS or Linux
- Python 3.11+ (3.12 recommended)
- macOS: Homebrew (used for the Ollama install step)
Manual install (fallback)
If you'd rather not use the script:
python3.12 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
python -m pip install --upgrade pip
pip install fastmcp chromadb ollama networkx duckdb apscheduler \
fastapi "uvicorn[standard]" jinja2 python-multipart pydantic \
pydantic-settings rich httpx python-dotenv spacy
python -m spacy download en_core_web_sm
# Ollama runtime + embedding model (macOS shown; the formula won't work β use the cask):
brew install --cask ollama-app
ollama serve &
ollama pull nomic-embed-text
# optional reasoning model (~20 GB):
ollama pull qwen3:32b
python main.py
Loading demo data
To populate the hub for a walkthrough or screenshots β memories of every type from several agents, quarantine entries, and skills at each promotion level:
python scripts/seed_demo.py --reset # wipe existing data first, then seed
python scripts/seed_demo.py # add demo data on top of what's there
Writes go through the real engine (trust gate, PII masking, vector + graph indexing), so the result mirrors a live system. Requires Ollama running for embeddings (installed by ./setup_and_run.sh).
Run with Docker
For a reproducible setup on any machine (no host Python/Ollama needed):
docker compose up --build
# MCP http://localhost:3000/mcp Β· Memory Viewer http://localhost:3001
The stack is two services β centralaizer and ollama β with named volumes forthe memory store and the pulled models, so data survives restarts. The containerbinds 0.0.0.0 internally (ports are published to 127.0.0.1 on the host) andthe embedding model is pulled automatically on first start.
Connecting your AI agents
Add this to each agent's MCP config and point it at http://localhost:3000/mcp:
Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"centralaizer": {
"url": "http://localhost:3000/mcp"
}
}
}
Cursor / Claude Code
Edit .cursor/mcp.json in your project (or ~/.cursor/mcp.json globally):
{
"mcpServers": {
"centralaizer": {
"url": "http://localhost:3000/mcp"
}
}
}
VS Code Copilot
Add to .vscode/settings.json:
{
"github.copilot.chat.mcpServers": {
"centralaizer": {
"url": "http://localhost:3000/mcp"
}
}
}
Browser AIs (ChatGPT, Gemini, Qwen Chat)
Browser assistants run in the cloud and can't reach your local hub over MCP. Thebrowser-extension/ bridge connects them anyway: load itunpacked and a Recall / Remember toolbar appears on those chat pages, talkingto your hub at localhost:3001 (nothing leaves your machine). Seebrowser-extension/README.md.
MCP tools available to agents
| Tool | Description |
|---|---|
memory_write |
Persist a memory (trust-gated, PII-masked) |
memory_search |
Multi-signal retrieval (semantic + FTS5 + graph) |
memory_context_get |
Read shared session context |
memory_context_set |
Write shared session context |
skill_get |
Retrieve a named workflow/playbook |
skill_record |
Record skill outcome (drives promotion) |
session_start |
Begin an episodic session |
session_end |
Close session, persist as episodic memory |
Suggested agent system prompt addition
You have access to a centralized memory hub via MCP (centralaizer).
- Before starting any task, call memory_search to retrieve relevant context.
- After completing a task, call memory_write to persist the outcome.
- For multi-step workflows, call session_start at the beginning and session_end when done.
- If a skill exists for the current task, call skill_get first, then skill_record when done.
Testing
The test suite lives in centralaizer-tests/ and is deliberately weighted toward integration and end-to-end coverage β not unit tests.
cd centralaizer-tests
../.venv/bin/python -m pytest # 74 tests (1 skips without Docker)
| Layer | Scope | Count |
|---|---|---|
| Unit | atomic pure logic (config merge, arg parsing, find_python, plan formatter, trust scoring, Docker directives) |
37 |
| Integration | features together against a real temp filesystem / sandbox; Docker compose wiring | 30 |
| E2E | full flows (agent auto-connect CLI; setup-script install β launch; Docker stack round-trip) | 7 |
| Total | 74 |
Two subsystems are covered:
- Agent auto-connect (
agent_connect/) β detect β merge β backup β write, with its safety guarantees: never clobbers other MCP servers, refuses to touch corrupted configs, idempotent re-runs. - Setup bootstrapper (
setup_and_run.sh) β run inside a sandbox wherebrew/ollama/curl/pythonare recording stubs. The tests assert both what the script decides (the plan) and what it actually invokes (the call log), across fresh / half-installed / fully-provisioned machine states.
Tests with teeth
A test that can't fail tests nothing. The suite is verified to go RED against a broken implementation before passing against the real one. The setup tests read the script under test from $CENTRALAIZER_SETUP_SCRIPT, so they can be pointed at a deliberately broken bootstrapper:
# RED β 20 of 21 setup tests fail against a broken script
CENTRALAIZER_SETUP_SCRIPT=/path/to/broken.sh ../.venv/bin/python -m pytest tests/β¦/test_setup_*.py
# GREEN β all 52 pass against the real script
../.venv/bin/python -m pytest
This same REDβGREEN discipline is how the agent-connect suite was validated (run against a stubbed core first, confirming every test could fail).
Configuration
Copy .env.example to .env and edit:
LM_DATA_DIR=~/.localmem
LM_MCP_PORT=3000
LM_UI_PORT=3001
LM_REASONING_MODEL=qwen3:32b
LM_EMBEDDING_MODEL=nomic-embed-text
LM_TRUST_THRESHOLD=0.6
LM_DECAY_HALF_LIFE_DAYS=30
LM_MANAGER_INTERVAL_MINUTES=15
LM_SKILL_PROMOTION_THRESHOLD=5
Project structure
centralaizer/
βββ main.py # Entrypoint β starts MCP + UI + scheduler
βββ setup_and_run.sh # Guided installer + launcher (see Quick start)
βββ config/
β βββ settings.py # All settings via env vars
βββ core/
β βββ memory/
β β βββ engine.py # Central memory engine
β β βββ models.py # Pydantic data models
β β βββ trust.py # Bayesian trust scoring
β βββ mcp/
β β βββ server.py # FastMCP server + tool definitions
β βββ privacy/
β β βββ filter.py # PII masking (spaCy + regex)
β βββ storage/
β βββ database.py # SQLite + FTS5
β βββ vector_store.py # ChromaDB (local embeddings)
β βββ graph_store.py # DuckDB knowledge graph
βββ ui/
β βββ app.py # FastAPI web app
β βββ static/
β β βββ css/app.css
β β βββ js/app.js
β βββ templates/ # Jinja2 HTML templates
β βββ base.html
β βββ index.html
β βββ memories.html
β βββ quarantine.html
β βββ skills.html
βββ Dockerfile # containerized hub
βββ docker-compose.yml # centralaizer + ollama stack
βββ browser-extension/ # bridge for ChatGPT/Gemini/Qwen
βββ centralaizer-tests/ # pytest suite (74 tests)
β βββ agent_connect/ # auto-connect logic under test
β βββ connect_agents_cli.py
β βββ tests/
β βββ unit/ # atomic logic (incl. test_setup_logic.py)
β βββ integration/ # features together (incl. test_setup_flow.py)
β βββ e2e/ # full flows (incl. test_setup_e2e.py)
βββ docs/
βββ AGENT_SETUP.md
βββ DESKTOP_UI.md # Tauri desktop app guide (Phase 2)
Tech stack
| Component | Technology |
|---|---|
| MCP server | FastMCP |
| Vector store | ChromaDB (embedded, no server) |
| Full-text search | SQLite FTS5 |
| Knowledge graph | DuckDB |
| LLM runtime | Ollama |
| Reasoning model | Qwen3 32B / Llama 3.3 70B |
| Embedding model | nomic-embed-text |
| Privacy NER | spaCy |
| Web framework | FastAPI + Jinja2 |
| Scheduler | APScheduler |
Author & contributors
Created and maintained by Lester Confido (@lestercoyoyjr).Contributions, issues, and ideas are welcome.
License
MIT β see LICENSE
Status
π§ Active development β Phase 1 (browser UI) complete. Phase 2 (Tauri desktop app) in progress.