Conditional Properties

approved

by Diego Eis

Automate frontmatter updates using conditional rules.

β˜… 24 stars↓ 7,894 downloadsUpdated 15d agoMIT

Conditional Properties for Obsidian

πŸ“– Full documentation site β€” every condition, action, and placeholder, with examples that mirror the settings screen field-by-field.

Automate your frontmatter with smart IF/THEN rules. Set properties, modify titles, and keep your vault organized β€” automatically.

Plugin Interface

Why use this plugin?

Stop manually updating properties across hundreds of notes. Define rules once, run everywhere. Useful for:

  • Auto-tagging notes based on content
  • Maintaining consistent metadata
  • Bulk property updates
  • Scheduled maintenance
  • Targeted scope (latest created/modified notes, or a single file)

Features

Every feature below has a short description and a working example. Deeper reference detail (full operator tables, placeholder syntax, typed-property parsing rules) lives further down β€” this section is the map.

Conditions (IF)

Property condition β€” check any frontmatter property's value. The condition row is: Property type β†’ property name field β†’ operator dropdown β†’ value field.

IF  Property: status β†’ exactly match β†’ "done"

First level title condition β€” check the note's title: the H1 heading immediately after frontmatter (or at the very top of the note if there's no frontmatter). Obsidian's separate "inline title" feature is never read β€” only an actual # H1 line counts, and only when nothing but whitespace precedes it.

IF  First level title: contains β†’ "Meeting"

Note file condition β€” check the file itself: its name or the folder(s) it lives in, instead of a property or title.

IF  Note file: Filename contains β†’ "draft"

Parent folder is / Parent folder is not β€” match a folder name or partial path anywhere in the file's location, not just the immediate parent.

IF  Note file: Parent folder is β†’ "meetings/transcripts/company"

Six comparison operators β€” exactly match, contains, does not contain, exists, does not exist, is empty. See the full Operators reference below. (Note file conditions have their own five operators instead β€” see Note file conditions.)

IF  Property: tags β†’ does not contain β†’ "draft"

Regex matching β€” wrap a value in /pattern/flags to match with a regular expression instead of a literal string, on exactly match/contains/does not contain. See Regular expression matching.

IF  First level title: contains β†’ /\d{4}-\d{2}-\d{2}/

Multiple conditions per rule β€” combine conditions with the Match dropdown set to Any of the following (OR) or All of the following (AND).

Match: All of the following
  Where  Property: status β†’ exactly match β†’ "done"
  And    Property: priority β†’ exactly match β†’ "high"
THEN  Property: tags β†’ Add value β†’ urgent-completed

Typed property awareness (IF side) β€” when a property is registered as checkbox, date, or datetime, your typed value is normalized before comparing, so 08-08-2025 matches a stored 2025-08-08.

IF  Property: created_at β†’ exactly match β†’ "08-08-2025"

matches a note whose YAML stores created_at: 2025-08-08.

Placeholders in condition values (new in v0.26.0) β€” a condition's value field accepts the same placeholders as a THEN action's, resolved against the file before the comparison runs. Skipped for a /regex/-mode value.

IF  Property: dateDue β†’ exactly match β†’ "{{today}}"

You can also compare one property against another this way:

IF  Property: type β†’ exactly match β†’ "{{company}}"

Rule chaining within a scan β€” a later rule's condition sees property (or filename/folder) changes an earlier rule already made in the same run, not just the state from before the scan started.

Rule 1: IF  Property: status β†’ exactly match β†’ "done"    THEN  Property: tags β†’ Add value β†’ completed
Rule 2: IF  Property: tags β†’ contains β†’ "completed"       THEN  Property: priority β†’ Add value β†’ low

Rule 2 fires in the same pass Rule 1 added the tag β€” no second scan needed.

Actions (THEN)

The action row for a Property action is: Property type β†’ property name field β†’ action dropdown β†’ value field.

Add value β€” add a value to a property without duplicating it. Converts a scalar to an array when needed.

THEN  Property: tags β†’ Add value β†’ important

Remove value β€” remove a specific value from a property or array.

