tui-tools

tui-snapper

btrfs snapshots, managed by snapper, from the terminal

v0.1.1snapshotsMIT
The snapshot history: pre/post pairs, timeline snapshots and the pinned ones, newest first
The snapshot history: pre/post pairs, timeline snapshots and the pinned ones, newest first

A terminal UI for the btrfs snapshots snapper manages. It lists every config and its history — pre/post pairs from package upgrades next to the hourly timeline snapshots — compares any two of them, and shows what changed file by file, with a read-only diff for anything you want to look at closely.

It creates, deletes, relabels and cleans up snapshots too, and puts individual files back with undochange without touching the rest of the filesystem. Every one of those is shown as the exact snapper command line and confirmed before it runs; starting the tool only reads.

Rollback is the one thing that genuinely differs between machines, so it is detected rather than assumed: where snapper rollback is the mechanism it is offered with a full warning, and on an Omarchy or limine-snapper-sync layout the boot menu entries are read from /boot/limine.conf and shown read-only, because that is where the rollback really happens.

--demo runs the whole UI against a sample history, so you can try it without a btrfs filesystem to risk.

Keys

KeyAction
d / enterCompare two snapshots; a post snapshot pairs with its own pre
spaceMark a snapshot: two marks are a range, many are one delete
cCreate a snapshot: description, type and cleanup algorithm
DDelete the selected snapshot, or every marked one
e / aChange a snapshot's description / cleanup algorithm
CRun a cleanup: number, timeline or empty-pre-post
uIn the diff: put the selected files back with undochange
RRollback, or how this machine actually rolls back
s / TSwitch config / snapper's timers, read-only
/Filter the list
? / qHelp / 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.

snapper

snapper ≥ 0.8.6
Binary
snapper
Minimum
0.8.6
Probed with
snapper --version
Tested
0.10.60.13.00.13.1

Needs a version this new

  • undochange-root-pathssince 0.10.6

What changes on older versions

  • snapper <0.8.6

    snapper has no --jsonout, and both the config list and the snapshot list are read as JSON, so nothing can be listed at all

  • snapper <0.10.6

    snapper undochange cannot recreate a path that sits directly under the subvolume root, so putting back a deleted top-level file or directory fails with "failed to create"

  • snapper <0.10.7

    snapper diff is broken for LVM-based configs, so the file view comes back empty there even when the compare screen lists the change

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-snapper
$ sudo pacman -S tui-snapper

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

    Reads too, not only writes: snapper opens its subvolumes directly, so even listing snapshots needs root. Run with sudo, or leave sudo = "sudo -n" configured. create, delete, modify, cleanup, undochange and rollback change things, and each is confirmed first. --demo escalates nothing.

  • 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.1 · 2026-08-30
FileSizeSHA-256
checksums.txt800 B
tui-snapper-0.1.1-1-aarch64.pkg.tar.zst1.7 MB19db38a185cd35422d59bb044100d58aa86e4dff9ab4da53f7daf072a462bf76
tui-snapper-0.1.1-1-x86_64.pkg.tar.zst1.8 MBc5068b2b55ec7b129e2c5cc770791ed5f362c56cd470099f572ed6fdc301aa1e
tui-snapper-0.1.1-1.aarch64.rpm1.7 MB9032e8aab045b2abd5681ec088665722560d97d3865c6c8a026965682d38216e
tui-snapper-0.1.1-1.x86_64.rpm1.8 MB7b86880c6e94c9693790d6506362bf4b782b73ff98c388c6a9259b75dd2d4e08
tui-snapper_0.1.1_amd64.deb1.8 MB985152e7a779fb4427a1841050597283004c4822220e09602ae05c3f78daa71f
tui-snapper_0.1.1_arm64.deb1.7 MB7b74a2525171a427704c323c4cfbacd819b46097db721c1de7e8991fa856b2cd
tui-snapper_0.1.1_linux_amd64.tar.gz1.8 MBc67f1468bbf5057241c453018723675905b248788d88760e49220dfc0e9dc65e
tui-snapper_0.1.1_linux_arm64.tar.gz1.7 MB48d85edfd5ad17253126be7037e84560309dd031a8e22ae9f8476e164051ebdd

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

2026-08-30
## Changelog
* 0e8d3a873253c297e174a7c76f0f733af37f0a1a Bump the github-actions group with 5 updates (#1)
* cce03797b03ded206265b06a3b333aa5a3849e40 Hold this tool to the family's lint bar
* 60c6d09fa8666890df4be66f0dede0efe1f29e0b Join the lab, and fix what the real Omarchy machine showed
* 36fb218dcde5cc0ac7853043c80fef778b927638 Packages are available from pkgs.tui.tools
* 5669e30bd8fc9e259cb1b4b41ac37212eb768887 Point the install line at v0.1.0
* f8296f32ddeebd30eb1c4949809b05ebed4319d2 Re-pin the kit at v0.1.3 and put the help screen back under the width test
* 5a84f3c11d87b62feb8b9531039634907031214d Re-pin the kit at v0.2.3
* 80794b77cace82177b986d9a14c338049603fba7 Ship the tool as a .deb, an .rpm and a pacman package
* ad670b41277a46c1d82f6441d04e0f6c9266abb0 Tell the user which snapper they are running
* 9f66d07254381b1ddc35ae7bd463206d46eda2c2 Use a neutral home directory in the path-with-spaces fixture

v0.1.0

2026-08-30
## Changelog
* 3927add228d0434cde0cdb80c0188900841ef102 Add --no-dbus, for a machine with no running snapperd
* 492a639daa4ee7656f42c78e22802408d761e8c2 Initial commit
* 1ca855042732942359cb2af5e5c7d87699d35a95 Replace the template with tui-snapper