Skip to main content

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.

PyPI CI License: MIT MCP

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.

The whole setup โ€” paste this and you're done:

pip install "elesync[mcp]"   #  install
ele onboard                  #  connect it to your AI app โ€” that's it

No accounts. No servers. No database. No cloud. No config files. Your memories are plain markdown files on your own disk โ€” that's the entire footprint. Nothing to sign up for, nothing to run, nothing to maintain.

This is a working seed (MVP), not a toy: the core has a passing 60-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.

Who it's for

EleSync is for people who use AI โ€” not engineers building agents.

"AI memory" is having a moment, but most of it is developer infrastructure: memory layers and SDKs you wire into agents you're coding (mem0, Letta, Zep), or autonomous-agent products that manage their own memory (Manus). Powerful โ€” for builders.

EleSync is the everyday-user end of that spectrum:

  • No code, no agent to build, no cloud account. Install it, run ele onboard, done.
  • It plugs into the apps you already talk to โ€” Claude, ChatGPT, Gemini โ€” instead of asking you to adopt a new one.
  • The memory is yours: plain markdown files on your disk, not rows in someone else's database.

If you've ever had to re-explain yourself to a fresh chat, EleSync is for you. If you're wiring a memory store into a fleet of autonomous agents, one of the developer tools above is the better fit.

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 normalized MemoryItem schema 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, encrypt, decrypt, serve.
  • elesync/embeddings.py โ€” optional semantic recall: vectors stored alongside the SQLite index, brute-force cosine, hybrid keyword+vector ranking. Degrades to keyword-only.
  • elesync/crypto.py โ€” optional encryption at rest: argon2id key + libsodium per-file AEAD; the index is a rebuildable cache. Plaintext stays the default.

Install

Install from PyPI in one line. Works on macOS, Windows, and Linux; needs Python 3.10+. To use it as a live connector you also need a desktop AI app that speaks MCP โ€” e.g. Claude Desktop.

1 ยท Install EleSync

pip install "elesync[mcp]"

No Python yet? Get it from python.org/downloads (on Windows, tick "Add Python to PATH"). If pip isn't found, use py -m pip โ€ฆ (Windows) or python3 -m pip โ€ฆ (macOS/Linux). The [mcp] part adds the connector SDK.

Confirm it worked:

ele --version          # โ†’ EleSync 0.1.3

2 ยท 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.

3 ยท 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. ๐ŸŽ‰

Install from source instead (for contributors / latest master)
git clone https://github.com/darknodebros/EleSync.git
cd EleSync
pip install -e ".[mcp]"

No git? Use the green Code โ†’ Download ZIP button on the repo page, unzip, and run the pip install from inside the folder.

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" }
    }
  }
}

Use it with other AI apps (any MCP client)

EleSync is a standard MCP server, so the same vault works with any app that can act as an MCP client โ€” not just Claude Desktop. Tools like Manus, Cursor, and other MCP-capable apps can connect and recall / remember against your vault live โ€” no adapter, no export/import.

The how-to is the same everywhere: point the client at EleSync's MCP server. Print the config block with

ele onboard --print-only

then add that mcpServers entry wherever the app keeps its MCP config (in Manus: Settings โ†’ Connectors; in Cursor: its MCP settings), with ELESYNC_DIR pointing at your vault. Done โ€” that app now reads and writes the one vault every other AI shares.

Note: the ele import adapters are only for chat assistants that expose a memory export (ChatGPT, Claude, Gemini, Grok, DeepSeek). Agent tools like Manus don't offer one โ€” and don't need it: they connect as a live MCP client instead.

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 set ELESYNC_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.

Encryption at rest (optional)

Plaintext markdown is the default (so the vault stays Obsidian-readable). If you'd rather your notes be unreadable on disk โ€” a stolen laptop, a leaked backup, a synced folder โ€” encrypt the vault with a passphrase:

pip install "elesync[encryption]"
ele encrypt          # encrypts notes/*.md โ†’ *.md.enc, drops the plaintext index

