A self-hosted memory layer with an agent runtime built in — run any model, local or cloud, and share the same memory with Claude Code, Codex and other MCP tools.
Built on SQLite or Postgres with on-device embeddings. Runs 100% local by default.
No API keys. No cloud dependency. Your data never leaves your machine.
You are a software developer? ✦ Try Aperio-dev — basic terminal comfort is required.
You are a normal human? ✦ Try Aperio-lite — double-click and go, no tech skills needed.
Built for developers who want AI that actually knows them. Without giving up their data or their infrastructure.
Your memories survive every conversation, every tool, every session. 9 structured types keep things organized — facts, preferences, decisions, solutions and more. Three sensitivity tiers keep your private data safe: tier 1 shared as-is, tier 2 PII-redacted on cloud, tier 3 never leaves your machine.
The AI keeps its own private notebook — walled off from your memories. It learns what works, remembers your style, and carries its own observations across every session.
Powered by on-device embeddings (mxbai-embed-large) over sqlite-vec or pgvector. Ask about your projects and get results matched by meaning, not keywords. Voyage AI optional.
One brain shared across every agent. Claude, Cursor, Windsurf — all connect to the same Postgres database through the MCP protocol.
Responses stream token by token via WebSocket. Live code rendering, markdown on completion, smart auto-scroll. No waiting.
Runs fully on your machine with llama.cpp — free, private, offline-capable. Switch to Claude with one env variable when you need more power.
Background job finds near-duplicate memories every 10 minutes using cosine similarity. Dry-run by default — you stay in control.
Native support for thinking models like qwen3, gemma4 and llama3 — and cloud models reason out of the box. A collapsible reasoning bubble shows the model's thought process live. Toggle it on or off anytime.
Toggle Discuss and two agents cross-review each other until they agree. Domain characters give each a different perspective.
learn more...Connect SQLite, Postgres or MySQL and ask in plain English. Aperio writes the SQL — reads run instantly, and any change to your data asks you to confirm first.
learn more...Since you own the database, Aperio scales from personal to shared team brain with two changes — update the system prompt and seed team memories. One brain for the whole team.
One database. One MCP server. Two AI providers. Your brain is just a Postgres table with vectors.
Each one is available to any MCP-compatible agent (Claude, Cursor, Windsurf).
Remember that we deploy to production on Tuesdays only, and never after 4pm.
What did we decide about rate limiting on the public API?
Update the memory about our staging URL — it moved to staging.internal.acme.dev.
Forget the note about the old Redis credentials — that setup is gone.
Some older notes aren't showing up in semantic search — generate the missing embeddings.
I've saved that deploy note three times. Find the near-duplicates and show me before deleting anything.
Note down for yourself how I like commit messages written, so you don't have to ask me again.
Before you start, check your own notes on how this repo's tests are usually run.
Your note about my timezone is stale — I moved to UTC+3. Fix your own record.
Drop your note about preferring tabs — we moved that repo to spaces months ago.
Open lib/config.js and explain what the precedence chain actually does.
Write a fresh docker-compose.yml for a Postgres 16 + pgvector setup under ./infra.
Append today's decisions to the bottom of NOTES.md, dated.
In server.js, make every hardcoded port 3000 read from process.env.PORT instead.
Read the requirements.docx the client sent and list every hard requirement as bullets.
Scan this repo three levels deep and tell me where the auth code actually lives.
Delete the leftover config.old.json — but check nothing references it first.
Turn last month's invoice list into an .xlsx with one sheet per client.
Draft the release notes as a .docx I can send to the non-technical stakeholders.
Write up everything we know about the billing pipeline as a wiki article, and cite the memories you used.
Search the wiki for anything we've written about incident postmortems.
What wiki articles do we have, newest first? I want to see what has gone stale.
Pull up the 'deploy-process' article and tell me when it was last revised.
Find every symbol whose name or docs mention 'embedding queue'.
Which repos are indexed right now, and how many symbols does each one have?
Give me the outline of lib/agent/index.js — every function with its line range.
Show me the source of AgentOrchestrator.runTurn so I can see what it actually does.
Who calls validatePath? I want the blast radius before I change its signature.
What does startLlamaCpp call internally? Trace one level down.
Search our documents for the passage about data retention obligations.
Which document folders are indexed, and how many chunks does each hold?
Show me the section tree of the vendor contract PDF.
Fetch the full text of section 7.2 from that contract.
Which of our documents reference invoice INV-2024-0912?
Write and run a quick Node script that counts the rows per table in that SQLite file.
Run a Python script to chart last week's latency numbers from this CSV.
Check that the file you just edited still parses before we commit it.
Run the test suite and show me only the failures.
Fetch that changelog URL and tell me whether anything in it breaks the version we pin.
Search the web for the currently recommended way to pin pgvector on Postgres 16.
Read this screenshot of the error dialog and tell me what the stack trace says.
This scan is too big for the local vision model — optimize it before you read it.
Describe what's in this dashboard screenshot so I can paste it into the report.
Read issue #327 with all its comments and summarize what is actually blocking it.
Open an issue for that flaky path test — include the failure output and a repro.
Update issue #290 with the workaround we found and re-label it as confirmed.
List the open issues across our repos so we can triage them this morning.
Record my verdict on #312: won't fix, superseded by the new config layer.
Export all memories and wiki articles to a JSON file I can back up.
Import the export from my old laptop and tell me what got merged and what was skipped.
Which databases can you reach right now?
Show me the schema of the orders table — columns, indexes and foreign keys.
How many orders were placed last week, grouped by status?
Add a nullable 'cancelled_at' column to orders — show me the SQL before you run it.
Aperio is personal by default.
But since you own the database, it can become a shared team brain with minimal changes.
Every agent, every teammate, every tool — all drawing from the same memory pool.
Six months later, nobody remembers why you picked one vendor over the other. The Slack thread is archived, the RFC was never written — and the same debate starts again from zero.
Before we move the billing workers off Fly.io — pull everything we've stored about that hosting decision. Why did we choose Fly over Railway, what cost assumptions did we make, and which of those still hold now that we run three always-on services?
Every project has a stack, an owner and a dozen unwritten conventions that live in one person's head. Each context switch turns into an archaeology dig.
I'm picking up a ticket on Project Atlas and I haven't touched it in two months. Remind me of the stack, who owns which part, the conventions we agreed on for migrations, and anything we decided never to do again in that repo.
A new teammate joins and the same twenty questions get answered for the fifth time — in DMs, out of band, slightly differently every time.
A new backend dev starts Monday. Draft their first-week guide from our team memory: which repos they need, what access to request and from whom, how our deploy flow actually works, and the three gotchas that bite everyone in week one.
It's 2am, production is down, and the one person who remembers the recovery order is asleep, on a plane, or no longer at the company.
Postgres connections are maxed out in production and the API is timing out. Walk me through our recovery runbook step by step — and tell me whether we've hit this before, what actually fixed it last time, and what we said we'd change afterwards.
Knowing who to ask — and how they prefer to be asked — is half the job. That knowledge usually lives nowhere except in the habits of whoever has been here longest.
I need a decision on the analytics schema by Thursday. Who owns that area, which timezone are they in, do they prefer async or a call — and has anyone already raised concerns about this schema that I should read before I ask?
Some questions span every repo you own — "where else do we do this?" No single codebase can answer them, and no one has time to check them all.
Stripe is deprecating the API version we pin. Search across every project in memory: which ones integrate Stripe, which version each one pins, who owns them, and what we'd have to touch to upgrade each.
Aperio is a foundation, not a finished product. The source is fully open — fork it, extend it, repurpose it.
Here's what you can build on top.
The schema is yours to extend. Add new memory types, extra metadata columns, TTL logic, or per-project namespacing. Postgres gives you full flexibility.
Adding a tool is just a new entry in mcp/index.js. Expose calendar access, email drafting, browser control — any action you want your agents to take.
mxbai-embed-large runs on-device via transformers by default — zero external calls. Swap in Voyage AI for higher quality, or drop in OpenAI, Cohere, or any provider with a vectors API.
The web interface is a standalone HTML file with WebSocket. Rip it out and build a VS Code extension, a mobile app, a CLI, a Chrome sidebar — the server API stays the same.
Query your own memory graph. Build dashboards showing what topics you think about most, decision patterns over time, knowledge gaps, or memory growth by week.
Since you own the database, Aperio scales from personal to team brain with two changes: update the system prompt to team context, seed team memories in 001_init.sql.
Run multiple specialized agents that all share one brain. A research agent stores findings, a coding agent reads context, a writing agent pulls preferences — all from the same database.
Scheduled, autonomous agents that run without a chat turn. Define jobs in the database, set interval or file-watcher triggers, and let them handle deduplication, wiki refresh, code indexing — silently, in the background.
Commercial memory services are great products.
Aperio is a different choice — self-hosted, open source, fully customizable.
| Feature | ✦ Aperio | Cloud Services |
|---|---|---|
| Data ownership | ✅ 100% yours — own Postgres | ✗ Vendor's servers |
| Monthly cost | ✅ Free (self-hosted) | ✗ $20–100 / month |
| Local AI support | ✅ llama.cpp built-in | ✗ Cloud only |
| File system tools | ✅ read · write · append | ✗ Not available |
| Full source access | ✅ Open source — fork it | ✗ Closed API |
| MCP integration | ✅ Native protocol | ⚠ Varies |
| Works offline | ✅ With llama.cpp | ✗ Requires internet |
| Non-developer friendly | ✅ Aperio-lite — double-click & go | ✗ Requires dev setup |
| Team memory | ✅ Shared DB — one brain for the team | ⚠ Varies by plan |
Local AI · persistent memory · streaming responses · 4 themes.
Three ways in — pick your comfort level. Everything runs 100% local by default: no API keys, no cloud.
The fastest path to your own private AI.
Runs 100% on your machine. No Money. No Cloud. No register your email here and there.
Download → unzip → double-click. That's it.
START.sh is right at the top level (the how-to folder holds a printable guide)START.sh → right-click → Make AliasAperiohttp://localhost:31337START.bat is right at the top level (the how-to folder holds a printable guide)START.bat → right-click → RenameAperio.bathttp://localhost:31337START.sh is right at the top level (the how-to folder holds a printable guide)START.sh → right-click → Properties → PermissionsSTART.sh → Copy to Desktop → rename to Aperiohttp://localhost:31337aperio-lite folder.unzip aperio-lite.zip -d ~/aperio-litegit pull in the folder) — it fast-forwards to the latest release and keeps your memory database. No re-download.bash START.shSelf-hosted. Takes 5 minutes.