██████╗████████╗ ██████╗ ██████╗ █████╗ ██████╗ ███████╗
██╔════╝╚══██╔══╝██╔═══██╗██╔══██╗██╔══██╗██╔════╝ ██╔════╝
╚█████╗ ██║ ██║ ██║██████╔╝███████║██║ ███╗█████╗
╚═══██╗ ██║ ██║ ██║██╔══██╗██╔══██║██║ ██║██╔══╝
██████╔╝ ██║ ╚██████╔╝██║ ██║██║ ██║╚██████╔╝███████╗
╚═════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚══════╝
███████╗██╗ ██╗ ██████╗ ██╗ ██╗███████╗██████╗
██╔════╝██║ ██║██╔═══██╗██║ ██║██╔════╝██╔══██╗
╚█████╗ ███████║██║ ██║██║ █╗ ██║█████╗ ██████╔╝
╚═══██╗██╔══██║██║ ██║██║███╗██║██╔══╝ ██╔══██╗
███████║██║ ██║╚██████╔╝╚███╔███╔╝███████╗██║ ██║
╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚══╝╚══╝ ╚══════╝╚═╝ ╚═╝
cargo install storageshower
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
█ >> INITIALIZING FEATURE MATRIX... █
█ >> STATUS: ALL SYSTEMS NOMINAL █
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
> FEATURE_DUMP.exe
[RENDER_ENGINE]
├── Live disk usage display ─── color-coded progress bars
│ ├── gradient ████▓▓▒▒░░
│ ├── solid █████████
│ ├── thin ▬▬▬▬▬▬▬▬▬
│ └── ascii #########
│
[TELEMETRY_CORE]
├── Real-time system stats ─── load avg / memory / CPU
│ ├── swap / process count / uptime
│ ├── network IP / battery / TTY
│ └── background thread @ 3s via Arc<Mutex<>>
│
[ALERT_SUBSYSTEM]
├── Threshold alerts
│ ├── ◈ NOMINAL ── all clear, choomba
│ ├── ⚠ WARNING ── approaching redline
│ └── ✖ CRITICAL ── flatlined
│
[INTERFACE_DECK]
├── Sort ─── name / usage% / size / asc / desc
├── Filter ─── case-insensitive substring match
├── Units ─── human / GiB / MiB / raw bytes
├── Themes ─── 30 builtin + custom user themes (TOML)
├── Theme chooser ─── live preview with mouse click + keyboard nav
├── Theme editor ─── live color picker with per-channel control
└── Persistent config ─── ~/.storageshower.conf (TOML)
│
[DRILL_DOWN]
├── Directory explorer ─── Enter on any mount to drill in
│ ├── recursive size calculation per directory
│ ├── background scanning via Arc<Mutex<>>
│ ├── breadcrumb navigation (Enter/Backspace/Esc)
│ ├── sort by size or name (s/n/r keys)
│ ├── progress bar with item count during scan
│ └── gradient size bars relative to largest entry
│
[NET_LATENCY]
├── Network filesystem latency ─── NFS/SMB/CIFS/SSHFS
│ ├── timed read_dir with 2s timeout (no root needed)
│ ├── color-coded badge: green(<50ms) / warn / red
│ └── detects: nfs, nfs4, cifs, smbfs, afp, sshfs, s3fs, 9p
│
[DISK_IO]
├── Live disk I/O throughput ─── per-mount read/write rates
│ ├── macOS: IOKit IOBlockStorageDriver byte counters
│ ├── Linux: /proc/diskstats sector counters
│ ├── auto device→mount mapping via getmntinfo / /proc/mounts
│ └── overlay on bar: ▲1.2M/s ▼500K/s (shown when active)
│
[ALERT_ENGINE]
├── Disk free space alerts ─── threshold crossing detection
│ ├── terminal bell (\x07) on newly crossed thresholds
│ ├── pulsing red border flash for 2 seconds
│ ├── dark red row highlight on alerting disks
│ ├── status bar message: ⚠ ALERT: /mount 90%
│ └── auto-clears when disk drops below threshold
│
[SMART_HEALTH]
├── SMART drive health status ─── per-device monitoring
│ ├── macOS: diskutil info SMART Status (Verified/Failing)
│ ├── Linux: /sys/block/*/device/state
│ ├── ✔ green for healthy, ✘ red for failing
│ └── cached per base device, mapped to all mounts
│
[PLATFORM_COMPAT]
├── macOS ── SUPPORTED
├── Linux ── SUPPORTED
└── auto-detects battery, memory, TTY, local IP
> RENDER_PREVIEW.dat
// DEFAULT_THEME
// GREEN_THEME
// HELP_OVERLAY
> REQUIRED_IMPLANTS.cfg
RUST_VERSION >= 1.85 [2024 edition]
TARGET_OS == macOS || Linux
IMPLANT |
PURPOSE |
ratatui 0.29 |
TUI rendering framework |
crossterm 0.28 |
Terminal events + manipulation |
sysinfo 0.32 |
Disk / memory / CPU / proc intel |
clap 4 |
CLI argument parsing |
dirs 5 |
Home directory detection |
serde 1 |
Config serialization |
toml 0.8 |
Config file format |
libc 0.2 |
Unix syscalls (time, TTY) |
> COMPILE_SEQUENCE.sh
cargo build --release
cargo run --release
./target/release/storageshower
> CLI_OPTIONS.exe
┌──────────────────────────────────────────────────┐
│ ◈◈◈ COMMAND LINE DECK ◈◈◈ │
└──────────────────────────────────────────────────┘
CLI flags override config file settings. Every --flag has a --no-flag inverse
to force-override in either direction.
// SORTING
FLAG |
DESCRIPTION |
-s, --sort MODE |
Sort disk entries — name, pct, size |
-R, --reverse / --no-reverse |
Reverse sort order |
-l, --local-only / --no-local |
Show only local disks (HDD/SSD) |
--no-virtual / --virtual |
Hide/show virtual filesystems (tmpfs, devfs, etc.) |
// DISPLAY
FLAG |
DESCRIPTION |
-b, --bar-style STYLE |
Bar visualization — gradient, solid, thin, ascii |
-c, --color PALETTE |
Color palette — 30 builtins: default, green, blue, purple, amber, cyan, red, sakura, matrix, sunset, neonnoir, chromeheart, bladerunner, voidwalker, toxicwaste, cyberfrost, plasmacore, steelnerve, darksignal, glitchpop, holoshift, nightcity, deepnet, lasergrid, quantumflux, biohazard, darkwave, overlock, megacorp, zaibatsu |
--theme NAME |
Activate a custom theme by name (defined in config) |
--list-colors |
List all builtin color schemes with preview |
--export-theme |
Export current palette as TOML (combine with -c or --theme) |
-u, --units MODE |
Unit display — human, gib, mib, bytes |
-k, --compact / --no-compact |
Compact mount names |
-f, --full-mount / --no-full-mount |
Show full mount paths |
--bars / --no-bars |
Show/hide usage bars |
--border / --no-border |
Show/hide border chrome |
--header / --no-header |
Show/hide column headers |
--used / --no-used |
Show/hide used/total size display |
--tooltips / --no-tooltips |
Show/hide hover tooltips (right-click still works) |
// THRESHOLDS
FLAG |
DESCRIPTION |
-w, --warn PCT |
Warning threshold (default: 70%) |
-C, --crit PCT |
Critical threshold (default: 90%) |
// COLUMNS
FLAG |
DESCRIPTION |
--col-mount WIDTH |
Mount column width (0 = auto) |
--col-bar-end WIDTH |
Bar-end column width (0 = auto) |
--col-pct WIDTH |
Percentage column width (0 = auto) |
// SYSTEM
FLAG |
DESCRIPTION |
-r, --refresh SECS |
Data refresh interval (default: 1s) |
--config PATH |
Config file path (default: ~/.storageshower.conf) |
-h, --help |
Display help transmission |
-V, --version |
Display version information |
// EXAMPLES
storageshower -c purple -b ascii storageshower -s pct -R storageshower -l --no-virtual storageshower -u gib -w 60 -C 85 storageshower --theme neonpink storageshower --list-colors storageshower --export-theme -c blue storageshower --config /tmp/ss.conf
> KEYBIND_MATRIX.dat
┌──────────────────────────────────────────────────┐
│ ◈◈◈ COMMAND INTERFACE ◈◈◈ │
└──────────────────────────────────────────────────┘
// GENERAL_OPS
KEY |
ACTION |
q Q |
Disconnect (or close help overlay) |
h H ? |
Toggle help HUD |
p P |
Pause / resume data stream |
Esc |
Deselect current disk |
// NAVIGATION
KEY |
ACTION |
j Down |
Select next disk |
k Up |
Select previous disk |
G End |
Jump to last disk |
Home Ctrl+g |
Jump to first disk |
Ctrl+d |
Half-page down |
Ctrl+u |
Half-page up |
// SORT_PROTOCOL
KEY |
ACTION |
n N |
Sort by mount name (again to reverse) |
u U |
Sort by usage % (again to reverse) |
s S |
Sort by size (again to reverse) |
r R |
Reverse sort vector |
// DISPLAY_MODS
KEY |
ACTION |
b |
Cycle bar style — gradient / solid / thin / ascii |
c |
Theme chooser popup — live preview, mouse click, scroll |
C |
Theme editor — live per-channel color picker |
v V |
Toggle usage bars |
d D |
Toggle used/size columns |
g |
Toggle column headers |
x X |
Toggle border chrome |
m M |
Compact mount names |
w W |
Full mount paths |
i I |
Cycle units — human / GiB / MiB / bytes |
f F |
Cycle refresh rate — 1s / 2s / 5s / 10s |
t |
Cycle warn threshold — 50 / 60 / 70 / 80% |
T |
Toggle hover tooltips (right-click still works) |
z Z |
Cycle crit threshold — 80 / 85 / 90 / 95% |
// FILTER_OPS
KEY |
ACTION |
l L |
Local disks only |
a A |
Show all filesystems (incl. virtual) |
/ |
Enter filter mode |
0 |
Purge filter |
// FILTER_EDIT_MODE
KEY |
ACTION |
Enter |
Confirm filter |
Esc |
Cancel filter |
Backspace Ctrl+h |
Delete char before cursor |
Delete |
Delete char at cursor |
Ctrl+w |
Delete word backward |
Ctrl+u |
Clear line before cursor |
Ctrl+k |
Delete to end of line |
Ctrl+a Home |
Cursor to start |
Ctrl+e End |
Cursor to end |
Ctrl+b Left |
Cursor left |
Ctrl+f Right |
Cursor right |
// DISK_OPS
KEY |
ACTION |
Enter |
Drill down into selected mount |
o O |
Open selected mount in file manager |
y Y |
Copy mount path to clipboard |
e E |
Export disk matrix to file |
B |
Toggle bookmark (pin to top) |
// DRILL_DOWN_MODE
KEY |
ACTION |
j k |
Navigate entries |
Enter |
Drill into selected directory |
Backspace |
Go up one level |
Esc |
Return to disk list |
s S |
Sort by size (again to reverse) |
n N |
Sort by name (again to reverse) |
r R |
Reverse sort direction |
o O |
Open current directory in file manager |
g G |
Jump to first / last entry |
// THEME_EDITOR (C)
KEY |
ACTION |
j k |
Select color channel |
h l |
Adjust value ±1 |
H L |
Adjust value ±10 |
Enter s |
Save (prompts for name) |
Esc q |
Cancel |
// MOUSE_INPUT
ACTION |
EFFECT |
Left-click disk row |
Select disk |
Left-click selected disk |
Drill down into mount |
Left-click column header |
Cycle sort on that column |
Left-click theme chooser row |
Select and preview theme |
Left-click outside theme popup |
Cancel and revert theme |
Left-drag column separator |
Resize mount / pct / right columns |
Right-click disk row |
Verbose tooltip: capacity, rank, headroom, SMART, I/O |
Right-click drill-down entry |
Verbose tooltip: size, rank, share bar, depth, sort |
Hover title segment |
Per-segment tooltip: node, date, load, mem, cpu, etc. (auto-hides after 3s) |
Hover footer segment |
Per-segment tooltip: sort, theme, units, uptime, etc. (auto-hides after 3s) |
Scroll wheel |
Select next/prev disk (or drill-down / theme entry) |
> BENCHMARK_TELEMETRY.dat
┌──────────────────────────────────────────────────┐
│ ◈◈◈ PERFORMANCE MATRIX ◈◈◈ │
└──────────────────────────────────────────────────┘
Measured with Criterion.rs on Apple Silicon (M-series).
// CORE_FORMATTING
BENCHMARK |
TIME |
format_bytes (Human, 1 GiB) |
~67 ns |
format_bytes (GiB, 1 GiB) |
~69 ns |
format_bytes (Bytes, zero) |
~20 ns |
format_uptime (45m) |
~21 ns |
format_uptime (2d14h) |
~39 ns |
truncate_mount (w=8) |
~27 ns |
truncate_mount (w=32) |
~97 ns |
// LAYOUT_ENGINE
BENCHMARK |
TIME |
mount_col_width |
~590 ps |
right_col_width_static |
~540 ps |
// COLOR_PIPELINE
BENCHMARK |
TIME |
palette |
~2.4 ns |
gradient_color_at |
~0.7–1.1 ns |
// TIME_OPS
BENCHMARK |
TIME |
epoch_to_local |
~300 ns |
chrono_now |
~427 ns |
// DATA_COLLECTION
BENCHMARK |
TIME |
collect_disk_entries |
~3.2 µs |
collect_sys_stats |
~3.8 µs |
// CONFIG_SERDE
BENCHMARK |
TIME |
prefs serialize (TOML) |
~4.6 µs |
prefs deserialize (TOML) |
~5.3 µs |
// SORT_DISKS
BENCHMARK |
10 |
50 |
200 |
by_name |
270 ns |
1.7 µs |
7.9 µs |
by_pct |
242 ns |
1.2 µs |
4.3 µs |
by_size |
250 ns |
1.2 µs |
4.2 µs |
// FILTER_DISKS
BENCHMARK |
10 |
50 |
200 |
substring_match |
291 ns |
1.6 µs |
5.9 µs |
no_match |
151 ns |
746 ns |
3.0 µs |
// RENDER_PIPELINE
BENCHMARK |
TIME |
format_all_disks (10) |
~1.5 µs |
format_all_disks (50) |
~4.4 µs |
format_all_disks (200) |
~15.7 µs |
cargo test
cargo bench
// CI_PIPELINE
GitHub Actions runs on every push and pull request to main, on merge queue batches (when enabled), and can be run manually via Actions → CI → Run workflow (workflow_dispatch).
| Job |
What it runs |
| Check |
cargo check --locked --all-targets on Ubuntu and macOS |
| Test |
cargo test --locked --lib, then --tests (one integration binary per tests/*.rs), then --doc on Ubuntu and macOS |
| Format |
cargo fmt --all --check on Ubuntu |
| Clippy |
cargo clippy --locked --all-targets -- -D warnings on Ubuntu |
The --locked flag fails the job if Cargo.lock is out of sync with Cargo.toml, so CI always resolves the same dependency graph as a fresh clone with a committed lockfile. The lockfile is checked into this repository; if your machine’s global gitignore ignores Cargo.lock, run git add -f Cargo.lock after changing dependencies so updates are not missed.
Concurrent runs for the same branch are cancelled when a newer commit is pushed (concurrency.cancel-in-progress). The workflow uses least-privilege contents: read permissions.
Matrix jobs (Check, Test) use fail-fast: false so a failure on one OS still runs the other. Each job has a wall-clock timeout (30 minutes for build/test/clippy, 10 minutes for format) so hung runners cannot burn minutes indefinitely.
The Test job sets RUST_BACKTRACE=1 so panics print a full stack trace in the Actions log (useful when a test fails only on one OS).
All jobs inherit CARGO_NET_RETRY=2 so Cargo retries failed network fetches (crates.io / git dependencies) when the network or registry is slow.
Disk enumeration (collect_disk_entries) omits rows with an empty mount path so the TUI never shows blank mounts (this also avoids flaky tests on macOS CI when the OS reports odd mount table entries).
To match CI locally before pushing:
cargo fmt --all --check && cargo clippy --locked --all-targets -- -D warnings && cargo test --locked --lib && cargo test --locked --tests && cargo test --locked --doc
To run all tests (library + integration + doc) in one command: cargo test --locked.
> CONFIG_PERSISTENCE.log
┌──────────────────────────────────────────────────────┐
│ ALL PREFS AUTO-SAVED TO ~/.storageshower.conf │
│ FORMAT: TOML ── RESTORED ON BOOT ── ZERO EDIT │
│ │
│ >> sort mode >> sort direction >> show all │
│ >> refresh rate >> bar style >> color mode │
│ >> warn/crit >> bar visibility >> border │
│ >> col headers >> compact mode >> mount paths │
│ >> show used >> show local >> custom widths │
│ >> mount col w >> right col w >> pct col w │
│ >> custom themes (HashMap) >> active theme │
│ >> bookmarks (Vec<String>) │
└──────────────────────────────────────────────────────┘
> CUSTOM_THEMES.cfg
┌──────────────────────────────────────────────────┐
│ ◈◈◈ THEME SYSTEM ◈◈◈ │
└──────────────────────────────────────────────────┘
30 builtin palettes including: Neon Sprawl · Acid Rain · Ice Breaker · Synth Wave · Rust Belt · Ghost Wire · Red Sector · Sakura Den · Data Stream · Solar Flare · Neon Noir · Chrome Heart · Blade Runner · Void Walker · Toxic Waste · Cyber Frost · Plasma Core · Steel Nerve · Dark Signal · Glitch Pop + 10 more
Create your own by adding to ~/.storageshower.conf:
[custom_themes.neonpink]
blue = 199
green = 46
purple = 201
light_purple = 213
royal = 196
dark_purple = 161
active_theme = "neonpink"
Or use the in-app theme editor (C key) to tweak colors live and save.
See themes/ for all builtin palettes as ready-to-copy TOML files.