# Enzyme: 미리 만든 질문으로 노트 검색
# Enzyme: searching notes with questions made in advance

- Site: https://select1.dev/2026-10-25 (English), https://select1.dev/ko/2026-10-25 (Korean)
- Entry: 015
- Published: 2026-10-25 (KST). Launch date: 2026-10-24
- Pick: Enzyme <https://github.com/byenzyme/enzyme> (source: Show HN)
- Verified: ran
- What: Enzyme 은 Markdown 노트 폴더로 로컬 검색 색인과 질문 목록을 만들고, Claude Code 같은 코딩 에이전트가 그 색인으로 노트를 찾게 하는 프로덕트다.
- What (en): Enzyme is a product that builds a local search index and a list of questions from Markdown notes. Coding agents such as Claude Code use it to find notes.
- Why: 오늘의 픽으로 선정한 이유는 몇 달 치 노트에서 무엇이 바뀌었는지 묻는 질문에도 에이전트가 답을 찾을 수 있게 하기 때문이다.
- Why (en): It is today’s pick because it lets an agent answer questions about what changed across months of notes.
- Verdict: 작동한다. 기본 설정으로 색인을 만들고, 네트워크 없이 검색했다.
- Verdict (en): It works. With the default settings it built the index, and search ran with no network.
- Tags: ai-agents, search, notes, markdown, rust, ai-built

## Checked against the README

- [pass] 검색은 로컬에서만 실행된다(Search runs entirely on your machine) — unshare -n 으로 네트워크를 차단하고 enzyme catalyze 를 실행하자 결과 10개가 3 ms 만에 반환됐다
- [pass] 기본 설정의 enzyme init 은 Enzyme 의 호스팅 모델을 사용하고 OPENAI_* 변수를 무시한다 — OPENAI_API_KEY 와 OPENAI_BASE_URL 을 지정하고 init 을 실행하자 로그에 Enzyme free-config broker 에서 설정을 받았다는 메시지가 출력됐다. OPENAI_BASE_URL 에는 요청을 기록하는 중계 서버를 지정했는데, 이 서버에는 요청이 한 건도 오지 않았다
- [unknown] 검색 결과마다 질의에 가장 알맞은 catalyst 가 함께 반환된다(Each result carries the catalyst that best connects it to the query) — 결과 10개 모두 via_catalyst_text 가 있었다. 그중 9개는 catalyst 가 같았다. 질의와 상관없는 일기 노트도 그 catalyst 에 연결됐다. 그 catalyst 가 질의에 가장 알맞은지는 확인하지 못했다

## Measured

- 네트워크를 차단한 상태에서 노트 10개를 대상으로 질의 한 번을 처리한 시간(Enzyme 이 출력한 값): 3 ms(결과 10개) (enzyme catalyze 의 JSON 출력 processing_time 0.003)

## 한국어

## 무엇이 문제인가

코딩 에이전트가 몇 달 치 Markdown 노트를 참고하려면, 질문과 관련된 노트를 직접 찾아야 한다. Anthropic 의 Claude Code 문서에 따르면 Claude Code 는 패턴으로 파일을 찾고 정규식으로 내용을 검색한다. Enzyme 의 제작자 Joshua Pham 은 README 에서, 이름이나 정확한 문구를 찾을 때는 이런 검색이 빠르지만 프로젝트에서 무엇이 바뀌었는지처럼 시간의 흐름을 따라가야 하는 질문에는 Enzyme 이 도움이 된다고 했다.

## 어떻게 해결했나

Enzyme 은 2026년 10월 24일 Hacker News 에 Show HN 글로 올라왔다. Enzyme 은 노트 폴더 안에 로컬 색인을 만든다. Enzyme 의 설정 파일은 확장자가 `.enzyme` 이고, 색인과 달리 노트 폴더 밖의 Enzyme 홈 디렉토리에 저장된다. 이 파일에 읽을 폴더와 태그를 지정하면, `enzyme init` 이 두 가지를 실행한다.

첫째, 폴더와 태그마다 시기별로 발췌를 골라 LLM 에 질문을 만들게 한다. Enzyme 에서는 이 질문을 catalyst 라고 부른다. 둘째, 모든 노트를 단어와 의미로 검색할 수 있게 색인한다. README 에 따르면 에이전트가 `enzyme catalyze` 로 질의하면, 결과마다 질의에 가장 알맞은 catalyst 가 함께 반환된다.

