elesync 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
elesync-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Alphanymous
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
elesync-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,312 @@
1
+ Metadata-Version: 2.4
2
+ Name: elesync
3
+ Version: 0.1.0
4
+ Summary: Local-first, MCP-native unified memory vault โ€” your AI memory as files you own, shared across every model.
5
+ Author: Alphanymous
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/darknodebros/EleSync
8
+ Project-URL: Repository, https://github.com/darknodebros/EleSync
9
+ Project-URL: Issues, https://github.com/darknodebros/EleSync/issues
10
+ Keywords: mcp,ai-memory,local-first,claude,chatgpt,gemini,grok,deepseek,memory,elesync
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Intended Audience :: End Users/Desktop
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
22
+ Classifier: Topic :: Utilities
23
+ Requires-Python: >=3.10
24
+ Description-Content-Type: text/markdown
25
+ License-File: LICENSE
26
+ Provides-Extra: mcp
27
+ Requires-Dist: mcp[cli]>=1.2.0; extra == "mcp"
28
+ Provides-Extra: semantic
29
+ Requires-Dist: fastembed>=0.3.0; extra == "semantic"
30
+ Provides-Extra: dev
31
+ Requires-Dist: mcp[cli]>=1.2.0; extra == "dev"
32
+ Requires-Dist: fastembed>=0.3.0; extra == "dev"
33
+ Dynamic: license-file
34
+
35
+ # ๐Ÿ˜ EleSync
36
+
37
+ ### Your AI memory, as files you own. One vault. Every model.
38
+
39
+ [![CI](https://github.com/darknodebros/EleSync/actions/workflows/ci.yml/badge.svg)](https://github.com/darknodebros/EleSync/actions/workflows/ci.yml)
40
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
41
+ [![MCP](https://img.shields.io/badge/MCP-native-8A2BE2.svg)](https://modelcontextprotocol.io)
42
+
43
+
44
+ You use Claude, ChatGPT, and Gemini. Each one knows a different slice of you, and none
45
+ of them share. **EleSync** is one local-first vault on your own disk that every AI
46
+ plugs into over the [Model Context Protocol](https://modelcontextprotocol.io) โ€” so context
47
+ you build in one AI is instantly available in all of them. Local-first. MCP-native. Yours.
48
+
49
+ > No pasting context around. No static "memory chips." No switching apps. The AIs you
50
+ > already use connect to a vault *you* control.
51
+
52
+ ```
53
+ Teach ChatGPT a fact โ†’ it lands in your vault โ†’ Claude already knows it.
54
+ ```
55
+
56
+ This is a working seed (MVP), not a toy: the core has a passing 50-test suite and a CLI
57
+ you can run today.
58
+
59
+ ---
60
+
61
+ ## The one-sentence idea
62
+
63
+ **EleSync *is* an MCP server sitting on top of a local-first file store.**
64
+
65
+ Because MCP is now supported natively by OpenAI, Google and Anthropic, a single server
66
+ makes one vault you own readable and writable by all of them โ€” live and bidirectionally.
67
+
68
+ ## Why this, when Anuma / Memory Forge exist?
69
+
70
+ The "unified memory layer" concept is validated (Anuma crossed ~60k users). The gap they
71
+ leave open is the wedge here:
72
+
73
+ | | Anuma | Memory Forge | **EleSync (this)** |
74
+ |---|---|---|---|
75
+ | Open / inspectable | โœ— closed app | partial | โœ“ your files, your code |
76
+ | MCP server | โœ— none | โœ— | โœ“ core feature |
77
+ | Keep using Claude/ChatGPT/Gemini apps | โœ— must switch in | n/a | โœ“ they connect to you |
78
+ | Live read **+ write back** | within app | โœ— static file | โœ“ |
79
+ | Infrastructure | crypto/wallet | browser only | โœ“ zero โ€” files + SQLite |
80
+
81
+ "Eco-friendly and easy" = no server, no database to run, no crypto. Markdown + SQLite.
82
+
83
+ ## Architecture
84
+
85
+ ```
86
+ ChatGPT export โ”€โ”
87
+ Claude export โ”€โ”ค adapters/normalize.py โ”Œโ”€ notes/*.md (source of truth, Obsidian-compatible)
88
+ Gemini export โ”€โ”ผโ”€โ–บ โ†’ MemoryItem (schema) โ”€โ”€โ–บ โ”‚
89
+ manual notes โ”€โ”˜ โ””โ”€ index.db (SQLite + FTS5 full-text search)
90
+ โ”‚
91
+ โ–ผ
92
+ mcp_server.py (the connector)
93
+ โ”‚
94
+ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
95
+ Claude Desktop ChatGPT Gemini / any MCP client
96
+ recall / remember / forget / memory_status
97
+ ```
98
+
99
+ - **`elesync/models.py`** โ€” the normalized `MemoryItem` schema every source maps into.
100
+ - **`elesync/store.py`** โ€” local-first store: markdown files + SQLite FTS index, with
101
+ content-hash dedup (re-importing is idempotent).
102
+ - **`elesync/normalize.py`** โ€” tolerant ingest adapters that sniff each provider's export shape.
103
+ - **`elesync/mcp_server.py`** โ€” exposes the vault over MCP (`recall`, `remember`, `forget`, `memory_status`).
104
+ - **`elesync/cli.py`** โ€” `import`, `search`, `add`, `stats`, `reindex`, `embed`, `export`, `serve`.
105
+ - **`elesync/embeddings.py`** โ€” optional semantic recall: vectors stored alongside the
106
+ SQLite index, brute-force cosine, hybrid keyword+vector ranking. Degrades to keyword-only.
107
+
108
+ ## Install
109
+
110
+ No prior setup knowledge needed โ€” five steps, ~5 minutes. Works on **macOS, Windows, and Linux**.
111
+
112
+ **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](https://claude.ai/download)**.
113
+
114
+ > **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.
115
+
116
+ **1 ยท Check you have Python 3.10+**
117
+
118
+ ```bash
119
+ python --version
120
+ ```
121
+ If that prints `2.x` or "command not found", try `python3 --version`. Still nothing? Install it from **[python.org/downloads](https://www.python.org/downloads/)** โ€” on **Windows, tick "Add Python to PATH"** in the installer.
122
+
123
+ **2 ยท Download EleSync**
124
+
125
+ *With git:*
126
+ ```bash
127
+ git clone https://github.com/darknodebros/EleSync.git
128
+ cd EleSync
129
+ ```
130
+ *No git?* On the [repo page](https://github.com/darknodebros/EleSync), click the green **Code** button โ†’ **Download ZIP**, unzip it, then open a terminal **inside** the unzipped folder.
131
+
132
+ **3 ยท Install it**
133
+
134
+ ```bash
135
+ pip install -e ".[mcp]"
136
+ ```
137
+ > If `pip` isn't found: **Windows** โ†’ `py -m pip install -e ".[mcp]"`; **macOS/Linux** โ†’ `python3 -m pip install -e ".[mcp]"`.
138
+
139
+ This adds the `ele` command. Confirm it worked:
140
+ ```bash
141
+ ele --version # โ†’ EleSync 0.1.0
142
+ ```
143
+
144
+ **4 ยท Connect it to Claude โ€” one command**
145
+
146
+ ```bash
147
+ ele onboard
148
+ ```
149
+ 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**.
150
+
151
+ **5 ยท Verify**
152
+
153
+ ```bash
154
+ ele doctor # checks Python, vault, search, MCP SDK, and the Claude wiring
155
+ ```
156
+ Then ask Claude: *"What do you remember about me?"* โ€” that's your live confirmation. ๐ŸŽ‰
157
+
158
+ <details>
159
+ <summary>Prefer to wire Claude by hand?</summary>
160
+
161
+ `ele onboard --print-only` prints the exact block to paste into your Claude Desktop config file:
162
+
163
+ ```json
164
+ {
165
+ "mcpServers": {
166
+ "elesync": {
167
+ "command": "python",
168
+ "args": ["-m", "elesync.mcp_server"],
169
+ "env": { "ELESYNC_DIR": "/path/to/your/EleSyncVault" }
170
+ }
171
+ }
172
+ }
173
+ ```
174
+ </details>
175
+
176
+ ## Everyday use
177
+
178
+ Import what your AIs already exported, then search across all of them at once:
179
+
180
+ ```bash
181
+ ele import ~/Downloads/chatgpt_memory.json --source chatgpt
182
+ ele import ~/Downloads/claude_export.json --source claude
183
+
184
+ ele search "project notes"
185
+ ele add "Prefers direct, no-fluff answers" --type preference
186
+ ele stats
187
+
188
+ ele export vault-backup.json # back up / move your whole vault
189
+ ele reindex # rebuild the search index from notes/*.md
190
+ ```
191
+
192
+ > 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"`).
193
+
194
+ Now Claude can `recall` your full cross-AI context at the start of any chat and `remember`
195
+ new durable facts back into the same vault that ChatGPT and Gemini read from.
196
+
197
+ ### Semantic recall (optional)
198
+
199
+ By default, search is keyword-based (SQLite FTS) โ€” no dependencies, no model. Install the
200
+ optional extra to also match on *meaning*, so `recall` finds the right memory even when the
201
+ wording differs:
202
+
203
+ ```bash
204
+ pip install "elesync[semantic]" # adds a small local ONNX model (no PyTorch, no cloud)
205
+ ele embed # embed existing memories (first run downloads the model)
206
+ ele --semantic search "where do they live" # โ†’ surfaces "Based in Westbrook"
207
+ ```
208
+
209
+ Vectors are stored as float32 blobs in the same SQLite index โ€” no new datastore โ€” and ranking
210
+ fuses keyword + vector hits (Reciprocal Rank Fusion), so exact matches stay strong while
211
+ semantically-close memories surface too. Set `ELESYNC_SEMANTIC=1` to make it the default (the
212
+ MCP server picks this up too). Without the extra, everything works exactly as before.
213
+
214
+ ## Troubleshooting
215
+
216
+ **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.
217
+
218
+ <details>
219
+ <summary><code>ele: command not found</code> (or <code>'ele' is not recognized</code>)</summary>
220
+
221
+ 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).
222
+
223
+ - **Quickest workaround** โ€” run it as a module instead: `python -m elesync.cli --version` (works for every command: `python -m elesync.cli onboard`, etc.).
224
+ - **Proper fix** โ€” add the folder pip mentioned to your PATH, *or* use a virtual environment (recommended), which puts `ele` on PATH automatically while active:
225
+ ```bash
226
+ python -m venv .venv
227
+ # macOS/Linux: source .venv/bin/activate
228
+ # Windows (PowerShell): .venv\Scripts\Activate.ps1
229
+ pip install -e ".[mcp]"
230
+ ```
231
+ </details>
232
+
233
+ <details>
234
+ <summary><code>pip: command not found</code></summary>
235
+
236
+ Use Python's bundled pip: **Windows** โ†’ `py -m pip โ€ฆ`; **macOS/Linux** โ†’ `python3 -m pip โ€ฆ`.
237
+ </details>
238
+
239
+ <details>
240
+ <summary>Wrong / too-old Python, or several Pythons installed</summary>
241
+
242
+ 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]"`.
243
+ </details>
244
+
245
+ <details>
246
+ <summary>Claude doesn't seem to know anything / EleSync isn't showing up</summary>
247
+
248
+ 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.
249
+ 2. Run `ele doctor` โ€” confirm the line "Claude Desktop config wired" says **PASS** (it shows which file). If it says WARN, run `ele onboard`.
250
+ 3. Make sure the MCP SDK is installed: `pip install "mcp[cli]"`.
251
+ </details>
252
+
253
+ <details>
254
+ <summary><code>ModuleNotFoundError: No module named 'mcp'</code> when serving</summary>
255
+
256
+ 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]"`.
257
+ </details>
258
+
259
+ <details>
260
+ <summary>Semantic search isn't matching on meaning</summary>
261
+
262
+ Semantic recall is an optional extra. Install it and embed your memories:
263
+ ```bash
264
+ pip install "elesync[semantic]"
265
+ ele embed # first run downloads a small model (one time)
266
+ ele --semantic search "โ€ฆ"
267
+ ```
268
+ </details>
269
+
270
+ Still stuck? Open an issue with the output of `ele doctor` and we'll help.
271
+
272
+ ## Tests
273
+
274
+ ```bash
275
+ python -m unittest discover -s tests -v # 50 tests, stdlib only โ€” no MCP SDK required
276
+ ```
277
+
278
+ ## Where the export files come from (2026 reality)
279
+
280
+ All three majors shipped memory export in March 2026 (GDPR Article 20 + competition), but
281
+ the formats are uneven and there's no clean memory API โ€” so the adapters normalize the mess:
282
+ - **ChatGPT** โ€” JSON of stored facts/preferences
283
+ - **Claude** โ€” structured memory export from claude.ai
284
+ - **Gemini** โ€” via Google Takeout (ZIP)
285
+ - **Grok** โ€” xAI memory/personalization export (`{"grok_memories": [...]}`)
286
+ - **DeepSeek** โ€” memory export (`{"deepseek_memories": [...]}`)
287
+
288
+ EU/EEA availability of the in-app import tools is restricted; importing your own export
289
+ file into your own vault sidesteps that entirely.
290
+
291
+ ## Roadmap (the honest next 20%)
292
+
293
+ 1. **Semantic recall** โ€” โœ… landed (optional `[semantic]` extra: local ONNX embeddings,
294
+ hybrid keyword+vector ranking โ€” see above). Next: semantic *dedup* (near-duplicate
295
+ detection), and pgvector/sqlite-vec if a vault ever outgrows brute-force cosine.
296
+ 2. **Encryption at rest** โ€” age/libsodium per-file encryption; keep markdown plaintext
297
+ optional for the privacy-conscious vs. Obsidian-readable tradeoff.
298
+ 3. **Sync** โ€” it's just files: `git`, iCloud, Syncthing, or Drive. No server to build.
299
+ After syncing the notes to another machine, `ele reindex` rebuilds the search
300
+ index from the markdown so the vault and its index agree again.
301
+ 4. **Scoped sharing** โ€” per-client memory scopes (let Claude see writing style without
302
+ exposing legal/health context), the way Anuma gates by category.
303
+ 5. **Provenance & conflict resolution** โ€” when two AIs assert contradictory facts, surface
304
+ it instead of silently picking one.
305
+ 6. **More adapters** โ€” Grok and DeepSeek have landed; Manus is next (note: Manus is an
306
+ autonomous *agent*, not a chat-with-memory product โ€” confirm it exposes an exportable
307
+ memory before building the adapter). Each new source is a ~40-line file in `normalize.py`;
308
+ the launch does not depend on any of them beyond the core three.
309
+
310
+ ## License
311
+
312
+ MIT โ€” see [LICENSE](LICENSE) for details.
@@ -0,0 +1,278 @@
1
+ # ๐Ÿ˜ EleSync
2
+
3
+ ### Your AI memory, as files you own. One vault. Every model.
4
+
5
+ [![CI](https://github.com/darknodebros/EleSync/actions/workflows/ci.yml/badge.svg)](https://github.com/darknodebros/EleSync/actions/workflows/ci.yml)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
7
+ [![MCP](https://img.shields.io/badge/MCP-native-8A2BE2.svg)](https://modelcontextprotocol.io)
8
+
9
+
10
+ You use Claude, ChatGPT, and Gemini. Each one knows a different slice of you, and none
11
+ of them share. **EleSync** is one local-first vault on your own disk that every AI
12
+ plugs into over the [Model Context Protocol](https://modelcontextprotocol.io) โ€” so context
13
+ you build in one AI is instantly available in all of them. Local-first. MCP-native. Yours.
14
+
15
+ > No pasting context around. No static "memory chips." No switching apps. The AIs you
16
+ > already use connect to a vault *you* control.
17
+
18
+ ```
19
+ Teach ChatGPT a fact โ†’ it lands in your vault โ†’ Claude already knows it.
20
+ ```
21
+
22
+ This is a working seed (MVP), not a toy: the core has a passing 50-test suite and a CLI
23
+ you can run today.
24
+
25
+ ---
26
+
27
+ ## The one-sentence idea
28
+
29
+ **EleSync *is* an MCP server sitting on top of a local-first file store.**
30
+
31
+ Because MCP is now supported natively by OpenAI, Google and Anthropic, a single server
32
+ makes one vault you own readable and writable by all of them โ€” live and bidirectionally.
33
+
34
+ ## Why this, when Anuma / Memory Forge exist?
35
+
36
+ The "unified memory layer" concept is validated (Anuma crossed ~60k users). The gap they
37
+ leave open is the wedge here:
38
+
39
+ | | Anuma | Memory Forge | **EleSync (this)** |
40
+ |---|---|---|---|
41
+ | Open / inspectable | โœ— closed app | partial | โœ“ your files, your code |
42
+ | MCP server | โœ— none | โœ— | โœ“ core feature |
43
+ | Keep using Claude/ChatGPT/Gemini apps | โœ— must switch in | n/a | โœ“ they connect to you |
44
+ | Live read **+ write back** | within app | โœ— static file | โœ“ |
45
+ | Infrastructure | crypto/wallet | browser only | โœ“ zero โ€” files + SQLite |
46
+
47
+ "Eco-friendly and easy" = no server, no database to run, no crypto. Markdown + SQLite.
48
+
49
+ ## Architecture
50
+
51
+ ```
52
+ ChatGPT export โ”€โ”
53
+ Claude export โ”€โ”ค adapters/normalize.py โ”Œโ”€ notes/*.md (source of truth, Obsidian-compatible)
54
+ Gemini export โ”€โ”ผโ”€โ–บ โ†’ MemoryItem (schema) โ”€โ”€โ–บ โ”‚
55
+ manual notes โ”€โ”˜ โ””โ”€ index.db (SQLite + FTS5 full-text search)
56
+ โ”‚
57
+ โ–ผ
58
+ mcp_server.py (the connector)
59
+ โ”‚
60
+ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
61
+ Claude Desktop ChatGPT Gemini / any MCP client
62
+ recall / remember / forget / memory_status
63
+ ```
64
+
65
+ - **`elesync/models.py`** โ€” the normalized `MemoryItem` schema every source maps into.
66
+ - **`elesync/store.py`** โ€” local-first store: markdown files + SQLite FTS index, with
67
+ content-hash dedup (re-importing is idempotent).
68
+ - **`elesync/normalize.py`** โ€” tolerant ingest adapters that sniff each provider's export shape.
69
+ - **`elesync/mcp_server.py`** โ€” exposes the vault over MCP (`recall`, `remember`, `forget`, `memory_status`).
70
+ - **`elesync/cli.py`** โ€” `import`, `search`, `add`, `stats`, `reindex`, `embed`, `export`, `serve`.
71
+ - **`elesync/embeddings.py`** โ€” optional semantic recall: vectors stored alongside the
72
+ SQLite index, brute-force cosine, hybrid keyword+vector ranking. Degrades to keyword-only.
73
+
74
+ ## Install
75
+
76
+ No prior setup knowledge needed โ€” five steps, ~5 minutes. Works on **macOS, Windows, and Linux**.
77
+
78
+ **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](https://claude.ai/download)**.
79
+
80
+ > **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.
81
+
82
+ **1 ยท Check you have Python 3.10+**
83
+
84
+ ```bash
85
+ python --version
86
+ ```
87
+ If that prints `2.x` or "command not found", try `python3 --version`. Still nothing? Install it from **[python.org/downloads](https://www.python.org/downloads/)** โ€” on **Windows, tick "Add Python to PATH"** in the installer.
88
+
89
+ **2 ยท Download EleSync**
90
+
91
+ *With git:*
92
+ ```bash
93
+ git clone https://github.com/darknodebros/EleSync.git
94
+ cd EleSync
95
+ ```
96
+ *No git?* On the [repo page](https://github.com/darknodebros/EleSync), click the green **Code** button โ†’ **Download ZIP**, unzip it, then open a terminal **inside** the unzipped folder.
97
+
98
+ **3 ยท Install it**
99
+
100
+ ```bash
101
+ pip install -e ".[mcp]"
102
+ ```
103
+ > If `pip` isn't found: **Windows** โ†’ `py -m pip install -e ".[mcp]"`; **macOS/Linux** โ†’ `python3 -m pip install -e ".[mcp]"`.
104
+
105
+ This adds the `ele` command. Confirm it worked:
106
+ ```bash
107
+ ele --version # โ†’ EleSync 0.1.0
108
+ ```
109
+
110
+ **4 ยท Connect it to Claude โ€” one command**
111
+
112
+ ```bash
113
+ ele onboard
114
+ ```
115
+ 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**.
116
+
117
+ **5 ยท Verify**
118
+
119
+ ```bash
120
+ ele doctor # checks Python, vault, search, MCP SDK, and the Claude wiring
121
+ ```
122
+ Then ask Claude: *"What do you remember about me?"* โ€” that's your live confirmation. ๐ŸŽ‰
123
+
124
+ <details>
125
+ <summary>Prefer to wire Claude by hand?</summary>
126
+
127
+ `ele onboard --print-only` prints the exact block to paste into your Claude Desktop config file:
128
+
129
+ ```json
130
+ {
131
+ "mcpServers": {
132
+ "elesync": {
133
+ "command": "python",
134
+ "args": ["-m", "elesync.mcp_server"],
135
+ "env": { "ELESYNC_DIR": "/path/to/your/EleSyncVault" }
136
+ }
137
+ }
138
+ }
139
+ ```
140
+ </details>
141
+
142
+ ## Everyday use
143
+
144
+ Import what your AIs already exported, then search across all of them at once:
145
+
146
+ ```bash
147
+ ele import ~/Downloads/chatgpt_memory.json --source chatgpt
148
+ ele import ~/Downloads/claude_export.json --source claude
149
+
150
+ ele search "project notes"
151
+ ele add "Prefers direct, no-fluff answers" --type preference
152
+ ele stats
153
+
154
+ ele export vault-backup.json # back up / move your whole vault
155
+ ele reindex # rebuild the search index from notes/*.md
156
+ ```
157
+
158
+ > 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"`).
159
+
160
+ Now Claude can `recall` your full cross-AI context at the start of any chat and `remember`
161
+ new durable facts back into the same vault that ChatGPT and Gemini read from.
162
+
163
+ ### Semantic recall (optional)
164
+
165
+ By default, search is keyword-based (SQLite FTS) โ€” no dependencies, no model. Install the
166
+ optional extra to also match on *meaning*, so `recall` finds the right memory even when the
167
+ wording differs:
168
+
169
+ ```bash
170
+ pip install "elesync[semantic]" # adds a small local ONNX model (no PyTorch, no cloud)
171
+ ele embed # embed existing memories (first run downloads the model)
172
+ ele --semantic search "where do they live" # โ†’ surfaces "Based in Westbrook"
173
+ ```
174
+
175
+ Vectors are stored as float32 blobs in the same SQLite index โ€” no new datastore โ€” and ranking
176
+ fuses keyword + vector hits (Reciprocal Rank Fusion), so exact matches stay strong while
177
+ semantically-close memories surface too. Set `ELESYNC_SEMANTIC=1` to make it the default (the
178
+ MCP server picks this up too). Without the extra, everything works exactly as before.
179
+
180
+ ## Troubleshooting
181
+
182
+ **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.
183
+
184
+ <details>
185
+ <summary><code>ele: command not found</code> (or <code>'ele' is not recognized</code>)</summary>
186
+
187
+ 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).
188
+
189
+ - **Quickest workaround** โ€” run it as a module instead: `python -m elesync.cli --version` (works for every command: `python -m elesync.cli onboard`, etc.).
190
+ - **Proper fix** โ€” add the folder pip mentioned to your PATH, *or* use a virtual environment (recommended), which puts `ele` on PATH automatically while active:
191
+ ```bash
192
+ python -m venv .venv
193
+ # macOS/Linux: source .venv/bin/activate
194
+ # Windows (PowerShell): .venv\Scripts\Activate.ps1
195
+ pip install -e ".[mcp]"
196
+ ```
197
+ </details>
198
+
199
+ <details>
200
+ <summary><code>pip: command not found</code></summary>
201
+
202
+ Use Python's bundled pip: **Windows** โ†’ `py -m pip โ€ฆ`; **macOS/Linux** โ†’ `python3 -m pip โ€ฆ`.
203
+ </details>
204
+
205
+ <details>
206
+ <summary>Wrong / too-old Python, or several Pythons installed</summary>
207
+
208
+ 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]"`.
209
+ </details>
210
+
211
+ <details>
212
+ <summary>Claude doesn't seem to know anything / EleSync isn't showing up</summary>
213
+
214
+ 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.
215
+ 2. Run `ele doctor` โ€” confirm the line "Claude Desktop config wired" says **PASS** (it shows which file). If it says WARN, run `ele onboard`.
216
+ 3. Make sure the MCP SDK is installed: `pip install "mcp[cli]"`.
217
+ </details>
218
+
219
+ <details>
220
+ <summary><code>ModuleNotFoundError: No module named 'mcp'</code> when serving</summary>
221
+
222
+ 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]"`.
223
+ </details>
224
+
225
+ <details>
226
+ <summary>Semantic search isn't matching on meaning</summary>
227
+
228
+ Semantic recall is an optional extra. Install it and embed your memories:
229
+ ```bash
230
+ pip install "elesync[semantic]"
231
+ ele embed # first run downloads a small model (one time)
232
+ ele --semantic search "โ€ฆ"
233
+ ```
234
+ </details>
235
+
236
+ Still stuck? Open an issue with the output of `ele doctor` and we'll help.
237
+
238
+ ## Tests
239
+
240
+ ```bash
241
+ python -m unittest discover -s tests -v # 50 tests, stdlib only โ€” no MCP SDK required
242
+ ```
243
+
244
+ ## Where the export files come from (2026 reality)
245
+
246
+ All three majors shipped memory export in March 2026 (GDPR Article 20 + competition), but
247
+ the formats are uneven and there's no clean memory API โ€” so the adapters normalize the mess:
248
+ - **ChatGPT** โ€” JSON of stored facts/preferences
249
+ - **Claude** โ€” structured memory export from claude.ai
250
+ - **Gemini** โ€” via Google Takeout (ZIP)
251
+ - **Grok** โ€” xAI memory/personalization export (`{"grok_memories": [...]}`)
252
+ - **DeepSeek** โ€” memory export (`{"deepseek_memories": [...]}`)
253
+
254
+ EU/EEA availability of the in-app import tools is restricted; importing your own export
255
+ file into your own vault sidesteps that entirely.
256
+
257
+ ## Roadmap (the honest next 20%)
258
+
259
+ 1. **Semantic recall** โ€” โœ… landed (optional `[semantic]` extra: local ONNX embeddings,
260
+ hybrid keyword+vector ranking โ€” see above). Next: semantic *dedup* (near-duplicate
261
+ detection), and pgvector/sqlite-vec if a vault ever outgrows brute-force cosine.
262
+ 2. **Encryption at rest** โ€” age/libsodium per-file encryption; keep markdown plaintext
263
+ optional for the privacy-conscious vs. Obsidian-readable tradeoff.
264
+ 3. **Sync** โ€” it's just files: `git`, iCloud, Syncthing, or Drive. No server to build.
265
+ After syncing the notes to another machine, `ele reindex` rebuilds the search
266
+ index from the markdown so the vault and its index agree again.
267
+ 4. **Scoped sharing** โ€” per-client memory scopes (let Claude see writing style without
268
+ exposing legal/health context), the way Anuma gates by category.
269
+ 5. **Provenance & conflict resolution** โ€” when two AIs assert contradictory facts, surface
270
+ it instead of silently picking one.
271
+ 6. **More adapters** โ€” Grok and DeepSeek have landed; Manus is next (note: Manus is an
272
+ autonomous *agent*, not a chat-with-memory product โ€” confirm it exposes an exportable
273
+ memory before building the adapter). Each new source is a ~40-line file in `normalize.py`;
274
+ the launch does not depend on any of them beyond the core three.
275
+
276
+ ## License
277
+
278
+ MIT โ€” see [LICENSE](LICENSE) for details.
@@ -0,0 +1,12 @@
1
+ """elesync โ€” a local-first, MCP-native unified elesync.
2
+
3
+ One vault on your disk. Every AI reads from and writes to it over MCP.
4
+ """
5
+
6
+ from .models import MemoryItem, MEMORY_TYPES
7
+ from .store import MemoryStore
8
+ from .service import MemoryService
9
+ from . import normalize
10
+
11
+ __all__ = ["MemoryItem", "MEMORY_TYPES", "MemoryStore", "MemoryService", "normalize"]
12
+ __version__ = "0.1.0"