Local-first, MCP-native unified memory vault โ your AI memory as files you own, shared across every model.
Project description
๐ EleSync
Your AI memory, as files you own. One vault. Every model.
You use Claude, ChatGPT, and Gemini. Each one knows a different slice of you, and none of them share. EleSync is one local-first vault on your own disk that every AI plugs into over the Model Context Protocol โ so context you build in one AI is instantly available in all of them. Local-first. MCP-native. Yours.
No pasting context around. No static "memory chips." No switching apps. The AIs you already use connect to a vault you control.
Teach ChatGPT a fact โ it lands in your vault โ Claude already knows it.
This is a working seed (MVP), not a toy: the core has a passing 50-test suite and a CLI you can run today.
The one-sentence idea
EleSync is an MCP server sitting on top of a local-first file store.
Because MCP is now supported natively by OpenAI, Google and Anthropic, a single server makes one vault you own readable and writable by all of them โ live and bidirectionally.
Why this, when Anuma / Memory Forge exist?
The "unified memory layer" concept is validated (Anuma crossed ~60k users). The gap they leave open is the wedge here:
| Anuma | Memory Forge | EleSync (this) | |
|---|---|---|---|
| Open / inspectable | โ closed app | partial | โ your files, your code |
| MCP server | โ none | โ | โ core feature |
| Keep using Claude/ChatGPT/Gemini apps | โ must switch in | n/a | โ they connect to you |
| Live read + write back | within app | โ static file | โ |
| Infrastructure | crypto/wallet | browser only | โ zero โ files + SQLite |
"Eco-friendly and easy" = no server, no database to run, no crypto. Markdown + SQLite.
Architecture
ChatGPT export โโ
Claude export โโค adapters/normalize.py โโ notes/*.md (source of truth, Obsidian-compatible)
Gemini export โโผโโบ โ MemoryItem (schema) โโโบ โ
manual notes โโ โโ index.db (SQLite + FTS5 full-text search)
โ
โผ
mcp_server.py (the connector)
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Claude Desktop ChatGPT Gemini / any MCP client
recall / remember / forget / memory_status
elesync/models.pyโ the normalizedMemoryItemschema every source maps into.elesync/store.pyโ local-first store: markdown files + SQLite FTS index, with content-hash dedup (re-importing is idempotent).elesync/normalize.pyโ tolerant ingest adapters that sniff each provider's export shape.elesync/mcp_server.pyโ exposes the vault over MCP (recall,remember,forget,memory_status).elesync/cli.pyโimport,search,add,stats,reindex,embed,export,serve.elesync/embeddings.pyโ optional semantic recall: vectors stored alongside the SQLite index, brute-force cosine, hybrid keyword+vector ranking. Degrades to keyword-only.
Install
No prior setup knowledge needed โ five steps, ~5 minutes. Works on macOS, Windows, and Linux.
You need: Python 3.10 or newer. To use EleSync as a live connector you also need a desktop AI app that speaks MCP โ e.g. Claude Desktop.
Shortcut (once it's on PyPI):
pip install elesync(add"elesync[mcp]"for the connector), then jump to step 4. Until the first PyPI release lands, use the from-source steps below.
1 ยท Check you have Python 3.10+
python --version
If that prints 2.x or "command not found", try python3 --version. Still nothing? Install it from python.org/downloads โ on Windows, tick "Add Python to PATH" in the installer.
2 ยท Download EleSync
With git:
git clone https://github.com/darknodebros/EleSync.git
cd EleSync
No git? On the repo page, click the green Code button โ Download ZIP, unzip it, then open a terminal inside the unzipped folder.
3 ยท Install it
pip install -e ".[mcp]"
If
pipisn't found: Windows โpy -m pip install -e ".[mcp]"; macOS/Linux โpython3 -m pip install -e ".[mcp]".
This adds the ele command. Confirm it worked:
ele --version # โ EleSync 0.1.0
4 ยท Connect it to Claude โ one command
ele onboard
This creates your vault (default: ~/EleSyncVault) and writes the EleSync entry into your Claude Desktop config automatically โ it finds the right file on macOS/Windows/Linux and backs up any existing config first. Then fully quit and reopen Claude Desktop.
5 ยท Verify
ele doctor # checks Python, vault, search, MCP SDK, and the Claude wiring
Then ask Claude: "What do you remember about me?" โ that's your live confirmation. ๐
Prefer to wire Claude by hand?
ele onboard --print-only prints the exact block to paste into your Claude Desktop config file:
{
"mcpServers": {
"elesync": {
"command": "python",
"args": ["-m", "elesync.mcp_server"],
"env": { "ELESYNC_DIR": "/path/to/your/EleSyncVault" }
}
}
}
Everyday use
Import what your AIs already exported, then search across all of them at once:
ele import ~/Downloads/chatgpt_memory.json --source chatgpt
ele import ~/Downloads/claude_export.json --source claude
ele search "project notes"
ele add "Prefers direct, no-fluff answers" --type preference
ele stats
ele export vault-backup.json # back up / move your whole vault
ele reindex # rebuild the search index from notes/*.md
The file paths above are just examples โ point them at wherever your export files are. EleSync keeps its vault at
~/EleSyncVault; to use a different folder setELESYNC_DIR(macOS/Linux:export ELESYNC_DIR=~/my-vaultยท Windows PowerShell:$env:ELESYNC_DIR="C:\path\to\my-vault").
Now Claude can recall your full cross-AI context at the start of any chat and remember
new durable facts back into the same vault that ChatGPT and Gemini read from.
Semantic recall (optional)
By default, search is keyword-based (SQLite FTS) โ no dependencies, no model. Install the
optional extra to also match on meaning, so recall finds the right memory even when the
wording differs:
pip install "elesync[semantic]" # adds a small local ONNX model (no PyTorch, no cloud)
ele embed # embed existing memories (first run downloads the model)
ele --semantic search "where do they live" # โ surfaces "Based in Westbrook"
Vectors are stored as float32 blobs in the same SQLite index โ no new datastore โ and ranking
fuses keyword + vector hits (Reciprocal Rank Fusion), so exact matches stay strong while
semantically-close memories surface too. Set ELESYNC_SEMANTIC=1 to make it the default (the
MCP server picks this up too). Without the extra, everything works exactly as before.
Troubleshooting
First move for anything weird: run ele doctor โ it checks your Python version, the vault, search, the MCP SDK, and the Claude wiring, and tells you exactly what's wrong.
ele: command not found (or 'ele' is not recognized)
The install put the ele launcher in a folder that isn't on your PATH (pip usually prints a "Scripts installed in 'โฆ' which is not on PATH" warning).
- Quickest workaround โ run it as a module instead:
python -m elesync.cli --version(works for every command:python -m elesync.cli onboard, etc.). - Proper fix โ add the folder pip mentioned to your PATH, or use a virtual environment (recommended), which puts
eleon PATH automatically while active:python -m venv .venv # macOS/Linux: source .venv/bin/activate # Windows (PowerShell): .venv\Scripts\Activate.ps1 pip install -e ".[mcp]"
pip: command not found
Use Python's bundled pip: Windows โ py -m pip โฆ; macOS/Linux โ python3 -m pip โฆ.
Wrong / too-old Python, or several Pythons installed
EleSync needs 3.10+. Check with ele doctor (or python --version). On Windows you can pick a specific version: py -3.12 -m pip install -e ".[mcp]".
Claude doesn't seem to know anything / EleSync isn't showing up
- Fully quit Claude Desktop โ quit the app (Cmd/Ctrl+Q, or quit from the menu-bar/tray icon), not just close the window โ then reopen it. MCP servers are only picked up at launch.
- Run
ele doctorโ confirm the line "Claude Desktop config wired" says PASS (it shows which file). If it says WARN, runele onboard. - Make sure the MCP SDK is installed:
pip install "mcp[cli]".
ModuleNotFoundError: No module named 'mcp' when serving
The MCP SDK isn't installed (it's optional and only needed to serve). Install it: pip install "mcp[cli]" โ or reinstall EleSync with the extra: pip install -e ".[mcp]".
Semantic search isn't matching on meaning
Semantic recall is an optional extra. Install it and embed your memories:
pip install "elesync[semantic]"
ele embed # first run downloads a small model (one time)
ele --semantic search "โฆ"
Still stuck? Open an issue with the output of ele doctor and we'll help.
Tests
python -m unittest discover -s tests -v # 50 tests, stdlib only โ no MCP SDK required
Where the export files come from (2026 reality)
All three majors shipped memory export in March 2026 (GDPR Article 20 + competition), but the formats are uneven and there's no clean memory API โ so the adapters normalize the mess:
- ChatGPT โ JSON of stored facts/preferences
- Claude โ structured memory export from claude.ai
- Gemini โ via Google Takeout (ZIP)
- Grok โ xAI memory/personalization export (
{"grok_memories": [...]}) - DeepSeek โ memory export (
{"deepseek_memories": [...]})
EU/EEA availability of the in-app import tools is restricted; importing your own export file into your own vault sidesteps that entirely.
Roadmap (the honest next 20%)
- Semantic recall โ โ
landed (optional
[semantic]extra: local ONNX embeddings, hybrid keyword+vector ranking โ see above). Next: semantic dedup (near-duplicate detection), and pgvector/sqlite-vec if a vault ever outgrows brute-force cosine. - Encryption at rest โ age/libsodium per-file encryption; keep markdown plaintext optional for the privacy-conscious vs. Obsidian-readable tradeoff.
- Sync โ it's just files:
git, iCloud, Syncthing, or Drive. No server to build. After syncing the notes to another machine,ele reindexrebuilds the search index from the markdown so the vault and its index agree again. - Scoped sharing โ per-client memory scopes (let Claude see writing style without exposing legal/health context), the way Anuma gates by category.
- Provenance & conflict resolution โ when two AIs assert contradictory facts, surface it instead of silently picking one.
- More adapters โ Grok and DeepSeek have landed; Manus is next (note: Manus is an
autonomous agent, not a chat-with-memory product โ confirm it exposes an exportable
memory before building the adapter). Each new source is a ~40-line file in
normalize.py; the launch does not depend on any of them beyond the core three.
License
MIT โ see LICENSE for details.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file elesync-0.1.0.tar.gz.
File metadata
- Download URL: elesync-0.1.0.tar.gz
- Upload date:
- Size: 33.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
388f1e47f4c21a560134681d23e56295de8887f3cf20ab5787cd501de34b5d68
|
|
| MD5 |
bbe20f0c9e4cffd500ddcd699a8b8863
|
|
| BLAKE2b-256 |
a966226315f5243a2d825e54eaeea93eac3d287412b40a91a80fdfc7f6049a94
|
Provenance
The following attestation bundles were made for elesync-0.1.0.tar.gz:
Publisher:
release.yml on darknodebros/EleSync
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
elesync-0.1.0.tar.gz -
Subject digest:
388f1e47f4c21a560134681d23e56295de8887f3cf20ab5787cd501de34b5d68 - Sigstore transparency entry: 1773542233
- Sigstore integration time:
-
Permalink:
darknodebros/EleSync@0d3f0cd2c13cfb46d08d39ac711e1933c278e81b -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/darknodebros
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0d3f0cd2c13cfb46d08d39ac711e1933c278e81b -
Trigger Event:
release
-
Statement type:
File details
Details for the file elesync-0.1.0-py3-none-any.whl.
File metadata
- Download URL: elesync-0.1.0-py3-none-any.whl
- Upload date:
- Size: 26.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9ddb502c2d16e8fad6fdfb5b7fc0b90c383f9c8877598809f5698c1c601c0d73
|
|
| MD5 |
099816f8d4724fb73fd55e50426d4a25
|
|
| BLAKE2b-256 |
47fb0be8cc2511185e84e40d9f713c65cd2b3d498111d70d7b8d71e759d7d6ec
|
Provenance
The following attestation bundles were made for elesync-0.1.0-py3-none-any.whl:
Publisher:
release.yml on darknodebros/EleSync
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
elesync-0.1.0-py3-none-any.whl -
Subject digest:
9ddb502c2d16e8fad6fdfb5b7fc0b90c383f9c8877598809f5698c1c601c0d73 - Sigstore transparency entry: 1773542412
- Sigstore integration time:
-
Permalink:
darknodebros/EleSync@0d3f0cd2c13cfb46d08d39ac711e1933c278e81b -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/darknodebros
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0d3f0cd2c13cfb46d08d39ac711e1933c278e81b -
Trigger Event:
release
-
Statement type: