"Where mass accumulates, attention should follow."
File system explorer and analyzer with an interactive TUI, built in Rust.
- Interactive TUI - Beautiful terminal interface with vim-style navigation
- Miller Columns Layout - Ranger-style three-pane view (toggle with
v) - File Operations - Copy, move, rename, create, delete with undo support
- Parallel Scanning - Fast directory traversal using
jwalk - Duplicate Detection - Find duplicate files using BLAKE3 hashing with partial-hash optimization
- Age Analysis - Identify stale directories and analyze file age distribution
- Drill-Down Navigation - Explore directories without rescanning
- Conflict Resolution - Interactive handling for file conflicts during copy/move
- Command Palette - Vim-style
:commands for power users - Multiple Themes - Dark and light theme support
- Library-First Design - Use as a library or standalone tool
- Export Support - Export scan results to JSON
cargo install gravityfilegit clone https://github.com/epistates/gravityfile
cd gravityfile
cargo install --path .This installs two binaries: gravityfile and grav (short alias).
gravityfile [PATH]
# or use the short alias:
grav [PATH]Launch the interactive terminal interface to explore disk usage.
gravityfile scan [PATH] [-d DEPTH] [-n TOP]Quick summary of disk usage with tree output.
gravityfile duplicates [PATH] [--min-size SIZE] [-n TOP]Find duplicate files. Uses a three-phase algorithm:
- Group files by size
- Compute partial hash (first + last 4KB)
- Full BLAKE3 hash for candidates
gravityfile age [PATH] [--stale DURATION]Analyze file ages and find stale directories.
gravityfile export [PATH] [-o OUTPUT]Export scan results to JSON.
| Key | Action |
|---|---|
j / ↓ |
Move down |
k / ↑ |
Move up |
h / ← |
Collapse directory |
l / → |
Expand directory |
g / Home |
Jump to top |
G / End |
Jump to bottom |
Ctrl-u / PgUp |
Page up |
Ctrl-d / PgDn |
Page down |
Enter |
Drill into directory |
Backspace / - |
Navigate back |
o |
Toggle expand node |
Ctrl-g |
Go to path |
| Key | Action |
|---|---|
Space |
Mark item for multi-select |
y |
Yank (copy) to clipboard |
x |
Cut to clipboard |
p |
Paste from clipboard |
Esc |
Clear clipboard / marks |
| Key | Action |
|---|---|
d / D / Del |
Delete item(s) |
r |
Rename |
a |
Create file (touch) |
A |
Create directory (mkdir) |
T |
Take (mkdir + cd into new directory) |
Ctrl-z |
Undo last operation |
| Key | Action |
|---|---|
Tab / Shift-Tab |
Switch view tab (Usage, Duplicates, Age) |
v |
Toggle Tree / Miller layout |
i |
Toggle details panel |
P |
Cycle preview mode |
t |
Toggle theme (dark/light) |
, |
Open settings |
R |
Rescan current directory |
| Key | Action |
|---|---|
/ |
Search |
s |
Sort |
S |
Reverse sort |
| Key | Action |
|---|---|
Ctrl-t |
New directory tab |
Ctrl-w |
Close current tab |
] / [ |
Next / previous tab |
1-9 |
Switch to tab by number |
| Key | Action |
|---|---|
: |
Open command palette |
? |
Show help |
q |
Quit |
Ctrl-c |
Force quit |
| Command | Action |
|---|---|
:q :quit |
Quit |
:cd <path> |
Change directory |
:touch <name> |
Create file |
:mkdir <name> |
Create directory |
:take <name> |
Create dir and cd into it |
:yank :y |
Copy to clipboard |
:cut :x |
Cut to clipboard |
:paste :p |
Paste from clipboard |
:delete :rm |
Delete marked items |
:rename <name> |
Rename current item |
:clear |
Clear all marks |
:theme dark|light |
Set theme |
:layout tree|miller |
Set layout |
:help |
Show help |
gravityfile is designed as a composable library:
use gravityfile_scan::{JwalkScanner, ScanConfig};
use gravityfile_analyze::{DuplicateFinder, DuplicateConfig};
// Scan a directory
let config = ScanConfig::new("/path/to/analyze");
let scanner = JwalkScanner::new();
let tree = scanner.scan(&config)?;
// Find duplicates
let dup_config = DuplicateConfig::builder()
.min_size(1024u64)
.build()?;
let finder = DuplicateFinder::with_config(dup_config);
let report = finder.find_duplicates(&tree);
println!("Found {} duplicate groups", report.group_count);
println!("Wasted space: {} bytes", report.total_wasted_space);gravityfile- Main binary and CLIgravityfile-core- Core types (FileNode, FileTree, etc.)gravityfile-scan- File system scanning enginegravityfile-analyze- Analysis algorithms (duplicates, age)gravityfile-ops- File operations engine (copy, move, rename, delete)gravityfile-tui- Terminal user interface
- Parallel directory traversal via
jwalk - Memory-mapped I/O for large file hashing
- Partial hash optimization reduces disk reads for duplicate detection
- Event-driven TUI rendering minimizes CPU usage
Licensed under either of:
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Contributions welcome! Please feel free to submit a Pull Request.
