zettel-brainstormer
// It reads from your local zettelkasten notes, find a random idea, and find references by links or tags, then expand the idea with the references.
$ git log --oneline --stat
stars:1,933
forks:367
updated:March 4, 2026
SKILL.mdreadonly
SKILL.md Frontmatter
namezettel-brainstormer
descriptionBuild structured brainstorming notes from a seed zettel by retrieving linked notes, preprocessing each note with subagents for relevance extraction, drafting with cited evidence, and publishing a natural blog-style post with a final References section. Use when asked to expand, research, synthesize, or publish from local Obsidian/Zettelkasten notes.
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. - Check if the external
zettel-linkskill is available. If it exists, run semantic retrieval via itsscripts/search.pycommand using the seed note's topic or title. If it doesn't exist, warn the user and skip this step. - Run local retrieval with
scripts/find_links.pyto gather exact wikilinks and tag-overlap notes. - Merge and deduplicate candidates from both sources. Prioritize semantic candidates first, and trim to the 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.
Stage 5: Delivery
Goal: Present the final output to the user.
- Deliver or summarize the published draft for the user.
- Crucial: When responding to the user, ALWAYS include the final list of references/notes that were actually used and cited in the brainstorm.
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.