Metadata Validator

by flowing-abyss
5
4
3
2
1
Score: 53/100

Description

The Metadata Validator plugin validates note metadata against manifest driven schemas. It looks for manifest.md files inside a schemes/ folder and applies the closest manifest above each note as that note's schema. Nested manifests inherit from the parent tree, so a base schema can be extended for narrower folders like sources, books or people without repeating every rule. The plugin's model is entirely folder based and depends on keeping those manifest files in the schemes hierarchy.

Reviews

No reviews yet.

Stats

4
stars
4,696
downloads
0
forks
54
days
18
days
18
days
0
total PRs
0
open PRs
0
closed PRs
0
merged PRs
0
total issues
0
open issues
0
closed issues
199
commits

Latest Version

19 days ago

Changelog

Fixed number values not saving in Bases tables

README file from

Github

Metadata Validator

Available in Obsidian Release Downloads

Describe what a note's properties should look like in a manifest.md, and the plugin checks every matching note, fills in what it can, and keeps the properties in order. Rules add the conditional part, for example "when the status is done, set the end date".

Where manifests live

Manifests sit in a schemas folder (set in the plugin settings) and inherit down the tree. A note gets the closest manifest whose target matches it.

vault/
└── schemas/
    ├── manifest.md            base schema
    ├── rules.md               rules for every manifest below
    ├── sources/
    │   ├── manifest.md        extends base
    │   └── books/
    │       └── manifest.md    extends sources
    └── projects/
        └── manifest.md        extends base

A complete example

One manifest for project notes. It matches notes tagged #project, describes their properties, keeps them in a fixed order, and has three rules.

---
name: Project
description: A finite piece of work with one result.
target:
  query: "#project"
enforce_folder: projects
fields:
  tags:
    type: multiselect
    required: true
    sort: alphabetical
  status:
    type: select
    required: true
    default: inbox
    options:
      - { value: inbox, label: Inbox }
      - { value: wip, label: In progress }
      - { value: done, label: Done }
  priority:
    type: select
    default: normal
    options: [{ value: high }, { value: normal }, { value: low }]
  category:
    type: multilink
    source:
      query: "#category"
  start:
    type: date
  end:
    type: date
  created:
    type: date
    hidden: true
  icon:
    type: text
    hidden: true
    fixed: 🗂️
rules:
  - name: start on wip
    when: "status=wip AND start="
    then:
      set: { start: "{{today}}" }
  - name: end on done
    when: "status=done AND end="
    then:
      set: { end: "{{today}}" }
  - name: created stamp
    when: "created="
    then:
      set: { created: "{{now}}" }
formatting:
  property_order: [tags, status, priority, category, start, end, created, icon]
---

This runs on save, on open, and when you start the vault auto-fix from the sidebar. Missing properties get their default, icon is always the fixed value, the rules fill in the empty dates and the creation time, and the properties are reordered. Anything the plugin cannot fix shows up in the sidebar and as an icon next to the property.

Manifest keys

Key Meaning
name, description shown in the sidebar and in the properties modal
target.query which notes this manifest applies to, see the query language below
enforce_folder notes matching this manifest are moved into this folder
extends path of the parent manifest, when it is not the parent folder
exclude names of inherited fields or rules to drop
priority when several manifests match, the higher priority wins
fields the properties, see below
rules the rules, see below
formatting.property_order order of properties in the note

Field keys

Types are text, number, select, multiselect, list, date, link, multilink, boolean and url.

Key Meaning
required the property must be present
default inserted when the property is empty
fixed always this value
options allowed values, a list of { value, label, description }, or { source: ... } for a computed list
strict: false values outside options are left alone
source for links, which notes are allowed. query, folder, tag or js
validate_exists: false do not require the linked note to exist
sort alphabetical or alphabetical-desc for lists
min, max range for numbers
format date format, for example YYYY-MM-DD
label, description, hidden how the property appears in the editing modal
validate.js custom check, return true or an error message

