Phase 3: processing to the vault
Phase 3 converts approved items into structured Obsidian notes. All generation runs locally via Qwen3.5:9b. Add --hd to any command to use Claude Sonnet 4.6 instead (after explicit confirmation).
Papers
Papers reach _inbox via the Zotero browser extension, the iOS app, or automatically via the feedreader (after calibration). After a Go decision in Phase 2:
verwerk recente papers
Claude Code:
- Retrieves metadata from Zotero MCP (title, authors, year, journal, citation key, tags) — no full text
- Calls the local subagent
process_item.pywith only the item key and metadata:process_item.pyfetches the full text locally, generates a structured note via Qwen3.5:9b, builds the YAML frontmatter, and writes the.mdfile toliterature/- Claude Code receives only
{"status": "ok", "path": "literature/..."}— no source content
- Adds
[[internal links]]to related notes in the vault - Removes the item from Zotero
_inbox
The generated note contains:
- YAML frontmatter (title, authors, year, journal, citation key, tags, status)
- Core question and main argument
- Key findings (3–5 points)
- Methodological notes
- Relevant quotes (original language)
- Links to related notes
Notes are saved to literature/[citation-key].md.
Privacy: no paper content ever appears in Claude Code's context.
process_item.pyis a self-contained local subagent — it fetches, generates, and writes without returning any source text to the orchestration layer.
YouTube videos
Videos added via the iOS share sheet from the YouTube app arrive in Zotero _inbox as watch URLs. After a Go decision:
transcript [URL]
Claude Code:
- Checks whether a transcript is already cached from the feedreader (
.claude/transcript_cache/{video_id}.json) — no re-fetch needed if so - Falls back to yt-dlp if no cache exists
- Generates a structured note locally via Qwen3.5:9b:
- Title, speaker, channel, date, URL
- Summary (3–5 sentences)
- Key points with timestamps
- Relevant quotes with timestamps
- Adds frontmatter,
[[internal links]], and#videotag - Removes the raw transcript from
inbox/and the item from Zotero_inbox
Notes are saved to literature/[speaker-year-keyword].md.
Podcasts
Podcast episodes added from Overcast (via iOS share sheet) arrive in Zotero _inbox as overcast.fm URLs. After a Go decision:
podcast [URL]
Claude Code:
- Checks for a cached show notes file in
.claude/transcript_cache/podcast_{episode_id}.json - If no cache: downloads audio via yt-dlp, transcribes locally via whisper.cpp (automatic language detection)
- For long episodes (> 45 min): generates a layered summary first (main line → per segment), then the final note
- Generates a structured note locally via Qwen3.5:9b:
- Title, speaker(s), programme/channel, date, URL
- Summary (3–5 sentences)
- Key points with timestamps
- Relevant quotes with timestamps (original language)
- Adds frontmatter,
[[internal links]], and#podcasttag - Removes raw
.mp3and.txtfiles frominbox/and the item from Zotero_inbox
Notes are saved to literature/[speaker-year-keyword].md.
RSS web articles
Non-academic articles from RSS feeds that you forward to _inbox can be processed in two ways:
Via Zotero (recommended for articles worth citing):
verwerk recente papers
The item is already in _inbox with metadata from the Zotero Connector. Processed as a standard literature note.
Direct to inbox/ (for news items, policy documents, quick reads):
inbox [URL]
Claude Code fetches the article and saves it as a Markdown file in inbox/. You can then ask Claude Code to convert it to a note in literature/.
Notes get #web or #beleid as appropriate.
After processing
After each session, check whether:
- New notes are linked to related existing notes (
[[double brackets]]) - Relevant syntheses in
syntheses/need updating - Flashcards should be created for the new notes:
maak flashcards voor literature/[note].md
If new papers were added to Zotero, update the semantic search database:
update-zotero