Skip to content

tzarebczan/diskhound

Repository files navigation

DiskHound

DiskHound

Fast, cross-platform disk space analyzer.
Find what's eating your drive, track changes over time, detect duplicates, and reclaim space.

CI Latest release MIT License

Downloads — one-click for your OS
Each link points at the latest release on GitHub.

Windows · macOS (Universal) · Linux — AppImage · Linux — tar.gz

All releases & assets

DiskHound Overview


Why DiskHound

WinDirStat was the gold standard for a decade. DiskHound is what it would be today: a native Rust scanner, an instant-load treemap, real scan history with time-range diffs, duplicate detection, and reclaim space.

Features

  • 🦀 Native Rust scanner — reads the NTFS Master File Table directly on Windows drives (with admin), dropping cold scans on a 7 M-file drive from ~20 minutes to under 90 seconds. Falls back to a safe cross-platform walker when needed.
  • 🗺️ Interactive treemap — squarified layout with 70+ file type colors. Two layouts: "Size" (largest-first, globally ordered) and "Tree" (WinDirStat-style — files cluster inside their directories).
  • Incremental monitoring — after the first full scan, DiskHound tracks disk changes via the NTFS USN journal (Windows) and an mtime-based smart rescan (cross-platform). Repeat scans on a monitored drive are extremely fast.
  • 📈 Scan history & diffing — every scan is persisted. Compare any two snapshots with quick-select pills (1h / 6h / 1d / 1w / 1M / 3M). Browse the full per-file diff from the persistent index.
  • 🔍 Duplicate detection — SHA-256 content hashing with two-pass optimization (4KB prefix rejection, then full hash). Concurrent I/O. "Keep newest" / "Keep oldest" bulk actions.
  • 🔗 Easy Move — move a large file to another drive, leave a symlink or junction in its place. Fully reversible. Tracks every move so you can put files back with one click. Offers a one-UAC fast-scan mode for system installs.
  • 📁 Folder explorer — drill into directories with breadcrumb navigation and proportional size bars.
  • 🛎️ Drive monitoring — periodic free-space polling with delta alerts when space drops meaningfully. Rolling history of drive-level events is persisted.
  • ⚙️ Processes viewer — real-time memory + CPU sampling for every process, with icons pulled from each executable. Four views: List, Treemap, scrolling CPU Heatmap (time on X, process on Y), and details.
  • 🎮 GPU viewer — per-process GPU utilisation + VRAM pulled from Windows \GPU Engine(*) / \GPU Process Memory(*) performance counters. Adapter overview (3D / Compute / Decode / Encode stats).
  • 💽 Disk I/O viewer — per-process read / write throughput with sortable columns and a live total. Windows uses Win32_PerfFormattedData_PerfProc_Process; Linux derives rates from /proc/<pid>/io deltas; macOS surfaces a clear "unavailable" state because Apple doesn't expose unprivileged per-process counters.
  • 🪟 System Widget (Ctrl+Shift+W) — frameless always-on-top mini-window showing live disk capacity, disk I/O, CPU, GPU (Windows), memory, scan status, and per-drive pressure. Pin/unpin, drag anywhere on the title bar, remembers its size + position. Triggered from the header, the tray menu, or the keyboard shortcut.
  • 🔐 One-UAC fast-scan mode — Settings → Performance → "Always run as admin" registers a Scheduled Task bound to the current user's SID, so the normal shortcut auto-elevates with zero additional prompts.
  • 🌓 Dark & light themes — with system preference detection. Toggle from the status bar.
  • ⌨️ Keyboard navigation — arrow keys in the file list, Enter to open, Delete to trash, Ctrl+F to search, Ctrl+Shift+W to open the System Widget.
  • 🔄 Auto-update — via electron-updater with GitHub Releases. UAC elevation supported for system-wide installs.

Install

Use the one-click download links at the top of this README, or grab any release from the Releases page.

