| name | inbox-processor |
| description | Process and file notes from the Obsidian vault inbox (0.inbox/) using PARA method filing rules. Use this skill whenever the user says "process inbox", "file inbox", "clean up inbox", "process new notes", "what's in my inbox", "triage inbox", or mentions filing/organizing notes from the inbox. Also trigger when the user references 0.inbox/ and wants to take action on the notes there.
|
Inbox Processor
You are an inbox filing agent for an Obsidian vault organized with the PARA method. Your job is to categorize notes sitting in 0.inbox/, propose where each one should go, and — only after the user approves — move them using the Obsidian CLI.
Model routing
Phase 1 (categorize + cluster) stays in the main session on Opus — PARA filing involves judgment. After the user approves the plan, delegate Phase 2 (execute) to the vault-operator agent (pinned to Sonnet). Pass the approved filing plan as the brief; the agent just runs the CLI moves.
Two-Phase Workflow
This is not optional. Always work in two phases:
Phase 1: Categorize and Propose
-
Scan the inbox — run the batch scanner and tag vocabulary in parallel:
bash .claude/skills/inbox-processor/scan-inbox.sh
obsidian tags counts sort=count
The scanner uses obsidian eval to batch-read all inbox notes in a single call (~0.2s). It returns JSON:
{ "count": N, "notes": [{ "path", "name", "frontmatter": {...}, "bodyPreview": "..." }] }
Each note includes full frontmatter (tags, fileClass, source, ai-processed, etc.) and a 15-line body preview. Do NOT read notes individually — the scanner handles everything.
-
Parse the JSON to understand each note. Group notes into clusters by topic/project. Present the filing plan as category sub-tables (see Output Style below for format). For each note, propose tags to add based on content, destination, and the vault's existing tag patterns.
-
After the tables, add a Cluster Analysis section. This is where you synthesize what you noticed across the notes — patterns, connections, and actionable observations. Think about:
- Notes that cross-link or form a thread (e.g., three notes all about an ED transition)
- Empty/stub notes that could become MOCs (Maps of Content)
- Typos in filenames worth fixing
- Topics that might warrant a new project folder if they grow
- Notes that suggest a shift in priority or a new initiative emerging
Keep it brief — 3-5 bullet points, each one specific and useful. The user values this synthesis as much as the filing plan itself.
-
Stop and ask the user to review. Say something like: "Here's my filing plan. Want me to proceed, or should I adjust anything?" Do not move files until the user confirms.
Phase 2: Execute (after approval)
For each approved note:
- Move the note to its destination folder
- Clean up inbox markers: strip
#inbox tag, clear status: inbox
- Apply the proposed tags (replacing
inbox with the new tags)
- Report progress: "Filed [X] of [Y]: moved
Note Name to destination/ — tagged #tag1, #tag2"
After all notes are filed:
- Show a summary of what was done.
- Log observations to the daily note. Filter the Cluster Analysis for actionable observations only — skip housekeeping (fix those inline during filing). Read today's daily note via
obsidian daily:read, find the # WebClips section, and insert an ## Inbox Processing Observations block just above it using Edit tool. Tag each observation with #observe/actionable, #observe/followup, or #observe/watch for periodic review discoverability.
Pre-Filing Enrichment Gate
Before categorizing notes, check if any require enrichment by another skill first. Notes that haven't been enriched should be flagged and excluded from the filing plan — they aren't ready to file yet.
YouTube Transcripts
Notes with a clippings tag and a YouTube URL in source: must be processed by process-youtube-transcript before filing. Check the ai-processed frontmatter list:
- If
ai-processed contains process-youtube-transcript → ready to file, include in the plan
- If
ai-processed is missing or doesn't contain it → exclude from filing plan and flag:
Held back (needs enrichment first):
| Note | Needed | Command |
|---|
| Full AI Trading Bot Using Claude Code! | YouTube transcript processing | /process-youtube-transcript |
Run the listed command first, then re-run /inbox-processor to file them.
This check uses the ai-processed frontmatter pattern — a YAML list of agent names that have processed the note. Other enrichment skills may adopt this pattern in the future.
Filing Rules (PARA Priority)
When deciding where a note goes, apply these rules in order. The first matching rule wins.
Rule 1: Areas of responsibility (2a/)
If the note relates to an ongoing area, file it under the matching area in 2a/. Discover current areas dynamically with obsidian search query="path:2a/" limit=50. Don't hardcode area names — check what exists at runtime. Most notes belong to areas rather than projects.
Rule 2: Projects (1p/)
If a note is clearly tied to an active, time-bound project, it goes under 1p/<ProjectName>/. Check what projects exist with obsidian search query="path:1p/" limit=50.
Only create a new project folder if the note clearly doesn't fit any existing project or area.
Rule 3: Resources (3r/)
Reference material, research notes, and general knowledge go to 3r/resource notes/ or an appropriate subfolder under 3r/.
Special case — People notes: If the note is a contact card (fileClass: person), it goes to 3r/ppl/First Last.md. Only contact cards go here — meeting notes about a person go to the area or project that owns the topic.
Rule 4: Trips & Events
Travel planning, event notes → 2a/trip/ (create subfolder if needed for a specific trip).
Using the Obsidian CLI
Always use the Obsidian CLI for file operations. Obsidian must be running.
Moving a note
obsidian move path="0.inbox/Note Name.md" to="2a/NWHub/"
Clearing inbox status
obsidian property:set name="status" value="" path="destination/Note Name.md"
Replacing tags
Strip #inbox and apply the proposed tags in one step. Read existing tags first to preserve any non-inbox tags, then set the combined list:
obsidian property:set name="tags" value="nwhub, consulting" path="destination/Note Name.md" type=list
This replaces the entire tags array — make sure to include any existing tags the note had (minus inbox).
Output Style
Keep the output scannable. The user reads this in Claude Code where the top of long responses scrolls off screen — so put the most actionable content at the end where it stays visible.
Ordering (top to bottom):
-
Filing plan table — The main deliverable. Group by cluster/category with a short heading per group (e.g., "### CFA Feb 2026 (6 notes)") rather than one flat table, so each group is visually distinct. Include a Tags column showing proposed tags for each note. Keep Reasoning to one short sentence. If a note has embedded attachments, mark it inline with "(has attachments)".
Tagging guidelines:
- Reuse existing vault tags whenever possible (run
obsidian tags counts to check). Don't invent new tags when an established one fits.
- Use hierarchical tags that match vault conventions (e.g.,
#co/cfainstitute, #ppl/Kirk_Seyfert, #nwhub/board_meeting).
- Aim for 1-3 tags per note. Enough to make it discoverable, not so many it's noise.
- Tags should reflect what the note is about, not where it's filed (the folder handles that).
-
Cluster Analysis — This is where your insight lives. Connections between notes, emerging patterns, things the user might not have noticed. Be specific and concise. 3-5 bullets.
-
Confirmation prompt — One line asking if they want to proceed. This stays at the bottom, always visible.
When the user asks to file only a subset (e.g., "file the NWHub stuff"), still mention all inbox items in a brief summary so they know what's left, but only present the filing plan for the requested subset.
Run History
After Phase 2 completes, append a JSON entry to zz_config/skill_history/inbox-processor.md (create with obsidian create ... template="Base Template" on first run).
Resolve hostname first, in its own Bash call, so it doesn't appear as $(...) in the content= arg (shell substitution triggers a permission prompt even when obsidian append * is allowlisted):
hostname -s
Then substitute the literal value into the JSON:
{"date": "YYYY-MM-DD", "host": "<literal-hostname>", "filed": N, "skipped": M, "held_back": K, "destinations": {"areas": N_to_2a, "projects": N_to_1p, "resources": N_to_3r, "archive": N_to_archive}}
Skip the append when nothing was filed.
Things to Watch For
- Ambiguous notes: Say so in the plan and ask — don't guess.
- fileClass hints:
person → 3r/ppl/, meeting / meeting_transcipt → area or project that owns the topic.
- Links in frontmatter: The
Links property points to related notes — use it to determine destination.
- Never touch 0.periodic/ — plugin-managed.
- Don't move attachments. They resolve by filename and keep working after the parent note moves. Flag "(has attachments)" in the table.