Local-first AI notes for Mac — your notes, your models. Sign in with the ChatGPT or Claude subscription you already have (OAuth, no API key required); everything is stored locally on your machine.
- Markdown editor with wikilinks and a slash command menu
- Collections, plus AI auto-organize to file notes for you
- Full-text and semantic search (embeddings computed locally, fully offline)
- Version history for every note
- Quick capture global hotkey
- AI chat over your knowledge base with citations — it can also create and edit notes for you
- AI Clean Up with a diff preview before anything is applied
- Dark mode
myMem is an Electron app. Notes live in a local SQLite database — FTS5 for keyword search and sqlite-vec for vector search — with embeddings computed on-device by transformers.js (MiniLM). All AI features run through @earendil-works/pi-ai, a provider-agnostic LLM client that supports OpenAI Codex OAuth and Claude Pro/Max OAuth, so chat works on your existing subscription. Nothing leaves your machine except the model calls you explicitly make.
brew tap jgwesterlund/tap
brew install --cask mymem # the app
brew install jgwesterlund/tap/mym # optional: the CLI for agentsBuilds are currently unsigned, so macOS Gatekeeper blocks the first
launch: right-click /Applications/myMem.app and choose "Open" (once), or run
xattr -dr com.apple.quarantine /Applications/myMem.app.
Grab the .dmg from the latest release
and drag myMem to Applications (same Gatekeeper note applies).
npm install
npm run dist # packaged .app/.dmg/.zip in release/ (arm64)Requirements: macOS (Apple Silicon / arm64), Node >= 22.19. Go is only needed
if you want the mym CLI. See the comments in electron-builder.yml for
enabling signing/notarization with your own Developer ID.
npm run dev # HMR dev server + Electron
npm run typecheck # tsc over main/preload, renderer, and tests
npm test # vitest unit/component suite
npm run smoke # builds, then verifies the whole backend stack inside Electron
npm run e2e # builds, then drives the real app UI with Playwright (_electron)MYMEM_SMOKE=1 MYMEM_SMOKE_EMBED=1 electron . additionally exercises the real
embeddings worker (downloads the ~23 MB MiniLM model — network required). To
sanity-check a packaged build, run the same smoke against
./release/mac-arm64/myMem.app/Contents/MacOS/myMem.
The app icon is generated — npm run icon rebuilds it from
scripts/make-icon.swift (see resources/README.md). Design notes and known
issues live in docs/.
mym is a small Go CLI that talks to the running app over a local unix
socket, so any shell — or any coding agent — can search, read, and write your
notes. An agent skill (skills/mymem/SKILL.md) teaches agents the workflow:
search first, cite note titles, write markdown.
brew install jgwesterlund/tap/mym # or: npm run build:cli (requires Go)
npm run install-skill # installs the skill for every agent detected on your machineinstall-skill symlinks skills/mymem into each agent's skill directory
(idempotent; --agent claude|codex|pi|opencode|all to target one):
| Agent | Skill location | Notes |
|---|---|---|
| Claude Code | ~/.claude/skills/mymem |
|
| Codex CLI | ~/.agents/skills/mymem |
Codex's user scope; symlinks officially supported |
| pi | ~/.pi/agent/skills/mymem |
also reads ~/.agents/skills, so a Codex install already covers it |
| opencode | ~/.config/opencode/skills/mymem |
also reads ~/.claude/skills and ~/.agents/skills, so a Claude/Codex install already covers it |
All four use the same SKILL.md convention (name + description
frontmatter), so one skill directory serves every agent. The installer skips
agents it can't find and never overwrites files it didn't create.
From the shell:
mym search "kubernetes notes" --json
printf '## Decisions\n- v2 endpoints stay REST\n' | mym create --title "API design review" --collection Work -
mym append 9f3ac2d4 -- '- follow up on X'
mym related 9f3ac2d4Also: status, get, list, update, collections, trash — run
./cli/mym help. cd cli && go test ./... runs its test suite.
From an agent, just talk:
- "Check my notes for what we decided about the API design" — the agent runs
mym search/mym getand answers with citations from your notes. - "Save a note summarizing this conversation" — the agent writes a markdown
note via
mym createinto a sensible collection. - "Add 'rotate the staging certs' to my ops checklist note" — the agent finds
the note and runs
mym append.
The API is a unix socket with 0600 permissions
(~/Library/Application Support/mymem/api.sock; MYMEM_SOCKET overrides) —
local-only, current user only, no network listener. There is no telemetry.
AI provider credentials are encrypted with Electron safeStorage, backed by
the macOS Keychain.
MIT © 2026 John Westerlund