how i use enzyme
A practitioner's walkthrough of the capture-to-compounding system I built on top of Obsidian.
In 2023 I wrote about looking for the right tool. That post ended with Obsidian. This one starts there, because the tool I ended up building sits on top of it, and the distance between finding a home for your notes and making the archive think with you turned out to be the interesting part.
Enzyme is a CLI that runs over an Obsidian vault. I built it for myself and have been using it daily for over two years. I want to describe how I use it, because the value is in how the layers compound over time.
What I capture
Four daily flows feed the vault:
-
Kindle highlights. When I finish a reading session, highlights sync to Obsidian via Readwise. I tag them by the thread they connect to. A passage from Buechner about honesty in memoir gets
#storytelling. A paragraph from a theology book about walking pace gets#hospitality. The same highlight might get#craftand#faithif both threads are live. -
Voice memos. Walking, driving, after a conversation. These get transcribed and dropped into the inbox. The transcription is rough. That’s fine. What matters is the timestamp and whatever tags I add after skimming.
-
Handwritten journaling. I journal by hand, then transcribe into the vault using Wispr Flow, a voice-to-text tool that transcribes inline wherever the cursor is. The practice stays analog. The material enters the system when I read it back aloud.
-
Claude Code sessions. I run Claude Code from within the vault. When connecting ideas surfaces something new, I tell the agent to persist it — it creates a note with markdown links back to the source notes and quotes material using block embeds. The new note carries its lineage visibly.
About fifteen to twenty tags recur consistently: #storytelling, #entrepreneurship, #hospitality, #taste, #craft, #capture, #faith, #relationships, #pkm, #ai-ux, #margins, #discovery, #ecology-of-technology, a few others. They show up across hundreds of notes. The same tag on a Kindle highlight, a voice memo, and a reflection written at 2am creates the cross-references that matter later.
Tags as grips
There’s a version of personal knowledge management that treats tags as overhead, something AI should eventually handle for you. I think that gets it backwards.
Choosing a tag is thinking. When I tag a note #hospitality, I’m making a claim: this connects to the thread about rest and presence and receiving someone. An embedding model might cluster the note near similar content. But the tag carries my decision that this belongs, and the embedding doesn’t.
Enzyme uses embeddings for semantic search, and they’re good at surfacing adjacent ideas. The explicit tags do something different. They’re emotive anchors. When I search by #taste, I get back the specific trail of moments where I felt the pull of accumulated discernment: a coffee shop in Iceland, a soba restaurant in Tokyo, a design decision in my own product. Embeddings surface what’s nearby. Tags surface what I’ve been tracking for years, across contexts I wouldn’t think to connect.
It takes months to build the habit. But once fifteen tags are flowing through your capture practice, the vault holds a shape that resembles how you actually think.
This matters for what comes next, because the tags are what enzyme indexes, and what the agent is constrained to reuse. When a Claude Code session creates a new note, the CLAUDE.md has a hard rule: only tag with what enzyme retrieved, never invent. The tag vocabulary stays stable because every new note inherits from the notes that informed it. The grips propagate.
Enzyme in practice
Enzyme has two main commands. enzyme petri shows what’s trending in the vault: which tags, folders, and wikilinks have been active recently, weighted by frequency and recency. Each entity comes with catalysts, thematic questions generated from the content beneath it. The catalyst for #inbox right now reads: “When does the impulse to capture become a substitute for the thing it captures?” I didn’t write that as a question. Enzyme surfaced the tension I’d been circling.
enzyme catalyze is semantic search. I give it a concept like “friction as formation” and it returns notes connected to that theme regardless of their tags.
I rarely type these commands myself.
The actual daily use runs through Claude Code. A file called CLAUDE.md sits at the vault root and teaches the agent how to work with the vault: when to run enzyme petri for a bird’s-eye view, when to run enzyme catalyze for thematic context, how to create notes using a script, and a hard rule to only reuse existing tags from retrieved content. Never invent new ones. When I open a session, the agent already knows how to navigate the archive.
A real session: I come in with a half-formed thought about product philosophy. The agent runs enzyme catalyze "taste as product mindset" and gets back five notes I’d written months apart. It reads them. It runs a second query, enzyme catalyze "legibility daydreaming travel", chasing a thread that showed up in the first results. It reads those files too. Then it runs the new-note script, creates a timestamped file in inbox/, and writes a synthesis that traces the connection between those notes. The tags on the new note come from the retrieved content: #taste, #craft, #storytelling. I didn’t specify them. The CLAUDE.md told the agent to extract tags from what enzyme surfaced.
I’ve watched sessions chain three or four enzyme queries in a row, each one sharpening the angle. The agent treats enzyme as a way to understand what the vault is about thematically, not as a file browser. It decides when to use enzyme catalyze for conceptual search and when to fall back to grep for exact tag or name matches. The CLAUDE.md gives it that judgment.
The catalysts carry a first-person wondering tone. “What does the practice of logging what worked suggest about the iterative nature of influence?” instead of “Key themes: iteration, logging, reflection.” That voice comes from how I annotate, from years of marginalia that asks questions. Someone could fork the engine, but the catalysts would sound like documentation. The voice follows from a specific person’s relationship with their own material.
Architecture as values
Local-first and small. The embedding model is ONNX int8-quantized, 23MB. Runs on CPU. An embedding daemon keeps the model warm via a Unix socket so queries return in under a second. I want this to be something you install and forget about, the way you forget about a good knife because it works when you reach for it. A thinking tool that lives on someone else’s server has a dependency you didn’t ask for.
Composable by design. I built a separate project, obsidian-bootstrap, that sets up a vault from scratch as a Claude Code skill. It walks someone through capture workflows, installs plugins, configures hotkeys, generates a getting-started guide. When the vault gets heavy enough, enzyme init is one command away. Both tools ship as self-contained packages. The bootstrap skill is 302 lines of instruction and a folder of plugin assets. The entire Enzyme package, model included, is under 50MB. They compose because each one does one thing and stays out of the other’s way.
Near-zero marginal cost. Catalyst generation runs through Gemini Flash Lite, the cheapest model that produces the wondering-tone questions I want. A refresh doesn’t need to touch every note. Enzyme weights by recency, so the tensions that matter live in the most recent thousand or so notes, the ones where threads are still moving. Older notes contribute structure: the tag graph, the entity relationships, the shape of how ideas cluster. It’s similar to how a recommendation engine learns from playlists. The individual track matters, but what really teaches the model is the sequence, what got placed next to what and when. A refresh costs a fraction of a cent and runs in seconds. Everything after the indexing pass is local with no API calls.
The engine is free. The guide is craft. Enzyme’s config file, the “guide,” tells the engine which entities to track, what profile each carries (dialectical, relational, strategic, reflective), and how to weight the vault’s structure. I can hand someone the CLI and they’ll get useful results. The tuning, which tags to catalyze, what profile to assign, how to read the shape of someone’s archive, that’s where the practitioner’s taste shows up.
What compounds
A note about a road trip through Iceland, observing my friend evaluate gas station coffee, sat in the vault for months tagged #taste and #craft. A separate note about Enzyme’s catalyst voice, tagged #enzyme and #storytelling, sat nearby. Months later I opened a Claude Code session with a question about product philosophy. The agent ran enzyme catalyze "taste as product mindset" and surfaced both. The synthesis it produced connected taste-as-accumulated-discernment to specific design decisions: why the catalyst voice sounds the way it does, why reflection-before-retrieval exists, why the cost-of-knowing interface shows you the archaeology of your own returns to a question. That note got the same tags as its sources and became findable by the next session. The thread grew without me planning for it to.
Another thread: a garden keeper in Kona said “This is a working garden, and it’s not very user-friendly. Please be careful.” I captured that during a retreat in 2023, tagged #craft and #hospitality. It connected, through enzyme, to a PKM essay I wrote in 2025, and then to Enzyme’s own content strategy. The design philosophy of working with imperfect capture traces back to standing in that garden and recognizing my vault in it. Three years of material became a design position that no requirements doc could have produced.
The vault has over a thousand notes in the inbox alone. Fifteen recurring tags create hundreds of cross-references. Enzyme’s catalysts phrase the tensions I keep returning to as questions I haven’t answered. What holds the system together is that each layer feeds the next without extra effort: I capture and tag, enzyme indexes what I’ve tagged and surfaces connections across it, Claude Code extends those connections into new notes carrying existing tags, and those notes enter the pool for the next session. The vault doesn’t distinguish between a note I wrote walking around the block and one that emerged from a midnight synthesis session.
Coda
I’ve read Matuschak on evergreen notes and Luhmann on the zettelkasten and the usual references. The useful observation from all of them is the same: the system works because the practitioner uses it. Architecture matters less than returning to your material every day and finding something you didn’t expect.
Enzyme is the tool I built because the vault got heavy enough to need one. My tags carry years of reading practice. The catalysts phrase questions I keep circling back to, and the CLAUDE.md encodes how I think about the vault for an agent that picks up where I left off. Someone else’s system would look different. It should. The whole point of a working garden is that the gardener’s hands are in it.
---
If you enjoyed this post, you can subscribe here to get new posts and a weekly marginalia digest. No spam, unsubscribe any time.