Skip to content

Lint an Obsidian vault with rumdl

Use rumdl's obsidian flavor to lint vault content without treating callouts, wikilinks, tags, Obsidian comments, Dataview fields, or Templater expressions as ordinary Markdown errors. Standard Markdown checks continue to run outside those recognized constructs.

.rumdl.toml
[global]
flavor = "obsidian"
rumdl check .

Supported Patterns

Tags with Hash Syntax

MD018 recognizes Obsidian's tag syntax to avoid false positives:

This is a #tag not a malformed heading.
Multiple #tags #in-one-line are supported.
Nested #tags/with/hierarchy work too.

Callouts (Admonitions)

MD028 recognizes Obsidian callout syntax to prevent false positives when blank lines appear between callout blocks:

> [!NOTE]
> This is a note callout.

> [!WARNING]
> This is a warning.

> [!TIP]+ Foldable (expanded by default)
> Tip content here.

> [!INFO]- Collapsed by default
> Info content here.

Supported callout types include: - note, abstract, summary, tldr - info, todo, tip, hint, important - success, check, done - question, help, faq - warning, caution, attention - failure, fail, missing - danger, error, bug - example, quote, cite

Custom callout types are also supported.

Comments

Rules skip Obsidian comment syntax to avoid false positives inside comments:

This is visible %%this is hidden%% and visible again.

%%
Multi-line
comments are
also supported
%%

Rules affected: MD011, MD012, MD034, MD037, MD044, MD049, MD061, MD064, MD069

Highlights

MD037 and other emphasis-related rules recognize Obsidian highlight syntax:

This is ==highlighted text== in a sentence.

Table rules treat the pipe in an aliased wikilink as part of the link rather than a cell delimiter, so a row like this one has two cells and not three, and a paragraph whose only pipes sit inside wikilinks is not mistaken for a row that lost its table:

| Character | Note                        |
| --------- | --------------------------- |
| Alice     | [[White Rabbit|the Rabbit]] |

Dataview Inline Queries

MD038 recognizes Dataview plugin inline query syntax:

The file name is `= this.file.name`.
Dynamic content: `$= dv.current().field`.

Dataview Inline Fields

MD011 recognizes Dataview inline field syntax to prevent false positives:

(status:: active)[link text]
(author:: John Doe)[read more]
(date:: 2024-01-01)[view]

These patterns look like reversed links but are valid Dataview inline field syntax.

Extended Task Checkboxes

MD064 recognizes extended task checkbox syntax beyond the standard [ ], [x], and [X]:

- [/] In progress
- [-] Cancelled
- [>] Deferred
- [<] Scheduled
- [?] Question
- [!] Important
- [*] Star/highlight

These extended checkboxes are commonly used in Obsidian with plugins like Tasks or custom CSS.

Templater Syntax

MD033 correctly ignores Templater plugin syntax (not flagged as inline HTML):

<% tp.date.now() %>
<%* javascript code %>
<%+ expression %>
<% tp.file.title %>

Rule Behavior Changes

Rule Standard Behavior Obsidian Behavior
MD018 Flag #text without space Allow #tag syntax
MD028 Flag blanks between blockquotes Recognize callout blocks
MD033 Flag inline HTML Ignore Templater <% %> syntax
MD037 Check emphasis spacing Recognize ==highlight== syntax
MD038 Check code span spacing Allow = and $= Dataview prefixes
MD011 Check reversed links Skip %%comments%% and (field:: value) patterns
MD012 Check multiple blanks Skip content in %%comments%%
MD034 Check bare URLs Skip content in %%comments%%
MD044 Check proper names Skip content in %%comments%%
MD049 Check emphasis style Skip content in %%comments%%
MD061 Check link fragments Skip content in %%comments%%
MD064 Check multiple consecutive spaces Skip %%comments%%, allow extended checkboxes [/], [-], etc.
MD069 Check reference links Skip content in %%comments%%
MD056 Count \| as a cell delimiter Treat [[Target\|Label]] as one cell
MD075 Pipe line after a table is a row Wikilink-only pipes stay prose

Configuration

[global]
flavor = "obsidian"

When to Use

Use the Obsidian flavor when:

  • Linting notes from your Obsidian vault
  • Using Obsidian-specific syntax like callouts or comments
  • Using the Dataview plugin for dynamic content
  • Using the Templater plugin for templates
  • Using Obsidian's tag syntax extensively

Plugin Compatibility

The Obsidian flavor is designed to work with common Obsidian plugins:

  • Dataview: Inline queries with = and $= prefixes
  • Templater: Template syntax with <% %> delimiters
  • Core plugins: Callouts, tags, wiki-links, block references

Coming from Obsidian Linter?

Comparison with Obsidian Linter maps every Obsidian Linter rule to its rumdl counterpart, gives a starter .rumdl.toml for a vault, and lists the behaviors that differ.

See Also