From vault
Format and organize Obsidian notes with auto-wikilink discovery according to the vault's style guide. Use when the user asks to stylize, format, clean up, or add wikilinks to notes in Notes/, Projects/, or specific files. Supports custom instructions for ordering/styling. Does NOT apply to Daily Notes.
How this skill is triggered — by the user, by Claude, or both
Slash command
/vault:stylizeThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Format and organize Obsidian notes according to the vault's style guide with spell/grammar corrections and automatic wikilink discovery.
Format and organize Obsidian notes according to the vault's style guide with spell/grammar corrections and automatic wikilink discovery.
Read ~/.claude/settings.json and extract env.OBSIDIAN_VAULT.
If OBSIDIAN_VAULT is not set, display: "Vault not configured. Run /vault first."
Read vault structure from <vault_path>/vault-config.yaml.
/stylize <path> [--instructions "custom instructions"] [--no-link] [--no-suggest] [--enrich]
Arguments:
<path> - File or folder to stylize (relative to vault root)
Notes/ - All notes in Notes folderProjects/ - All notes in Projects folderNotes/my-note.md - Specific note--instructions "..." - Custom instructions for ordering/styling (optional)--no-link - Skip vault index and wikilink discovery (formatting only)--no-suggest - Skip the suggestion output for new notes--enrich - Enrich existing notes with external data (places via Google Maps, more sources in the future)Examples:
/stylize Notes/
/stylize Projects/my-project.md
/stylize Notes/ --instructions "order sections alphabetically"
/stylize Notes/my-note.md --no-link
/stylize References/ --enrich
When this skill is invoked:
If stylizing notes that may have been recently created/modified by the thought organizer, check:
<vault_path>/Processed/YYYY-MM-DD/run-report.md
This report shows:
Use this to understand which notes were just generated and may need stylizing.
Read the vault's style guide at the vault root:
<vault_path>/Style Guide.md
The style guide is the single source of truth for all formatting, naming, linking, and content rules. Apply everything it defines.
Reference the appropriate Obsidian skills for proper syntax:
Markdown content - obsidian-markdown skill:
[[note-name]], [[note-name|display text]]> [!note], > [!warning]Base embeds - obsidian-bases skill (when notes embed .base files):
![[MyBase.base]] or ![[MyBase.base#View Name]]Canvas embeds - json-canvas skill (when notes embed .canvas files):
![[MyCanvas.canvas]]Skip this step if --no-link is passed.
Launch two Explore subagents in parallel to build a comprehensive index of all linkable entities in the vault. This index is built once per invocation and reused across all notes being stylized.
Agent 1: "Structure Index" — Scans Categories/, References/, Projects/
Agent tool:
subagent_type: "Explore"
description: "Build vault link index - structure"
prompt: |
Build a wikilink target index from the Obsidian vault at {vault_path}.
Read EVERY .md file in these folders:
- {vault_path}/Categories/
- {vault_path}/References/
- {vault_path}/Projects/
For each file, extract:
1. Note title (the filename without .md extension)
2. Frontmatter `categories` values (if any)
3. Frontmatter `type` values (if any)
4. Frontmatter `aliases` values (if any)
Also list ALL filenames (without .md) in {vault_path}/Daily Notes/
(do NOT read daily note content, just the filenames).
Return a structured list:
TITLE: <note title>
FOLDER: <Categories|References|Projects>
CATEGORIES: <category links>
TYPE: <type links>
ALIASES: <aliases if any>
---
(repeat for each note)
Then list daily note filenames separately.
Agent 2: "Content Index" — Scans Notes/, Clippings/
Agent tool:
subagent_type: "Explore"
description: "Build vault link index - content"
prompt: |
Build a wikilink target index from the Obsidian vault at {vault_path}.
Read EVERY .md file in these folders:
- {vault_path}/Notes/
- {vault_path}/Clippings/
For each file, extract:
1. Note title (the filename without .md extension — notes do NOT have H1 headings)
2. Frontmatter `categories` values (if any)
3. Frontmatter `aliases` values (if any)
4. Key concepts mentioned in the first paragraph of body content
Return a structured list:
TITLE: <note title>
FOLDER: <Notes|Clippings>
CATEGORIES: <category links>
ALIASES: <aliases if any>
CONCEPTS: <key concepts from first paragraph>
---
(repeat for each note)
Run both agents in parallel.
After both return, merge results into a single vault entity index. The index contains:
For each note in the target path, apply all rules from the style guide read in Step 2 — including naming, frontmatter, content structure, writing style, and spell/grammar corrections.
Follow the linking conventions defined in the style guide. Use the vault entity index from Step 4 to identify linkable terms in each note.
Implementation details not covered by the style guide:
[[wikilinks]], code blocks, or URLs.[[Note Title|mentioned text]] when the text in the note does not exactly match the target note's filename.Processing order per note:
obsidian open file="<note title>" to open the note in Obsidian so the user can see changes liveSkip this step if --no-link is passed.
While scanning note content in Step 5, detect location mentions that refer to specific, real-world places. This runs automatically as part of the normal stylize flow -- it only creates new reference notes for places that don't exist yet.
First, read the API reference for type mappings and field details:
${CLAUDE_PLUGIN_ROOT}/shared/google-maps-api.md
CoreLocationCLI -format "%latitude,%longitude"
If not installed or fails, proceed without location bias.
Identify location mentions in note content:
For each detected place, check the vault index from Step 4. If a reference note already exists, just wikilink it. If no reference note exists:
Look up the place via Google Maps:
echo '{"query": "<place name> <city if mentioned>", "location_bias": [<lat>, <lng>]}' | python "${CLAUDE_PLUGIN_ROOT}/shared/search_place.py"
Omit location_bias if CoreLocationCLI was unavailable.
Present the result for confirmation:
Detected: "Taniku Izakaya in Japantown"
Google Maps: Taniku Izakaya, 1581 Webster St #235, San Francisco, CA 94115
Type: Restaurant | Rating: 4.5/5 | Price: $$$
Create reference note? [y/n/skip all places]
Determine the vault type using the Google primaryType and types array.
Read the vault's Categories/ folder and existing type values from place notes
in References/ to find the best match. For example, primaryType: "japanese_restaurant"
maps to [[Restaurants]], primaryType: "national_park" maps to [[Parks]].
If no existing vault type fits the Google type:
[[<suggested name>]]? [y/n/custom]"Categories/ following
the vault's category template patternDetermine the vault loc using the city field from the script output.
Use nested wikilinks for region hierarchy: ["[[City]]", "[[State/Region]]"]
(e.g., ["[[Big Sur]]", "[[California]]"]).
If confirmed, create References/<Place Name>.md using the appropriate vault template:
<vault_path>/Templates/Place Template.md (or Restaurant Template.md
for restaurants/cafes/bars)type -> vault type wikilink from step 3loc -> nested wikilinks from step 4coordinates -> [latitude, longitude] as stringsaddress -> formatted as '["full address"]'source -> googleMapsUrlplaceId -> from APIscoreGoogle -> from APIprice -> from API (restaurants/cafes/bars only)created -> today's daterating and last empty (user fills these)Wikilink the mention in the source note.
Rules: See the vault property mapping table in google-maps-api.md for full details.
The key rule: rating is the user's personal 1-7 scale -- NEVER auto-fill it from Google.
type and loc must be wikilink arrays. Type mapping is NOT hardcoded -- always check
the vault's actual Categories/ and existing type values.
Only runs when --enrich is passed. This step backfills incomplete existing notes with data from external sources. Currently supports place enrichment via Google Maps; designed to support additional enrichment sources in the future.
Using the vault index from Step 4, identify place notes in the target path (notes with categories: ["[[Places]]"]). For each, check frontmatter for missing fields (type, loc, address, scoreGoogle, description).
For incomplete notes:
Look up the place using the filename plus any existing address:
echo '{"query": "<filename> <existing address if any>"}' | python "${CLAUDE_PLUGIN_ROOT}/shared/search_place.py"
Fill only missing fields. Never overwrite existing data.
Normalize existing fields to match the style guide:
type and loc must be arrays of wikilinks (e.g., ["[[Hotels]]"], ["[[Big Sur]]"])address must be a properly formatted YAML string array (fix malformed brackets if present)Present all changes for approval before writing.
If --instructions provided, apply them after standard formatting. These are for content organization, not style overrides:
Skip this step if --no-suggest is passed.
After all notes are processed, review the unresolved wikilinks that were created during Step 5. Output a grouped list of suggested new notes:
## Suggested New Notes
Based on unresolved wikilinks discovered:
### People
- [[Person Name]] — mentioned in: Note A, Note B
### Companies
- [[Company Name]] — mentioned in: Note C
### Tools
- [[Tool Name]] — mentioned in: Note D
### Concepts
- [[Concept Name]] — mentioned in: Note E
This is informational only — do not create notes automatically.
DO:
DON'T:
Daily Notes/ - these are journal entries.md filesBefore writing any changes, present a preview for each file:
Wait for user approval before proceeding. The user may:
After approval, write the accepted changes to the files and confirm completion.
npx claudepluginhub baehenrys/personal-toolkit --plugin vaultCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.