tui-tools

tui-disk

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
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

KeyAction
1…5 / tabSwitch between devices, mounts, btrfs, health and space
enterOpen the selected row in full
m / uMount or unmount the selected fstab entry
eEdit the fstab entry for the selected row, with a diff to confirm
aAdd an fstab entry, picking the device by UUID
DReload the systemd units generated from fstab
c / CStart or cancel a btrfs scrub
b / BStart or cancel a btrfs balance, with a block group filter
s / SStart a short or extended drive self-test
/Filter the current screen across every column
RRe-read the storage
?Help
qQuit

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.

The one-time setup, by hand
$ curl -fsSL -o /tmp/tui-tools.asc https://pkgs.tui.tools/pubkey.asc
  sudo pacman-key --add /tmp/tui-tools.asc
  sudo pacman-key --lsign-key \
    "$(gpg --show-keys --with-colons /tmp/tui-tools.asc | awk -F: '/^fpr:/{print $10; exit}')"
  printf '[tui-tools]\nServer = https://pkgs.tui.tools/arch/$arch\n' \
    | sudo tee -a /etc/pacman.conf
  sudo pacman -Sy
Arch Linux · tui-disk
$ sudo pacman -S tui-disk

Upgrades then arrive with the rest of your system updates.

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.

Downloads

v0.1.0 · 2026-08-30
FileSizeSHA-256
checksums.txt200 B
tui-disk_0.1.0_linux_amd64.tar.gz1.9 MB06eb96f0e0719b5760cb3ca5728db3b355752046e91e60a45b88f958f2124076
tui-disk_0.1.0_linux_arm64.tar.gz1.7 MB2b700a38b2c5063f1aa4b48aeac0dae7e5702d1cb1fb6ec76434422cfe32a1c1

Every release ships a checksums.txt. Download it next to the archive and run sha256sum -c checksums.txt --ignore-missing. See verifying a download.

Releases

v0.1.0

2026-08-30
## 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