## 무엇이 다른가

첫째, 노트를 찾는 방식이 다르다. 정규식 검색은 패턴과 일치하는 파일을 모두 찾지만, Enzyme 은 결과를 질의와 관련성이 높은 순서로 정렬하고 결과마다 미리 만든 질문을 함께 반환한다. 에이전트는 관련 있는 노트부터 읽고, 그 질문으로 결과가 나온 이유를 알 수 있다. 다만 오늘은 결과 대부분에 같은 질문이 연결돼, 질문만으로는 결과가 왜 나왔는지 알기 어려웠다.

둘째, 정규식 검색과 달리 Enzyme 은 `enzyme init` 을 실행할 때 LLM 이 필요하다. 기본 설정에서는 Enzyme 의 호스팅 모델이 질문을 만들므로, 사용자가 API 키를 준비하지 않아도 된다. 트레이드오프는 노트 발췌문이 그 모델로 전송된다는 점이다.

## 무엇이 편해지나

- 몇 달 치 회의록과 결정 기록을 Markdown 으로 쌓아 둔 팀의 개발자. 오늘은 결정이 바뀐 이유를 질의했다. 질의에 넣은 Postgres 와 billing 이 여러 노트에 있었는데도, 바뀐 뒤의 결정 문서가 첫 결과로 나왔다.
- Obsidian 으로 노트를 관리하는 사용자. README 에 따르면 Enzyme 은 노트를 옮기거나 정리하지 않고 그대로 색인한다. 오늘 Enzyme 은 노트 파일을 바꾸지 않았다. 색인은 노트 폴더 안의 `.enzyme` 디렉토리에 만들어졌다.

## 어떻게 만들었나

- 커밋 713개는 2026년 3월 1일부터 10월 24일까지 작성됐다(작성자 시간대 기준). 이 가운데 276개에는 Claude 와 함께 작성했다는 Co-authored-by 트레일러가 있다.
- 저장소의 `crates` 디렉토리에 있는 Rust 코드는 88,321줄이다.
- 제작자는 2026년 10월 24일 Hacker News 댓글에서 Enzyme 을 Obsidian 플러그인으로 시작해 Obsidian 용 MCP 서버를 거쳐, 그 주에 오픈소스로 공개했다고 밝혔다.

## 실행해 보니

소스로 빌드하고, 직접 작성한 노트 10개로 시험했다. 회의록과 결정 문서는 결제 데이터베이스를 Postgres 에서 SQLite 로 바꾼 과정을 다룬다.

1. 빌드. `cargo build --release -p enzyme-cli` 에 4분 46초가 걸렸다. 빌드 스크립트는 Hugging Face 에서 임베딩 모델 파일을 내려받는다.
2. 설정. README 에 따르면 `enzyme compile` 은 OpenRouter 의 API 를 호출해 설정을 제안한다. 이 명령 대신 README 예시대로 설정 파일을 작성했다.
3. 색인. 기본 설정으로 `enzyme init` 을 실행하자 catalyst 33개가 만들어졌다. 실행에는 14.5초가 걸렸다. 환경 변수에 OpenAI API 키와 주소를 지정했지만, 로그에 따르면 Enzyme 은 무료 설정 서버에서 설정을 받았다. 지정한 주소로는 요청이 한 건도 가지 않았다.
4. 직접 지정한 모델. `--llm env` 로 OpenRouter 의 Claude Haiku 5.5 를 지정했다. Enzyme 은 요청의 출력 상한을 512 토큰으로 설정했다. 응답 9건은 모두 이 상한에 도달해 중단됐다. 응답에는 추론 내용만 있고 답은 비어 있었다. catalyst 는 하나도 만들어지지 않았다. `init` 은 실패했다.
5. 질문 목록. `enzyme petri` 는 만들어진 질문을 시기와 함께 보여 줬다.
6. 검색. 네트워크를 차단한 채, 기본 설정으로 만든 색인에 `enzyme catalyze` 로 결정이 바뀐 이유를 질의했다. 결과 수의 기본값이 10개라 노트가 모두 반환됐다. 처리 시간은 3 ms 였다. 첫 결과는 바뀐 뒤의 결정 문서였다. 결과 10개 모두 catalyst 와 함께 반환됐지만, 그중 9개는 catalyst 가 같았다.
7. 갱신. 노트 하나를 고치고 `enzyme refresh` 를 실행하자 고친 노트만 다시 임베딩됐다. refresh 는 19 ms 가 걸렸고 catalyst 를 다시 만들지 않았다. README 에 따르면 refresh 에는 `enzyme login` 이 필요하지만, 오늘은 로그인 없이도 refresh 가 완료됐다.
8. 비용. `--llm env` 의 실패한 요청 9건에 23,235 토큰, $0.00417 이 들었다.