Query language

Used in target.query, in source.query and in rule conditions.

Term Matches when
#project the note has this tag or a child tag
projects/ the note is in this folder
status=done the property equals the value, or a list contains it
end= the property is empty
rating>=8, end<2026-01-01 numbers and dates compare as such
-term, AND, OR, ( ) negation, both, either, grouping

Rules

A rule says what the properties should look like when a condition holds. It runs on the note's current state, so it behaves the same on save, on open and in the vault auto-fix, and it does nothing when the note is already correct.

rules:
  - name: end on done
    description: Done work gets its end date.
    when: "status=done AND end="
    then:
      set: { end: "{{today}}" }

name and description are optional. The properties modal lists the rules under the schema and shows the description on hover.

when is a query string, or one of these forms, and can be nested.

when: { project: { when: "status=done" } }       # a linked note in `project` matches
when: { tasks: {} }                               # `tasks` has at least one value
when: { and: ["status=done", { not: ["end="] }] } # also `or`
when: { js: "return fm.status === 'done'" }

then holds verbs that run in the order written.

Verb Does
set: { end: value } write the value, null clears
add: { tags: value } add to a list, no duplicates
remove: { tags: value } remove from a list, * is a wildcard
js: "..." run code with the note's fm

A value is a literal, a template or a selection. A selection { team: { when: "status=left" } } means the links in team whose note matches, and { team: {} } means all of them.

Templates use {{today}}, {{now}}, {{file.name}} or any property. {{project>category}} reads category from the notes linked in project. Filters are name (link to note name), snake, kebab, lower, upper, trim, replace:"a","b", join:", " and date:"YYYY-MM-DD".

Common rules

Dates that follow the status.

  - when: "status=wip AND start="
    then:
      set: { start: "{{today}}" }
  - when: "status=dropped"
    then:
      set: { end: null, priority: low }