THEN  Property: tags β†’ Remove value β†’ active, wip

Overwrite all values with β€” replace the entire value. Unlike Add/Remove, this does not split on commas β€” Overwrite all values with β†’ "a, b, c" writes the literal string "a, b, c", not an array. Use Add value for a multi-value array.

THEN  Property: status β†’ Overwrite all values with β†’ "archived"

Delete property β€” remove the property from the note entirely. No value field for this one β€” the action dropdown alone is the whole action.

THEN  Property: legacy_data β†’ Delete property

Rename property to β€” copy a property's value to a new name and remove the old one. Skipped silently if the target name already exists. The new-name field does not accept placeholders.

THEN  Property: old_name β†’ Rename property to β†’ new_name

Typed property awareness (THEN side) β€” writing to a checkbox/date/datetime property stores the real YAML type, so Obsidian's native widgets render correctly.

THEN  Property: completed β†’ Overwrite all values with β†’ "true"

Result on disk: completed: true (boolean) β€” renders as a checked checkbox, not text.

First level title actions β€” the action row is First level title type β†’ modification dropdown (Add prefix / Add suffix / Overwrite to) β†’ text field.

THEN  First level title: Overwrite to β†’ "{{date:YYYY-MM-DD}} - {{filename}}"

Result: 2026-01-08 - team-sync.

Note file actions β€” the action row is Note file type β†’ action dropdown (Rename file / Add name prefix / Add name suffix / Move file to / Bookmark file / Remove bookmark / Delete file) β†’ text field (a bookmark-group dropdown for Bookmark file; omitted for Remove bookmark and Delete file). See Note file actions.

THEN  Note file: Move file to β†’ "Archive/{today:YYYY}"

Multiple actions per rule β€” chain several actions in one rule; note file actions execute immediately and compose in sequence. The remove ("Γ—") button on an action row only shows once there's more than one action (new in v0.26.0) β€” same rule the IF side's condition rows already followed, since a rule always needs at least one.

THEN:
  - Property: status β†’ Overwrite all values with β†’ "done"
  - Property: tags β†’ Add value β†’ archived
  - Property: tags β†’ Remove value β†’ active, wip

Placeholders in action values β€” reference dates, the filename, or any frontmatter property inline. See the full Placeholders reference.

THEN  Property: excerpt β†’ Add value β†’ "{{g_excerpt}}"

{{match}} in THEN (Beta) β€” reuse whatever an IF regex condition matched, instead of retyping the pattern. See {{match}} in THEN.

IF    Note file: Filename contains β†’ /\d{4}-\d{2}-\d{2}/
THEN  Note file: Move file to β†’ "transcripts/{{match}}"

Execution & scheduling

Run manually β€” the whole vault, or just the current file.

  • Settings β†’ Conditional Properties β†’ "Run now"
  • Command palette β†’ "Run conditional rules on vault" / "Run conditional rules on current file"

Run this rule β€” run a single rule against its current scan scope, without running every other rule.

Stop button β€” cancel a running scan; the file currently being processed finishes cleanly and the rest are skipped.

Scheduled scans β€” run automatically on an interval (minimum 5 minutes).

Scan scopes β€” Latest created, Latest modified, or Entire vault, with a configurable note count (1-1000) for the two "latest" scopes.

Scope: Latest modified, count: 15

Settings management

Rule search (new in v0.25.3, extended in v0.26.0) β€” right under the "Rules" heading: a dropdown (Property / First level title / Note file) plus a search field that filters the rule list live as you type, once you've typed at least 2 characters. It searches both sides of the rule for that type: for Property, the IF condition's property name and value, plus the matching THEN property action's property name, value, and rename target; for First level title and Note file, the IF condition's typed text plus the matching THEN action's text (and bookmark group, for Note file). Matching is case-insensitive, as a literal substring (a /regex/-mode value is matched as that literal text). A rule shows up if any matching field is found, regardless of the rule's own Match (any/all) setting. The search resets every time you reopen the settings tab.

Search: Property β†’ "people"

Shows every rule with a Property condition or action whose property name or value contains "people" (e.g. property named people/peoples_list, or a value like Add value β†’ "people, teams").

