// STORAGESHOWER — DISK MATRIX HUD

storageshower v0.28.9 · ratatui + crossterm · 30 builtin themes · live disk I/O · SMART health · NFS latency · drill-down explorer · theme editor

13,635 Rust src lines · 49,922 integration test lines · 1,336 test files · 3,692 test functions · macOS + Linux

Report GitHub Issues
// Color scheme

>_JACK INTO YOUR FILESYSTEM

A neon-drenched terminal UI for monitoring disk usage. Live per-mount usage bars, threshold alerts with bell + border flash, recursive drill-down explorer, live disk I/O throughput (macOS IOKit + Linux /proc/diskstats), SMART health badges, NFS / SMB / SSHFS latency probes, 30 builtin cyberpunk palettes, a live theme editor with per-channel color picker, persistent TOML config. Built in Rust with ratatui + crossterm.

Install

# Homebrew (recommended)
brew tap MenkeTechnologies/menketech
brew install storageshower

# crates.io
cargo install storageshower

# from source
git clone https://github.com/MenkeTechnologies/storageshower
cd storageshower && cargo build --release
./target/release/storageshower

Runs on macOS and Linux. Rust ≥ 1.85 (2024 edition) to build from source. LTO + strip in release profile — lean single binary.

Quick tour

storageshower                            # default palette, all filesystems
storageshower --color purple -b ascii    # purple palette + ascii bars
storageshower -s pct -R                  # sort by usage%, descending
storageshower -l --no-virtual            # local physical disks only
storageshower -u gib -w 60 -C 85         # GiB units, warn 60%, crit 85%
storageshower --theme neonpink           # activate a custom theme from config
storageshower --list-colors              # preview every builtin palette
storageshower --export-theme --color blue # dump a builtin palette as TOML
storageshower --config /tmp/ss.conf      # use an alternate config file

CLI flags override config. Every --flag has a paired --no-flag inverse so either direction can be forced from the command line. Config lives at ~/.storageshower.conf (TOML). Note: --color has no short alias — -c is reserved for --config.

Subsystems

Render engine

Color-coded usage bars in four styles: gradient (████▓▓▒▒░░), solid, thin, ascii. Cycle with b. Optional border, headers, used/total columns, hover tooltips — each toggleable from the keyboard.

Telemetry core

Background thread refreshes every 3 s via Arc<Mutex<>>: load avg, memory, CPU count, process count, swap, uptime, kernel, arch, OS, local IP, battery, TTY. Rendered as title / footer segments with per-segment hover tooltips.

Alert subsystem

Threshold crossings (warn / crit) trigger terminal bell (\x07), 2-second pulsing red border flash, dark-red row highlight, and a status-bar message. Auto-clears when usage drops back below threshold. Default thresholds 70 % / 90 % — cycle in-app with t / z.

Drill-down explorer

Enter on any mount enters the directory explorer. Recursive size scan runs in a background worker; entries paint as they're computed with a progress bar + item count. Breadcrumb nav (Enter / Backspace / Esc), sort by size or name, gradient bars relative to the largest entry.

Live disk I/O

Per-mount read/write throughput overlaid on the usage bar (▲1.2M/s ▼500K/s). macOS: IOKit IOBlockStorageDriver byte counters via getmntinfo device map. Linux: /proc/diskstats sector counters via /proc/mounts.

SMART health