Tags that mirror a property. The first rule removes every status/* tag, the others add the right one.

  - then:
      remove: { tags: "status/*" }
  - when: "status=wip"
    then:
      add: { tags: status/wip }
  - when: "status=done"
    then:
      add: { tags: status/done }

Links that belong in another property. When a person in team has left, their link moves to former_team.

  - then:
      add:
        former_team: { team: { when: "status=left" } }
      remove:
        team: { when: "status=left" }

A reading list that sorts itself. Books move between to_read, reading and finished by their own status.

  - then:
      add:
        reading: { to_read: { when: "status=reading" }, finished: { when: "status=reading" } }
        finished: { to_read: { when: "status=done" }, reading: { when: "status=done" } }
      remove:
        to_read: { when: "-status=to_read" }
        reading: { when: "-status=reading" }
        finished: { when: "-status=done" }

A task that follows its project. The values are copied in both directions, so a category removed from the project leaves the task too. A task without a project keeps its own.

  - then:
      set: { category: "{{project>category}}", area: "{{project>area}}" }

State taken from a linked note. A task closes when its project closes, and a project closes when all its tasks are closed.

  - when: { project: { when: "status=done" } }
    then:
      set: { status: done }
  - when:
      and:
        - tasks: {}
        - not:
            - tasks: { when: "-status=done" }
    then:
      set: { status: done }

Overdue work.

  - when: "end<{{today}} AND -status=done"
    then:
      add: { tags: overdue }
  - when: { or: ["end>={{today}}", "status=done", "end="] }
    then:
      remove: { tags: overdue }

Where rules live

Rules go in a manifest, or in a rules.md file anywhere in the schemas folder. A rules.md applies to every manifest in its folder and below. Rules from rules.md files run first, then the manifest chain from the root ancestor down. A rule with the same name replaces the earlier one.

When a note changes, the notes whose rules read it through a link are checked again, so a task follows its project right away. This can be turned off in the settings.

Similar Plugins

info
• Similar plugins are suggested based on the common tags between the plugins.
Binary File Manager
5 years ago by qawatake
An Obsidian plugin to manage binary files
Auto Card Link
4 years ago by Nekoshita Yuki
Media DB Plugin
4 years ago by Moritz Jung
A plugin that can query multiple APIs for movies, series, anime, games, music and wiki articles, and import them into your vault.
Metadata Menu
4 years ago by mdelobelle
For data management enthusiasts : type and manage the metadata of your notes.
Custom File Explorer sorting
4 years ago by SebastianMC
Take full control over the order and sorting of folders and notes in File Explorer in Obsidian
Meta Bind Plugin
4 years ago by Moritz Jung
A plugin for Obsidian to make your notes interactive with inline input fields, metadata displays, and buttons.
Note aliases
4 years ago by Pulsovi
This plugin manages wikilinks aliases and save them on the aliases list of the linked note
Linked Data Vocabularies
3 years ago by kometenstaub
Add linked data to the YAML of your Obsidian notes.
Notes dater
3 years ago by Paul Treanor
Adds created_on and updated_on dates of the active note to status bar
Bulk Exporter
3 years ago by symunona
Bulk export Markdown filtered, renamed and sorted by front matter metadata into a new structure.
Copy Metadata
3 years ago by wenlzhang
An Obsidian plugin to copy metadata to clipboard and insert it into file name.
Auto Tag
3 years ago by Control Alt
Easily generate relevant tags for your Obsidian notes.
Frontmatter generator
3 years ago by Hananoshika Yomaru
A plugin for Obsidian that generates frontmatter for notes
File Index
3 years ago by Steffo
Obsidian plugin to create a metadata file about the files present in the Vault
Additional Icons
3 years ago by Matthew Turk
Add additional iconsets to Obsidian
Metadata Icon
3 years ago by Benature
change metadata entry icon
Update Time
2 years ago by Sébastien Dubois
Obsidian plugin that updates front matter to include creation and last update times
Watched-Metadata
2 years ago by Nail Ahmed
Watches for changes in metadata and updates the note content accordingly.
Image Metadata
2 years ago by alexeiskachykhin
Adds image metadata editing capabilities to Obsidian
Virus Total Enrichment
2 years ago by ytisf
An Obsidian plugin to enrich a note with VirusTotal API.
Onto Tracker
2 years ago by Jacob Hart
Plugin for obsidian allowing project management with ontologies.
Dataview
6 years ago by Michael Brenan
A data index and query language over Markdown files, for https://obsidian.md/.
Supercharged Links
5 years ago by mdelobelle
obsidian plugin to add attributes and context menu options to internal links
MetaEdit
5 years ago by Christian B. B. Houmann
MetaEdit for Obsidian
Metadata Extractor
5 years ago by kometenstaub
Obsidian Plugin that provides metadata export for use with third-party apps.
Update time on edit
5 years ago by beaussan
Metadata Auto Classifier
2 years ago by Beomsu Koh
Obsidian plugin that uses AI providers to generate tags and frontmatter metadata for your notes.
ExMemo Assistant
2 years ago by ExMemo AI
Using LLMs to manage files and generating metadata such as tags and summaries.
KoReader Highlight Importer
2 years ago by Tahsin Kocaman
Imports highlights and metadata from KoReader into Obsidian notes
Frontmatter Markdown Links
2 years ago by mnaoumov
Obsidian Plugin that adds support for markdown links in frontmatter
Boardgame Search
2 years ago by Marlon May
A plugin to create notes for boardgames based on the BGG API
Sentinel
2 years ago by Giorgos Sarigiannidis
A plugin for Obsidian that allows you to update properties or run commands based on document visibility changes.
Current File Tags
2 years ago by Trung Tran
Dataview Autocompletion
2 years ago by Daniel Bauer
NetClip
2 years ago by Elhary
this plugin is for Obsidian that allows you to browse the web and clip webpages directly into your vault.
Media Companion
2 years ago by Nick de Bruin
Fold Properties By Default
2 years ago by Tommy Bergeron
Always have editor/metadata properties folded by default.
LLM Tagger
2 years ago by David Jayatillake
Paste Image Into Property
2 years ago by Nito
My Thesaurus
2 years ago by Mara-Li
A plugin that auto tags file based on contents and a csv file or a Markdown table (inspired by https://github.com/pmartinolli/MyThesaurus)
Content Cards
2 years ago by leo
Insert content cards in Markdown, such as timeline, highlightblock, target card, book information card, music information card, movie information card, photoes ablum, business card, content subfield, countdown, SWOT,BCG.
AI Tagger Universe
2 years ago by Hu Nie
An intelligent Obsidian plugin that leverages AI to automatically analyze note content and suggest relevant tags, supporting both local and cloud-based LLM services.
Note Favicon
2 years ago by mdklab
Obsidian plugin – Show Favicon from Metadata
File Title Updater
2 years ago by wenlzhang
An Obsidian plugin that synchronizes titles between filename, frontmatter, and first heading in your notes.
Chronotyper
2 years ago by BambusControl
Obsidian plugin for tracking note edit time
Kanban Status Updater
2 years ago by Ankit Kapur
Obsidian plugin that automatically updates the note property when card is moved to a column.
Simple File Info
2 years ago by Lukas Capkovic
Another Name
a year ago by Jiyuan Wang
Add a subheading to your note in Obsidian
GitHub Integration
a year ago by Kirill Zhuravlev
Plugin that fetch your github stars into notes
Note UID Generator
a year ago by Valentin Pelletier
Allow you to automatically generate UID for the notes in your vault.
Symbol linking
a year ago by Evan Bonsignori ; Mara-Li
Adds ability to link with any trigger in Obsidian. Each trigger can limit linking to specific folders or file.
Frontmatter Metadata Link Classes
a year ago by Varvara Zmeeva / zmeeva.io
Enhanced internal links with automatic classnames based on frontmatter metadata.
Discrete
a year ago by shkarlsson
Papers
a year ago by William Liang
An obsidian plugin to retrieve and import research papers.
Note Codes
a year ago by Ezhik
Reference your Obsidian notes from anywhere with simple 4-character codes.
Pretty Properties
a year ago by Anareaty
API Designer
10 months ago by Ruveyda Yilmaz
A plugin for Obsidian that lets you design and document API endpoints visually without leaving your notes.
Book Clipper
10 months ago by Hossein Fardmohammadi
Save book details from websites into your notes
Conditional Properties
9 months ago by Diego Eis
Automate frontmatter property updates in your Obsidian notes using simple conditional rules.
Frontmatter to HTML Attributes
7 months ago by Tarek Saier
Snipd Official
5 months ago by snipd-app
Better Export PDF
4 months ago by l1xnan
Obsidian PDF export enhancement plugin
April Automatic Timelines
4 months ago by april-gras
Simple timeline generator plugin for story tellers using obsidian
Advanced Note Mover
3 months ago by Lars Bücker
Quickly and easily move notes to predefined folders. Perfect for organizing your notes.
Bases Toolbox
3 months ago by Grub Basket
Adds Quality of Life features to Obsidian Bases
Property Panels
3 months ago by Eva Chen
Display and edit Obsidian frontmatter properties in configurable panels that stay inside the note's scrollable content.
PixNote
2 months ago by Sofia Milton
Vault Shelf
a month ago by Lukas Proprentner
Your Obsidian vault as a browsable library: shelves of books built from titles, dates, people, tags, folders or any note property. Customizable to make it your own.
Mapa neuronal
a month ago by Felipe Córdova
A graph that explains itself: your Obsidian vault as a layered neural map, with the reason each note links to the next.
Advanced Metadata Cache
18 days ago by Michael Naumov
Maintains the vault indexes that are otherwise rebuilt on every call, and answers the built-in lookups from them, so backlinks come from an index instead of a fresh scan of every note.