Onboarding empty state (new in v0.26.0) β€” with zero rules (a fresh install, or every rule removed), the search bar and rule list are replaced by a short welcome message and its own "Add rule" button, so a first-time user isn't looking at a bare search field with nothing to search. Disappears the moment a rule exists, and reappears if you delete your way back down to zero.

Backup and restore settings β€” export your rules and scan settings to a JSON file in the vault, and re-import them later or on another vault.

  • Settings β†’ Conditional Properties β†’ Backup and restore β†’ Export settings / Import settings

Operators reference

These are the exact labels shown in the operator dropdown for Property and First level title conditions. Note file conditions use a separate five-option dropdown instead β€” see Note file conditions.

OperatorDescriptionExample
exactly matchExact matchProperty: type β†’ exactly match β†’ "meeting"
containsSubstring matchProperty: name β†’ contains β†’ "Diego"
does not containDoes not containProperty: tags β†’ does not contain β†’ "draft"
existsProperty presentProperty: status β†’ exists
does not existProperty absentProperty: reviewed β†’ does not exist
is emptyEmpty valueProperty: tags β†’ is empty

exactly match / contains / does not contain are case-sensitive on Property and First level title conditions (Note file filename matching is the one exception β€” that's case-insensitive, see below). On a Property condition, is empty on a property that doesn't exist at all returns false, not true β€” use does not exist to catch a missing property. is empty on a missing First level title does return true, since a note with no H1 reads as "empty" there.

Regular expression matching

Wrap the value of exactly match, contains, or does not contain in forward slashes to match with a regular expression instead of a literal string β€” same convention as Obsidian's Web Clipper URL-trigger patterns. Works on Property, First level title, and Note file (the three filename operators only β€” not Parent folder is / Parent folder is not).

IF  First level title: contains β†’ /\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])/

Matches a title like "Nota da reuniΓ£o 2026-08-22 com John Doe" β€” the plugin finds the date 2026-08-22 inside the text. Standard JS regex flags are supported as a suffix, e.g. /report/i for case-insensitive matching or /^draft/m for multiline. If the text you type looks like a regex but is missing its /slashes/, the settings UI shows a hint under the field so it's easy to catch. A malformed pattern (or unknown flag) never crashes a scan: it's treated as "does not match" and you'll get a one-time Notice + console error identifying the broken pattern.

Regex mode is case-sensitive by default (add the i flag yourself for case-insensitive matching) β€” the opposite of literal Note file filename matching, which is case-insensitive by default. Property and First level title literal matching is case-sensitive either way. exactly match and contains behave identically in regex mode β€” both just test whether the pattern matches anywhere in the value (RegExp.test()); exactly match does not implicitly anchor to the whole string. Anchor it yourself with ^...$ for a true full-string match. Typed-property coercion (checkbox/date/datetime normalization) is skipped entirely in regex mode β€” the property's raw stored value is tested directly.

Mobile note: avoid regex lookbehind ((?<=...) / (?<!...)) if you sync your vault to iOS β€” it isn't supported on iOS versions before 16.4. Named capture groups ((?<name>...), used by {{match:name}} below) are unaffected; only lookbehind assertions are the risk.

{{match}} in THEN (Beta)

Reuse whatever your IF regex matched β€” no need to retype it in the THEN action. Available in property values, title actions, and Note file actions (rename / prefix / suffix / move), via {{match}} and friends:

PlaceholderResolves to
{{match}}The full text matched by the pattern
{{match:1}}, {{match:2}}, …Numbered capture group (...) β€” non-capturing groups (?:...) don't count
{{match:name}}Named capture group, from a pattern written as (?<name>...)
IF    Note file: Filename contains β†’ /\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])/
THEN  Note file: Move file to β†’ "transcripts/{{match}}"

Moves any file whose name contains a date like 2026-08-22 into transcripts/2026-08-22/, auto-creating the folder β€” no need to duplicate the date pattern on the THEN side.

Named groups work the same way:

IF    Note file: Filename contains β†’ /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/
THEN  Note file: Move file to β†’ "transcripts/{{match:year}}/{{match:month}}"