Per-device SMART probe cached per base device and mapped onto every mount that shares it. macOS via diskutil info SMART Status (Verified / Failing). Linux via /sys/block/*/device/state. Green healthy, red failing.

Network FS latency

Detects nfs, nfs4, cifs, smbfs, afp, ncp, fuse.sshfs, fuse.rclone, fuse.s3fs, 9p, afs. Timed read_dir probe with a 2 s timeout (no root required). Color-coded badge: green < 50 ms, warn 50–200 ms, red > 200 ms / timeout.

Theme system

30 builtin palettes plus user themes loaded from themes/*.toml. Live theme chooser popup (c) with mouse + scroll preview. Per-channel color editor (C) with h/l ±1 and H/L ±10 nudges. --export-theme dumps any builtin to TOML for hand-editing.

Filter mode

/ opens a case-insensitive substring filter with full readline-style editing: Ctrl+a/e, Ctrl+b/f, Ctrl+w/u/k, Backspace, Delete. 0 clears.

Mouse input

Left-click selects, double-click drills, column headers cycle sort, drag the column separator to resize, right-click pops a verbose per-row tooltip (capacity, rank, headroom, SMART, I/O). Scroll wheel walks the disk list, drill-down list, or theme chooser.

Persistent config

~/.storageshower.conf in TOML. Every CLI flag has a config-file equivalent. Custom palettes are merged from [custom_themes.<name>] blocks and selectable with active_theme or --theme NAME. Rewritten on save from the theme editor and theme chooser.

Bookmarks & export

B pins the selected disk to the top (persisted in the bookmarks config array). e/E exports the current disk matrix (mount, percent, used, total) to ~/.storageshower.export.txt. o/O opens the selected mount in the system file manager. y/Y copies the mount path to clipboard.

Builtin color palettes

30 hand-tuned cyberpunk palettes ship in storageshower. Cycle with c for the popup chooser (mouse + scroll), or pin one from the CLI with -c <name>. Use --list-colors to see all of them rendered.

defaultNeon Sprawl
greenAcid Rain
blueIce Breaker
purpleSynth Wave
amberRust Belt
cyanGhost Wire
redRed Sector
sakuraSakura Den
matrixData Stream
sunsetSolar Flare
neonnoirNeon Noir
chromeheartChrome Heart
bladerunnerBlade Runner
voidwalkerVoid Walker
toxicwasteToxic Waste
cyberfrostCyber Frost
plasmacorePlasma Core
steelnerveSteel Nerve
darksignalDark Signal
glitchpopGlitch Pop
holoshiftHolo Shift
nightcityNight City
deepnetDeep Net
lasergridLaser Grid
quantumfluxQuantum Flux
biohazardBio Hazard
darkwaveDarkwave
overlockOverlock
megacorpMegacorp
zaibatsuZaibatsu

Ten ready-to-copy custom-theme TOMLs also ship under themes/ as starting points: acid_rain, data_stream, ghost_wire, ice_breaker, neon_sprawl, red_sector, rust_belt, sakura_den, solar_flare, synth_wave. Each file is a single [custom_themes.<name>] block — paste one into your config and select it with active_theme or --theme <name>.

CLI flags

Sorting

FlagDescription
-s, --sort MODESort entries — name, pct, size
-R, --reverse / --no-reverseReverse sort order
-l, --local-only / --no-localShow only local disks (HDD / SSD)
--no-virtual / --virtualHide or show virtual filesystems (tmpfs, devfs, etc.)

Display

FlagDescription
-b, --bar-style STYLEgradient · solid · thin · ascii
--color PALETTEOne of the 30 builtin palettes (no short flag — -c is --config)
--theme NAMEActivate a custom theme (from config [custom_themes.NAME])
--list-colorsList every builtin palette with a preview
--export-themeExport the current palette as TOML (pair with -c or --theme)
-u, --units MODEhuman · gib · mib · bytes
-k, --compact / --no-compactCompact mount names
-f, --full-mount / --no-full-mountShow full mount paths
--bars / --no-barsShow or hide usage bars
--border / --no-borderShow or hide border chrome
--header / --no-headerShow or hide column headers
--used / --no-usedShow or hide used / total size
--tooltips / --no-tooltipsShow or hide hover tooltips (right-click still works)

Thresholds & columns

FlagDescription
-w, --warn PCTWarning threshold (default 70 %)
-C, --crit PCTCritical threshold (default 90 %)
--col-mount WIDTHMount column width (0 = auto)
--col-bar-end WIDTHBar-end column width (0 = auto)
--col-pct WIDTHPercentage column width (0 = auto)

System

FlagDescription
-r, --refresh SECSData refresh interval (default 1 s)
-c, --config PATHConfig file path (default ~/.storageshower.conf)
-h, --helpDisplay help transmission
-V, --versionDisplay version information

Keybindings

General

q QDisconnect (or close help overlay)
h H ?Toggle help HUD
p PPause / resume data stream
EscDeselect current disk

Navigation

j DownSelect next disk
k UpSelect previous disk
G EndJump to last disk
Home Ctrl+gJump to first disk
Ctrl+d / Ctrl+uHalf-page down / up

Sort & filter

n NSort by name (again to reverse)
u USort by usage %
s SSort by size
r RReverse sort
l LLocal disks only
a AShow all filesystems
/Enter filter mode
0Purge filter

Display toggles

bCycle bar style (gradient / solid / thin / ascii)
cTheme chooser popup
CTheme editor (per-channel color picker)
v VToggle usage bars
d DToggle used / size columns
gToggle column headers
x XToggle border chrome
m MCompact mount names
w WFull mount paths
i ICycle units (human / GiB / MiB / bytes)
f FCycle refresh rate (1 / 2 / 5 / 10 s)
t / zCycle warn / crit threshold
TToggle hover tooltips

Disk ops

EnterDrill down into selected mount
o OOpen in file manager
y YCopy mount path to clipboard
e EExport disk matrix to ~/.storageshower.export.txt
BToggle bookmark (pin to top, persisted)

Drill-down mode

j kNavigate entries
EnterDrill into selected directory
BackspaceGo up one level
EscReturn to disk list
s SSort by size (again to reverse)
n NSort by name (again to reverse)
r RReverse sort direction
o OOpen current directory in file manager
g GJump to first / last entry

Filter edit mode (after /)

EnterConfirm filter
EscCancel (restore previous filter)
Backspace Ctrl+hDelete char before cursor
DeleteDelete char at cursor
Ctrl+wDelete word backward
Ctrl+uClear line before cursor
Ctrl+kDelete to end of line
Ctrl+a HomeCursor to start
Ctrl+e EndCursor to end
Ctrl+b LeftCursor left
Ctrl+f RightCursor right

Theme editor (C)

j kSelect color channel
h lAdjust value ±1
H LAdjust value ±10
Enter sSave (prompts for a name)
Esc qCancel

Mouse input

ActionEffect
Left-click disk rowSelect disk
Left-click selected diskDrill down into mount
Left-click column headerCycle sort on that column
Left-click theme chooser rowSelect and preview theme
Left-click outside theme popupCancel and revert theme
Left-drag column separatorResize mount / pct / right columns
Right-click disk rowVerbose tooltip: capacity, rank, headroom, SMART, I/O
Right-click drill-down entryVerbose tooltip: size, rank, share bar, depth, sort
Hover title / footer segmentPer-segment tooltip (auto-hides after 3 s)
Scroll wheelWalk the disk list, drill-down list, or theme chooser

Config file

The config lives at ~/.storageshower.conf and is written from the default template (storageshower.default.conf) on first run if it does not yet exist. The theme editor and theme chooser save changes back to it on apply. Keys map directly to the serialized Prefs struct (TOML via serde); custom palettes are merged from [custom_themes.<name>] blocks and selected with active_theme or --theme NAME. Enum-valued keys are serialized in their TitleCase form. Example:

sort_mode     = "Pct"        # Name | Pct | Size
sort_rev      = true
show_local    = false        # only local disks (HDD/SSD)
show_all      = true         # include virtual filesystems
bar_style     = "Gradient"   # Gradient | Solid | Thin | Ascii
color_mode    = "Purple"     # one of the 30 builtin palettes
unit_mode     = "Human"      # Human | GiB | MiB | Bytes
thresh_warn   = 70           # cycle: 50 -> 60 -> 70 -> 80
thresh_crit   = 90           # cycle: 80 -> 85 -> 90 -> 95
refresh_rate  = 1            # seconds; cycle: 1 -> 2 -> 5 -> 10
show_bars     = true
show_border   = true
show_header   = true
show_used     = true
show_tooltips = true
compact       = false
full_mount    = false
col_mount_w   = 0            # 0 = auto
col_bar_end_w = 0            # 0 = auto
col_pct_w     = 0            # 0 = auto
active_theme  = "neonpink"
bookmarks     = []

[custom_themes.neonpink]
blue          = 199
green         = 46
purple        = 201
light_purple  = 213
royal         = 196
dark_purple   = 161

A custom theme is six 256-color terminal indices: blue, green, purple, light_purple, royal, dark_purple. Set active_theme (or pass --theme) to a [custom_themes.<name>] key to activate it. Bookmarked mounts persist in the bookmarks array and pin to the top of the list across runs.

Inverse --no-flag CLI variants force-override the corresponding config field in either direction — useful for one-off invocations that diverge from the saved baseline (e.g. --no-tooltips defeats show_tooltips = true without rewriting the file). The shipped storageshower.default.conf in the repo root documents every key inline with comments and a full flag/keybinding reference.

Platform notes

  • macOS — disk I/O via IOKit IOBlockStorageDriver byte counters, device-to-mount mapping via getmntinfo. SMART via diskutil info (parses the SMART Status: line). Battery via IOKit, local IP from getifaddrs.
  • Linux — disk I/O via /proc/diskstats (sector counters, scaled by sector size), mount mapping via /proc/mounts. SMART status read from /sys/block/<dev>/device/state. Battery from /sys/class/power_supply/, local IP via getifaddrs.
  • No root required for any feature. Network FS latency is a userspace read_dir probe with a 2 s timeout.

Worked examples

GoalCommand
Local physical disks, no virtual fsstorageshower -l --no-virtual
Sort by usage %, highest firststorageshower -s pct -R
Raw byte counts, ASCII barsstorageshower -u bytes -b ascii
Tighter alert thresholds in GiBstorageshower -u gib -w 60 -C 85
Minimal chrome (no border / header)storageshower --no-border --no-header
Slower refresh for a remote sessionstorageshower -r 5
Preview every builtin palettestorageshower --list-colors
Dump a palette to TOML for editingstorageshower --export-theme --color blue
Run with an alternate configstorageshower -c /tmp/ss.conf

Inverse forms (--virtual, --no-reverse, --no-local, --bars, --header, …) let a one-off invocation override a saved config field without rewriting the file.

Troubleshooting

  • No disk I/O numbers — throughput overlays (▲▼) appear only when a mount has measurable read/write delta between refresh ticks. An idle disk shows no overlay. On macOS the IOKit device map and on Linux /proc/diskstats must resolve the mount to a base device; loopback / overlay / pseudo devices may not map.
  • No SMART badge — SMART is probed per base device. Network, virtual, and removable mounts that don't expose SMART (or report an unknown state) render no health glyph rather than a false one.
  • Network mount latency badge missing — the probe times out after 2 s; an unreachable mount returns no badge instead of hanging the UI. Only the recognized network filesystem types are probed.
  • Blank mount rows — disk enumeration omits entries with an empty mount path, so the TUI never paints a blank row even when the OS reports an odd mount-table entry.
  • Config not loading — a malformed ~/.storageshower.conf falls back to defaults silently rather than erroring out. Enum keys must use TitleCase values (e.g. color_mode = "Purple", not "purple"); the on-CLI --color purple uses the kebab/lower form.
  • No root required — every probe (I/O, SMART, network latency) is a userspace read; storageshower never needs elevated privileges.

Source & links