This is a project post about Cortex: my proof of concept build of a personal wiki. In Part 1 I argued that the real pull of Karpathy’s LLM Wiki wasn’t architecture — it was an emotional promise: let the machine see you, and you’ll finally see yourself. I wanted to find out if that was true. So I built it, here.
What Cortex Is
Cortex is a native macOS app that ingests your saved links — exported from Notion as markdown — and turns them into three views: a Knowledge Graph, a searchable Wiki, and an Interest Landscape. It runs entirely on your machine. No cloud. SQLite under the hood.
660 links in. 46 topic hubs discovered. 3,092 connections mapped.
The Graph
660 articles laid out across 46 topic hubs — the shape of two years of reading, visible at once
The central piece is a bipartite force-directed graph rendered with D3.js v7 on Canvas 2D inside a WKWebView. Topic hubs — large labeled circles, sized by article count — float in the center; article nodes cluster around their topics as colored dots. The shape of your knowledge collection becomes readable at a glance: where you’re dense, where you’re sparse, and which topics you’ve avoided without realizing it.
Topic extraction runs through a ~50-rule pattern engine layered with URL domain signals: arxiv.org routes to AI Research Papers, github.com to Open Source & GitHub, substack.com to Writing Craft. Each article can belong to multiple topics, creating cross-connections between hubs.
Explore Any Topic Hub
Clicking Large Language Models surfaces 197 articles in that cluster — click any title to jump to its full Wiki entry
Clicking any hub dims the rest of the graph and opens an inline panel listing every article in that cluster. Large Language Models surfaces 197 articles. DevOps & Infrastructure has 34. Every title is clickable — it jumps straight to the full Wiki entry.
The sidebar category filter wires directly into the graph. Clicking AI & Machine Learning (268 links) pulls that cluster forward and dims everything else — a fast way to explore within a domain without losing spatial context.
The Wiki
Every article gets a full detail panel: topics, key concepts, named entities, content preview, and related links surfaced from the graph
The Wiki tab is a searchable list of all 660 links. Every article gets a full detail panel:
- Summary — extracted from page content stored in the markdown
- Topics — multi-label, up to 8 per article
- Key Concepts — distilled terms (e.g.
rag, llm)
- People — named entities (e.g. Andrej Karpathy)
- Tools & Companies (e.g. OpenAI, Anthropic)
- Metadata — sentiment, complexity, type, word count, connection count
- Content Preview — first few hundred words without opening the browser
- Related Links — articles connected through shared topics, surfaced from the graph
The Interest Landscape
Trends: monthly saves by category from Mar 2024 to Apr 2026, and a lifetime breakdown — AI & Machine Learning at 260, Software Engineering at 126, AI Agents at 72
The Trends tab answers: what do you actually read about, and when?
Monthly Activity by Category plots every link saved across 26 months as a stacked bar chart, color-coded by primary category. The shape is readable immediately: a dense burst in early 2024, a lull through mid-year, then a sustained uptick from late 2025 into 2026. AI & Machine Learning (blue) is the load-bearing layer in almost every month.
All-Time by Category strips the time dimension and just answers the question flat: 260 AI & Machine Learning links, 126 Software Engineering, 72 AI Agents & Workflows. Everything else trails off fast. That ratio — AI infrastructure at roughly 4× the next category — is what you stop noticing when you’re inside it one link at a time.
Under the Hood
Stack: Swift + SwiftUI · D3.js v7 + Canvas 2D inside WKWebView · SQLite via GRDB 6.29.3 · Packaged as a native .app with ad-hoc code signing
The silent bug that killed 660 records. DateFormatter without an explicit locale silently fails to parse English month names on non-English systems. One line fixed it: formatter.locale = Locale(identifier: "en_US_POSIX"). 660 NULL timestamps, instantly recovered. Silent failures are the hardest bugs.
The Charts crashes that required three separate fixes. LinearGradient on a BarMark crashes Swift Charts on hover. Duplicate abbreviated Y-axis labels crash the scale. And @Published properties emit their current value immediately on subscription — so onAppear and onReceive both fire simultaneously, two concurrent Tasks race to write chart state, and Swift Charts hits an internal assertion. Fixed with a single .task(id:) modifier.
What the Promise Got Right
The graph tells you things about yourself you didn’t know you believed. Not through insight — through pattern. I thought I read broadly about AI. The graph showed I read almost exclusively about AI infrastructure and tooling — almost no alignment, almost no theory. That wasn’t what I would have said if you’d asked me.
What the Promise Got Wrong
Cortex makes it easier to find what you’ve already encountered. It does not make you encounter better things. The knowledge compounds in structure, not in quality. The most useful output isn’t the graph — it’s the delta between your self-applied tags and the machine’s extracted topics. That gap is where the self-knowledge actually is.
View the source on GitHub →
Built with Swift, D3.js, GRDB, and Claude Code. Runs entirely on your Mac.