Current limitations (beta):

  • {{match}} reads from the first regex-mode condition (in the order you listed them) that was the reason the rule matched. A rule with multiple conditions doesn't expose more than one condition's captures.
  • Not supported yet for a Property condition whose value is a list (e.g. tags) β€” regex still matches against list items, but there's no single scalar to pull a capture from. Property (single value), First level title, and Note file (filename) conditions are supported.
  • Double-brace only ({{match}}) β€” see Two syntaxes, same placeholders.
  • If the rule had no matching regex condition, or you reference a group/name that doesn't exist in the pattern, {{match...}} resolves to an empty string rather than erroring.

Multiple conditions per rule

Combine conditions inside a single rule using the Match dropdown next to the IF block, set to Any of the following or All of the following (inspired by Zotero).

AND example β€” Match: All of the following:

Match: All of the following
  Where  Property: status β†’ exactly match β†’ "done"
  And    Property: priority β†’ exactly match β†’ "high"
THEN  Property: tags β†’ Add value β†’ urgent-completed

OR example β€” Match: Any of the following:

Match: Any of the following
  Where  Property: status β†’ exactly match β†’ "archived"
  Or     Property: deleted β†’ exactly match β†’ "true"
THEN  Property: tags β†’ Remove value β†’ active

Click + add condition below the IF block to add more conditions, and use the Match dropdown to switch between Any of the following and All of the following. Each condition row is labeled to read like a sentence (new in v0.25.4) β€” the first is always Where, every one after it is Or (Match: Any) or And (Match: All), automatically following whichever mode you have selected. THEN actions are all labeled Do this. Existing rules from previous plugin versions are auto-migrated and keep their behavior unchanged.

Note file conditions

Select Note file as the condition type to check the file itself, instead of a frontmatter property or the H1 title. Note file conditions don't have a separate property-name field, and use their own five-option operator dropdown instead of the six-operator one above β€” no exists / does not exist / is empty here. Literal (non-regex) comparisons are case-insensitive; a /regex/ value is case-sensitive instead unless you add the i flag β€” see Regular expression matching.

OperatorChecks againstExample
Filename containsfile.basename (no extension)filename contains "draft"
Filename not containsfile.basenamefilename not contains "template"
Filename exactly matchfile.basenamefilename exactly "index"
Parent folder isthe folder path the file lives insee below
Parent folder is notthe folder path the file lives in (inverted)see below

The three filename operators above also accept a /regex/-wrapped value (see Regular expression matching); Parent folder is / Parent folder is not always stay literal path matching.

Parent folder is accepts either a single folder name or a partial path β€” enter the folder name(s) only, never a path starting with / from the vault root:

IF Note file: Parent folder is β†’ "ClienteA"

Matches any note under a folder named ClienteA, at any depth β€” ClienteA/notes/file.md and Projects/ClienteA/2026/file.md both match.

IF Note file: Parent folder is β†’ "meetings/transcripts/company"

Matches when those three segments appear contiguous and in that order anywhere in the file's folder path β€” e.g. Work/meetings/transcripts/company/2026/file.md matches, but meetings/company/transcripts/file.md does not (wrong order).

Parent folder is not is the exact inverse β€” same matching rules, opposite result. Useful to exclude a folder from a broader rule:

IF    Note file: Parent folder is not β†’ "Archive"
THEN  Note file: Add name prefix β†’ "[ACTIVE] "

Runs on every note except those under an Archive folder anywhere in their path. Leaving the value empty makes Parent folder is never match and Parent folder is not always match (same "nothing to compare against" convention as the does not contain operator elsewhere in the plugin).

Note file actions

Select Note file as the THEN action type to change the file itself instead of a frontmatter property or the H1 title. All text fields support the same placeholders as property/title actions ({{date}}, {{created_date}}, {{updated_date}}, {{today}}, {{filename}}, {{propertyName}}).

