obsidian-plugin/skills/vault-templates/SKILL.md
Obsidian Templater drift repair. Use when fixing unrendered `<% tp.file.cursor() %>` markers or replacing `{{title}}`/`{{date}}` placeholders.
npx skillsauth add laurigates/claude-plugins vault-templatesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
| Use this skill when... | Use the alternative instead when... |
|---|---|
| Repairing unrendered <% tp.file.cursor() %> / {{title}} markers committed in note bodies | Stripping the same kind of markers inside YAML frontmatter — use vault-frontmatter |
| Auditing daily-note structure drift against the canonical Templater template | Creating new daily notes interactively via the running CLI — use vault-files |
| Fixing notes committed before Templater finished rendering | Reconnecting the cleaned-up notes into a hub afterwards — use vault-mocs |
Obsidian's Templater plugin renders placeholder syntax when a new note is created. When rendering fails (plugin error, user dismissal, manual copy-paste), the literal markers get committed and persist. Fixing them is mechanical.
| Marker | Meaning | Fix |
|--------|---------|-----|
| <% tp.file.cursor(N) %> | Cursor position placeholder | Strip the entire tag |
| <% tp.file.title %> | Filename stem | Replace with actual filename (no .md) |
| <% tp.date.now("YYYY-MM-DD") %> | Today's date | Replace with the creation date from frontmatter, or the filename date for daily notes |
| {{title}} | Filename stem (legacy) | Replace with filename stem |
| {{date}} | Today's date (legacy) | Same as above |
| <% await tp.system.prompt(...) %> | User prompt | Strip; requires user to refill |
# Find any Templater leak
rg '<%\s*tp\.' --glob '*.md'
rg '\{\{title\}\}|\{\{date\}\}' --glob '*.md'
<% tp.file.cursor(1) %>Before:
---
tags: [📝/notes]
---
<% tp.file.cursor(1) %>
After:
---
tags: [📝/notes]
---
Use Edit with old_string='\n\n<% tp.file.cursor(1) %>' and new_string='' (or adjust for trailing whitespace) — the cursor marker never has meaningful content around it.
{{title}} in daily notesBefore (file work/notes/2025-03-26.md):
# {{title}}
## Log
After:
# 2025-03-26
## Log
Use the filename stem (no .md). Don't replace {{title}} inside code blocks or quoted text — only in headings / body.
The templates themselves live in Templates/ and should contain raw Templater syntax — never "fix" them. Only fix notes outside Templates/.
| Template | Produces | Sections |
|----------|----------|----------|
| Daily.md | Notes/YYYY-MM-DD.md | Quick Links, Today's Focus, Work, Personal, Tomorrow's Prep, Navigation |
| MOC.md | Zettelkasten/{Subject} MOC.md | Title heading + sections |
| New.md | general Zettelkasten notes | Frontmatter + body stub |
| Work Daily.md | work/notes/YYYY-MM-DD.md | Log, Thoughts, Discoveries, Todo, Recurring reminders |
Personal daily notes created before 2025 usually lack ## Navigation and ## Tomorrow's Prep. Two remediation options:
Default to #2 unless the user specifically asks for retrofit.
Work-namespace daily notes that contain literal {{title}} in the heading — fix these.
Templates/*.md when fixing leakage — templates are supposed to contain Templater syntax.sed -i 's/{{title}}/.../' — always use file-specific Edit calls so the title derivation is correct per file.<% tp.system.prompt(...) %>, don't guess the answer — flag for user.development
Debug HTTP APIs: trace requests, inspect headers. Use when a request fails: check status first.
documentation
Render architecture diagrams from text sources. Use when documenting system topology.
tools
Inspect JSON payloads and extract nested fields. Use when parsing API responses.
tools
--- name: no-description allowed-tools: Read --- # No Description This skill has no description and must be dropped with a warning.