Alexander Leonov277 downloadsQuickly hide or show user-defined folders from the file explorer, search and graph by toggling Obsidian's Excluded files setting.
Obsidian community plugin that toggles your Excluded files list on and off with one click. Useful when you keep an archive folder, attachments, templates, or anything else noisy out of your file explorer / search / graph by default, but occasionally want to dig into it without losing the configuration.
The plugin operates on Obsidian's built-in Settings → Files and links → Excluded files list — it doesn't maintain its own. There's no settings tab for the plugin itself; configure what to exclude in the native UI and the plugin just flips it on/off.
Works with every filter type Obsidian's Excluded files setting supports:
Archive/Templates/note.md/^_/Search and Graph views are refreshed automatically after toggling (File Explorer updates on its own).
Settings → Community plugins → Browse → search "Toggle Excluded Folders" → Install → Enable.
Download main.js and manifest.json from the latest release and drop them into <Vault>/.obsidian/plugins/toggle-excluded-folders/. Reload Obsidian, enable in Community plugins.
Alternatively, bind the Toggle visibility command to a hotkey via Settings → Hotkeys.
You can add entries to the native list at any time. Anything you add while filters are off will be merged in on the next restore — it won't get lost.
Vault.getConfig / setConfig disappear in a future version, the plugin detects this on load, shows a notice, and disables itself instead of crashing.This plugin reads and writes Obsidian's "Excluded files" list through APIs that are not part of the public plugin SDK. They are isolated in two files so the surface area is easy to audit and patch:
Vault.getConfig("userIgnoreFilters") / Vault.setConfig("userIgnoreFilters", …) — the only way to access the native excluded-files list programmatically. Used in src/vault-config.ts.view.setQuery / view.onSearch / view.searchComponent — to make Search re-run after the filter list changes (it doesn't subscribe to userIgnoreFilters). Used in src/refreshers.ts.view.dataEngine.update() / view.dataEngine.render() — same reason, for Graph and Local graph views. Used in src/refreshers.ts.Type signatures for everything above live in src/obsidian-internals.d.ts as a module augmentation, so the rest of the code reads as plain typed access with no as any / as unknown as casts at call sites.
npm install
npm run dev # esbuild watch — writes main.js in place
npm run build # tsc typecheck + production esbuild
npm run lint
Under src/:
main.ts — plugin lifecycle, toggle logic, ribbon, commandvault-config.ts — isolated wrapper around the undocumented Vault.getConfig/setConfig for userIgnoreFiltersrefreshers.ts — REFRESHERS array describing how to nudge each consumer (Search, Graph, …). Add an entry to support a new view or third-party plugin.obsidian-internals.d.ts — module augmentation + standalone interfaces for every undocumented Obsidian API the plugin touches. Single source of truth for the private surface area.There is no test framework. Verify manually: reload Obsidian, click the ribbon, confirm folders appear/disappear in File Explorer, Search, and Graph.
See LICENSE.