disktree README

The project's README from github.com/tobi/disktree. As one markdown file: README.md.

disktree

disktree: a home directory as a treemap, coloured by kind of data, with reclaimable space hatched and the selection, findings and free space in the side panel

Find what is filling a disk, mark what should go, and remove it — with the volume's free space in view the whole time.

disktree is a treemap for Omarchy. It scans your home directory by default, draws every directory as a nested mosaic sized by what it really costs on disk, and lets you walk into it with the keyboard or the mouse. Mark as much as you like; nothing happens until you review the list and commit, and the permanent path always asks first.

Built with GPUI through gpui-omarchy, so it follows your Omarchy theme and behaves like the rest of the desktop.

Install

Download disktree-*-x86_64-linux.tar.gz (aarch64-linux on ARM) from the latest release, unpack it, and run ./install.sh inside (or just copy disktree onto your PATH). Or build it:

git clone https://github.com/tobi/disktree
cd disktree
make install

make install builds a release binary and puts three things under ~/.local (no root needed):

sudo make install PREFIX=/usr/local installs system-wide; make uninstall removes exactly what was installed.

You need Rust 1.97 or newer and a Wayland or X11 session with a GPU that GPUI can drive (Vulkan). Distributions often package an older Rust; rustup installs a current one.

macOS

Download disktree-*-aarch64-macos.zip (x86_64-macos for an Intel Mac) from the latest release, unzip it, and drag disktree.app into Applications. macOS 11 or newer.

A release that was not signed and notarized is stopped by Gatekeeper: macOS says it "is damaged and can't be opened" or "cannot be verified". The app is fine; the browser marked the download as quarantined. Clear the mark once:

xattr -dr com.apple.quarantine /Applications/disktree.app

(Or open it once, then choose Open Anyway in System Settings › Privacy & Security.)

Or build it, with Rust 1.97 or newer and Xcode or its Command Line Tools. macOS does not come with Rust; install it with rustup.

make install     # ~/Applications/disktree.app, and ~/.local/bin/disktree
make uninstall

To see everything, give disktree Full Disk Access in System Settings › Privacy & Security (the panel offers a button when it is missing), then reopen it. Without it macOS hides Mail, Messages, Safari, other apps' data and the Trash, and disktree counts them as unreadable. Started from a terminal, it is the terminal that needs the access. macOS also asks once each for Desktop, Documents and Downloads.

What is different from Linux:

To sign and notarize a build for others, with a Developer ID certificate in the keychain and credentials saved by xcrun notarytool store-credentials:

NOTARY_PROFILE=<profile> cargo xtask bundle \
  --sign "Developer ID Application: Name (TEAMID)" --notarize

Windows

On Windows 10 or 11, download disktree-*-x86_64-windows.zip (aarch64-windows on ARM) from the same release, unpack it anywhere and run disktree.exe. Or build it with Rust 1.97 or newer, from rustup, and the MSVC toolchain (Visual Studio Build Tools, C++ workload):

git clone https://github.com/tobi/disktree
cd disktree
cargo build --release    # target\release\disktree.exe

See On Windows for what differs there.

Use

disktree            # scan the home directory
disktree --disk     # the whole disk it lives on
disktree ~/src      # or any directory
disktree --help     # options: apparent size, follow links, skip hidden, …

The screen

One colour is kept apart: amber marks the selection, the main action, and what can be had back.

The kinds come from directory names and a few shapes (a bare git repository, target beside a Cargo.toml). Some of the names are specific to one machine; see crates/disktree-core/src/classify.rs.

Marking

Space, X, Enter and the arrows act on the tile under the mouse if the mouse moved last, and on the keyboard selection after you use an arrow or Tab.

A marked tile takes the danger colour, and so does everything inside it: removing a directory takes its contents with it. Marking a directory absorbs any marks already inside it, and something inside a marked directory cannot be marked or kept on its own; its panel offers to unmark the directory instead. Marking is reversible — press it again — and the saving is never counted twice.

Zooming and going in

