Open-source project
darlal/obsidian-switcher-plus avatar
darlal/obsidian-switcher-plus

Quick Switcher++: an Obsidian switcher that searches headings, symbols and editors

Enhanced Quick Switcher plugin for Obsidian.md

639 stars29 forksTypeScriptGPL-3.0

At a glance

What is it?
Quick Switcher++ extends the built-in Obsidian Quick Switcher with heading search, symbol navigation across canvas nodes, hashtags, links and embeddings, editor and panel navigation, workspace switching, bookmark search and command execution. It is a TypeScript plugin built with Rollup and Jest, and it depends on the core Quick Switcher staying enabled.
Who is it for?
Quick Switcher++ suits an Obsidian user whose vault is large enough that the built-in filename switcher stops finding things, because searching headings and symbols rather than filenames is the difference between finding a section and finding a file. It does not suit a user who wants a plugin that replaces the core switcher, since the core plugin must remain enabled and the two share configuration.
Can I use it commercially?
Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
Is it still maintained?
Yes. The repository last received commits 6 days ago.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 24, 2026, and from our analysis. They are not legal advice.

Editorial analysis

It extends the core switcher rather than replacing it

Quick Switcher++ is an Obsidian.md plugin that extends the functionality of the built-in Quick Switcher, and the README puts a condition on it in bold: the core Obsidian Quick Switcher plugin must remain enabled, because Quick Switcher++ extends the core switcher and shares the same configuration settings.

That single constraint shapes the whole design. The plugin is not a replacement switcher, it is a set of additional search modes layered onto the one you already use, and the configuration you already have keeps working. The primary language is TypeScript and the licence is GPL-3.0-only, with the current release at 6.2.0 from 2026-09-12 following 6.1.6 and 6.1.5 in July 2026, and the last push to the repository on 2026-10-18.

The problem it addresses is specific and, in a large vault, real. Obsidian's Quick Switcher searches filenames. In a notes vault where the meaningful structure lives in headings inside files, the filename is often a poor key, and the switcher can feel like it is searching the wrong thing. Searching headings means you can type the sentence you remember and land on the exact section.

The audience is therefore an Obsidian user with a large vault and a lot of prose, and the plugin's design assumes you know the vault's structure well enough to want to jump to a heading, a hashtag or a link target rather than to a file.

The feature list in the README is organised around modes, and each mode has a default trigger character: headings use #, symbols use @, and there are modes for editors, panels, workspaces, bookmarks, commands, related files and vaults.

Heading search with a filename fallback you can turn off

The heading mode is the core feature and the configuration table for it is the most detailed part of the README.

The behaviour is configurable three ways. Strictly through only the first H1 header with a fallback to filename search when there is no H1 match, through all headers, or respecting the built-in Quick Switcher settings for showing existing files, attachments and all file types.

By default, heading mode displays the first top 50 results. That cap is worth understanding, because it is the difference between a switcher that shows you everything and one that shows you a page.

The settings are granular. The trigger character is configurable, and the defaults are # for the headings list mode. Search Headings is enabled by default. Turn off filename fallback is disabled by default, which means the fallback to filename search happens when there is no match in the first H1 contained in the file. Search all headings is enabled by default, so all headings are searched rather than only the first H1 in each file. Search Filenames is disabled by default, which means filename suggestions are suppressed except for fallback searches. Search Bookmarks is enabled by default.

Three settings are about pruning the result set rather than the search. Max recent files to show controls how many recent files appear when there is no search term, with 0 hiding them entirely and the default being 25. Exclude folders takes folder path regexes, one per line, and excludes those folders and their sub-directories from suggestion search. Hide Obsidian Excluded files, disabled by default, is the one with the subtlest behaviour: when enabled, suggestions for files on Obsidian's Options, Files & Links, Excluded files list are not displayed at all, and when disabled they are displayed but downranked.

The last setting, File extension override, always searches files with the listed extensions, overriding the built-in Show attachments and Show all file types settings, and the default value is canvas. That default is a good hint about what the plugin is for, because the canvas extension is Obsidian's visual whiteboard format, and searching canvas files by default is not what a general-purpose file switcher would do.

Symbol mode has two different sources depending on how you trigger it

Symbol navigation covers canvas nodes, headings, hashtags, links and embeddings, and it can be entered in two ways that behave differently, which is the part that takes a minute to understand.

The first way is a command, Quick Switcher++: Open Symbols for the active editor. It always triggers symbol mode for the active file in the currently active editor pane, meaning the file actively being edited when the command was triggered, whether it was triggered through a hotkey, the command palette or a trigger character. The list of symbol suggestions is always symbols from that one file.

The second way is the trigger character, @ by default, and it is called embedded symbol mode. It triggers symbol mode for the currently highlighted suggestion in the switcher. So you open Quick Switcher++, see a list of your recent files or your file search results, and whichever suggestion is highlighted when you type @ is the file whose symbols get listed.

That means you can filter with characters, and use the arrow keys to select which file is the source, before typing the trigger. It is a more flexible model, since the file does not have to be the one you are editing, and it works for files that are not open in an editor at all.

The two modes are complementary. The command version is for when you are already in the file and know what you are looking for. The trigger version is for when you are navigating from a search result, which is the case the plugin is really built around.

