Diego Eis2k downloadsAutomate frontmatter updates using conditional rules.
Automate your frontmatter with smart IF/THEN rules. Set properties, modify titles, and keep your vault organized—automatically.

Stop manually updating properties across hundreds of notes. Define rules once, run everywhere. Perfect for:
Match any (OR) or Match all (AND) — inspired by Zotero's "match any/all of the following" UI.exactly, contains, notContains, exists, notExists, isEmptycheckbox, date, or datetime, values are written with the right YAML type instead of as plain strings — so whatsapp: true lands as a real boolean (renders as a checked checkbox), and created_at: 08-08-2025 is parsed and stored as 2025-08-08 (renders in the Obsidian date widget).Auto-tag meetings:
IF property: type = "meeting"
THEN ADD tags: work, important
Archive old projects:
IF property: status = "archived"
THEN REMOVE tags: active, wip
Date-stamp completed tasks:
IF property: status = "done"
THEN Change Title: Add suffix " - {date:DD/MM/YYYY}"
Standardize meeting note titles:
IF title contains: "Meeting"
THEN Change Title: Overwrite to "{date:YYYY-MM-DD} - {filename}"
Result: 2026-01-08 - team-sync
Clean up deprecated data:
IF property: tags = "old-project"
THEN DELETE PROPERTY: legacy_data
Title-based tagging:
IF title contains: "Meeting"
THEN ADD tags: meeting, important
Some Obsidian property types have native widgets (the checkmark for checkbox, the calendar for date, the calendar+clock for datetime). For the widget to render correctly, the YAML must store the value with the right type — boolean for checkbox, ISO date for date/datetime. Strings won't trigger the widgets, even if the property is registered with the right type.
Since v0.19.0, the plugin detects when the target property is one of these types and converts the rule's value automatically. You can keep writing rules with plain text and the plugin handles the rest.
IF property: status = "done"
THEN OVERWRITE property: completed = "true"
Result on disk: completed: true (boolean). Obsidian renders a checked checkbox.
Rules:
"true" (any casing) → true"false", empty, "sim", etc.) → falseIF property: status = "done"
THEN OVERWRITE property: created_at = "08-08-2025"
Result on disk: created_at: 2025-08-08 (ISO date). Obsidian renders the date widget.
How the date parsing works:
YYYY-MM-DD, it's stored as-is.DD-MM-YYYY, DD/MM/YYYY, YYYY/MM/DD).YYYY-MM-DD before being written to the YAML.Datetime properties (YYYY-MM-DDTHH:mm:ss) are not parsed and are written exactly as typed. The Obsidian datetime widget will render them when the input is already in the expected ISO datetime form.
ADD value and OVERWRITE all values with actions on typed properties. For these types ADD behaves as OVERWRITE because the underlying types are scalar (you can't have a checkbox holding [true, false]).text, number, multitext, tags, etc.) keep the original string-based behavior. Nothing changes for those.The same type-aware coercion now happens when matching conditions, not just when writing actions. You can author IF rules using whatever date format you prefer and the plugin will normalize before comparing against the ISO value stored in YAML.
IF property: created_at exactly "08-08-2025"
THEN ...
matches a note whose YAML stores created_at: 2025-08-08. The same applies to contains and notContains. For checkbox properties, IF property: done exactly "true" matches a note with done: true (boolean) regardless of how the user typed true (case-insensitive).
Combine conditions inside a single rule using Match any / Match all of the following (inspired by Zotero).
AND example — match all of the following:
Match all of the following:
- property: status = "done"
- property: priority = "high"
THEN ADD tags: urgent-completed
OR example — match any of the following:
Match any of the following:
- property: status = "archived"
- property: deleted = "true"
THEN REMOVE tags: active
Click + Add condition below the IF block to add more conditions, and the dropdown to switch between any and all. Existing rules from previous plugin versions are auto-migrated and keep their behavior unchanged.
Combine actions to automate complex workflows:
IF property: project_status = "completed"
THEN:
- SET status [OVERWRITE]: done
- ADD tags: archived
- REMOVE tags: active, wip
- ADD priority: low
Choose what to scan:
Perfect for running rules only on active notes instead of your entire vault.
| Operator | Description | Example |
|---|---|---|
exactly |
Exact match | type = "meeting" |
contains |
Substring match | name contains "Diego" |
notContains |
Does not contain | tags notContains "draft" |
exists |
Property present | status exists |
notExists |
Property absent | reviewed notExists |
isEmpty |
Empty value | tags isEmpty |
Modify note titles dynamically:
[ARCHIVED] Original TitleOriginal Title - {date}{date} → 2026-01-08{date:DD-MM-YYYY} → 08-01-2026{date:YYYY/MM/DD} → 2026/01/08meeting-notes.md → meeting-notesPlaceholders can be combined in any order:
{date:YYYY-MM-DD} - {filename} → 2026-01-08 - meeting-notesMeeting {filename} - {date:DD/MM/YY} → Meeting meeting-notes - 08/01/26{filename} → meeting-notes (overwrite with just filename).obsidian/plugins/obsidian-conditional-propertiesSettings → Scan interval (minutes) → Set interval (minimum 5)
The plugin runs automatically based on your selected scope.
{filename} and {date:FORMAT} placeholdersmatch any / match all)(A AND B) OR C)All processing happens locally. No data collection, no external requests.
MIT