Scroll to magnify toward the pointer. The wheel magnifies until the directory under the pointer fills the view, and the next notch goes into it — one continuous motion, with the directory's contents growing into place. Scroll the other way to come back out. Enter goes into the selected directory at any depth, and Backspace or Escape goes up one level. < and >, beside the Size / Files / Age switch, go back and forward through the directories visited, as do alt ← alt → (also ⌘[ ⌘] on macOS) and the mouse's side buttons. + and - magnify without going in; 0 resets.

Removing

c (or Review…) opens the list of everything marked. Unmark anything there, then choose:

When it finishes, disktree scans again so the numbers on screen match the disk, and shows how much free space was actually gained.

Keys

key does
space / x mark or unmark the tile you point at
ctrl-click (⌘-click on macOS) mark without moving the selection
enter open that directory, at any depth
⌫ / esc go up one directory
alt ← alt → back and forward through where you have been
← ↑ ↓ → move between tiles at this level
tab next largest sibling
scroll zoom toward a directory, then go into it
shift-scroll pan the magnified view
[ ] draw fewer or more levels at once
- = 0 magnify, shrink, reset the view
ctrl = ctrl - ctrl 0 (⌘ on macOS) interface zoom
/ filter by name: only matches keep their colour; enter shows only them, esc clears
c review the marked list
t rank by size or by file count
d disk usage or apparent size
i include or skip hidden entries
r scan again
ctrl o (⌘O on macOS) choose another directory to scan
g the whole disk
p show or hide the selection line
o show it in Finder, File Explorer or the file manager
? every key
q quit

On macOS the menu bar also has ⌘⇧R to show the selection in Finder, ⌘R to rescan, ⌘[ and ⌘] for back and forward, and ⌘Q, ⌘H and ⌘W (closing the window quits); other ⌘ chords are left to the system. On Linux and Windows the same work with ctrl, with F5 to rescan too.

