Dmitry52 downloadsExplore and manage any folder as an interactive mind map, including folders outside the vault: sizes, counts, file search, rename, move, drag and drop.
An Obsidian plugin that turns any folder into an interactive mind map: collapsible nodes, sizes, file counts, search and basic file operations right on the map. It works with folders inside the vault and with any directory on disk (for example E:\My Drive).
Русская версия: README.ru.md · English
I love Obsidian. So I see no reason why it can't also help me keep the folder structure on my computer in order — not just the notes inside the vault.
comment, комментарий, description, описание, note). The mode is toggled by the "comments" button in the toolbar or by the checkbox in the settings.node_modules, .git, __pycache__ and similar) are hidden with one toggle.Settings → Community plugins → Browse → search for "Folder Mindmap" → Install → Enable.
Put the plugin folder into <vault>/.obsidian/plugins/folder-mindmap:
git clone https://github.com/Bathert/obsidian-folder-mindmap.git "<vault>/.obsidian/plugins/folder-mindmap"
In Obsidian: Settings → Community plugins → Reload plugins, then enable "Folder Mindmap" if it is off.
Alternatively copy manifest.json, main.js and styles.css into a folder-mindmap folder inside .obsidian/plugins.
Requirements: Obsidian 1.4.0+ on desktop. The plugin does not work on mobile: it reads the file system through Node.js.
| Action | What it does |
|---|---|
| click a folder | expand / collapse the branch; an empty folder expands with an "empty" marker |
| "more N" | show the remaining folders of a node (when there are more than the limit) |
| mouse wheel | zoom |
| drag the background | pan the map |
| search | finds a folder or file by name, expands the path and highlights the folder |
| "2 lv." / "3 lv." / "all" | expand the map to 2, 3 or all levels (with a guard against too many nodes) |
| right click a node | "Rename", "Move", "Copy path" |
| double click a node | rename the folder or file |
| Ctrl/Cmd + click a file | open it: notes inside the vault in Obsidian, anything else in the system app |
| Space over a file | preview: images, notes, plain text, audio, video |
| right click → "Open" / "Open in new tab" / "Preview" / "Open in Explorer" | the same actions from the menu |
| drag a node | drop a file or folder onto another folder to move it |
| "undo" | undo the last move or rename |
| "collapse" | collapse everything down to the root |
| "system" | show / hide node_modules, .git, __pycache__ and similar |
| "files" | show / hide files (on by default) |
| "comments" | show / hide comment properties of files |
| "refresh" | re-read the folder (unchanged directories still come from the index) |
| ⛶ | fit the map to the window |
The button captions in the shipped UI are Russian; the table above translates them one to one. An English localisation is the next step.
Right click any node — folder or file:
After the operation the tree, sizes and index are updated immediately; no manual rescan is needed.
Drag any node with the mouse: a label follows the cursor, a valid destination folder gets an accent border, the source node fades. Drop it on a folder and the file or folder moves there; tree and index update at once.
Not allowed: dropping onto a file (folders only), onto the node itself, or into its own subtree — such targets are not highlighted. Releasing over empty space cancels the move.
A folder without subfolders shows its file count next to the size — "0 files · 0 B", "3 files · 1.2 MB"; a folder with subfolders shows the number of subfolders: "2 sub. · 14.1 MB". Everything sits on one line on the right, so the name is clipped to the remaining width. Such a folder without subfolders also expands: inside there are either its files or an "empty" marker.
If the destination folder already contains an object with the same name, the plugin shows the native system dialog: Replace (the old object is deleted permanently), Rename (the new one becomes file (2).txt) or Cancel (nothing is moved).
Mistake? The "undo" button in the toolbar reverts the last move or rename (history lasts for the session).
The folder index lives in <plugin>/cache/idx-<hash>.json and stores, per directory, its mtime, names of subfolders and files with their sizes.
stat: if the mtime matches the index, the contents come from the index and files are not stat-ed again.Notes can carry a short description in their frontmatter:
---
comment: Anything that explains what this file is
---
With the "comments" toggle on, the map draws that value under the file name as a dim italic line, and the node becomes two lines tall. Hovering shows the full text, clicking puts the path, size and comment into the status bar.
comment, комментарий, description, описание, note by default, configurable in the settings. The first match wins.|, >) are skipped — the map shows single-line properties only.shell.openPath. Shift + Ctrl/Cmd opens in a new tab.A file is shown with its extension. If the name does not fit the node, only the name is clipped and the extension stays: verylongname_aaaa….txt.
isDesktopOnly: true — the plugin uses Node fs and path directly.fs.promises) and does not block the UI; progress is shown in the status bar.<plugin>/cache/ and contain only the tree and sizes, no service references.ItemView (folder-mindmap-view), separate from notes.readdir, stat) under the folder you open — nothing else on the disk.<plugin>/cache/ (the index and scan cache), plus the actual rename/move you asked for, including "Replace" after you confirm it in the system dialog.fetch, no XMLHttpRequest, no Obsidian requestUrl. Everything runs locally.The plugin requires raw file system access on purpose: the whole point is showing folders that live outside the vault.
The community directory scan flags two things. Both are intentional and bounded:
| Scan finding | What the code actually does |
|---|---|
Direct file system access (fs outside the vault API) |
readdir/stat only inside the folder you open — showing folders outside the vault is the whole point. Directory symlinks are shown with a → marker and are not traversed, so a scan cannot wander outside the opened tree. Writes go to <plugin>/cache/ plus the objects you explicitly rename or move; a move whose destination is outside the opened folder asks for confirmation first. |
| Clipboard access | One call to navigator.clipboard.writeText behind the "Copy path" item. The clipboard is never read. |
No network requests, no telemetry, no third-party code.
main.js the whole plugin: scanning, aggregation, layout, view, settings
styles.css map and toolbar styling
manifest.json Obsidian manifest (id, version, minimum app version)
tests/ Node checks of the logic without launching Obsidian
Unit checks need no Obsidian — the obsidian module is stubbed:
node tests/logic.test.js main.js
They cover scanning, size aggregation, counters, the child node limit and layout on a temporary tree.
How to run the plugin by hand, what to keep untouched and what a pull request should look like — see CONTRIBUTING.md.
Live checks (Obsidian 1.15.0): opening a folder, expanding/collapsing nodes, search with jump, toggling service folders, restoring the view after a restart, dragging files and folders (including cancelling a move and refusing to put a folder inside itself), the undo button, the system dialog on name conflicts, expanding empty folders, the index (5,208 directories / 68,525 files: first open 2.4 s, second 0.3 s, a new file is picked up by re-reading a single directory) and file name search from the index.
MIT — see LICENSE.