A bare date placeholder here is always date-only. {{today}} (or {{date}} / {{created_date}} / {{updated_date}}) with no explicit :FORMAT always resolves to YYYY-MM-DD in these fields β€” never a time component, even if your vault has a different default date format configured elsewhere. This only applies to the no-format default: if you explicitly type a format, e.g. {{today:YYYY-MM-DD_HH-mm}}, it's honored exactly as you typed it β€” including a literal : if your OS's filesystem accepts one. The plugin never second-guesses text you typed explicitly, only the automatic default.

ActionEffect
Rename fileReplaces the entire filename (keeps the extension) with the text you enter. Left empty β†’ skipped, the rest of the rule's actions still run.
Add name prefixPrepends text to the current filename. Empty text is a no-op.
Add name suffixAppends text to the current filename. Empty text is a no-op.
Move file toMoves the file to a folder path inside the vault (e.g. Archive/2026). The folder is created automatically if it doesn't exist β€” you never need to pre-create the destination. Left empty β†’ skipped. Moving outside the vault isn't possible β€” Obsidian's plugin API has no access beyond the vault sandbox.
Bookmark file (new in v0.25.0)Bookmarks the file using Obsidian's core Bookmarks plugin. A second dropdown lets you pick an existing bookmark group to file it under, or leave it at "No group (top level)". Requires the core Bookmarks plugin to be enabled β€” see below.
Remove bookmark (new in v0.25.0)Removes the file's bookmark wherever it is in the Bookmarks tree (any group, or top level). No-op if the file isn't bookmarked.
Delete fileSends the file to trash using your vault's configured deletion behavior (system trash, .trash folder, or permanent β€” whatever you set in Obsidian's Files & Links settings).

All file actions run through the official Obsidian API: fileManager.renameFile for rename/prefix/suffix/move (so links elsewhere in the vault stay intact), fileManager.trashFile for delete, and the core Bookmarks plugin's internal API for bookmark/remove bookmark.

Bookmark file: requires the core Bookmarks plugin

Bookmark file and Remove bookmark read and write Obsidian's core Bookmarks plugin. Enable it under Settings β†’ Core plugins β†’ Bookmarks. The group dropdown lists every group that already exists in your Bookmarks pane (including nested groups, shown as Parent/Child) β€” create the group in the Bookmarks pane first if you want to file notes into it. If Bookmarks is disabled, the group dropdown is empty and the action silently does nothing (logged to the developer console) rather than failing the whole scan.

Move file to: auto-creates the destination folder

Because the folder is created if missing, Move file to works great combined with date placeholders to sort files into folders that don't exist yet β€” you set the rule up once, and it creates a fresh folder every day/month/year as needed.

IF    Note file: Filename contains β†’ "transcript"
THEN  Note file: Move file to β†’ "transcripts/{{today}}"

