The Cortex menu bar popover open on a dark macOS desktop, showing the Session Readiness view. Skills loaded (3-5 listed with their applicability annotations), recent corrections visible, context assembled. A small 'MCP connected' indicator. The composition should feel like looking at an intelligent briefing document, not a settings panel.
Cortex
Claude starts every session from zero. I designed the memory layer that lets it remember how you work — and the trust model that makes that safe to rely on.
A local-first memory system that turns scattered project files into compounding intelligence — entirely on your Mac.
100% on-device
Local-first, no account
3-in-1
App · MCP server · cloud sync (soon)
5 types
Modeled on the brain — built to decay
End-to-end
Verified, not just shipped
The first articulation of Cortex was a file-sync utility — keep CLAUDE.md files consistent across Claude Code sessions. That would have solved the logistics problem. The real problem was different: Claude re-learns the same things in every project. The collaboration doesn't compound. It restarts.
My Role
Solo designer — product vision, knowledge architecture, interaction & visual system, brand, and direction of the AI-assisted build (SwiftUI + MCP server).
The Frame
The first version of Cortex was the wrong product
The first articulation was a file-sync utility: keep CLAUDE.md files consistent across Claude Code, Desktop, and Console. Reasonable. Buildable in a weekend. Wrong product.
The deeper problem wasn't files drifting out of sync — it was that Claude re-learns the same things in every project. Every new session, the same corrections, the same preferences, the same groundwork. The collaboration wasn't compounding. It was restarting.
The thesis
A memory system only works if you trust it — and trust isn't a screen you add at the end. It's earned in the architecture. Everything that follows is a decision about that.
- 1
Common Ground
Sync as a shared foundation. Accurate — but shallow.
- 2
Good Collaborator
Gets better over time. Now we're describing a learning layer.
- 3
Builds Expertise
Skills that transfer across projects. This one rewrote the IA, the interaction design, and the value proposition — before a single screen was sketched.
The Inversion
Intelligence lives above projects, not inside them
"Always run xcodegen after a merge" is learned in one project. In a file-based world it stays there forever. The reframe: recognize it as an xcodegen-workflow pattern — project-type-agnostic — and make it available to any project that uses xcodegen, including projects that haven't started yet.
Projects consume skills; they don't own them. That single inversion — intelligence above projects, not inside them — is the kind of decision that defines a product category instead of a feature. It was a design decision before it was an engineering one.
Project-centric model
Memory siloed inside each project — nothing compounds
Cortex model
One memory above all — it compounds everywhere
Most tools put memory inside each project. Cortex puts intelligence above all of them — so what you learn in one place compounds everywhere.
The Principle
Make a knowledge graph feel like a colleague, not a database
The architecture was right; the harder problem was experiential. A real graph sits underneath — skills connect to projects, projects to corrections, corrections to sessions. But the moment a user feels like they're administering that graph — nodes, edges, relationship counts — the design has failed.
One principle resolved it: expertise, not infrastructure. The user should see "Claude knows how to do X," never "there are three edges connecting these nodes." That cascaded into rules I wrote down before any wireframes: skills named like capabilities, not rules; the graph never exposed directly; promotion never automatic; origin always preserved.
Modeled on how memory actually works — which is why it reads as expertise, not storage.
The Hardest Interaction
Discovery, not automation — the system notices; the user decides
Skill promotion is the highest-stakes moment in the product. Too eager and the global skill set fills with project-specific noise; too timid and the cross-project learning never happens. The whole thing turns on a feeling: does this read as the system noticing something, or the system deciding something? The first earns trust. The second erodes it.
So the copy is load-bearing. The approved framing is observational and tentative — past tense, evidential, non-prescriptive: "You've applied this in Hopscotch and Tokenomics. It looks like a general practice — make it a skill so Claude uses it everywhere it applies."
- 1
✗ "A new rule has been created from your corrections."
Passive, mechanical — the system already acted.
- 2
✗ "We think you should make this a global rule!"
Prescriptive, over-excited, presumes the answer.
- 3
✗ "Cortex detected a pattern."
Technical framing that leaks the implementation.
- 4
✓ "You've applied this in two projects — make it a skill."
Observational. Earned confidence, offered as a choice.
✦ Offer, never act
The secondary action does as much work as the primary. "Keep in Projects" — not "Dismiss" — tells you nothing disappears; it just stays scoped. One word, a completely different emotional register. Promotion lives in the Inbox, never inline: a lasting decision deserves space, not a one-liner under a terminal.
The skill-promotion card in the Cortex inbox — a pre-generated skill name, the exact instruction text shown before confirming, and two actions: Save as Skill / Keep in Projects.
The Trust Model, Inverted
Sometimes trust is asking first — sometimes it's acting, then offering undo
Promotion asks first because the stakes are high. But most learning isn't — it's a correction you made in passing, the kind you'd never stop to file. Requiring approval for each one would make the system useless at volume. So capture inverts the rule: over-remember, then actively forget. Corrections are caught automatically, go live as probationary rules, and surface in a "Recently Learned" feed where a single thumbs-down pulls one back. The judgment moved out of the save moment and into the pipeline — decay and consolidation became the editor.
That created a subtler trust problem. Cortex reads its own past sessions to judge which rules are working — but those transcripts contain the very rules Cortex injected. A naive system would count "Claude followed this rule" as proof the rule was right. A rule shouldn't get to vote for itself. So injection stopped counting as evidence: a rule needs corroboration from two independent sessions to graduate, and one genuine contradiction can demote a rule that's been applied correctly a hundred times.
✦ The guard
Injecting a rule into a session is not corroboration. The decay clock runs from the last independent confirmation — not the last time the rule was shown to Claude. The store tracks what's true, not what was repeated.
The 'Recently Learned' review feed — probationary rules captured from recent sessions, each with a one-tap thumbs-down to pull it back. A passive safety net, not an approval queue.
✦ Act, then offer undo
Auto-captured rules go live immediately and land here for review — the inverse of the promotion inbox. High stakes earn an ask; low stakes earn an easy undo. Same product, two trust settings, each matched to what's actually at risk.
Transparency
What you leave out is what earns the trust
As Cortex assembles context from several layers, users need to answer one question without understanding the architecture: does Claude have what it needs for this session? Showing what's loaded isn't enough. What creates trust is showing what was left out — and why.
"signing-debug — not relevant here" is as important as the list of what loaded. Without that reasoning, an absence becomes a worry: did the system forget? With it, the absence is legible — a judgment about relevance. I borrowed the move from iOS Focus mode: surfacing what's off makes what's on feel deliberate.
The Session Readiness view — three positive sections (Skills loaded, Project Context, Your Preferences) above a quieter 'Not Loaded' section listing excluded items with one-line reasons.
A read-only preflight check. Typography carries the hierarchy; the ✦ marks skills from the global layer. You view here — you edit elsewhere.
The inverse of every status bar
When everything relevant is loaded, the "Not Loaded" section disappears entirely. The best-case state is the cleanest one — silence means success.
Scope Discipline
Two surfaces, because there are two modes
Cortex serves two modes that one surface can't. Ambient awareness — a glance at status mid-session, then back to work. And deep management — browsing the graph, reviewing skills, reading what a session was built from. A 360-point menu-bar panel for the first; a full window for the second; one shared state behind both.
Designing the second surface is what let the first one be ruthless. With deep access living in the window, the panel didn't have to grow edit affordances and detail rows — it could stay a calm, three-row glance. Surface separation is scope discipline.
The compact menu-bar popover — status, three summary rows (Memory / Agents / Skills) with counts, sync status, one action.
Ambient: a glance, then back to work.
The full management window — NavigationSplitView, sidebar sections, master-detail, memories and skills with their origin preserved.
Management: for when you're ready to think about the system itself.
Foundations
The design system existed before the screens did
Before any view was implemented, I codified the foundations: a five-token spacing scale on a 4-point grid, a six-size type scale that signals hierarchy through weight rather than big size jumps, and a semantic color system — never hardcoded hex — so dark mode and accessibility settings come for free.
Two marks carry the brand into the product. The six-band wave — also the menu-bar icon — and the ✦ skill glyph, chosen over a checkbox precisely because a checkbox implies configuration debt. The ✦ signals presence from the global layer without implying anything needs managing. Used consistently, it means something without a legend.

