Bulk Tag Manager is a comprehensive tag management utility for Obsidian. It provides a unified, professional dashboard to rename, merge, delete, clean, standardise, and organise both tags and front matter properties across your entire vault. This plugin absorbed the functionalities from Tag Wrangler, by pjeby.
Warning
This plugin contains a History system that allows you to undo any operation. However, if you are about to perform a destructive bulk process, it is recommended that you backup your vault before running bulk operations.
The plugin provides two interfaces:
- Quick Actions Modal -- Accessed from the ribbon icon (Tags). Provides single-tag operations: rename, delete, search, tag page creation, and random note.
- Settings Dashboard -- Accessed from Settings or the Command Palette. Contains the full suite of bulk operations, vault-wide statistics, and advanced tools.
At the top of the Settings Dashboard, expand the Overview section to see real-time analytics:
- Total Tags -- Count of unique tags in your vault.
- Total Files -- Number of notes in the current scope.
- Case Consistency -- Breakdown of lowercase, uppercase, and mixed-case tags with a consistency progress bar.
- Separator Consistency -- Breakdown of kebab-case, snake_case, mixed, and unseparated tags.
- Clean Tags and Front Matter -- Count of clean tags vs. tags with special characters, plus detection of notes with unnecessarily quoted properties.
- Tag Format Style -- Count of files using YAML list format vs. inline array format, with one-click conversion buttons.
- Wiki Link Format Style -- Same format breakdown for wiki link properties (
aliases,cssclasses, etc.). - Tag Nesting -- Count of flat vs. nested (hierarchical) tags, with links to files containing nested tags.
- Locations -- Breakdown of tags in frontmatter vs. tags in the document body, with links to files containing inline body tags.
- Length -- Detection of unusually long tags (over 25 characters).
- Case Duplicates -- Automatic detection of tags that differ only by case (e.g.
#Projectvs#project), with a one-click "Merge all to canonical" button. - Empty Tags -- Detection of files with empty tag fields in frontmatter.
Clicking any statistic opens a detailed list of the relevant tags or files.
If any files contain malformed YAML tag syntax (missing commas, unquoted colons, invalid formatting), an Invalid Tags warning block appears below the Overview. Clicking Fix Invalid opens a modal where you can review each issue and apply automatic or manual fixes.
Rename any tag across all files, in both frontmatter and the document body.
- Go to the Rename Tag section.
- Enter the Find tag (or use the Search button to browse existing tags with usage counts).
- Enter the Replace tag. If the target tag already exists, a warning is displayed indicating the rename will merge the tags.
- Click Rename.
Child tags are automatically updated: renaming #project to #work will also rename #project/active to #work/active in both frontmatter and body.
Rename multiple tags simultaneously using a dedicated table of old/new pairs.
- Go to the Batch Rename section.
- Add as many rows as needed.
- Enter the Old Tag and New Tag for each row.
- Click Apply.
This is ideal for quickly reorganising small groups of tags without running multiple single rename operations.
Perform large-scale tag restructuring by uploading a data file.
- Go to the Batch Rename from CSV section.
- Click Choose CSV and select a file with two columns:
old_tagandnew_tag. - Review the Preview of the first few pairs to ensure correct loading.
- Click Apply.
The CSV should not contain headers or the # symbol (though the plugin handles them if present).
Consolidate multiple tags into a single canonical tag.
- Go to the Merge Tags section.
- Enter Source tags (comma-separated, e.g.
#film, #movie), or use the Select button for a multi-select modal with checkboxes. - Enter a Target tag (e.g.
#cinema). - Click Merge.
Duplicate tags in the same file are automatically deduplicated after merging. Child tags are propagated (e.g. #film/drama becomes #cinema/drama).
Create hierarchical structures by moving existing tags under a new parent.
- Go to the Nest Tags section.
- Enter the Parent tag (e.g.
#work). - Enter the Tags to nest (comma-separated, e.g.
#meetings, #tasks). - Click Nest.
Each child tag will be renamed to include the parent prefix (e.g. #work/meetings and #work/tasks).
Remove tags from all files in the current scope.
- Go to the Delete Tags section.
- Enter tags to delete (comma-separated), or use the Select or Search buttons.
- Click Delete.
Deleting a parent tag also removes its child tags (e.g. deleting #project also removes #project/active and #project/done). Tags are removed from both frontmatter arrays and inline body occurrences. Trailing whitespace artifacts are automatically cleaned up.
Advanced tag restructuring using Regular Expressions.
- Go to Pattern Rename (Regex).
- Enter a Pattern (e.g.
^category-(.*)). - Enter a Replacement (e.g.
new-category/$1). - Click Apply.
Regex complexity is limited to prevent catastrophic backtracking (ReDoS). Frontmatter content is excluded from pattern matching to prevent YAML corruption.
Configure how tags should be formatted vault-wide:
- Case Strategy -- Lowercase, Uppercase, or No Change.
- Separator Style -- Snake_case, Kebab-case, or Preserve.
- Remove Special Characters -- Strip everything except letters, numbers, hyphens, and underscores.
- Flatten Diacritics -- Convert accented characters to their plain equivalents (e.g. a to a).
- Apply to Nested Tags -- Whether to process child tags during conversion.
Click Convert All to apply these rules across all files in the current scope. A preview modal shows exactly which files and lines will be changed before you confirm.
In the Case statistics box, two buttons allow you to convert all tags in your vault to uppercase or lowercase in a single operation, independent of the Case Strategy setting.
Limit all operations to specific parts of your vault.
- Enable Scope Filter.
- Use Include Folders to specify which folders to process.
- Use Exclude Folders to protect specific folders (e.g.
Templates,Archive). - Optionally set a File Pattern Filter (regex) applied to file paths for fine-grained control.
All statistics, conversions, and bulk operations respect the active scope filter.
Removes unnecessary quotes and trims whitespace from all frontmatter fields across the vault. This addresses Obsidian's tendency to add defensive quoting around property values.
Converts both tag properties and wiki link properties (such as aliases and cssclasses) to the inline array format ([value1, value2]) across all files in the current scope.
Converts both tag properties and wiki link properties to the multiline YAML list format across all files:
tags:
- tag1
- tag2In the Tag Format Style statistics box, you can convert tags specifically (without affecting wiki link properties) between YAML list and inline array formats.
In the Wiki Link Format Style statistics box, you can convert wiki link properties specifically between YAML list and inline array formats.
Visualise your tags as a collapsible, searchable tree to understand your taxonomy. Includes:
- A search field to filter the tree in real time.
- A sort dropdown (alphabetical, by count, by depth).
- Expand All / Collapse All controls.
- Click counts to see usage per tag node.
Find tags used fewer times than a configurable threshold (default: 2 files). The orphan modal lists all matching tags with their usage counts and provides a Delete All Orphans button for bulk cleanup.
Generate a markdown file (All Tags.md) in your vault root listing every tag and its usage count, sorted alphabetically.
Every destructive operation (rename, merge, delete, convert, pattern rename, format conversion, property cleaning) is recorded with full file snapshots.
- Click History to view a chronological log of all operations.
- Click Undo on any operation to revert every affected file to its exact state before the operation.
- History is stored externally in the plugin's data directory to keep
data.jsonsmall. - Configure Max History Size (default: 50 entries) and History Expiration (default: 7 days) in Settings.
Define tags that should never be modified by any rename, merge, or delete operation.
- Go to Settings > Bulk Tag Manager > Protected Tags.
- Add a tag (e.g.
#status/active). - Use a wildcard (
*) for prefix matching (e.g.#status/*protects#status/active,#status/done, etc.).
Protected tags are silently skipped during all bulk operations.
Define automatic correction rules that trigger when you save a note.
- Go to Settings > Bulk Tag Manager > Aliases.
- Add an Alias (e.g.
wip) and a Canonical tag (e.g.work-in-progress). - Whenever you save a note containing
#wip, it is automatically corrected to#work-in-progress.
Aliases work in both frontmatter and the document body. Child tags are also corrected (e.g. #wip/urgent becomes #work-in-progress/urgent). A debounce timer prevents conflicts during rapid editing.
Right-click any tag in the tag pane, editor, reading view, or metadata properties panel to access:
- Rename -- Opens the rename prompt for that tag.
- Delete -- Deletes the tag with confirmation.
- Open / Create Tag Page -- Opens an existing tag page or creates a new one with the tag as an alias.
- New Search -- Opens a global search scoped to the tag.
- Require in Search -- Adds the tag as a required filter to the current search query.
- Exclude from Search -- Excludes the tag from the current search query.
- Open Random Note -- Opens a random note tagged with the selected tag (requires the Smart Random Note plugin).
Tags can also be dragged and dropped in the tag pane to restructure the hierarchy (e.g. dragging active onto project renames it to project/active).
Holding Ctrl/Cmd + Click on any tag in the editor or reading view opens its tag page, or prompts to create one.
- Download the latest release from GitHub.
- Extract
main.js,manifest.json, andstyles.cssinto<vault>/.obsidian/plugins/bulk-tag-manager/. - Reload Obsidian and enable the plugin.
- Click the Tags icon in the left ribbon for quick single-tag actions (rename, delete, search, tag page, random note).
- Use Settings > Bulk Tag Manager for bulk operations, vault-wide cleanup, statistics, and advanced tools.
- Right-click any tag in the tag pane, editor, or reading view for contextual actions.
- Use the Command Palette for direct access to common operations.
| Command | Description |
|---|---|
Open Bulk Tag Manager Settings |
Opens the full settings dashboard |
Convert all tags (with preview) |
Runs bulk conversion based on current settings with a preview |
Generate Tag List |
Creates a markdown file listing all tags and their usage counts |
Show Tag Hierarchy |
Opens the tag hierarchy tree view |
Find Orphaned Tags |
Scans for tags below the usage threshold |
Undo Last Tag Operation |
Reverts the most recent operation |
- Use Preview: The bulk convert option shows a preview of every change before applying. Use it to verify before committing.
- Check History: Use the History modal after any operation to verify exactly which files were changed and to undo if needed.
- Scope Filters: Use Include/Exclude folders to test operations on a sandbox folder before running them vault-wide.
- Protected Tags: Add critical tags (e.g.
#status/*) to the protected list before running bulk operations to prevent accidental modification. - Case Duplicates: Run the case duplicate check periodically. Tags like
#Projectand#projectare treated as separate tags by Obsidian and can cause inconsistencies.
This plugin incorporates and extends the context menu and tag page functionality originally created by pjeby in the Tag Wrangler plugin.