This moves any note whose filename contains transcript into transcripts/YYYY-MM-DD/ (today's date) β€” creating both transcripts/ and the dated subfolder the first time it runs, and reusing them on later runs the same day. Use {{today:YYYY-MM}} instead of {{today}} if you want one folder per month rather than per day.

Multiple file actions in the same rule compose in sequence β€” each one executes immediately, so a later action sees the result of an earlier one:

THEN:
  - Note file: Add name prefix β†’ "[ARCHIVED] "
  - Note file: Move file to β†’ "Archive/{today:YYYY}"

The file is prefixed first, then the already-renamed file is moved.

Delete stops everything else for that file. If a "Delete file" action runs β€” in this rule or an earlier one in the same scan β€” no further actions or rules execute against that file, since it no longer exists.

Typed properties (checkbox / date / datetime)

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.

The plugin detects when the target property is one of these types and converts the rule's value automatically, on both the IF and THEN sides. You can keep writing rules with plain text and the plugin handles the rest.

Checkbox

IF    Property: status β†’ exactly match β†’ "done"
THEN  Property: completed β†’ Overwrite all values with β†’ "true"

Result on disk: completed: true (boolean). Obsidian renders a checked checkbox.

Rules:

  • "true" (any casing) β†’ true
  • Anything else ("false", empty, "sim", etc.) β†’ false

Date / datetime

IF    Property: status β†’ exactly match β†’ "done"
THEN  Property: created_at β†’ Overwrite all values with β†’ "08-08-2025"

Result on disk: created_at: 2025-08-08 (ISO date). Obsidian renders the date widget.

How the date parsing works:

  1. If your input is already in YYYY-MM-DD, it's stored as-is.
  2. Otherwise, the plugin tries to parse it using the Daily Notes core plugin's date format (if enabled), then the Templates core plugin's date format (if enabled), then a few common civilian formats (DD-MM-YYYY, DD/MM/YYYY, YYYY/MM/DD).
  3. The first format that parses successfully wins β€” the value is converted to YYYY-MM-DD before being written to the YAML.
  4. If nothing parses (you typed garbage), the input is written as-is and the property won't render in the date widget. The plugin doesn't validate format beyond that β€” garbage in, garbage out.

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.

Notes

  • This applies to both Add value and Overwrite all values with actions on typed properties. For these types Add value behaves as Overwrite all values with because the underlying types are scalar (you can't have a checkbox holding [true, false]).
  • Properties without a registered type (or registered as text, number, multitext, tags, etc.) keep the original string-based behavior. Nothing changes for those.
  • The same type-aware coercion happens when matching IF conditions, not just when writing THEN actions. For checkbox properties, Property: done β†’ exactly match β†’ "true" matches a note with done: true (boolean) regardless of how the user typed true (case-insensitive).

Rule chaining within a scan

Rules run in the order they're listed. A Property condition in a later rule sees property changes an earlier rule already made in the same scan β€” not just the frontmatter as it was before the scan started. So this works in a single pass:

Rule 1: IF  Property: status β†’ exactly match β†’ "done"    THEN  Property: tags β†’ Add value β†’ completed
Rule 2: IF  Property: tags β†’ contains β†’ "completed"       THEN  Property: priority β†’ Add value β†’ low

Rule 2 fires on the same run Rule 1 added the completed tag, no second scan needed. Note file actions in an earlier rule (rename, move) are visible the same way β€” a later rule's Note file condition checks the file's current name/folder, including any rename/move already applied earlier in the same scan.

Scan scopes

Choose what to scan:

  • Latest created: process newest notes (default: 15)
  • Latest modified: process recently edited notes (default: 15)
  • Entire vault: process all notes

Useful for running rules only on active notes instead of your entire vault.

Placeholders

Placeholders work inside any THEN action value β€” property Add value / Overwrite all values with, title Prefix / Suffix / Overwrite, and Note file Rename / Add name prefix / Add name suffix / Move file to β€” and, (new in v0.26.0), inside any IF condition value too (Property, First level title, Note file β€” skipped for a /regex/-mode value). They're expanded at the moment the rule runs, against the file being processed.

PlaceholderResult
{{date}}Today's date β€” same meaning as Obsidian's own {{date}} Templates placeholder. Default format is YYYY-MM-DD, unless your vault has a custom Date format set under Files & Links β€” then that format is used instead. Example: 2026-01-08. {{today}} still works as an alias, kept for backward compatibility.
{{yesterday}} / {{tomorrow}} (new in v0.26.0)Yesterday's / tomorrow's date. Same formatting rules as {{date}}.
{{created_date}}The file's creation date.
{{updated_date}}The file's last-modified date.
{{time}}Current time. Default format is HH:mm, unless your vault has a custom Time format set β€” then that format is used instead. Matches Obsidian's Templates {{time}}.
{{filename}} / {{title}}File basename without .md. Example: meeting-notes.
{{propertyName}}Live value of that frontmatter property on the current note.
:FORMAT suffixAny of the above with a custom moment.js format: {{date:DD-MM-YYYY}} β†’ 08-01-2026, {{date:MM}} β†’ just today's month, {{time:HH:mm:ss}}, {{updated_date:YYYY}}.
{{match}} / {{match:N}} / {{match:name}}Beta β€” see {{match}} in THEN above.

Property placeholders

Any token that isn't one of the reserved names above, and whose first character isn't : or whitespace, is treated as a frontmatter property lookup. So {{g_excerpt}}, {{summary}}, {{kebab-case-prop}} all work.

Copy a value from one property to another:

IF    Property: g_excerpt β†’ exists
THEN  Property: excerpt β†’ Add value β†’ "{{g_excerpt}}"

Behavior:

  • Missing property β†’ empty string. No errors, no literal {{name}} left behind in your YAML.
  • Arrays are joined with , . A source like tags: [a, b, c] becomes a, b, c in the expanded string.
  • Earlier actions in the same rule are visible to later ones. The expansion reads from the in-progress frontmatter, so if action #1 sets excerpt, action #2 can reference {{excerpt}}.
  • Reserved names win. date, created_date, updated_date, today, yesterday, tomorrow, time, title, and filename are resolved as reserved placeholders first; a property with one of those names won't shadow them.

Note file actions and conditions: dates are always date-only

Inside Rename / Add name prefix / Add name suffix / Move file to, and any Note file condition's value (new in v0.26.0), a bare date placeholder ({{date}}, {{yesterday}}, {{tomorrow}}, {{created_date}}, {{updated_date}}, {{today}} β€” no explicit :FORMAT) always resolves to YYYY-MM-DD, never a time component, regardless of your vault's configured default date format. File and folder names elsewhere in the OS can't contain certain characters depending on platform, so these fields don't inherit a format that might not have been meant for filenames. An explicit format is always honored exactly as typed, including one with : in it β€” the plugin never rewrites what you explicitly typed, it only picks a safe default when you didn't specify one.

Combinations

Placeholders mix freely in the same value:

  • {{date:YYYY-MM-DD}} - {{title}} β†’ 2026-08-22 - meeting-notes
  • Meeting {{filename}} - {{date:DD/MM/YY}} β†’ Meeting meeting-notes - 08/01/26
  • {{date}}/{{title}} as a Move file to destination β†’ 2026-08-22/meeting-notes (folder auto-created)
  • {{g_title}} ({{date:YYYY}}) β†’ My Post (2026)

Installation

From Community Plugins

  1. Settings β†’ Community Plugins β†’ Browse
  2. Search "Conditional Properties"
  3. Install and enable

Manual installation

  1. Copy folder to .obsidian/plugins/conditional-properties
  2. Settings β†’ Community Plugins β†’ Enable "Conditional Properties"

Usage

Run manually

  • Settings: Conditional Properties β†’ "Run now" button
  • Command Palette: "Run conditional rules on vault"
  • Current file: "Run conditional rules on current file"

Schedule execution

Settings β†’ Scan interval (minutes) β†’ Set interval (minimum 5)

The plugin runs automatically based on your selected scope.

Backup and restore settings

Settings β†’ Backup and restore.

  • Export settings writes conditional-properties-settings-YYYY-MM-DD.json to your vault's root folder (not your OS's Downloads folder) and shows a Notice confirming the path. This works the same way on desktop and mobile β€” earlier versions triggered a browser download dialog, which isn't reliable in Obsidian Mobile's WebView. The full path of the most recent export is also shown as "Latest export" right under this section's description (new in v0.25.2) β€” on desktop that's the full OS filesystem path (mobile has no real filesystem path, so it falls back to the vault-relative one) β€” and it stays there after reopening the settings tab or restarting Obsidian.
  • Import settings opens a file picker; pick any exported JSON file to restore your rules and scan settings.

Roadmap

  • IF/THEN rules engine
  • 6 property operators
  • Multiple actions per rule
  • Title modifications with date placeholders
  • Scheduled scans
  • Scoped execution (latest/entire vault)
  • Current file execution
  • Property existence checks
  • Rename property action
  • Title overwrite with {{filename}} and {{date:FORMAT}} placeholders
  • Multiple conditions per rule (match any / match all)
  • Frontmatter property placeholders ({{propertyName}}) in action values
  • Regex matching (/pattern/) on exactly match / contains / does not contain
  • Modify note content (beyond frontmatter)
  • Comparison operators (greater than / less than)
  • Nested condition groups (e.g. (A AND B) OR C)
  • Folder/tag-based scoping

Privacy

All processing happens locally. No data collection, no external requests.

License

MIT

For plugin developers

Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.