Skip to main content

📝 Lesson 6.3: Templater & Templates

How many times have you typed the same headings at the top of a new note? Date, title, "Attendees," "Action items," the same frontmatter fields again and again. Templates end that forever. In this lesson you'll start with Obsidian's built-in Templates plugin, then graduate to Templater — a scriptable, dynamic template engine that fills in the date, asks you questions, and drops your cursor exactly where you want to start typing.

📚 What You'll Learn

By the end of this lesson, you will be able to:

  • Use the built-in Templates core plugin with {{title}}, {{date}}, and {{time}}
  • Install Templater and write dynamic commands like <% tp.date.now() %> and <% tp.file.title %>
  • Add prompts, suggesters, and cursor placement so a template gathers input as it runs
  • Configure a template folder, assign hotkeys, and trigger templates automatically on new files in a folder

⏱️ Estimated Time: 70 minutes

🎯 Project: Build a reusable "meeting note" template and use it to create a real meeting note.

In This Lesson

Why Templates Matter

A template is a reusable skeleton for a kind of note. Every meeting note has the same shape: who was there, what was decided, what to do next. Every book note wants the same frontmatter: title, author, rating, status. A template captures that shape once, so every new note of that type starts complete and consistent.

There are two payoffs, and the second is the big one:

  • Speed & consistency — no more retyping headings or forgetting a field.
  • Structured data on autopilot — remember Lesson 6.2? Dataview only works if your notes actually have the fields. Templates guarantee every new book note is born with rating, status, and #book — so your dashboards stay complete without you thinking about it. Templates feed Dataview.

📖 Definition

Template: a note stored in a designated folder whose contents get inserted into a new note on demand. A static template inserts fixed text with a few simple substitutions. A dynamic template (via Templater) runs small commands as it's inserted — computing dates, reading the file's title, even asking you questions — and inserts the results.

graph LR A["📄 Template note
(the skeleton)"] --> B["Insert into
a new note"] B --> C{"Static or
dynamic?"} C -->|"Core Templates"| D["Simple swaps:
{{title}} {{date}}"] C -->|"Templater"| E["Runs commands:
dates, prompts, cursor"] D --> F["✅ Consistent note,
ready to fill in"] E --> F

The Built-in Templates Plugin

Before installing anything, know that Obsidian ships with a Templates core plugin. It's simple and perfectly good for many people, so let's start there.

Turning it on

  1. Open Settings > Core plugins and enable Templates.
  2. Go to the new Templates settings tab and set a Template folder location — make a folder called Templates in your vault and point it there.

Its substitution variables

The core plugin recognizes a small set of variables using double curly braces:

VariableBecomes
{{title}}The new note's title (file name)
{{date}}Today's date (format set in the plugin's settings)
{{time}}The current time

You can even format inline, e.g. {{date:YYYY-MM-DD}}. To use a template: create your skeleton note in the Templates folder, then in any note run the command "Insert template" (from the Command palette, or its ribbon icon) and pick one. The variables fill in on insertion.

# {{title}}

Created: {{date}} at {{time}}

## Notes

💡 When the built-in plugin is enough

If all you need is to stamp a date and a couple of headings, the core Templates plugin is simpler and requires no third-party code. Start here. Reach for Templater (next) only when you want dynamic behavior the core plugin can't do — computed dates, prompts, cursor placement, or scripting.

Meet Templater