README 에 적힌 세 가지 가운데 두 가지는 실행에서 확인됐다. 검색은 로컬에서만 실행됐다. Enzyme 은 기본 설정에서 OPENAI_* 환경 변수를 무시했다. catalyst 가 질의에 가장 알맞은지는 정답을 정해 두지 않아 확인하지 못했다.

```
Resolved API config from Enzyme free-config broker (model=anthropic/claude-haiku-5.5)
[catalyst] [1/3] meetings (failed: all 3 retry attempts failed: Failed to parse LLM API response as JSON)
{"processing_time":0.003,"query":"why did we move billing off Postgres and what did finance lose",...}
projects/billing-db-v2.md 0.992 | via: Why did I choose Postgres for billing when finance wanted SQL reports?
```

## 확인하지 못한 것

- `enzyme compile` 의 설정 제안. README 에 따르면 compile 은 OPENAI_BASE_URL 이 OpenRouter 주소일 때 직접 지정한 키를 사용한다. 그렇게 실행해 직접 작성한 설정과 비교하자.
- 에이전트와의 연동. `enzyme install claude` 로 Claude Code 에 스킬을 설치하고, Claude Code 가 노트에 관한 실제 질문에 답하는지 확인하자.
- 로컬 모델로 만든 catalyst. `enzyme model` 로 모델을 설치해 호스팅 모델의 결과와 비교하자.

## 판정

작동한다. 기본 설정으로 색인을 만들고, 네트워크 없이 검색했다. 다만 오늘은 직접 지정한 모델이 아니라 Enzyme 의 호스팅 모델로만 catalyst 를 만들 수 있었다. 몇 달 치 Markdown 노트를 바탕으로 에이전트가 시간의 흐름을 따라가야 하는 질문에 답해야 하고, 노트 발췌문을 호스팅 모델에 보내도 되는 경우에 써 볼 만하다. 노트를 외부로 보내면 안 되는 환경이라면, 로컬 모델로 catalyst 를 만들 수 있는지 확인하기 전까지 이 프로덕트는 적합하지 않다.

## 얻어갈 것

- 검색 결과마다 그 결과를 고른 이유를 함께 반환하고, 그 이유가 결과마다 다른지 확인해 보자.
- 자신의 API 키를 지정해도 도구의 기본값이 호스팅 모델인지 확인하자. Enzyme 은 OPENAI_* 변수가 있어도 호스팅 모델을 사용했다.

### 용어

- Show HN: 개발자 커뮤니티 Hacker News 에서 자신이 만든 프로덕트를 소개하는 글. 제목이 "Show HN:"으로 시작한다.
- LLM: 대규모 언어 모델. 많은 글로 학습해 글을 이해하고 생성하는 AI 모델이다.
- MCP: Model Context Protocol. AI 모델을 외부 도구와 데이터에 연결하는 방식을 정의한 규격이다.
- 임베딩: 문장을 숫자 벡터로 바꾼 것. 뜻이 비슷한 문장은 가까운 벡터가 되어, 단어가 달라도 의미로 검색할 수 있다.
- OpenRouter: 여러 회사의 AI 모델을 API 하나와 계정 하나로 사용할 수 있게 하는 서비스.

## English

## The problem

A coding agent with months of Markdown notes has to find the notes that matter for each question by itself. According to Anthropic’s Claude Code docs, Claude Code finds files by pattern and searches their content with regex. Joshua Pham, the maker of Enzyme, says in the README that this kind of search is fast for a name or an exact phrase. He says Enzyme helps with questions about change over time, such as what changed in a project.

## How it solves it

Enzyme was posted as a Show HN on Hacker News on October 24, 2026. It builds a local index inside the notes folder. Its settings file has the `.enzyme` extension and, unlike the index, is stored outside the notes folder, in Enzyme’s home directory. In this file you name the folders and tags to read. Then `enzyme init` does two things.

