The go-to directory tree tool.
Map any folder. Navigate, filter, annotate, and export it in 9 formats — from ASCII trees for your README, to interactive HTML, to a WinDirStat-style treemap.
Built with Tauri 2 · React 19 · Rust · TypeScript
Note
Prebuilt installers for Windows, macOS, and Linux live at zsync.eu/zdirmap. You can also grab the latest artifacts from the GitHub Releases page. No need to build from source unless you want to hack on it.
Tip
Built because the alternatives are either ancient, web-only, or locked behind subscriptions. ZDirMap is free, native, fast, and ships as a tiny binary thanks to Tauri.
- 🌳 Streaming scan with live progress + cancellation — handles huge directories without freezing
- ☑️ Tri-state checkboxes with O(depth) propagation — pick exactly what ends up in the output
- 📦 9 output formats — ASCII, Markdown, JSON, YAML, Flat path list, CSV, HTML, Mermaid, and a WinDirStat-style treemap
- 🗺️ Squarified treemap with drill-in navigation
- 📸 Snapshots + diff between scans to spot what changed
- 🚫 Saved ignore presets + automatic
.gitignoreimport + glob patterns - ✋ Drag-and-drop reorder — grab any tree row by its grip handle and rearrange siblings; the new order flows straight into every output format
- 💬 Inline
# commentson any row, virtualized tree (rendering 100k+ rows is fine) - 📑 One-click export-all writes every format to a directory at once
- 📊 Annotations — file sizes, modified times, and line counts in the output
Nine ways to look at the same tree. The active tab updates live as you check, uncheck, reorder, or annotate rows.
The classic. Box-drawing characters, depth-aware indentation, optional annotations, inline comments.
my-app/ (14.2 MB, 8,412 lines)
├── src/ (2.1 MB, 5,118 lines)
│ ├── App.tsx (2.4 KB, 84 lines) # entry
│ ├── main.tsx (0.6 KB, 22 lines)
│ └── store.ts (4.8 KB, 212 lines)
├── README.md (3.1 KB, 98 lines)
└── package.json (1.2 KB, 48 lines)
GitHub-flavored nested bullet list — drop straight into a README.
- my-app/
- src/
- App.tsx
- main.tsx
- store.ts
- README.md
- package.jsonNested, machine-readable. Includes name, isDir, and any active annotations.
{
"name": "my-app",
"isDir": true,
"size": 14894694,
"lines": 8412,
"children": [
{ "name": "App.tsx", "isDir": false, "size": 2458, "lines": 84, "comment": "entry" }
]
}Same shape as JSON, more human-friendly for config-style use.
- name: my-app
type: dir
size: 14894694
lines: 8412
children:
- name: App.tsx
type: file
size: 2458
lines: 84
comment: entryEvery selected path, one per line, relative to the root. Pipe-into-anything friendly.
my-app/
my-app/src/
my-app/src/App.tsx
my-app/src/main.tsx
my-app/README.md
Spreadsheet-ready. Columns toggle on with the annotations.
path,type,depth,size,lines,comment
my-app/,dir,0,14894694,8412,
my-app/src/App.tsx,file,2,2458,84,entrySelf-contained, styled, collapsible HTML page. Open it in a browser, share it, host it.
Drop the output into any Mermaid-aware Markdown renderer (GitHub, GitLab, Notion, Obsidian) and get a rendered tree diagram.
graph TD
my-app --> src
src --> App.tsx
src --> main.tsx
my-app --> README.md
A squarified, color-graded SVG treemap that visualizes disk usage at a glance. Click a rectangle to drill in; breadcrumbs let you walk back out. The fastest way to find what's eating your disk.
Flags in the sidebar that change what gets walked on disk. Tweak them, then re-scan.
| Flag | What it does |
|---|---|
| Smart ignore | Skip the usual noise — node_modules, .git, target, dist, build, etc. On by default. |
| .gitignore | Auto-import the patterns from the scanned root's .gitignore and respect them. |
| Show hidden | Include dotfiles and dot-directories (.env, .vscode/, …). Off by default. |
| Symlinks | Follow symbolic links instead of skipping them. Cycle-safe. |
| Count lines | Read each text file (≤ 8 MB, binary-detected) and count newlines. Aggregates to parent dirs. |
| Scan depth | Stop the walker at depth N (or ∞). Useful for huge trees you don't fully care about. |
Don't trigger a re-scan — these reshape the output from data already in memory. Updates are instant.
Toggle what shows next to each row in the output.
| Annotation | Example | Notes |
|---|---|---|
| Sizes | (14.2 MB) |
Human-readable; dirs show aggregated descendant size. |
| Modified | (2d ago) |
Relative time since mtime. |
| Lines | (212 lines) |
Only present when "Count lines" was enabled during scan. |
All three can be combined: (14.2 MB, 2d ago, 8,412 lines).
Reshape the tree without losing the underlying selection.
| Filter | Effect |
|---|---|
| Files only | Hide intermediate folders from the output (paths still traverse them). |
| Folders only | Drop files entirely; great for directory-structure docs. |
| Hide dotfiles | Strip rows whose name starts with . from the output. |
| Trailing / | Append / to directory names (off by default for some formats). |
| Output cap | Cap output at depth N independent of scan depth — preview a deep tree without re-scanning. |
| Sort | Name (A→Z), Size (large→small), or Modified (recent→old). |
Hover any tree row, a grip handle fades in on the right. Grab it and drag to reorder siblings under the same parent. The new order is stored as a per-parent override and applied to every output format — ASCII branches redraw, JSON children reshuffle, CSV rows resequence, all instantly.
Order resets when you re-scan unless you save it to a snapshot.
Click the comment bubble that appears on a row hover to attach a free-text comment. It renders as # comment in ASCII / Markdown / Flat, as a comment: field in JSON / YAML / CSV, and as edge labels in Mermaid.
A snapshot is a single .zdirmap JSON file capturing the full scan state at a moment in time: the tree, your selection, comments, custom order, output options, scan options.
| Use case | How |
|---|---|
| Save a scan | Click the camera button → file is written to the app config dir. |
| Reopen | Snapshots panel lists everything you saved. |
| Diff | Compare two snapshots — see what was added, removed, or changed size. |
| Share | The file is plain JSON, version-controlled, diff-able in git. |
Save a set of glob patterns as a named preset. Patterns match per-path-component (so node_modules catches **/node_modules/**). Auto-import a project's .gitignore to seed a preset in one click. Presets persist as JSON in the app config dir.
- Frameless glass shell — custom titlebar with drag-region, native min / max / close.
- Theme toggle — dark / light / follow-system.
- One-click export-all — pick a directory and ZDirMap writes every format at once (
tree.ascii.txt,tree.markdown.md,tree.json, …). - Copy the current output to clipboard.
- Toast notifications for scan completion, errors, and exports.
- Virtualized tree — 100k+ rows scroll smoothly because only the visible window mounts.
- Cancellable scans — kick off a scan of
/, change your mind, hit cancel, no orphaned work.
| Platform | Format |
|---|---|
| Windows | .msi installer + portable .exe |
| macOS | .dmg (Apple Silicon + Intel) |
| Linux | .AppImage, .deb, .rpm |
git clone https://github.com/TheHolyOneZ/ZDirMap.git
cd ZDirMap
pnpm install
pnpm tauri dev # run dev
pnpm tauri build # bundle installersYou need:
- Node 20+ and pnpm 9+
- Rust stable toolchain
- Platform deps for Tauri 2 — see the Tauri prerequisites
| Layer | Tools |
|---|---|
| Shell | Tauri 2 (Rust) |
| Frontend | React 19 · TypeScript · Vite 7 |
| Styling | Tailwind 4 with custom theme tokens |
| State | Zustand 5 (composed slices) |
| Tree | @tanstack/react-virtual |
| Treemap | d3-hierarchy (squarified) |
| Motion | motion (Framer) |
| Scan | walkdir · globset · ignore · tokio |
- 🌐 Website — zsync.eu
- 📦 ZDirMap — zsync.eu/zdirmap
- 🐙 GitHub — github.com/TheHolyOneZ
- 🧰 Source — github.com/TheHolyOneZ/ZDirMap
ZDirMap © 2026 TheHolyOneZ — Released under the GNU General Public License v3.0.