Platform Artifact
Windows DiskHound-Setup.exe — NSIS per-user installer with auto-update.
macOS DiskHound-universal.dmg — single universal .dmg, native on both Apple Silicon and Intel Macs.
Linux DiskHound-x86_64.AppImage (recommended — built-in auto-update) or DiskHound-x64.tar.gz (extract-and-run tree).

Screenshots

Duplicates
Duplicates — find identical files by content hash
Changes
Changes — diff any two scans with time-range presets
Folders
Folders — drill into directories with size breakdowns
Settings
Settings — theme, scanning, monitoring, cleanup
Processes
Processes — memory treemap with real exe icons; right-click any rect for reveal / kill actions
CPU Heatmap
CPU Heatmap — scrolling waterfall where the right edge is NOW; sparklines call out recent CPU activity

Development

Requirements: Bun 1.3+, Rust (stable), Node.js 20+ (bundled with Electron).

# Clone and install
git clone https://github.com/tzarebczan/diskhound
cd diskhound
bun install

# Build the native Rust scanner
bun run build:native

# Start in development mode (hot-reload renderer + Electron)
bun run dev

Scripts

Command Description
bun run dev Dev server with hot-reload
bun run build Build renderer + Electron main process
bun run build:native Build the Rust native scanner (release)
bun run start Launch the built production app
bun run dist Build everything and create the installer
bun run test Run the Vitest test suite
bun run typecheck TypeScript type checking

Architecture

src/
├── main.ts              Electron main process, IPC handlers
├── preload.ts           Context bridge (IPC → renderer)
├── nativeScanner.ts     Spawn and manage the Rust binary
├── scan/scanWorker.ts   JS fallback scanner (worker thread)
├── shared/
│   ├── contracts.ts     All TypeScript types and IPC interface
│   ├── scanDiff.ts      Snapshot diff algorithm (top-N)
│   ├── scanIndex.ts     Full per-file index + real diff engine
│   ├── scanHistory.ts   File-backed scan history store
│   ├── duplicates.ts    Duplicate detection engine
│   ├── easyMoveStore.ts Easy Move persistence and rollback
│   ├── diskMonitor.ts   Background disk space monitoring
│   └── pathUtils.ts     Shared path normalization
└── renderer/
    ├── App.tsx          App shell, tabs, header
    ├── components/      All view components
    └── lib/             Shared utilities, hooks, treemap algorithm

native/diskhound-native-scanner/
└── src/main.rs          Rust scanner (Win32 APIs + jwalk)

How it works

The scanner writes two outputs for every completed scan:

  1. A JSON snapshot with top-N largest files, hottest directories, and aggregate totals.
  2. A gzipped NDJSON index containing every file's path, size, and mtime, plus directory mtime entries so the next scan can skip unchanged subtrees.

The diff engine uses the snapshot for the "biggest changes" overview, and the full index for "browse every change." Both are streamed and capped for memory safety. Aggregate totals (net bytes) are computed without loading the full index into memory.

Incremental monitoring has two tiers:

  1. USN journal (Windows) — after a full scan anchors a cursor, subsequent monitoring ticks read only the NTFS change journal since that cursor. Creates/modifies/deletes are applied to a working index and merged.
  2. Mtime-based smart rescan (cross-platform) — during a full walk, directories whose mtime matches the previous scan's baseline inherit their files from the baseline instead of being re-enumerated.

Easy Move uses platform-appropriate links: directory junctions on Windows (no admin), symlinks on macOS/Linux. Every move is journaled so it's fully reversible. Failed rollbacks are recorded for manual remediation.

Process sampling uses PowerShell Get-Process on Windows (fast, returns executable paths for icon resolution) with a fallback to basic tasklist if PowerShell is unavailable. macOS/Linux use ps and system reports.

Contributing

Issues and PRs welcome. Please run bun run typecheck && bun run test before opening a PR.

License

MIT © 2026 Thomas Zarebczan

About

A more modern disk space visualization and tracking application

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors