A btop-style terminal app for running an Alpine (or LOSD) server over SSH
Find a file
2026-10-19 02:27:48 -04:00
src initial commit 2026-10-19 02:27:48 -04:00
.gitignore initial commit 2026-10-19 02:27:48 -04:00
Cargo.lock initial commit 2026-10-19 02:27:48 -04:00
Cargo.toml initial commit 2026-10-19 02:27:48 -04:00
README.md initial commit 2026-10-19 02:27:48 -04:00
rustfmt.toml initial commit 2026-10-19 02:27:48 -04:00

mans

A btop-style terminal app for running an Alpine (or LOSD) server over SSH: dashboard, services, processes, connections, firewall, updates, Docker, files and a shell, in one window.

Everything goes through your normal ssh/scp and key, over one shared connection. Nothing needs installing on the server beyond the usual Alpine tools.

Install (on your computer)

cargo install --path .
mans leserv@192.168.4.39   # or just `mans` to pick from ~/.ssh/config

Server setup (once)

  1. Log in with an SSH key (ssh-keygen -t ed25519, then ssh-copy-id you@server).

  2. Let mans run admin commands without a password prompt. As root, add these to the end of /etc/doas.d/doas.conf (doas uses the last matching line, so they must come after permit persist :wheel). Replace leserv with your username:

    permit nopass leserv as root cmd rc-service
    permit nopass leserv as root cmd rc-update
    permit nopass leserv as root cmd kill
    permit nopass leserv as root cmd ufw
    permit nopass leserv as root cmd fail2ban-client
    permit nopass leserv as root cmd reboot
    

    Check with doas -n ufw status. Without these, viewing works but those actions fail with "Authentication required".

  3. Optional:

    • Firewall tab: apk add ufw fail2ban
    • Docker tab: addgroup leserv docker, then log in again. This user can then do anything root can.

Logs, updates and edit-as-root open in a popup terminal where doas can ask for your password, so they need no rule.

Keys

Where Keys
Everywhere 1-9 / Alt+1-9 / F1-F9 switch tabs · / filter · g refresh · , settings · q / Alt+q quit
¹overview R reboot
²services s start · x stop · r restart · l logs · e start at boot · D don't start at boot
³procs k kill · K kill -9
⁴conns b block the remote IP
⁵firewall o open port · b block IP · x delete rule / unban
⁶updates f check for new · U install all
⁷docker s start · x stop · r restart · l logs
⁸files Enter open · Backspace up · d download to the current folder · u upload · e edit · E edit as root
⁹term / popups every key goes to the shell · Shift+PgUp/PgDn scroll back

Stop, kill, block, delete and unban ask y/n first (configurable). Reboot always asks.

Mouse: click a tab to switch, click a row to select it (click again to open, e.g. a folder), click a key hint in the bottom bar to run it, scroll the wheel through lists and terminal output. While the mouse is on, Shift+drag selects text in most terminals, or turn it off in settings.

Settings

Press , to change them, or edit ~/.config/mans/config:

refresh = 2           # seconds: 1, 2, 3, 5, 10
start_tab = overview
cpu_zoom = true       # zoom the cpu graph to recent usage
confirm = true        # ask before stop/kill/block
mouse = true          # off gives your terminal its normal text selection back
default_host =        # connect here when run with no argument

Limits

  • Graphs only cover the time mans has been open; nothing records history on the server.
  • If the SSH connection drops (for example after a reboot), restart mans.
  • Colors need a 24-bit color terminal.

AI Warning

This project was facilitated with Claude Code. If you have a problem with that, you can shove it up your ass, or if your a respectable human, open an issue.