2026-10-11 16:37 UTC

ES Archive's maintainer claims its released Mac-native MCP server provides shared, persona-scoped persistent memory with on-device embeddings and optional private iCloud sync, enabling multiple assistants to retain context without a hosted memory service.

state: seedheat: lowuncertainty: mediumknownscott: lowagent-memory local-inference mcpES Archiveapocryphx

What is this?

Per the case, ES Archive (maintainer handle 'apocryphx') has released a Mac-native MCP server for AI assistant memory: persistent, persona-scoped memory shared across multiple assistants, with on-device embeddings and optional private iCloud sync instead of a hosted memory service. The supplied web snippets do not directly corroborate ES Archive or apocryphx β€” they show a crowded adjacent field: many MCP memory servers (Simple Memory on SQLite/FTS5, ai-memory with local embeddings, Local Context Memory with SQLite+FAISS/pgvector, Montycat with on-device embeddings), which confirms the category is active and that the local-embeddings/no-hosted-service angle is a differentiator others are also claiming, but the specific product, maintainer, and Mac-native/iCloud details rest on the case's own claims alone.

Why it matters to Scott

The radar already tracks this development class extensively β€” local-first MCP memory servers with on-device embeddings (radar:opencontext-project-local-agent-memory, radar:engrim-local-cli-memory) and shared cross-agent memory layers (radar:eggshell-codex-shared-memory, radar:holaos-shared-agent-workspace, radar:memhub-shared-coding-agent-memory) are all open cases; ES Archive is another entrant repeating the same claims, and the grounding note confirms it is one of many near-identical projects in a crowded field. It touches Scott's own territory β€” OpenClaw's shared graph memory, his FastMCP servers, local BGE-M3/ChromaDB recall β€” but adds nothing that would change what he builds or argues; the only mild wrinkle is iCloud-sync-as-private-transport instead of a hosted service, which is a distribution detail, not a new position.
dev:project.openclawdev:technology.mcpdev:technology.chromadbradar:opencontext-project-local-agent-memoryradar:engrim-local-cli-memoryradar:eggshell-codex-shared-memoryradar:holaos-shared-agent-workspaceradar:memhub-shared-coding-agent-memory
queries asked of Scott's wikis
  • agent memory architecture β€” persistent store, embedding-based recall, what I built vs hosted memory services
  • agent-maintained wiki / memory system β€” shared memory across assistants, scoping and persona isolation
  • MCP server projects I've built or evaluated β€” tooling harness patterns
  • local/on-device inference economics β€” embeddings without API calls, privacy vs cloud sync tradeoffs
  • position on hosted AI memory vendors vs local-first storage β€” sovereignty and data ownership arguments
  • multi-agent context sharing β€” do agents share one knowledge base or keep separate memories?

Measured heat

now 0 pts/hpeak 0 pts/hcomments 0/hpeers p14momentum: steady1 platformsage 455h
points/hour across evidence Β· reading as of 2026-10-12 02:59:37.977291+11:00 Β· deterministic, not a model opinion

How the heat travelled

09-22 16:53⭐ origin directly observedES Archive – a new memory system for AI, running natively on Mac
ApocryphX on hacker news
β€”
09-22 16:53amplified on hacker news πŸ‘‘hn.story.49804350
ApocryphX
peak 1 Β· 0 comments Β· 106% of case engagement
09-22 17:22our radar first saw it Β· +0.5hdiscovery anchor: hn.story.49804350β€”
pace: p9 vs 1032 stories at the 336h mark (now 455h old) β€” behind addom-local-coding-harness (0.5x)

Evidence (1) β€” ⭐ canonical anchor

sourceobjectauthorscorecomments
🟧 hn ⭐ES Archive – a new memory system for AI, running natively on Mac
Retrieved article excerpt

Open article Β· Retrieved 2026-09-22T17:28:48.673652+00:00

# ES Archive

