Your Mac remembers what you promised to do.
100% local. No cloud. No account.
Memento is a native macOS menu-bar app that quietly turns your workday (mail, Slack, Teams, meetings, voice notes) into searchable memory and a list of follow-ups you owe people. Ask it "what did I promise last Tuesday?" from any app with ⌘⇧L.
Everything stays on your Mac: SQLite plus a plain-Markdown, Obsidian-compatible vault you can open, edit, and delete. The code is open, so you can audit it.
| Cloud screen-recorders | Memento | |
|---|---|---|
| Where your data lives | Their servers (or opaque local blobs) | A SQLite file and Markdown files on your Mac |
| What gets captured | Often everything on screen | Only an allowlist of work apps; password managers and system UI are never recorded |
| Works without an LLM | Rarely | Yes. Keyword search (FTS5) and heuristic follow-up detection need no model |
| Open and auditable | No | Yes, MIT |
| Your memory is... | Locked in the app | Plain .md files you own |
git clone https://github.com/crstnmac/memento.git
cd memento
npm install
npm run tauri dev # development (hot reload)
npm run tauri build # release .appRequires macOS, Node 20+, and a Rust toolchain. On first launch, grant Accessibility (required for capture) and Microphone (required for meeting recording) in System Settings > Privacy & Security. The Settings pane opens each permission pane and shows live status.
A prebuilt, signed .dmg and a Homebrew cask are on the roadmap.
The menu-bar popover. Screenshots use sample data.
- Runs from the menu bar. Captures quietly in the background; the main window opens on demand. Closing the window hides the app — it keeps running.
- Captures only meaningful work, via adapters. A dedicated allowlist of adapters covers the common work surfaces — Mail, Outlook, Spark, Slack, Teams, Discord, WhatsApp (native + web), Gmail, LinkedIn. Random native apps, generic browsing, password managers, and macOS system UI (System Settings, Finder, …) are never recorded. Near-duplicate screens (clocks, scroll, cursors) are suppressed so memory stays readable.
- Eras of state per thread. Captures group into threads, and every thread
keeps an append-only hourly snapshot history (
memory_versions): content, word count, parent version, frozen once the hour rolls over — so you can reconstruct "what was on screen at 3pm". - Finds action items locally — commitments, follow-ups, and deadlines are
extracted with heuristics (no LLM needed), tagged urgent/unread, and given a
scheduled
remind_at("Send it by Friday" → Friday 9am). - Reminder nudge, batched. A 60s worker batches all due reminders into ONE notification (missed-reminder catch-up included) and honors macOS Do Not Disturb / Focus before surfacing it.
- Your memory is a Markdown vault. Every memory is mirrored as plain
.mdinto an Obsidian-compatible vault (activity, meetings, daily[[wiki-link]]indexes, and anotes/folder that is ingested back). Search is keyword-first (SQLite FTS5) — no opaque embeddings; you can open, edit, and own every memory file. - Meeting & voice-note pipeline. mic (+ optional system audio) recording →
native Whisper transcription (whisper.cpp via
transcribe-rs, Whisper Tiny GGML) → titled meeting memory (deduplicated titles) or a lighter voice note. Transcription runs on the Rust side, so it keeps working when the window is closed. "micwatch" can auto-start when a meeting app comes forward and auto-stop when it ends, with a max-duration clamp so recordings never run forever. - Ask your day, over anything. Open it with ⌘⇧L from any app, from Ask your day in the sidebar, or from the menu-bar popover. A floating, always-on-top panel answers from the current screen (frontmost app, window title, selected text), your captured memory, and open follow-ups. Questions can name a time ("what did I promise last Tuesday?"). With a local LLM it writes an answer; without one it still works and shows the matching memories and follow-ups it found. Everything stays on-device.
- Timed pause & hourly check-in. The tray can pause capture for 5/10/30/60 minutes with auto-resume, and a quiet hourly notification summarizes the past hour (memories, follow-ups) honoring Do Not Disturb.
- Local MCP server. A built-in SSE server on
127.0.0.1exposes the same memory/meeting/agent tools to external LLMs over the Model Context Protocol, fully on-device (mcpStdio.cjsbridges Claude Desktop to it). - Stores everything locally on your Mac: SQLite (memories, versions, app visits, conversations, action items, agent runs) mirrored into the Markdown memory vault.
Settings → LLM brain — local MCP starts an on-device server exposing the
memory/meeting/agent tools over SSE on 127.0.0.1 (Model Context Protocol).
Claude Desktop connects through the bundled mcpStdio.cjs bridge — press
Add to Claude Desktop (config is written; restart Claude to pick it up).
All tool calls run against the local database; nothing is relayed.
Read PRIVACY.md for exactly what is captured, where it is stored, and what never leaves your Mac.
- Signed and notarized
.dmgin GitHub Releases - Homebrew cask (
brew install --cask memento) - System-audio capture for meetings (ScreenCaptureKit bridge)
- More capture adapters (see good first issues)
- Encrypted-at-rest database option
Issues and PRs are welcome. New capture adapters are the easiest way in; start with CONTRIBUTING.md. If Memento is useful to you, a star helps others find it.
MIT © 2026 Criston Mascarenhas.