First, it picks excerpts from different points in time for each folder and tag, and an LLM writes questions from them. Enzyme calls these questions catalysts. Second, it indexes every note for search by keywords and by meaning. According to the README, an `enzyme catalyze` query returns each result with the catalyst that best connects it to the query.

## What is different

The first difference is how notes are found. A regex search finds every file that contains the pattern. Enzyme ranks results by how close they are to the query and attaches a question to each one. The agent can read the most relevant notes first and use the question to see why each result came up. But today most results got the same question, so the questions did not explain why each result came up.

The second difference is that Enzyme needs an LLM when you run `enzyme init`, and a regex search needs none. By default Enzyme’s hosted model writes the questions, so you can start without your own API key. The tradeoff is that excerpts of your notes are sent to that model.

## What it makes easier

- Developers on teams that keep months of meeting notes and decision records in Markdown. Today I asked why a decision changed. The search terms Postgres and billing appeared in several notes, but the document with the new decision came first.
- People who keep their notes in Obsidian. According to the README, Enzyme indexes notes as they are, without moving or cleaning them up. Today Enzyme did not change the note files. The index went into a `.enzyme` directory inside the notes folder.

## How it was built

- The repository’s 713 commits date from March 1 to October 24, 2026, in the author’s time zone. 276 of them have a Co-authored-by trailer for Claude.
- The Rust code in the repository’s `crates` directory is 88,321 lines.
- In an HN comment on October 24, 2026, the maker says he started Enzyme as an Obsidian plugin. It then became an MCP server for Obsidian, and he open-sourced it that week.

## Running it

I built it from source in an isolated environment and tested it with 10 notes I wrote. They were meeting notes, decision documents and journal entries. The meeting notes and decision documents describe a billing database moving from Postgres to SQLite.

1. Build. `cargo build --release -p enzyme-cli` finished in 4 minutes 46 seconds. The build script downloads an embedding model file from Hugging Face.
2. Settings. According to the README, `enzyme compile` proposes settings through an OpenRouter API. I skipped this step and wrote the settings file myself from the README’s example.
3. Index. With the default settings, `enzyme init` made 33 catalysts in 14.5 seconds. I had set an OpenAI API key and base URL in the environment. But the log said `init` got its model settings from Enzyme’s free config server. No request reached the address I set.
4. A model I chose. I used Claude Haiku 5.5 through OpenRouter with `--llm env`. All 9 of the model’s responses stopped at the 512-token output limit that Enzyme set in its requests. Each one had only reasoning text and an empty answer. `init` made no catalysts and failed.
5. Question list. `enzyme petri` listed the questions with their time periods.
6. Search. With the network blocked, I used `enzyme catalyze` on the index from the default run to ask why a decision changed. It returned the default 10 results, which were all the notes. Enzyme reported a processing time of 3 ms. The first result was the document with the new decision. All 10 results came with a catalyst, but 9 of them had the same question.
7. Refresh. I edited one note and ran `enzyme refresh`. It embedded only the edited note again. The refresh took 19 ms. According to the README, refresh needs `enzyme login`. But this refresh finished without a login and made no new catalysts.
8. Cost. The 9 requests sent with `--llm env` all failed, but they used 23,235 tokens and cost $0.00417.

I checked three claims from the README, and two held up. Search runs only on your machine, and by default Enzyme ignores OPENAI_* variables. Each result came with a catalyst. I had not set expected answers beforehand, so I could not confirm that each catalyst best connects its result to the query.

```
Resolved API config from Enzyme free-config broker (model=anthropic/claude-haiku-5.5)
[catalyst] [1/3] meetings (failed: all 3 retry attempts failed: Failed to parse LLM API response as JSON)
{"processing_time":0.003,"query":"why did we move billing off Postgres and what did finance lose",...}
projects/billing-db-v2.md 0.992 | via: Why did I choose Postgres for billing when finance wanted SQL reports?
```

## Not checked

- The settings `enzyme compile` proposes. According to the README, compile uses your own key only when OPENAI_BASE_URL is the OpenRouter address. Run it that way and compare its output with the settings I wrote.
- Use with an agent. Install Enzyme’s skill in Claude Code with `enzyme install claude` and check whether Claude Code answers real questions about the notes.
- Catalysts from a local model. Install a model with `enzyme model` and compare its catalysts with the hosted model’s.