Each note is encrypted with XSalsa20-Poly1305 (libsodium); your passphrase is stretched to a key with argon2id (the key is never written to disk โ€” only the salt + params live in vault.json).

Use it while it stays encrypted. You don't have to decrypt the whole vault to use it โ€” just supply the passphrase and EleSync unlocks it live, building the search index only in memory (nothing plaintext ever touches the disk):

ELESYNC_PASSPHRASE=โ€ฆ ele search "project notes"   # or it'll prompt you
ele add "Prefers concise answers" --type preference   # writes a new *.md.enc, still encrypted at rest
ele decrypt                                        # permanently revert to plaintext when you want

The MCP server does the same: set ELESYNC_PASSPHRASE in its config and it serves the encrypted vault live (key held in memory for the session). ele decrypt is only for permanently turning encryption back off.

Threat model โ€” be clear-eyed. This protects data at rest (stolen disk, leaked backup, synced folder). It does not protect a running process, or a host where your passphrase is in memory or in an env var. Lose the passphrase and the data is unrecoverable.

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 ele on 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
  1. 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.
  2. Run ele doctor โ€” confirm the line "Claude Desktop config wired" says PASS (it shows which file). If it says WARN, run ele onboard.
  3. 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   # 60 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": [...]})
  • Perplexity โ€” memory export ({"perplexity_memories": [...]})
  • Copilot โ€” Microsoft Copilot memory export ({"copilot_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%)

  1. 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.
  2. Encryption at rest โ€” โœ… landed, both phases (see above): opt-in ele encrypt/decrypt (libsodium + argon2id), and live "locked mode" โ€” supply the passphrase and the vault is queryable/writable with an in-memory index, so the CLI and MCP server use it without ever decrypting to disk.
  3. Sync โ€” it's just files: git, iCloud, Syncthing, or Drive. No server to build. After syncing the notes to another machine, ele reindex rebuilds the search index from the markdown so the vault and its index agree again.
  4. Scoped sharing โ€” per-client memory scopes (let Claude see writing style without exposing legal/health context), the way Anuma gates by category.
  5. Provenance & conflict resolution โ€” when two AIs assert contradictory facts, surface it instead of silently picking one.
  6. More adapters โ€” Grok, DeepSeek, Perplexity, and Copilot have landed. (Manus was researched and ruled out โ€” it's an autonomous agent with no memory export; it connects as a live MCP client instead.) Each new source is a ~40-line file in normalize.py.

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

elesync-0.1.3.tar.gz (42.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

elesync-0.1.3-py3-none-any.whl (32.5 kB view details)

Uploaded Python 3

File details

Details for the file elesync-0.1.3.tar.gz.

File metadata

  • Download URL: elesync-0.1.3.tar.gz
  • Upload date:
  • Size: 42.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for elesync-0.1.3.tar.gz
Algorithm Hash digest
SHA256 06e027a4944fc437cb006430965cd9485645fdeb8f27150bb6f9bbd4bf2d24b8
MD5 8b3b49ffb11fc98b4f2a43cb610ecad1
BLAKE2b-256 a906d6b1d871918ef5b2b1d1d835204aee745095411fb80cf59da4642f588dfb

See more details on using hashes here.

Provenance

The following attestation bundles were made for elesync-0.1.3.tar.gz:

Publisher: release.yml on darknodebros/EleSync

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file elesync-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: elesync-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 32.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for elesync-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 9507778023494ee50d3f33ed9da1d256dbc4b5c892a7d9b4fc578aa8c5f66070
MD5 7ab96a3d3cb904fcf64ef2bc2018e66f
BLAKE2b-256 967bef49500dd0550738f868a49f0a64ca24cde6a20cd53a5e429c295f21e17d

See more details on using hashes here.

Provenance

The following attestation bundles were made for elesync-0.1.3-py3-none-any.whl:

Publisher: release.yml on darknodebros/EleSync

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page