Zettel Brainstormer
Run this workflow in order. Keep each stage separate so relevance decisions happen before drafting.
Configure Once
- Run setup:
python zettel-brainstormer/scripts/setup.py
- Confirm
zettel-brainstormer/config/models.jsoncontains:
zettel_diroutput_dirmodelsandagent_modelsretrieval.link_depthandretrieval.max_links
Stage 1: Retrieval
Goal: retrieve candidate notes from the seed note.
Required order for this stage:
- Read retrieval limits from config and target candidate count using
retrieval.max_links. - Prioritize retrieval from the external
zettel-linkskill when it is available and indexed. - Also, run local retrieval with
scripts/find_links.pyto gather wikilink and tag-overlap notes. - Merge and deduplicate candidates, prioritize semantic candidates first, and trim to configured count.
- Exclude the seed note itself.
Local retrieval command:
python zettel-brainstormer/scripts/find_links.py \
--input "/absolute/path/to/Seed Note.md" \
--output /tmp/zettel_candidates.json
Treat /tmp/zettel_candidates.json as the candidate pool for preprocessing.
Stage 2: Preprocess (Subagent Per Note)
Goal: preprocess each candidate note and decide relevance to the seed note.
- Read
agents/preprocess.mdas the per-note instruction. - Spawn one subagent per candidate note.
- For each note, require:
- Relevance score against the seed note topic.
- Concise summary.
- Distinct key points.
- Short evidence quotes when useful.
- Save each subagent output as markdown (one file per source note).
Quality rules:
- Reject notes with weak relevance.
- Prefer concrete claims and non-duplicated points.
- Keep outputs compact and structured for downstream merge.
Stage 3: Draft (Synthesis Subagent)
Goal: gather only relevant preprocess outputs and generate a referenced draft.
- Run the aggregation helper:
python zettel-brainstormer/scripts/compile_preprocess.py \
--seed "/absolute/path/to/Seed Note.md" \
--preprocess-dir /tmp/zettel_preprocess \
--output /tmp/zettel_draft_packet.json
- Read
agents/draft.md. - Use one drafting subagent with:
- Seed note content
- Filtered relevant notes from
/tmp/zettel_draft_packet.json - Required citation mapping from the packet
- Produce a draft that cites source notes inline and preserves traceability.
Stage 4: Publish (Publisher Subagent)
Goal: rewrite the draft into natural long-form writing while preserving evidence quality.
- Read
agents/publisher.md. - Use one publisher subagent to rewrite the draft with these constraints:
- Remove generic AI phrasing.
- Use natural language and a coherent author voice.
- Organize points with clear tiered argument structure.
- Remove irrelevant points.
- Do not force weak connections between notes.
- Keep explicit citations for all retained claims.
- Do not publish the draft's internal "Argument Spine" section.
- Append valid frontmatter properties, including article-relevant
tags.
- Always end with a
## Referencessection listing every cited note.
Bundled Resources
agents/retriever.md: retrieval-stage instructionsagents/preprocess.md: per-note preprocessing instructionagents/draft.md: synthesis drafting instructionagents/publisher.md: publication rewrite instructionscripts/find_links.py: retrieval script for wikilinks + tag overlapscripts/compile_preprocess.py: filter and merge preprocess outputs into a draft packetscripts/obsidian_utils.py: wikilink and tag helpersscripts/config_manager.py: shared config loaderscripts/setup.py: interactive config setup
Maintenance Rules
- Keep stage boundaries strict: retrieval -> preprocess -> draft -> publish.
- Keep prompts in
agents/and scripts inscripts/. - Remove deprecated scripts instead of keeping parallel legacy paths.