notenerd697 downloadsReveal hidden dot-folders (like .claude or .github) in the file explorer, search, and Bases, with live updates, file-type filters, and exclusions.
An Obsidian plugin that reveals hidden dot-folders (.claude, .github, .vscode, and friends) inside your vault. Revealed folders show up in the file explorer, search, the metadata cache, and Bases, and stay live as files change on disk. Nothing on disk is ever modified: revealing and hiding only changes what Obsidian indexes.
projects/.notes, or reveal a single dotfile like .env.env in the allowlist covers .env,
.env.local and .env.example, and gitignore covers .gitignore. Files with no extension at all
(LICENSE, Makefile) stay out.node_modules are skipped wherever they appear, so revealing .expo or a project folder doesn't flood your index.Reveal a hidden folder, Hide a revealed folder (both with fuzzy pickers), and Rescan revealed folders.Obsidian reads a file's extension from the last dot in its name. A file whose only dot is the leading one —
.env, .gitignore, .prettierrc — therefore has no extension as far as Obsidian is concerned, so there is
nothing for the mapping above to bind to. Those files are indexed either way (search, links, Bases and other
plugins see them), but listing them in the explorer needs the second toggle described below; without it, opening
one hands it to your default app.
Split dotfiles are fine, because their extension comes from the last dot: .env.local is extension local,
.env.example is example, .eslintrc.json is json. Those are in the default allowlist and show up normally,
listed under their basename with the extension as a badge. A file named config.env works too — only the bare
form is affected.
Also show files with no extension (off by default, under File types) covers the bare form by claiming the
empty extension. The claim cannot be scoped to revealed folders, but in practice its reach is narrow: Obsidian
does not index extensionless files from ordinary folders at all, so the only ones it can affect are those this
plugin reveals. A LICENSE sitting in a normal folder stayed unindexed and unlisted in testing. It is off by
default because the claim is still app-wide and undocumented, not because it was observed to cause trouble.
Do note what revealing an .env file means: its contents become searchable, show up in Quick switcher, and are
visible to anything that walks the vault — sync included. That is the point of the feature, but it is worth a
thought before turning it on in a vault that syncs.
Obsidian has no public API for indexing hidden paths, so the plugin calls (and patches) a small set of undocumented methods on the desktop FileSystemAdapter (reconcileFolderCreation, reconcileFileInternal, reconcileDeletion, and the listRecursiveChild / reconcileFile entry points). All patches are guarded, installed only while at least one folder is revealed, and fully restored on unload. This also means the plugin is desktop only.
Getting a revealed file to appear takes a second, separate mechanism. Obsidian's file explorer only draws a row for an extension that maps to a view, so the plugin claims the allowlisted extensions Obsidian does not already own (via the documented Plugin.registerExtensions) and maps them to the markdown view. The undocumented app.viewRegistry is read only to see which extensions Obsidian already owns — remapping those would break their real viewers — and to hand claims back when the allowlist changes mid-session. Every claim is released on unload. Because a row is created at the moment a file enters the index, changing either display setting forces a full conceal-and-re-reveal.
npm install
npm run dev # unminified build with inline sourcemaps
npm run build # typecheck + minified production build
The build bundles src/main.ts into main.js with esbuild. Copy (or symlink) main.js, manifest.json, and styles.css into <vault>/.obsidian/plugins/unhidden/ and enable the plugin in Settings → Community plugins.
| File | Role |
|---|---|
src/main.ts |
Plugin entry point: lifecycle, commands, settings persistence |
src/reveal-engine.ts |
Core: reveals/conceals folders, eager tree indexing, adapter patches |
src/vault-internals.ts |
Typed surface of the undocumented adapter methods and view registry |
src/settings.ts |
Settings shape, defaults, legacy-format migration, input parsing |
src/settings-tab.ts |
Settings UI |
src/folder-pick-modal.ts |
Fuzzy folder picker used by the commands |
MIT — see LICENSE.