✦ The mark
The six-band wave is the menu-bar icon. The same motif running through the page background appears as the actual app mark — the brand lives in the product, not alongside it. Idle (monochrome) vs. Alert (indicator dot): two states with nothing added except the dot. No color change, no animation. The difference is minimal because the signal should be calm, not urgent.
The wave at its smallest expression: 18pt, two states, two appearances.
Green Dashboards, Broken Product
Every layer reported success. The product delivered nothing.
For two months, Cortex's core promise — save a correction in one session, recall it in the next — was completely broken, in a way that looked completely fine. MCP tools returned success. Tests passed. The CLI printed confirmations. Five independent bugs were each masking the next, which is exactly why all five survived.
I found them by refusing to trust the logs — sitting down to run the actual demo and following what really happened at each step. Each fix exposed the next failure. No amount of unit testing would have caught this: every component worked in isolation. The failure lived in the seams between them.
- 1
The reply never flushed
JSON-RPC answers sat in a buffer until exit. The manual test passed only because closing stdin forced a flush. The real protocol got nothing.
- 2
The search join was silently empty
A text hash compared against a row integer — always false, zero rows, zero errors. It read as "found nothing," not "broken."
- 3
The fallback loaded results and discarded them
Recent memories were read into a dictionary the output never consulted. The one path that could have returned something never did.
- 4
Save and recall used different databases
The hook read one file; the app wrote another. Two operations, two files — recall could never see what save stored.
- 5
Bundling broke the app's own signature
Sidecars copied in after Xcode sealed the bundle — guaranteed notarization failure. The fix made the app self-heal its binaries at launch.
What I took from it
The most dangerous system states are the ones where every layer reports success. The discipline that works isn't "did each component do its job?" It's "did the user get what the product promised?" Those are different questions — and they find different bugs.
Why it's different
A filing cabinet stores. A garden grows.
Most AI memory tools are good filing cabinets — they store and organize, and never change. Cortex is built to behave like memory: it strengthens what you reinforce, lets the unused fade, and gets more useful the longer you use it. The architecture that made that possible also makes the business model honest — local runs free on your Mac at zero marginal cost, and cloud sync (in testing now, coming soon) is the only piece with a real per-user cost, so it's the only part that will be paid.
100% on-device
No cloud, no API key
On your Mac
Data never leaves
Free local
Sync is the only paid tier
$49/yr
Sync tier — one real cost
Filing cabinet
Organizes well, never learns
Cortex
Living knowledge
Cortex — organizes and learns
Raw notes
Neither organizes nor learns
Diary
Learns context, poor organization
A filing cabinet stores. A garden grows. Cortex is the only system that does both.
The complete system
Every color, type decision, the wave, the voice, and the ✦ live in one place — the Cortex brand guide, built as a single self-contained artifact.
Open the brand guide →What Shipped
MCP
Protocol
v1.5+
Shipped & iterating
114→252
Tests at verification
End-to-end
Verified
MCP server live end-to-end — a correction saved in one session now surfaces in the next, across projects. The menu-bar app added an ambient capture pipeline that learns without being asked, a redesigned six-tab settings model, and an onboarding flow that teaches the memory model in about fifteen seconds. Bidirectional file sync for skills and agents shipped in v1.1; cloud sync to web and mobile is in testing. The visual system — spacing tokens, semantic color, type scale — was specified before any view was built.
- MCP server live end-to-end — a correction saved in one session surfaces in the next, across projects
- Menu-bar app shipped: Session Readiness shows the loaded context and the reasoning behind what was left out
- Ambient capture shipped: corrections are caught automatically, then decay and consolidation decide what survives
- Anti-self-reinforcement guard: an injected rule can't count as evidence for itself — the store tracks what's true, not what repeated
- Honest sync (v1.1): three surface cards, each labeled with its real sync mode — no false "connected" status
- Two-tier trust model: high-stakes skill promotion asks first; low-stakes capture acts, with one-tap undo
- Visual system specified before any view was built: spacing tokens, semantic color palette, typography scale
What I Learned
The most dangerous system states are the ones where every layer reports success. The discipline that finds the real bugs isn't 'did each component do its job?' — it's 'did the user get what the product promised?' Those are different questions, and they find different bugs.
What this demonstrates
More Work
All projects →