On the review screen: m trash, p permanent, ! unmark all, enter commits, esc goes back. Or hand the list on instead of acting on it: s saves it as a text file, one path per line, and a copies a prompt for a coding agent: free the space by removing what you picked, checking each path first (git work that exists nowhere else, a tool's own clean command) and touching nothing else. A name holding a newline is left out of the list and escaped in the prompt, so it cannot pass for another path.

What it measures

The scan follows dust's approach: one rayon scope per root, a completion counter per directory so no directory is built before its last subdirectory lands, and one bottom-up pass that aggregates sizes and removes duplicate hardlinks.

The whole disk

Click / (or any directory above the scanned root) in the trail, press g, run disktree --disk, or use the launcher's Scan the whole disk action. g and --disk scan the disk your home directory lives on — / on Omarchy and on macOS. On macOS the Data volume's second mount, /System/Volumes/Data, is skipped: it is /Users, /Applications and the rest again under other names.

Widening is memoized: the tree already measured is handed to the wider walk and reused where it is reached, so going from ~ to / reads only what is outside ~ (on this machine, seconds instead of a full rescan). The current view stays on screen until the wider tree lands, which then opens with the directory you came from selected. Going back down is just navigation.

A scan stays on one volume, and a volume is the mount source, not the device number: btrfs gives each subvolume its own st_dev, so /home, /var/log and /var/cache/pacman/pkg are included, while /proc, /sys, /run, tmpfs, /boot, other disks, network shares and automount points are left out (checked by path, so an automounted NAS is never mounted just to be measured). Snapshot subvolumes are left out too: their files share blocks with the live ones, and counting them would count the disk twice. -X crosses into everything.

Without root, some system directories cannot be read; they are counted as unreadable in the top bar rather than guessed at.

On Windows

The same program, with Windows' answers to the questions above:

What it refuses to do

The removal rules live in crates/disktree-core/src/removal.rs, and each one is tested:

On Hyprland

Hyprland tiles new windows, so disktree opens into whatever tile it is given. It is designed for a roomy window; float it, or give it a rule. The window class is disktree.

windowrule = float, class:^(disktree)$
windowrule = size 1400 900, class:^(disktree)$

Develop

make run      # release build, scanning $HOME
make lint     # rustfmt --check, then clippy with every warning an error
make test     # scanner, layout and removal tests, plus window-harness tests
make ci       # lint, then test

The lint gate is strict on purpose: clippy::all and clippy::pedantic are errors, and every exception is written down with its reason in Cargo.toml. The window-harness tests draw real frames and press real keys — including one that marks a directory, confirms the deletion and checks that the files are gone while their neighbours are not.

path what lives there
crates/disktree-core scanning, the tree, the squarified layout, free space and removal — no UI
crates/disktree-app/src/state.rs every action the interface can take, and the key map
crates/disktree-app/src/views.rs the screens
crates/disktree-app/src/treemap_view.rs painting the mosaic and its labels
crates/disktree-app/src/ui.rs the spacing, type and size scale, in rem
crates/disktree-app/src/tests.rs end-to-end tests through a real window
packaging/, assets/, Makefile the desktop entry, the icon, and install

The interface follows the GPUI Kit design guides: every size is on one rem scale so interface zoom keeps its proportions, primary is reserved for what Enter does, and the only question the app asks is the one it cannot take back.

License

MIT

disktree (tobi/disktree)

Searching Database…

这是什么?disktree 是一款矩形树图可视化工具,用来找出是什么占满了你的磁盘:它把每个目录画成按实际占用空间大小嵌套的马赛克图,让你可以标记要删除的文件或文件夹,并始终显示整个卷的剩余空间。
它是命令行工具,还是图形界面应用?它是一个图形界面桌面应用,不是命令行工具——用 Rust 基于 GPUI 并通过 gpui-omarchy 构建,因此会遵循 Omarchy 主题,表现得像该桌面环境的原生组件。每个操作仍然配有键盘快捷键,不想用鼠标也行。
删除操作会立即永久生效吗?不会——标记文件或文件夹只是选中它;在你打开复核列表并选择“移到废纸篓”(可恢复)或“永久删除”之前不会有任何操作,而且永久删除选项总是先弹出确认对话框。
必须运行 Omarchy 吗,还是任何 Linux、Mac 或 Windows 机器上都能用?虽然以 Omarchy 为定位,它也提供面向通用 Linux、macOS 和 Windows 的预编译二进制,并针对各操作系统的回收站、磁盘统计和保护性系统文件夹做了专门处理。
为什么它看不到我 Mac 上的某些文件夹?在 macOS 上,disktree 需要在系统设置中授予完全磁盘访问权限(Full Disk Access),才能看到邮件、信息、Safari、其他应用的数据和废纸篓;没有该权限时这些会被计为不可读,而且如果你从终端启动它,需要授权的是终端本身。
Disk usage 和 Apparent size 有什么区别?Disk usage(磁盘占用)是默认项,反映 du 报告的数值,也是删除后实际能腾出的空间(stblocks × 512);Apparent size(表观大小)按一下键即可切换,是 `ls -l` 显示的原始文件大小,对稀疏文件或压缩文件来说两者可能相差很大。
我可以扫描整个磁盘而不只是主目录吗?可以——按 g、运行 `disktree --disk`,或使用启动器中的“Scan the whole disk”操作;扫描结果会被缓存,因此把范围从 ~ 扩大到 / 只会读取主目录以外的内容,而不会重新扫描全部。
如果我不想自己删,而是想要一份待删清单怎么办?在复核界面按 s 可把已标记的路径保存为纯文本文件,按 a 会复制一段现成的提示词给编程智能体,指示它通过删除这些路径来释放空间,除此之外什么都不要动。
为什么 macOS 显示的剩余空间可能比 Finder 少?disktree 报告的是 `df` 的数值,而 Finder 的数字还计入可清除空间(macOS 可自行清理的缓存和本地快照),因此 Finder 显示的剩余空间通常更大。
Creator
tobi
Size
2 MB
Stars
3K
Age
22d
Commits · 90 Days