## Verdict

It works. With the default settings it built the index, and search ran with no network. But today the model I chose could not make catalysts. Only Enzyme’s hosted model could. It is worth trying if an agent has to answer questions about what changed across months of Markdown notes, and if you can send excerpts to a hosted model. If your notes must not leave your environment, this product is not a good fit until you check that a local model can make catalysts.

## What to take away

- Return each search result with the reason it was picked, and check that the reasons differ from result to result.
- Check whether a tool uses a hosted model by default, even when you set your own API key. Enzyme used its hosted model even with OPENAI_* variables set.

### Terms

- Show HN: A post on Hacker News, a developer community, in which someone presents what they made. Its title starts with "Show HN:".
- LLM: A large language model. It is an AI model trained on large amounts of text to understand and generate text.
- MCP: Model Context Protocol: a standard for how AI models connect to outside tools and data.
- embedding: Text turned into a vector of numbers. Sentences with similar meanings get nearby vectors, so search can match meaning even when the words differ.
- OpenRouter: A service that offers many companies' AI models through one API and one account.

## Launches the same day

- Corgi <https://corgi.computer/> (Show HN, 121): 에이전트용 터미널 멀티플렉서. Claude Code, Codex 같은 에이전트의 상태를 한 화면에서 보여 준다고 소개한다.
- mali-pagecache-root <https://gitlab.com/c4psu13/mali-pagecache-root> (Show HN, 48): TCL Android TV 루팅 도구. CVE-2022-22706 취약점으로 루트 권한을 얻는다고 소개한다.
- Enzyme <https://github.com/byenzyme/enzyme> (Show HN, 15): 노트 검색 도구. Markdown 노트로 로컬 색인과 질문 목록을 만들어 에이전트가 노트를 찾게 한다.
- Drop7 solver <https://drop7.dev> (Show HN, 11): 퍼즐 게임 전략 탐색. 운이 섞인 퍼즐 게임 Drop7 의 최적 전략을 찾는다고 소개한다.
- Encarta 95 Web <https://benwinding.github.io/encarta_95_web/#/article/Art> (Show HN, 9): 백과사전 복원. Encarta 95 를 웹 브라우저에서 읽을 수 있게 만들었다.
- lantern <https://github.com/ivarvong/lantern> (GitHub, 194): 코드 설명 애니메이션. 의존성 없는 TypeScript 로 단계별 코드 설명을 SVG 로 만든다.
- xss-audit <https://github.com/songjianyang/xss-audit> (GitHub, 180): XSS 정적 검사 스킬. React, TypeScript, JavaScript 프로젝트를 14단계로 검사한다.
- unbloat-android-tv <https://github.com/xMazaki/unbloat-android-tv> (GitHub, 162): Android TV 정리 도구. 광고와 텔레메트리를 줄이고 Apple TV 같은 홈 화면을 설치한다고 소개한다.
- zCAD AI <https://www.producthunt.com/products/zcad-ai> (Product Hunt, 237): 3D 설계 AI. 모양만이 아니라 실제 부품을 만든다고 소개한다.
- myPip <https://www.producthunt.com/products/mypip-2> (Product Hunt, 207): 게임 제작 플랫폼. AI 로 게임을 만들고 공개해 수익을 낸다고 소개한다.
- 1Password for Agents <https://www.producthunt.com/products/1password> (Product Hunt, 194): 에이전트 로그인. AI 에이전트가 비밀번호를 확인하지 않고 로그인하게 한다고 소개한다.

## Getting started

- Steps: cargo build --release -p enzyme-cli ; enzyme init && enzyme catalyze "a question about your notes"
- Needs: Rust 1.88(소스 빌드), 또는 README 의 설치 스크립트, Markdown 노트 폴더. 같은 컴퓨터에서 두 번째 노트 폴더를 색인하려면 enzyme login
- Cost: Apache-2.0, 무료. README 에 따르면 기본 설정에서는 Enzyme 의 호스팅 모델이 질문을 만든다. 첫 노트 폴더는 로그인 없이 색인할 수 있다. 두 번째 폴더를 색인하려면 enzyme login 이 필요하다.
- Note: 자신의 OpenAI 호환 API 키를 사용하려면 enzyme init 에 --llm env 옵션을 지정한다. 지정하지 않으면 OPENAI_* 환경 변수는 무시된다.
