| created | "2026-04-17T00:00:00.000Z" |
| modified | "2026-05-09T00:00:00.000Z" |
| reviewed | "2026-04-25T00:00:00.000Z" |
| name | vault-templates |
| description | Obsidian Templater drift repair. Use when fixing unrendered `<% tp.file.cursor() %>` markers or replacing `{{title}}`/`{{date}}` placeholders. |
| user-invocable | false |
| allowed-tools | Read, Edit, Write, Grep, Glob |
Templater Convention & Drift Repair
When to Use This Skill
| 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.
Unrendered Markers
| 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 |
Detection
rg '<%\s*tp\.' --glob '*.md'
rg '\{\{title\}\}|\{\{date\}\}' --glob '*.md'
Fixing <% 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.
Fixing {{title}} in daily notes
Before (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.
Canonical Template Files
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 |
Daily Note Structure Drift
Personal daily notes created before 2025 usually lack ## Navigation and ## Tomorrow's Prep. Two remediation options:
- Retrofit template — add the missing sections to every old daily note. Usually not worth the diff; users rarely look at old daily notes.
- Leave as-is — document the change boundary in a single commit message and let old notes age.
Default to #2 unless the user specifically asks for retrofit.
Work Daily Note Drift
Work-namespace daily notes that contain literal {{title}} in the heading — fix these.
Safety
- Never edit
Templates/*.md when fixing leakage — templates are supposed to contain Templater syntax.
- Never run a blanket
sed -i 's/{{title}}/.../' — always use file-specific Edit calls so the title derivation is correct per file.
- When you encounter
<% tp.system.prompt(...) %>, don't guess the answer — flag for user.
Related Skills
- vault-frontmatter — YAML-level fixes
- vault-files — daily-note operations via Obsidian CLI