A small native disk-usage browser inspired by ncdu.
cljdu is ordinary JVM Clojure, rendered by clj-gpui (GPUI, not a browser or Electron). Select a folder, scan it in the background, and drill into the largest directories.
Primary platforms: macOS and Linux. Windows is out of scope.
- Native folder picker (GPUI / desktop portal, with
zenityfallback on Linux) - Recursive scan of regular files and directories
- Symbolic links are listed, never followed
- Unreadable paths are skipped, not fatal
- Largest-first table with kind icons, name, size, a share bar, and percent of the current folder
- Pie chart of the current folder with a color legend (name, size, %); hover a legend row for the full path; Bar tab uses horizontal bars
- Double-click a directory (or select it and Open) to drill in
- Right-click the listing to open a folder or show it in the file manager
- Native breadcrumbs, Back, Refresh
- Status bar with file/dir counts; shimmer and a progress circle while scanning (no expensive pre-scan)
- Remembers the last folder
- Show the current folder or selected item in Finder / the system file manager
- Copy the current folder path
- Catppuccin Violet Dark (pinned; does not follow OS light/dark)
- Read-only: no delete
Requirements: Java 21+, Clojure CLI, a Rust toolchain (first run builds the GPUI host), and a display. On Linux, Vulkan is required; Mesa lavapipe is enough.
clj -M:devnREPL listens on 127.0.0.1:7888 (see .nrepl-port). Edit src/ and save for hot reload.
clojure -M:test
clojure -M:cljfmt check
clojure -M:cljfmt fixConnect to a running UI with clojure -M:connect.
deps.edn depends on clj-gpui at git SHA ac8eec1016eaef746c77ac1a6986d4275258e970 (GPUI Kit 0.6 widgets, protocol 11). That SHA forwards GPUI text clip (:truncate, :text-overflow) so the status-bar scan path stays one line.
End users do not need Rust, Cargo, the Clojure CLI, or a system JDK. Packaging is native-only:
| Build host | Command | Output |
|---|---|---|
| macOS | clj -X:build package |
target/package/cljdu.app |
| Linux | clj -X:build package |
target/package/cljdu-0.1.0-x86_64.AppImage and target/package/cljdu_0.1.0_amd64.deb |
Use -X (not -T) so clj-gpui stays on the classpath. That uses clj-gpui's gpui.package plus gpui.edn in this repo. The bundle contains a jlink JRE, an uberjar started with gpui.prod (no nREPL, no source watcher, no Cargo), and the GPUI host.
If the AppImage cannot mount FUSE, run it extracted:
APPIMAGE_EXTRACT_AND_RUN=1 ./target/package/cljdu-0.1.0-x86_64.AppImageLICENSE and NOTICE from this repo are copied into the packages (usr/share/doc/cljdu/ on Linux, Contents/Resources/licenses/ on macOS).
Other tasks: clj -X:build uberjar, clj -X:build host, clj -X:build jre.
macOS codesigning is not applied. After a local .app:
codesign --deep --force --sign - target/package/cljdu.app # ad-hocNotarization can be added later with a Developer ID and notarytool.
MIT. The Catppuccin Violet palette is adapted from utility_belt_gpui (MIT OR Apache-2.0); see NOTICE.
