I've spent my career as a Creative & designer, and like everyone else I now do half my thinking inside AI chat windows, ChatGPT, Claude, Codex, Gemini. The absurd part: each of those tools has perfect recall of nothing. Every session starts from zero. I'd solve a problem on Tuesday and re-explain the entire context on Thursday, to the same model.
The conversations were the work. Losing them felt like a design flaw in the whole ecosystem, so I decided to fix it at the OS level instead of waiting for any one vendor to.
What it does
ThreadRecall is a macOS menu bar app that gives all your AI tools one shared, private memory. It quietly captures your AI conversations locally, indexes them, and makes them searchable and recallable, by you, or by the AI tools themselves via MCP (search_memory, read_session, pin_session, and friends). Pin the sessions that matter, export a typed-frontmatter knowledge base to Obsidian, and ask any assistant "what did I decide about this last month?" and get a real answer. No cloud, no account. Everything stays on your Mac.
How I built it
Here's the twist: I'm not an engineer. I built ThreadRecall by directing AI coding tools through every line, which means the product is also its own proof of concept, because a project this long only works if the AI can remember the project.
The stack under the hood:
Swift menu bar app for the native macOS UI Python backend (packaged with PyInstaller) for capture, indexing, and embedding-based semantic search over a local SQLite store A LaunchAgent daemon speaking NDJSON over a Unix domain socket, so UI reads answer in ~50 ms instead of paying a 2–5 second Python cold-start on every menu click An MCP server so Claude and other tools can query the memory directly Obsidian export with Bases-compatible frontmatter, so your AI history becomes a queryable knowledge workspace
Challenges I ran into
macOS 15 Sequoia vs. Gatekeeper. Sequoia started quarantine-flagging pip-installed native libraries, which silently broke my whole build. The fix: a build script that strips quarantine attributes and ad-hoc signs every .so and .dylib in both the build environment and the shipped bundle, then hardened-runtime signing and Apple notarization on top. The night I deleted my own memory. While testing the uninstaller, a single accidental y keystroke wiped all 609 of my captured sessions. I recovered everything from a migration backup the next morning, then redesigned the flow: destructive actions now require typing DELETE verbatim, and I ship reversible recovery scripts. Nothing teaches data-safety design like being your own first data-loss victim. Making "instant" actually instant. A menu bar app that takes 3 seconds to open is dead on arrival. Splitting reads (fast socket daemon) from writes (subprocess) got the hot path under 100 ms without risking the data layer.
What I learned
That the gap between "designer" and "builder" is now mostly memory and persistence, not syntax. That shipping on macOS is 20% features and 80% signing, notarization, and Gatekeeper archaeology. And that local-first isn't a compromise, for something as intimate as your entire thinking history, it's the only architecture users should accept.
What's next
Faster capture across more AI apps, richer decision extraction, and deeper integrations — so your memory follows you to every tool you think with
Built With
- accessibility-api
- applescript
- asyncio
- codesign
- codex
- launchd
- macos
- mcp
- notarization
- obsidian
- pyinstaller
- python
- sqlite
- swift
- swiftui
- unix-sockets
Log in or sign up for Devpost to join the conversation.