nsyout223 downloadsGenerate safe Markdown indexes from folders, tags, properties, and filename patterns.
Generate safe Markdown indexes from folders, tags, properties, and filename patterns.
Concordance writes a list of [[wikilinks]] into a clearly-marked block in any
note you designate as an index. Content outside the block is never touched, so
your indexes can mix prose, headings, callouts, and the auto-generated list in
one file.
prefix: files whose name starts with a configurable template (default
{PREFIX} - plus a space)folder: files inside a folder (optionally recursive)tag: files carrying a tag (inline or frontmatter)property: files whose frontmatter property equals a given value%% concordance:start %%
and %% concordance:end %% is rewritten. Headings, notes, and other prose
outside the block are left alone.name vs full path,
by name vs path).A Concordance-managed index file. The list inside the %% concordance %%
markers is regenerated each run. Everything outside is yours.

The update modal shows exactly what will change (links added, removed, and unchanged) before any file is written to disk.

Marker attributes drive non-prefix modes. Tag, folder, and frontmatter property indexes are all configured the same way, by editing the options in the start marker.

main.js, manifest.json, and styles.css from the latest release.<vault>/.obsidian/plugins/concordance/.There are two ways to turn a note into an index.
Create a note whose name matches the configured index template
(default {PREFIX} - Index - {DISPLAY_NAME}), e.g. ART - Index - Art. Open it
and run Concordance: Update current index. Concordance asks once whether to
insert the managed block, then fills it with links to every other note whose
name starts with the ART - prefix.
Add a managed block to any note. The attributes inside the start marker tell Concordance how to populate it:
## Recipes
%% concordance:start mode="folder" folder="Recipes" includeSubfolders="true" %%
%% concordance:end %%
Run Concordance: Update current index on the note. The body between the markers is replaced with the generated list.
| Command | What it does |
|---|---|
| Update current index | Compute and apply the update for the active note. |
| Update all indexes | Bulk-update every detected index after a confirmation step. |
| Check indexes for updates | Read-only diff of every index. Nothing is written. |
Attributes are written inside the start marker as key="value" pairs.
| Attribute | Modes | Values | Default |
|---|---|---|---|
mode |
all | prefix, folder, tag, property |
prefix |
folder |
folder |
vault-relative path (empty = whole vault) | index folder |
includeSubfolders |
folder |
true, false |
false |
tag |
tag |
#tag or tag (leading # added) |
none |
property |
property |
frontmatter key | none |
value |
property |
frontmatter value to match | none |
linkStyle |
all | auto, name, path |
auto |
sort |
all | name, path |
path |
linkStyle="auto" picks the basename for in-folder matches and the full path
for subfolder matches so wikilinks resolve unambiguously.
%% concordance:start mode="tag" tag="#recipe" sort="name" %%
%% concordance:end %%
%% concordance:start mode="property" property="type" value="recipe" %%
%% concordance:end %%
%% concordance:start mode="folder" folder="Projects/Active" includeSubfolders="true" linkStyle="path" %%
%% concordance:end %%
{PREFIX} and {DISPLAY_NAME}.{PREFIX}.Ask shows a confirmation modal before adding
a marker pair to an index that has none. Never silently skips such files.%% concordance:start %% and
%% concordance:end %%. Everything else in a file is preserved.vault.getMarkdownFiles() to find candidate notes for an index.tag and property modes, it reads cached metadata (tags and
frontmatter) via Obsidian's MetadataCache, with no extra file I/O.Build instructions, project layout, and release workflow live in CONTRIBUTING.md. Changelog is in CHANGELOG.md.
Developed with assistance from AI. All changes are reviewed and tested by the maintainer.
MIT. See LICENSE.