Repository avatar
AI Tools
v0.22.1
active

enzyme

io.github.jshph/enzyme

Semantic search and AI context for your Obsidian vault. Surface patterns with catalysts.

Documentation

What's in this repo

This README explains the concepts. For practical setup, see vault-guides/—shell script templates to (optionally) help you describe your vault structure before running enzyme init.

Enzyme Slate

A Slate is a structured map of your vault's conceptual topology—which entities carry signal, when you last engaged them, and what questions they raise.

How it differs from CLAUDE.md

CLAUDE.md is static context. You write it, Claude reads it.

A Slate contains catalysts: questions that actively retrieve content from your vault. Not keyword search. Not "find files with this tag." Catalysts surface content that resonates with the question, even if the words don't match.

Think of CLAUDE.md as a map that tells Claude where things are. A Slate is more like a compass—its catalysts point toward content that resonates with a question, surfacing what's latent rather than what's labeled.

A Slate is also computed. It reflects the current state of your vault, and you can't hand-write it. It changes as your vault changes.

Entities as semantic clusters

Every tag, link, and folder pattern in your vault is an entity: a semantic cluster that gathers related content.

When you tag a journal entry and a book highlight with #travel, you're not filing them. You're drawing a line between them. Enzyme sees that line—and everything else connected to it.

#travel
├── journal entry from a solo trip
├── highlight from a book on wandering
├── note about a conversation with a stranger
└── question you wrote at 2am in a new city

That cluster exists whether you remember it or not. Enzyme surfaces it.

Hierarchical tags create nested clusters. #travel/pyrenees is a subset of #travel, and Enzyme understands this—a catalyst for #travel can pull from Pyrenees content, while one for #travel/pyrenees stays focused.

Wikilinks work differently. A link like [[open questions]] isn't a folder; it's a note that other notes reference. Enzyme treats it as an entity and clusters everything that links to it.

Folders group content by structure. Content in people/ or Readwise/Books/ forms its own cluster based on where it lives.

Within each cluster, Enzyme prioritizes recency. A folder like people/ surfaces the people you've been thinking about lately.

Catalysts probe the clusters

For each entity, Enzyme generates catalysts: questions tuned to surface what's latent in that cluster. The same vault, explored through different catalysts, reveals completely different material:

CatalystWhat surfaces
"What kept pulling you forward when something was asking you to stay?"Meeting notes and journal entries about pace, presence, what someone else helped you see
"Rubin wrote 'begin with a question and use it to guide an adventure of discovery'—where did you do this, or fail to?"Book highlights alongside journal entries about craft, curiosity, getting lost
"Le Guin called attention 'not all that different from hunting'—where did the camera make you a tourist instead of a hunter?"Reflections on capture vs. presence, when documenting replaced noticing

Content surfaces not because it contains the right words, but because it speaks to the same question.

Temporal awareness

Enzyme tracks when you last engaged each entity, bucketing them into active, moderate, and dormant based on how recently and frequently you've touched them.

Dormant entities are often the most interesting. Enzyme can surface questions about threads you've abandoned, patterns you stopped noticing, ideas that went quiet.

What's in a Slate

A Slate is JSON. It captures what a CLAUDE.md file can't: when you last touched each thread, how active it's been, and questions generated from the content itself.

Enzyme generates a question that probes what's latent in the #travel cluster, and the question becomes the retrieval mechanism. It knows you touched this entity two days ago, that it's active, that you've been thinking about it. A static file can only know what you remembered to write down.

{
  "slate_entities": [
    {
      "entity": "#travel",
      "type": "tag",
      "temporal_metadata": {
        "last_seen": "2026-01-02",
        "activity_trend": "active"
      },
      "catalysts": [
        {
          "text": "What kept pulling you forward when something was asking you to stay?",
          "topic_name": "pace and presence"
        }
      ]
    }
  ],
  "summary": {
    "total_entities": 30,
    "total_catalysts": 281,
    "activity_distribution": { "active": 28, "moderate": 1, "dormant": 1 }
  }
}

Inspecting your Slate

# See what entities Enzyme found
enzyme slate | jq '.slate_entities[] | .entity'

# Check activity levels
enzyme slate | jq '.slate_entities[] | {entity, activity: .temporal_metadata.activity_trend}'

# Look at catalysts for an entity
enzyme slate | jq '.slate_entities[] | select(.entity | contains("travel")) | .catalysts[].text'

# Find dormant entities
enzyme slate | jq '.slate_entities[] | select(.temporal_metadata.activity_trend == "dormant") | .entity'
MCPB
https://github.com/jshph/enzyme-public/releases/download/v0.22.1/enzyme-mcp-0.22.1-macos-arm64.mcpb
Install Command
# mcpb: https://github.com/jshph/enzyme-public/releases/download/v0.22.1/enzyme-mcp-0.22.1-macos-arm64.mcpb