Skip to content

Templates

Pensum uses markdown templates stored in your vault at .pensum/templates/. Drop a .md file there and it becomes a command in the command palette.

Pensum ships with three default templates:

  • project.md — used by the New Project command
  • meeting.md — used when starting a recording
  • wiki-stub.md — used by the Capture Stub command

These are created automatically on first load. Edit them in .pensum/templates/ or reset them to defaults in Settings > Templates.

Create any .md file in .pensum/templates/. For example, .pensum/templates/sprint-retro.md:

---
pensum_template:
output_folder: "Meetings/Retros"
filename: "{{date}} Sprint Retro"
prompt_for:
- sprint_number
---
---
type: meeting
id: {{id}}
date: {{date}}
tags: [retro]
---
# Sprint {{sprint_number}} Retrospective
## What went well
## What could improve
## Action items
- [ ]

Save the file. The command “Create from template: Sprint Retro” appears in the command palette immediately.

When you run it, Pensum prompts you for sprint_number, fills in all the variables, and creates the file at Meetings/Retros/2026-05-14 Sprint Retro.md.

The pensum_template block in frontmatter controls behavior:

FieldDescriptionDefault
output_folderWhere to create the file. Supports {{variables}}.Vault root
filenameFile name (without .md). Supports {{variables}}.Template name
prompt_forVariables to ask the user for before creating.None (create immediately)

These are always available in every template:

VariableValue
{{id}}Unique ULID
{{date}}Today’s date (YYYY-MM-DD)
{{time}}Current time (HH:MM)
{{year}}Current year
{{month}}Current month (01-12)
{{day}}Current day (01-31)
{{created}}Same as {{date}}

Any variable listed in prompt_for shows as a text field in the creation modal. The user fills them in before the file is created.

pensum_template:
prompt_for:
- client_name
- engagement_type

This shows two fields: “Client Name” and “Engagement Type”.

---
pensum_template:
output_folder: "Clients/{{client_name}}"
filename: "{{client_name}} Onboarding"
prompt_for:
- client_name
- contact_email
---
---
type: project
id: {{id}}
status: active
created: {{created}}
client: {{client_name}}
tags: [onboarding]
---
# {{client_name}} Onboarding
## Contact
- Email: {{contact_email}}
## Kickoff tasks
- [ ] Schedule intro call
- [ ] Send welcome packet
- [ ] Set up shared workspace
## Notes
---
pensum_template:
output_folder: "Meetings/1-1s"
filename: "{{date}} 1-1 {{person}}"
prompt_for:
- person
---
---
type: meeting
id: {{id}}
date: {{date}}
attendees: [{{person}}]
tags: [1-1]
---
# 1:1 with {{person}} -- {{date}}
## Their updates
## My updates
## Action items
- [ ]
## Notes
---
pensum_template:
output_folder: "Reviews"
filename: "{{date}} Weekly Review"
---
# Weekly Review -- {{date}}
## What I accomplished this week
## What's carrying over
## Priorities for next week
- [ ]
## Reflections

This template has no prompt_for, so it creates immediately with no modal.

Pensum’s template engine handles simple variable substitution. For advanced logic (conditionals, loops, date math, file lookups), you can use Templater alongside Pensum.

How they coexist: Any {{variable}} that Pensum doesn’t recognize is left as-is in the output. Templater uses <% %> syntax which Pensum never touches. So you can mix both in one template:

---
pensum_template:
output_folder: "Projects"
filename: "{{name}}"
prompt_for:
- name
---
---
type: project
id: {{id}}
created: {{created}}
status: active
---
# {{name}}
Created on <% tp.date.now("dddd, MMMM Do YYYY") %>
<% tp.web.daily_quote() %>
## Tasks
- [ ]

Pensum fills in {{id}}, {{created}}, and {{name}}. Templater processes <% %> blocks when the file opens. Both work independently.

Setup: Install Templater from the Community Plugins browser. Enable “Trigger Templater on new file creation” in Templater’s settings. Pensum creates the file, Templater processes it on open.