A terminal UI (TUI) for ip, nft and wg on Linux: the read-only cockpit for a Linux router.
v0.3.2betanetworkMIT
The cockpit: one card per area of the router, refreshed in place
The read-only cockpit for a Linux router. One screen, one card per area — interfaces and their WAN/LAN roles, the firewall's posture, live traffic per interface, the DHCP server and its leases, the WireGuard peers — read from cheap system probes and refreshed in place.
It changes nothing itself. Press ENTER on a card and tui-router suspends, hands the terminal to the tool that manages that area — tui-firewall, tui-network, tui-traffic, tui-vpn — and resumes when you leave it, the same handoff the family launcher uses. The overview is here; the change happens in the tool the card opens, behind that tool's own preview and confirm.
It also carries what no per-area tool can: tui-router export writes one integrity-checked .tuiback artifact with the router's identity — the WAN/LAN roles, the networkd units, the forwarding and resolver drop-ins, DHCP/DNS, the WireGuard configs with their keys stripped, the saved firewall ruleset and the account names. tui-router restore puts it back behind a diff, a preview of every reload command, a typed confirmation and an atomic apply that rolls back unless you confirm you still have access (--keep skips that window for scripted restores).
Keys
Key
Action
↑/↓
Select a card
enter
Open the tool that manages the selected card
w
Roles wizard: assign the WAN/LAN roles (router profile)
b
Backup: export an artifact, or restore one (typed confirm)
B
Reboot the router (typed confirm)
P
Power the router off (typed confirm)
r / ctrl+r
Read the router again now
?
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.
iproute2
ip ≥ 5.0
Binary
ip
Minimum
5.0
Probed with
ip -V
Tested
No recorded run yet. The tool still runs and reports the version it found as untested.
Needs a version this new
json-outputsince 4.13
What changes on older versions
iproute2 <4.13
ip -j (JSON output) is missing, so the interface and route cards cannot be read from this version
nftables
nft ≥ 0.9
Binary
nft
Minimum
0.9
Probed with
nft -v
Tested
No recorded run yet. The tool still runs and reports the version it found as untested.
wireguard-tools
wg ≥ 1.0
Binary
wg
Minimum
1.0
Probed with
wg --version
Tested
No recorded run yet. The tool still runs and reports the version it found as untested.
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.
Available once tui-router's first release lands in pkgs.tui.tools.
!
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.
$ git clone https://github.com/tui-tools/tui-router
cd tui-router && make demo
Or run it against a sample router with `tui-router --demo`, which needs nothing installed.
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
The cards only read; the reads that need root (the nftables ruleset, ufw status, the WireGuard dump) escalate with sudo -n, which never prompts. The four mutations — roles wizard, reboot, poweroff, restore — escalate the same way, each behind its literal command and a confirmation.
✓
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.
✓
Signed release, with provenance
checksums.txt carries a keyless cosign signature from this repository's release workflow, every archive has a CycloneDX SBOM, and every archive, package and the checksum file carry SLSA build provenance. The security page shows the three commands that check it.
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.
## tui-router v0.3.2
DHCP card reads systemd-networkd's own server, and the wizard states its own verdict
Built by this repository's CI on the tag itself. Each archive ships a
CycloneDX SBOM, `checksums.txt` carries a keyless cosign signature, and
every file has SLSA build provenance — see the README's "Verify a
download" for the two commands that check them.
The commits in this release:
## Changelog
* 8f35ac18d8dbd18335d16a69eb0e704323911f0d DHCP card: read systemd-networkd's own server (#8)
## tui-router v0.3.1
Roles wizard: cancel the revert without reporting a false failure.
Also: tui-kit v0.3.0 — dialogs wrap and scroll instead of clipping the
command preview, and the picker filters as you type.
Built by this repository's CI on the tag itself. Each archive ships a
CycloneDX SBOM, `checksums.txt` carries a keyless cosign signature, and
every file has SLSA build provenance — see the README's "Verify a
download" for the two commands that check them.
The commits in this release:
## Changelog
* c0ecf66571db67f267345cf7383e974481bd58c1 Bump tui-kit to v0.3.0 (#7)
* b9cc8ab53514aad503b520c6bccaa3c5461cbad4 Roles wizard: cancel the revert without a false failure (#6)
## tui-router v0.3.0
Manage, not view (wave 2): apply what it diagnoses, author what it manages; lab-validated.
Built by this repository's CI on the tag itself. Each archive ships a
CycloneDX SBOM, `checksums.txt` carries a keyless cosign signature, and
every file has SLSA build provenance — see the README's "Verify a
download" for the two commands that check them.
The commits in this release:
## Changelog
* 9c4f5a04e0f11d0666e42c1ad3a8ddaa341964e2 Single-artifact backup/restore (item 15, complete) (#3)
* 691d94562e551636878bee8e5ba4c58a34b3aacc tool.json: released (#5)
## tui-router v0.2.0
Manage, not view: create and edit from the TUI (wave 1), lab-validated on the router image.
Built by this repository's CI on the tag itself. Each archive ships a
CycloneDX SBOM, `checksums.txt` carries a keyless cosign signature, and
every file has SLSA build provenance — see the README's "Verify a
download" for the two commands that check them.
The commits in this release:
## Changelog
* 0fe4b2d86b92763a7f068d0b04d05d677e2c6a50 Roles wizard, updates card, reboot — the cockpit learns to manage (#4)
## tui-router v0.1.0
First validated release: the router-1.0 lab ran this tool against real VMs (tui-lab router topology).
Built by this repository's CI on the tag itself. Each archive ships a
CycloneDX SBOM, `checksums.txt` carries a keyless cosign signature, and
every file has SLSA build provenance — see the README's "Verify a
download" for the two commands that check them.
The commits in this release:
## Changelog
* 2aa8ab1295eaca0915c657c2f8599e4f74bf38e5 Bump anchore/sbom-action/download-syft (#1)
* 79dfff77175a8c5909dcdc00ce87036e1536a7af Initial commit
* 23a230435e1388b2d9a8755bf51a672d3065e067 tui-router phase 1: the read-only router cockpit (#2)