Disks, mounts, fstab, btrfs and SMART, previewed before every change
v0.1.0storageMIT
The device tree: size, filesystem, usage and the SMART verdict of every disk
A terminal UI for the machine's storage. Five screens over one read: the block devices with their filesystems and usage bars, the mount table crossed against /etc/fstab, the btrfs filesystems in full, the SMART health of every drive, and what df says about free space.
The mounts screen is the one that earns its keep. It shows what is mounted now next to what fstab says will be mounted next boot, and marks every row where those disagree: a filesystem mounted by hand that will vanish on reboot, an fstab entry that failed to mount and nobody noticed, and options fstab asks for that are not in effect.
Changes are previewed. Mounting and unmounting an entry, starting or cancelling a btrfs scrub or balance, starting a drive self-test, and editing /etc/fstab — which is validated with findmnt --verify against the staged file BEFORE the dialog opens, shown as a unified diff, then installed and applied with systemctl daemon-reload — all carry the exact command line.
Run tui-disk --demo to drive a sample machine: an NVMe root on btrfs, a spinning disk with two reallocated sectors, a USB stick mounted by hand and one fstab mismatch. Nothing touches your system.
Keys
Key
Action
1…5 / tab
Switch between devices, mounts, btrfs, health and space
enter
Open the selected row in full
m / u
Mount or unmount the selected fstab entry
e
Edit the fstab entry for the selected row, with a diff to confirm
a
Add an fstab entry, picking the device by UUID
D
Reload the systemd units generated from fstab
c / C
Start or cancel a btrfs scrub
b / B
Start or cancel a btrfs balance, with a block group filter
s / S
Start a short or extended drive self-test
/
Filter the current screen across every column
R
Re-read the storage
?
Help
q
Quit
Press ? inside the tool for the full help screen, which is generated from the same action table as the key map.
Compatibility
This tool is a face on the program below, so its version matters.Tested is not a claim: a version lands there only after the tool's own suite passed against it on a real machine in the lab, and the run is kept as evidence in the repository. At startup the tool probes the backend once and says what it found in its header — a version nobody has run against is shown as(untested) in the warning colour, one older than the minimum as (below minimum) in the error colour. Neither stops it: the backend still refuses what it cannot do, in its own words.
util-linux
lsblk ≥ 2.34
Binary
lsblk
Minimum
2.34
Probed with
lsblk --version
Tested
2.39.32.41.52.42.2
Needs a version this new
mountpointssince 2.37
What changes on older versions
util-linux <2.37
lsblk has no MOUNTPOINTS column, so the single-valued MOUNTPOINT is asked for instead; a device mounted at several paths reports only the first one. lsblk fails the whole call on a column name it does not know, so this is a gate rather than a fallback
util-linux >=2.34
blkid reads /dev directly and answers an unprivileged caller with an empty body and exit 0, so the fstab editor's device picker escalates with sudo -n and falls back to the UUIDs lsblk already reported when it cannot
btrfs-progs
btrfs ≥ 5.10
Binary
btrfs
Minimum
5.10
Probed with
btrfs --version
Tested
6.6.36.19.17.1
Needs a version this new
json-outputsince 5.15
What changes on older versions
btrfs-progs >=5.10
--format json is supported per command, not globally: device stats and filesystem df emit JSON, while filesystem usage, subvolume list, scrub status and balance status refuse it through 6.19 at least, so those four are read from their text output
btrfs-progs >=5.10
subvolume list, qgroup show and balance status refuse an unprivileged caller with "Operation not permitted"; they are retried with sudo -n, and a machine that cannot escalate shows those sections empty with a note saying so
btrfs-progs <5.15
no --format json at all, so device stats is read from its text output too
smartmontools
smartctl ≥ 7.0
Binary
smartctl
Minimum
7.0
Probed with
smartctl --version
Tested
No recorded run yet. The tool still runs and reports the version it found as untested.
Needs a version this new
json-outputsince 7.0
What changes on older versions
smartmontools <7.0
smartctl --json does not exist, and the health of every drive is reported as unknown rather than scraped out of a table meant for human eyes
smartmontools >=7.0
reading SMART needs the raw device, so it escalates with sudo -n; a drive behind a USB bridge that passes no SMART through, and a virtual disk that has no firmware, both come back unknown with the reason smartctl gave
Install
Once per machine, then every tool in the family is one pacman away.
Add the repository
$ curl -fsSL https://pkgs.tui.tools/install.sh | sh
Or run the same thing yourself, one command at a time
A family whose whole promise is preview before you run is not going to insist you pipe a script into a shell. These are the commands that script runs.
Upgrades then arrive with the rest of your system updates.
!
Not published yet. The command is what it will be once the package repository at pkgs.tui.tools is live. Until then, use the static binary or build from source.
Arch Linux (AUR) · tui-disk-bincoming soon
$ paru -S tui-disk-bin
The -bin package installs the released static binary.
Once per machine, then every tool in the family is one apt away.
Add the repository
$ curl -fsSL https://pkgs.tui.tools/install.sh | sh
Or run the same thing yourself, one command at a time
A family whose whole promise is preview before you run is not going to insist you pipe a script into a shell. These are the commands that script runs.
Upgrades then arrive with the rest of your system updates.
!
Not published yet. The command is what it will be once the package repository at pkgs.tui.tools is live. Until then, use the static binary or build from source.
Needs the tui-tools repository, a one-time setup you do once per machine.
openSUSE · tui-diskcoming soon
$ sudo zypper install tui-disk
The rpm repository is shared with dnf; zypper support is not tested yet.
One static binary. Verify it against checksums.txt from the same release.
From source · tui-disk
$ git clone https://github.com/tui-tools/tui-disk
cd tui-disk && make build
sudo install -m0755 bin/tui-disk /usr/local/bin/tui-disk
Needs Go 1.27 or newer.
What it can do to your machine
✓
Preview, then confirm
Every change is shown as an exact command line and confirmed before it runs. The dialog and the runner receive the same value, so the preview cannot drift from what executes.
•
Escalates for actions
Most reads are unprivileged. Five are not and escalate with sudo -n, which never prompts: blkid, btrfs subvolume list, qgroup show, balance status and smartctl -a. Every change escalates the same way.
✓
No daemon, no state of its own
Nothing keeps running after you quit, and nothing is installed to run later. The system is the source of truth; the tool re-reads it after every change.
✓
No network access
The tool opens no network connection of its own. No telemetry, no update check, no phone home.
✓
Static binary
Released statically linked, with no runtime dependencies to install.
✕
Releases are not signed yet
Releases carry SHA-256 checksums but no signature. Verify the checksum, and read this as the open item it is.
Reporting
Report a security issue privately, through GitHub's private vulnerability reporting on the repository's Security tab. The family-wide policy, and what counts as in scope, is on the security page.
## Changelog
* 32f35b639edef85b8a39f13f82bc0a70bdf91fae Build tui-disk: disks, mounts, fstab, btrfs and SMART on one screen
* 53b08c5ec4331f3890a7636851c92509bcd33a63 Fit the manifest inside the family schema
* f4eab3e7cc3bbff4422b3b8607d71f464ff1884d Initial commit