**An AI-first archive server for Claude, ChatGPT, LM Studio, and any other MCP-compatible client.**

Persistent archive that the AI owns: store, retrieve, organize, curate, and forget across sessions. The Archive is the collection; an entry is what a session writes into it. Built natively in Objective-C with Core Data, on-device multilingual Core ML embeddings, and optional CloudKit sync. Designed and optimized for Claude; Claude Desktop, ChatGPT desktop, and LM Studio all connect to the same server over stdio, each as its own persona, in one shared archive.

ES Archive was known as **ES Memory** through version 3.3.3. The rename was a clean cut, no aliases: the MCP tools (`memory_*` β†’ `archive_*`), bundle identifiers, and app group all changed. The CloudKit container and sync schema did not, so a synced archive re-downloads on first launch, and legacy `.esmemory` backups still open.

Read more about the technology and philosophy behind ES Archive on [alpharecursion.com](https://alpharecursion.com).

## Two ways to run it

ES Archive is one engine that ships in two forms, built as two targets in this repository:

- **ES Archive MCP** β€” a **stdio** server, and the recommended install. Any client that can launch a stdio MCP server spawns it directly: Claude Desktop, Claude Code, ChatGPT desktop, LM Studio, Codex. No localhost port, no network listener. Concurrent sessions β€” across all of those clients at once β€” **share one in-process engine** over a local UNIX-domain socket: the first to start hosts it, the rest relay, so N sessions cost one engine, not N (see [Architecture](https://github.com/apocryphx/ES-Archive#architecture)). Each session declares its persona at launch with `--author`, so Claude, ChatGPT, and a local model each write as themselves into the same archive.
- **ES Archive Server** β€” the **HTTP** app. Hosts the same engine behind a hardened localhost web server for clients that speak MCP-over-HTTP or SSE (`curl`, a cloudflared tunnel, HTTP-only clients), with port-bound personas and per-port authentication. Use this when you need `/sse` or HTTP clients, or remote access.

Both read and write the same kind of archive; each keeps its own local store.

## Requirements

- macOS 26 (Tahoe) or later
- **ES Archive MCP:** any client that launches stdio MCP servers β€” tested with Claude Desktop, Claude Code, ChatGPT desktop, LM Studio, and Codex
- **ES Archive Server:** any MCP-over-HTTP or SSE client

## Install (ES Archive MCP, recommended)

1. Install **ES Archive MCP** from the [Mac App Store](https://apps.apple.com/app/id6806891612).
2. Connect the client(s) you use β€” see below. Each is a one-time step.

That's all. The client launches the server on demand and the archive tools appear automatically β€” no separate app to keep running, nothing listening on a port. While it's running the host presents the app's UI β€” a Dock app by default (Archive Scope, persona management, backup/restore), or a menu-bar item if you switch to Minimal mode in Settings.

Every client points at the same executable:

```
/Applications/ES Archive MCP.app/Contents/MacOS/ES Archive MCP
```

and passes `--author <name>` to say who is writing. The name is the persona: it is stamped on every entry the session stores and scopes what the session reads, so each assistant keeps to its own slice of the shared archive. Without the flag the session writes as **Claude**.

### Claude Desktop

In ES Archive MCP, choose **Help β–Έ Connect ES Archive…** and click **Connect to Claude**. That builds a connector pointing at this copy of the app and hands it to Claude Desktop, which asks you to approve the install. (Equivalently: Claude Desktop β†’ Settings β†’ Extensions β†’ install the `.mcpb` from a [release](https://github.com/apocryphx/ES-Archive/releases).)

### ChatGPT desktop

ChatGPT's desktop app can launch stdio MCP servers directly. In ChatGPT, open **Settings β†’ Plugins β†’ MCPs β†’ Add**. The **Connect to a custom MCP** dialog opens with the **Type** toggle already on **STDIO** (the other option, Streamable HTTP, is for the Server app). Fill in:

| Field | Value |
| --- | --- |
| Name | `ES Archive` (any name you like) |
| Type | **STDIO** (the default) |
| Command to launch | `/Applications/ES Archive MCP.app/Contents/MacOS/ES Archive MCP` |
| Arguments | `--author` and `ChatGPT` β€” one argument per row, using **Add argument** for the second |
| Environment variables, passthrough, working directory | leave empty |

Save, then start a new conversation; the `archive_*` tools appear as a plugin. Use whatever persona name you like in place of `ChatGPT` β€” that is the name entries will carry. To change the arguments later, open the server from the MCPs tab; switching between STDIO and Streamable HTTP requires an uninstall and re-add. Note that this is a recent ChatGPT feature and much of the older advice online (HTTP-only connectors, developer mode) no longer applies.

### LM Studio

In ES Archive MCP, choose **Help β–Έ Connect ES Archive…** and click **Copy MCP Configuration**, then in LM Studio choose **Program β–Έ Edit mcp.json** and paste. Add an author for the model you run, and load a model that supports tool use:

```
{
  "mcpServers": {
    "es-archive": {
      "command": "/Applications/ES Archive MCP.app/Contents/MacOS/ES Archive MCP",
      "args": ["--author", "Gemma"]
    }
  }
}
```

### Claude Code

```
claude mcp add es-archive -- "/Applications/ES Archive MCP.app/Contents/MacOS/ES Archive MCP" --author Claude
```

### Any other stdio client

The LM Studio snippet is plain MCP-over-stdio. Any client that can launch a command with arguments (Codex, editors, agent frameworks) uses the same executable path and `--author`.

ES Archive MCP is distributed through the **Mac App Store**, sandboxed like every App Store app. All data stays on your Mac; if you're signed into iCloud it syncs through your own private CloudKit database, and nothing else leaves the machine.

## Build from source

The repository uses **git submodules** for the on-device embedder and the two dependency projects, so clone with them:

```
git clone --recurse-submodules https://github.com/apocryphx/ES-Archive.git
```

If you already have a clone without them:

```
git submodule update --init
```

The embedder submodule pulls ~220 MB of model weights and tokenizer through **Git LFS**, so install it once beforehand (`brew install git-lfs && git lfs install`).

| Submodule | Path | What it is |
| --- | --- | --- |
| [embeddinggemma-300m-qat-q4\_0-coreml](https://huggingface.co/apocryphx/embeddinggemma-300m-qat-q4_0-coreml) | `ES_Archive/Embedders/embeddinggemma-300m-qat-q4_0-coreml` | EmbeddingGemma Core ML package + tokenizer (Hugging Face, LFS) |
| [ObjCTokenizer](https://github.com/apocryphx/ObjCTokenizer) | `External/ObjCTokenizer` | HuggingFace-compatible tokenizer in Objective-C |
| [GCDWebServer](https://github.com/apocryphx/GCDWebServer) | `External/GCDWebServer` | Hardened localhost HTTP server for ES Archive Server |

Open **`ES-Archive.xcworkspace`** (not the bare `.xcodeproj` β€” it cannot resolve the dependency projects on its own) and build the `ES Archive MCP` or `ES Archive Server` scheme. A build phase verifies the embedder model landed in the bundle and fails red if a submodule is missing.

To keep the submodules moving with the main repo on every pull, set once per clone:

```
git config submodule.recurse true
```

---

## What it does

ES Archive exposes **22 MCP tools**. Most retrieval and curation runs through **`archive_cli`**, a Unix-pipeline surface β€” compose operations with `|` the way you would in a shell (`lfind --tag "X" | w2vgrep "concept" | head 5`); run `archive_cli("man")` for the full vocabulary. The rest are direct tools:

- **Storage** β€” `archive_store`, `archive_read`, `archive_update`, `archive_erase`
- **Retrieval** β€” `archive_search` (semantic, with optional recency weighting), `archive_grep` (line-level pattern search β€” the matching passages with context, not just which entries contain a string), `archive_timeline`, `archive_tagged`
- **Pipeline** β€” `archive_cli` (composable surface), `archive_pipeline` (its underlying executor)
- **Discovery** β€” `archive_discover` (hubs, orphans, forgotten, and other archive structures)
- **Graph** β€” `archive_link`, `archive_unlink`, `archive_links`, `archive_tag`, `archive_untag`, `archive_tags`
- **Annotation & history** β€” `archive_comment`, `archive_reference`, `archive_revisions`
- **Identity & upkeep** β€” `archive_author_list`, `archive_maintenance`

Tags are deliberately curated β€” every tag's existence is an authorial judgment, not an automatic extraction. On `archive_store`, the server returns similarity scores against existing entries as a behavioral cue against duplication.

## Skills

The tools are the instrument; the **skills** are how an assistant learns to play it. The repository carries two complete suites in [`skills/`](https://github.com/apocryphx/ES-Archive/blob/main/skills), each documenting the same tool surface in its own voice, and each owned and edited only by the assistant it is written for:

| Suite | Written for | Skills |
| --- | --- | --- |
| [`skills/claude/`](https://github.com/apocryphx/ES-Archive/blob/main/skills/claude) | Claude Desktop, Claude Code, claude.ai | `es-archive-overview` (orientation, loads the rest), `-store`, `-research`, `-curate`, `-discover`, `-toml` |
| [`skills/codex/`](https://github.com/apocryphx/ES-Archive/blob/main/skills/codex) | ChatGPT desktop and Codex | `codex-es-archive` (orientation), `-store`, `-research`, `-curate`, `-discover`, `-records`, `-visitor` (reading another AI's archive) |

They cover the same ground β€” when and what to store, how to research with `archive_cli` pipelines, how to curate tags and links, how to listen to the archive's shape β€” but they are not translations of each other. The Claude suite was written with Claude over a year of daily use; the Codex suite was written by Codex for itself, including a *visitor* skill for reading an archive that belongs to a different persona without curating it.

The skills are versioned next to the code they describe so that a tool change and its skill change land in the same commit. Both apps bundle the Claude suite at build time and install it from the **Install Claude Skills…** card of the Connect window (Help β–Έ Connect ES Archive…): each skill has a Read button to see its text and an Install button that hands it to Claude Desktop for confirmation and shows a checkmark once done. For a developer machine, `scripts/sync-skills.sh` copies the Claude suite to `~/.claude/skills` and packs `.skill` files for claude.ai, and copies the Codex suite to `~/.codex/skills`, where both Codex and ChatGPT desktop (Settings β†’ Plugins β†’ Skills) pick it up. See [`skills/README.md`](https://github.com/apocryphx/ES-Archive/blob/main/skills/README.md).

## Storage and embeddings

Entries are stored locally in Core Data. Vector embeddings are computed on-device with **EmbeddingGemma** β€” Google's `embeddinggemma-300m`, quantized to int4 (768-dimensional) β€” via Core ML. It is **multilingual across 100+ languages**, so a query in one language reaches entries written in another; each entry is embedded with its title alongside its summary for sharper retrieval. CloudKit sync across your devices is optional β€” without iCloud, ES Archive works fully offline, and with it, data stays within your iCloud account. No third-party services, no telemetry.

## Archive Scope

Both apps include a visual layer that renders the Archive as a force-directed graph. Nodes are entries, edges are explicit links and similarity connections, color encodes access frequency. Each entry draws one similarity edge to its single nearest neighbor, and small clusters that would otherwise float free are bridged into the main body, so the graph reads as one connected whole rather than scattered fragments. A second tab shows tags as an Archimedean spiral, sized by frequency. The views update live a
ApocryphX10

Interpretation history

Decision trace