Other navigation modes follow the same pattern. There is editor navigation, which filters the currently open editors and makes one active, and then a second use of the switcher to open a side panel such as backlinks. The feature list also covers switching between configured workspaces, searching Obsidian bookmarks, running Obsidian commands, navigating to related files, opening vaults, and quick filters to narrow search results.

A TypeScript plugin with a performance test suite and a baseline file

The repository is a normal TypeScript Obsidian plugin with a few things that go slightly beyond the template.

The build is Rollup, with a fast variant that passes a development environment flag, and the packaging step copies styles.css and manifest.json next to the built output.

bash
npm run bundle
npm run package-plugin

The main output goes to ./dist/main.js, and the engines field pins Node to 24.18.1, which is a recent enough version to be worth noticing if you are building the plugin yourself.

The testing story is the interesting part. There are two Jest configurations, jest.config.js and jest.perf.config.js, and a separate performance script, test:perf, with a companion test:perf:update-baseline that runs with UPDATE_PERF_BASELINE=true. That is a performance regression harness rather than a unit test suite, and a baseline file to compare against is exactly the kind of thing a plugin that indexes a whole vault needs, since a change that makes the switcher slow is invisible to functional tests.

There is also a check:dts script pointing at scripts/check-dts.js, which validates the generated type declarations, and a coverage script that serves the lcov report. The CI script chains lint, test and build, so a commit has to pass all three.

At the top level there is a benchmark/ directory, a demo/ directory with the GIFs and screenshots the README uses, an eslint config in the new flat format, a codecov configuration, a release.sh, a manifest.json, versions.json and separate tsconfig files for production and development.

The development workflow is a watch loop. build:watch runs onchange over src/**/*.ts and triggers the fast build, and dev chains that with the lint and test tasks.

Where Quick Switcher++ is the wrong tool

The first wrong-tool case is a user who wants to replace the Obsidian switcher rather than extend it. The core Quick Switcher plugin must remain enabled, and the two share configuration, so you cannot treat this as a drop-in alternative and switch the built-in one off. If the goal is a different switcher entirely, this is the wrong shape.

The second case is a small vault. The value of heading and symbol search scales with how much structure your notes have. In a vault of twenty notes, the built-in filename switcher is already fast enough and the extra modes add nothing.

The third case is a user who wants a different kind of search. Everything here is fuzzy text matching over a set of names: files, headings, symbols, bookmarks, commands. If what you actually need is a full text search across the body of your notes, or a query language over your vault, that is a different plugin and a different mechanism.

There is a performance consideration that the plugin addresses but does not remove. A switcher that searches every heading in every file has more to index than one that matches filenames, and the 50 result cap in heading mode and the 25 recent file cap are there to keep the response instant. The existence of a performance baseline test shows the author was thinking about this, but a vault with tens of thousands of files is where you would want to check the actual behaviour rather than assume it.

On licensing, the plugin is GPL-3.0-only, which is the standard choice for Obsidian community plugins and is compatible with how the community distributes them. The primary language is TypeScript and the project is maintained by a single author under the darlal organisation, with the release history showing regular patch releases through 2026.

Editorial conclusion

Quick Switcher++ suits an Obsidian user whose vault is large enough that the built-in filename switcher stops finding things, because searching headings and symbols rather than filenames is the difference between finding a section and finding a file. It does not suit a user who wants a plugin that replaces the core switcher, since the core plugin must remain enabled and the two share configuration. Before adopting, read the headings mode configuration table, because the filename fallback and the top 50 result cap are the two settings that will change how the switcher feels, and note that the plugin requires Node 24.18.1 for its own build.

Frequently asked questions

What does the Quick Switcher++ Obsidian plugin do?

It extends the built-in Obsidian Quick Switcher with heading search, symbol navigation across canvas nodes, headings, hashtags, links and embeddings, navigation between open editors and side panels, workspace switching, bookmark search, command execution, related file navigation, vault opening and quick filters. The core Quick Switcher plugin must remain enabled because the two share configuration.

How do I trigger heading and symbol search in Quick Switcher++?

Headings mode is triggered by the # character by default and symbol mode by @. Symbol mode can also be entered through the Quick Switcher++: Open Symbols for the active editor command, which always uses the active file in the active editor pane, while the @ trigger uses whichever file suggestion is highlighted when you type it.

What are the main Quick Switcher++ settings?

The headings search can be restricted to the first H1 or all headings, with the filename fallback on or off, and separate toggles for searching filenames and bookmarks. You can cap recent files shown at 25 by default, exclude folders by regex, hide or downrank files on Obsidian's excluded files list, and override the file extension search, which defaults to canvas.

How do I build the Quick Switcher++ plugin from source?

The build uses Rollup, with npm run bundle producing the output and npm run package-plugin copying styles.css and manifest.json next to it. The engines field requires Node 24.18.1, and the ci script runs lint, test and build in sequence.

What license is Quick Switcher++ released under?

The plugin is licensed under GPL-3.0-only, recorded in the package metadata, with the LICENSE file at the root of the repository. The current release is 6.2.0, tagged on 2026-09-12, and the repository includes a benchmark directory plus a separate Jest performance configuration with a baseline update script.

Official sources

  1. darlal/obsidian-switcher-plus on GitHub
  2. Issues
  3. License: GPL-3.0
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/darlal-obsidian-switcher-plus.svg)](https://hysenlabs.com/projects/darlal-obsidian-switcher-plus)

Was this useful?