Templater is the community plugin that turns templates from "fill in a couple of blanks" into a genuine little automation engine. Where the core plugin knows three variables, Templater gives you dozens of commands plus the ability to run JavaScript. Install it the usual way: Settings > Community plugins > Browse, search Templater (by SilentVoid), Install, Enable. (Apply the Lesson 6.1 mindset — it's hugely popular and well-maintained.)

Templater's syntax

Every Templater command sits inside <% ... %> tags. Anything between those tags is executed and replaced by its result the moment the template is inserted. For example, <% tp.date.now("YYYY-MM-DD") %> becomes today's date in that format.

Point Templater at your template folder

Open the Templater settings tab and set the Template folder location to your Templates folder (the same one is fine). Now Templater knows where your templates live so it can list them when you insert one.

⚠️ Watch Out — two template systems, one folder

The core Templates plugin and Templater are separate and use different syntax ({{date}} vs <% tp.date.now() %>). They can share a template folder, but a given template should use one syntax. Most people, once they adopt Templater, use it for everything and leave the core plugin off to avoid confusion. Pick a lane per template.

Essential Templater Commands

Templater groups its commands into modules — tp.date, tp.file, tp.system, and more. Here are the ones you'll use constantly, with real syntax.

Dates & times — tp.date

<% tp.date.now("YYYY-MM-DD") %>          → 2026-09-14
<% tp.date.now("YYYY-MM-DD HH:mm") %>    → 2026-09-14 15:42
<% tp.date.now("YYYY-MM-DD", 1) %>       → tomorrow (offset by 1 day)
<% tp.date.tomorrow("YYYY-MM-DD") %>     → tomorrow

The format string uses the common YYYY-MM-DD HH:mm tokens. The optional second argument on tp.date.now is a day offset — handy for "yesterday/tomorrow" links in daily notes.

File info — tp.file

<% tp.file.title %>              → the note's title (file name)
<% tp.file.creation_date() %>    → when the file was created
<% tp.file.creation_date("YYYY-MM-DD") %>
<% tp.file.folder() %>           → the folder the note is in
<% tp.file.cursor() %>           → where the cursor lands after insertion

tp.file.title is a property (no parentheses); most others are functions (with parentheses). tp.file.cursor() is a favorite: place it in your template and, after insertion, your cursor jumps straight there so you can start typing immediately. You can even number multiple cursor stops — tp.file.cursor(1), tp.file.cursor(2) — and jump between them.

Asking the user — tp.system

<% tp.system.prompt("Meeting title?") %>
<% tp.system.prompt("Attendees?", "Me, ") %>
<% tp.system.suggester(["Low", "Medium", "High"], ["low", "medium", "high"]) %>

tp.system.prompt pops up a text box and inserts whatever you type (the second argument is an optional default). tp.system.suggester shows a dropdown to pick from — the first array is what you see, the second is what gets inserted. These two commands are what make templates feel interactive: the template interviews you and fills itself in.

✅ Pro Tip

To reuse a prompt's answer in several places (say, a meeting title in both the frontmatter and a heading), capture it into a variable with the "execution" form <%* ... %> (note the asterisk) and then print it: <%* const t = await tp.system.prompt("Title?") %> then <% t %> wherever you want it. You ask once, use it everywhere.

Two Complete Templates

Here are two full, correct templates you can drop straight into your Templates folder. Read them closely — they combine everything above.

1. Meeting note template

---
title: <% tp.file.title %>
date: <% tp.date.now("YYYY-MM-DD") %>
type: meeting
attendees: <% tp.system.prompt("Attendees (comma-separated)?", "Me, ") %>
tags:
  - meeting
---

# <% tp.file.title %>

**Date:** <% tp.date.now("YYYY-MM-DD HH:mm") %>
**Attendees:** see frontmatter

## 🗒️ Agenda
<% tp.file.cursor(1) %>

## 💬 Discussion


## ✅ Action Items
- [ ] <% tp.file.cursor(2) %>

## 🔗 Related
- 

When inserted, this asks for attendees, stamps the date, titles the note from its file name, and drops your cursor at the Agenda (jump to Action Items with the next-cursor command). Every meeting note comes out identical and Dataview-ready (note the type: meeting and #meeting tag).

2. Book note template

---
title: <% tp.system.prompt("Book title?") %>
author: <% tp.system.prompt("Author?") %>
rating: <% tp.system.suggester(["★☆☆☆☆","★★☆☆☆","★★★☆☆","★★★★☆","★★★★★"], [1,2,3,4,5]) %>
status: <% tp.system.suggester(["To read","Reading","Finished"], ["to-read","reading","finished"]) %>
started: <% tp.date.now("YYYY-MM-DD") %>
tags:
  - book
---

# <% tp.frontmatter.title %>
by *<% tp.frontmatter.author %>*

## 📝 Summary
<% tp.file.cursor() %>

## 💡 Key Ideas
-

## 📌 Favorite Quotes
> 

This one interviews you with a prompt for title and author and two dropdowns for rating and status, then echoes the title/author into the body using tp.frontmatter.* (which reads back the frontmatter you just filled). Every book note lands with exactly the fields your Lesson 6.2 dashboard queries.

🧠 Mindset

Those templates look intimidating the first time — angle brackets, function calls, dropdowns. But look again: it's mostly ordinary Markdown with a few <% ... %> slots where a value gets filled in. You don't write these from a blank page; you take a plain note you already like, and replace the bits you retype every time with a command. Build them one slot at a time. The first template you make will feel like magic — because it is.

Folder Templates & Automation

Inserting a template (and a hotkey)

To use a Templater template, run the command "Templater: Open insert template modal" from the Command palette and pick your template. Because you'll do this constantly, assign it a hotkey: go to Settings > Hotkeys (Lesson 5's territory), search "Templater," and bind the insert command to something like Alt + E. Templater also lets you assign a hotkey to a specific template so one keystroke inserts your daily-note template directly.

Folder templates — trigger on new file creation

Templater's best trick: folder templates. In Templater settings, enable Folder templates and map a folder to a template. From then on, any new note created in that folder automatically gets that template applied — no command needed.

  • Map Meetings/ → your meeting template. Make a note in Meetings, and it's already a meeting note.
  • Map Books/ → your book template.
  • Map your daily-notes folder → a daily template (Templater can also power the core Daily notes plugin's template).

There's a matching setting, "Trigger Templater on new file creation," that must be on for folder templates to fire automatically. With it enabled, your vault starts doing the structuring for you.

⚠️ Watch Out

Folder templates apply to brand-new notes created in that folder — not to notes you move in later, and not retroactively. Also, if a template runs a prompt on every new file, creating a note will interrupt you with that dialog — great for meetings, mildly annoying for quick scratch notes. Map folder templates only where you truly want that structure every time.

Common uses at a glance

  • Daily notes — date-stamped journal with yesterday/tomorrow links via tp.date.now(..., -1) and +1.
  • Meeting notes — the template above, triggered from a Meetings folder.
  • Book / literature notes — frontmatter that feeds Dataview.

💡 QuickAdd pairs beautifully

For serious capture workflows, the community plugin QuickAdd pairs naturally with Templater: it can create a new note from a template, in a chosen folder, from a single command or hotkey — capture a meeting note from anywhere with one keystroke. It's an optional next step once your templates are solid; we mention it so you know where the road leads.

🎯 Project: A Meeting Note Template

Let's build and actually use a meeting-note template — the single template most people reach for daily.

🏋️ Build and use a meeting template

Objective: Create a reusable Templater meeting template and generate one real meeting note from it.

Instructions (about 20 minutes):

  1. (3 min) Install and enable Templater if you haven't. Make a Templates folder and set it as Templater's template folder location.
  2. (7 min) Create a note in Templates called Meeting and paste the meeting-note template from Section 5 (or write your own version).
  3. (3 min) Assign a hotkey to "Templater: Open insert template modal" in Settings > Hotkeys (e.g. Alt + E).
  4. (4 min) Create a brand-new empty note titled with a real or pretend meeting (e.g. "2026-09-14 Project Kickoff"), press your hotkey, and choose the Meeting template. Answer the attendees prompt.
  5. (3 min) Confirm the date filled in, the title matches, the tag/frontmatter are present, and your cursor landed at the Agenda. Type a real agenda line.
💡 Hint — a minimal template if the full one feels like a lot
---
type: meeting
date: <% tp.date.now("YYYY-MM-DD") %>
tags: [meeting]
---
# <% tp.file.title %>
**Attendees:** <% tp.system.prompt("Who's attending?") %>

## Agenda
<% tp.file.cursor() %>

## Action Items
- [ ]

Start here, run it once, then add sections. Every command is optional — a template with just <% tp.date.now() %> is already useful.

🛟 Solution — the commands show as literal text instead of running
  • Make sure you inserted via Templater's command, not the core Templates plugin — only Templater executes <% ... %>.
  • Check the template is inside the folder set in Templater settings.
  • Verify the tags are exactly <% and %> (angle-bracket + percent), not typographic quotes or stray spaces.
  • Templater runs commands on insertion; viewing an already-inserted note won't re-run them — that's expected.

✅ Project Completion Checklist

  • Templater is installed, enabled, and pointed at your Templates folder
  • A "Meeting" template exists with frontmatter + at least one tp. command
  • You assigned a hotkey to the insert-template command
  • You created a real note from the template and answered a prompt
  • The date, title, and tag filled in automatically and the cursor landed in the body

🎯 Quick Quiz

Question 1: Which syntax does Templater use for a command?

Question 2: What does <% tp.file.cursor() %> do?

📓 Learning Journal

Open your learning journal note inside your vault. After each lesson, take a few minutes to write down:

  • Key concepts you learned
  • Techniques that clicked for you
  • Questions or confusion points to revisit
  • Ideas you want to try
  • Your progress and feelings about learning this

✍️ This lesson's prompt: Which note do you create most often — daily notes, meeting notes, something else? List the parts you type every single time. Those repeated parts are your first template. What would you turn into a prompt, and what into an automatic date or title?

📝 Lesson Summary

🎓 Key Takeaways

  • The built-in Templates core plugin inserts static skeletons with {{title}}, {{date}}, and {{time}}.
  • Templater adds dynamic commands inside <% ... %>: tp.date.now(), tp.file.title, tp.file.creation_date(), and tp.file.cursor().
  • Prompts and suggesters (tp.system.prompt, tp.system.suggester) make a template interview you as it runs.
  • Set a template folder, assign hotkeys, and use folder templates (with "trigger on new file creation") to apply templates automatically.
  • Templates guarantee the frontmatter your Dataview dashboards depend on — the two plugins are a powerhouse pair, and QuickAdd supercharges capture.

🎉 What You've Accomplished

You built a real, reusable template and used it to spin up a structured note in seconds — something you'll now do every day. You've also closed the loop with Dataview: your new notes are born with the exact fields your dashboards query. That's the difference between a vault you maintain and a vault that maintains itself.

❓ Common Questions at This Stage

Do I need Templater, or is the core Templates plugin enough?

If you only need to stamp a date and a few headings, the core plugin is simpler and needs no third-party code. Reach for Templater the moment you want dynamic behavior it can't do: computed or offset dates, prompts, dropdown suggesters, cursor placement, folder-triggered templates, or any scripting. Most power users standardize on Templater.

Why do my <% %> commands appear as plain text?

Because they were inserted by the wrong plugin or from the wrong folder. Only Templater executes <% ... %>, and only for templates in its configured folder, inserted with its command. Also, commands run once at insertion — reopening a finished note won't re-run them, which is exactly what you want.

Can Templater set up my daily notes automatically?

Yes. Point the core Daily notes plugin at a Templater template, or map your daily-notes folder as a Templater folder template with "trigger on new file creation" enabled. Either way, each new day's note arrives pre-built with the date, links to yesterday/tomorrow, and your usual sections.

🔭 Looking Ahead

You've automated the text side of your vault. Next we go visual: Canvas, Excalidraw, and Kanban — infinite whiteboards, hand-drawn diagrams, and board-style task workflows for the times when thinking is spatial, not linear.

✅ Before the Next Lesson

  • Keep your Meeting template — you'll use it for real from now on
  • Optionally build a second template (daily or book note)
  • Consider mapping one folder template so it triggers automatically
  • Write your Learning Journal entry for this lesson

📚 Additional Resources

🌟 Encouragement for the Journey

You just taught Obsidian to set the table before you sit down to write. Every meeting, every book, every day now starts complete and consistent — and feeds the dashboards you built last lesson. That's compounding leverage: a little setup today saving you a few minutes on every note for years. Next, we make room to think visually. 🔮