A terminal dashboard for the handful of machines in your home: your Arch (or other Linux) desktop and laptop, and optionally a Windows box. Everything goes over plain SSH. No agent to install on the other machines, no open ports and no background services.
- Overview: CPU (with temperature), GPU busy and temperature, memory, every drive, network rate, uptime, battery, last full upgrade, CPU history, the status of the whole fleet, and an SSH link speed test.
- Screen Time (Overview, Arch machines): today's total, pickups, hourly bars and most used apps from
screentime (
screentime today --jsonover SSH, every minute). - Wake-on-LAN: a machine that's off gets a Wake button (or
archfleet --wake <alias>). - Processes: every process with its CPU, GPU, memory, disk and network use, sortable and filterable, plus machine totals. You can end your own processes.
- Session (Hyprland): peek at the screen, lock it, send a notification or open a link there; list monitors, workspaces and windows, switch workspace, focus a window, reload the config.
- VPN: every machine's VPN in one table (state, relay, exit IP, last drop) plus a column in the
fleet table. Linux machines with the Mullvad app: connect, disconnect,
reconnect, switch relay. Windows machines: show a VPN watchdog's status file and run the restart /
test commands you put in
hosts.json. - Files: SCP upload/download, plus SSH, SFTP and tmux shells.
- Clipboard: every machine's clipboard side by side. Copy between them with one key.
- Run: one command on several machines at once, with output grouped per machine.
- Maintenance: fresh update checks, Arch news since your last upgrade, failed services, boot
errors, disk use, login sessions, a package diff between two machines, and interactive
pacman -Syu.
It also comes with clipdeck, a SUPER+V clipboard picker overlay with one column per machine: this machine's cliphist history, the other machines' histories, and Windows' native clipboard history, paged so you can reach far back.
- OpenSSH on each machine.
install.shbuilds Archfleet with Rust (cargo), or downloads the latest release binary when Rust isn't installed. Nothing else: no Python, no runtime. - Linux machines:
sshdrunning. For the clipboard you also needwl-clipboardandcliphist. The Session tab needs Hyprland,grimandnotify-send. - clipdeck needs eww and Hyprland.
- Windows (optional): Windows 10/11 with OpenSSH Server (the setup script installs it).
Arch: sudo pacman -S --needed rust openssh wl-clipboard cliphist grim libnotify and eww from the AUR.
On every Linux machine:
git clone https://github.com/Tjabooo/archfleet.git
cd archfleet
./install.shThis builds one archfleet binary into ~/.local/share/archfleet, links archfleet,
archfleet-clipboard and clipdeck to it in ~/.local/bin, adds an app-launcher entry, and creates
~/.config/archfleet/hosts.json the first time. Run it again (after git pull) to update. It also
removes what an older Python version of Archfleet left there.
Edit ~/.config/archfleet/hosts.json (start from hosts.example.json), using
the same file on every machine:
[
{"alias": "desktop", "label": "Desktop", "hostname": "my-desktop", "address": "192.168.1.20", "user": "me", "os": "linux", "mac": "00:11:22:33:44:55"},
{"alias": "laptop", "label": "Laptop", "hostname": "my-laptop", "address": "192.168.1.21", "user": "me", "os": "linux"},
{"alias": "server", "label": "Home server", "hostname": "my-server", "address": "192.168.1.10", "user": "me", "os": "windows"}
]| Key | Meaning |
|---|---|
alias |
The SSH alias Archfleet connects to (ssh <alias> must work without a password) |
hostname |
The machine's real hostname. This is how Archfleet knows which entry is "this machine". |
label, address, user |
Shown in the UI. address is also used for the SSH aliases below. |
os |
linux or windows |
mac |
Optional: the wired MAC address, which enables Wake-on-LAN |
helper, clipboard_client |
Optional: where archfleet is on that Linux machine (default ~/.local/share/archfleet/archfleet) / the Windows clipboard client |
screentime_command |
Optional: how to run screentime today --json there (default: from ~/.local/bin or PATH) |
lilin |
Optional: true on the machine running Lilin, to show its sharing load |
vpn |
Optional, see below |
The VPN tab finds the Mullvad app on Linux machines by itself. vpn adds what it can't guess:
{"alias": "desktop", "vpn": {"state_file": "~/.local/state/my-rice/vpn.json"}}
{"alias": "server", "vpn": {"status_file": "C:\\ProgramData\\MyVpn\\status.json",
"restart": "Restart-Service 'WireGuardTunnel$my-tunnel' -Force",
"test": "& 'C:\\tools\\Test-MyVpn.ps1'"}}| Key | Meaning |
|---|---|
state_file |
Linux: a JSON file with last_drop (unix seconds), written by whatever watches the VPN there |
status_file |
Windows: a JSON status written by a VPN watchdog: tunnel (up/down), server, exit (ok, ip, city, provider), problems, ok, at, lastDropAt, lastLeakAt |
restart, test |
Windows: PowerShell run over SSH by the Restart tunnel / Test tunnel buttons |
Keys 1–9 select machines in the order listed.
If ssh <alias> already works without a password, skip this step. Otherwise run this on each machine:
archfleet setup-ssh # aliases + a dedicated key, then prints what to authorise
archfleet setup-ssh --copy # same, and runs ssh-copy-id for the Linux machines
archfleet setup-ssh --check # once all are done: ssh + sftp round trip to eachThe aliases go in ~/.ssh/config.d/archfleet.conf, which is included from the top of
~/.ssh/config, and use their own key, ~/.ssh/id_ed25519_archfleet. Your other SSH settings
aren't touched, and private keys never leave their machine.
In an admin PowerShell, from the cloned folder, allow your Linux machines' public keys
(~/.ssh/id_ed25519_archfleet.pub from each, one per line in a file):
.\windows\setup-ssh-server.ps1 -PublicKeyFile C:\path\to\archfleet-keys.pubThis installs OpenSSH Server and allows key-only logins for your account. Port 22 is opened only to
your LAN (the PC's own /24 by default; change it with -AllowFrom 10.0.0.0/24), on the Private
network profile. The script refuses to replace an sshd_config it didn't write.
Then, as yourself (not elevated), install the clipboard bridge and archfleet.exe:
powershell -ExecutionPolicy Bypass -File windows\install.ps1SSH sessions on Windows can't see the desktop clipboard, so clipboard-bridge.ps1 runs hidden in
your signed-in desktop session (the "Archfleet Clipboard Bridge" logon task). It answers only your
own account, through a local named pipe, so no network port is opened. To show Windows history in
clipdeck, turn on Settings → System → Clipboard → Clipboard history.
Add the binds to your Hyprland config:
clipdeck/hyprland.lua for a Lua config, or
clipdeck/hyprland.conf for a classic hyprland.conf. SUPER+V opens the
overlay. Each entry has a key chip (1–0, Q–P, A–L), and pressing the key or clicking the entry
copies it to this machine. Each column shows 10 entries a page and holds up to 100 (set
CLIPDECK_HISTORY to change that; Windows itself keeps 25): ←/→, Page Up/Down, Home/End or the
scroll wheel flip every column together, and the same keys then pick from the page shown. Esc or any
other key closes it.
Each other machine's last answer is cached in ~/.cache/clipdeck/ (readable only by you). SUPER+V shows
it straight away, marked "updating", while it asks the machine again, and keeps showing it, marked
offline, when the machine is off or asleep. Text entries (up to 64 KiB each) still copy from that copy;
images need the machine on. CLIPDECK_CACHE=0 turns the cache off and clipdeck forget empties it.
If your eww config defines its own clipdeck window, copy the updated widget from
clipdeck/eww/eww.yuck to get the pager.
The overlay is an eww window. clipdeck uses the first eww config of yours that defines a
clipdeck window (~/.config/eww or any ~/.config/*/eww), so it can wear your theme. Otherwise it
uses the bundled one in clipdeck/eww. To pick a config yourself, set CLIPDECK_EWW.
Run archfleet or open Archfleet from your launcher.
Everything works with the keyboard or the mouse. Every button shows its key.
| Keys | Everywhere |
|---|---|
1–9 |
select a machine |
← → (or Tab) |
previous / next tab |
r s f w |
refresh, SSH shell, SFTP, Wake-on-LAN |
p c |
Processes, Clipboard |
↑ ↓ PgUp PgDn ⏎ |
move in the tab's list (or scroll it), pick |
Esc |
leave a text field or dialog |
q |
quit |
On a tab: Overview t tmux, l link test · Processes / filter, m only mine, o/O sort
column/order, e end · Session k peek, l lock, n notify, u open URL, g workspace,
R reload, t switch table · VPN o connect, x disconnect, e reconnect, l relay,
R/t restart/test tunnel · Files i edit paths, u upload, d download · Clipboard a
refresh all, h copy here, l send local here, v view image · Run: type, ⏎ runs, Alt+1…9
tick machines · Maintenance u updates, n news (click an item to open it), U upgrade, v j
d l diagnostics, k compare packages.
From a shell, on Linux or Windows:
archfleet-clipboard get laptop # print its clipboard text
archfleet-clipboard get server --json # with images and the format
archfleet-clipboard copy desktop server # desktop's clipboard -> server
wl-paste | archfleet-clipboard set laptop # content on stdin, never as an argument
archfleet --wake desktop # Wake-on-LAN magic packetOn Windows the command is %LOCALAPPDATA%\archfleet\archfleet-clipboard.cmd (it runs
archfleet.exe clipboard). It reads the same ~/.config/archfleet/hosts.json.
- One Rust binary does everything: the dashboard (ratatui), the per-machine helper, clipdeck and the
clipboard command (by the name it's started as, or
archfleet helper|clipdeck|clipboard). - On Linux the dashboard sends a JSON request over
ssh <alias> ~/.local/share/archfleet/archfleet helper --stdinand reads one JSON answer; for this machine it calls the same code in-process. On Windows it sends the PowerShell in windows/ over SSH. - Status is read every 15 seconds, the VPN state with it (
mullvad status --jsonon Linux). Processes are read every 3 seconds, only while their tab is open. Session info is read only when you open that tab or press Refresh. CPU, network and per-process rates come from the difference to the previous reading, which the helper keeps in$XDG_RUNTIME_DIR, so a read answers at once instead of sampling (only the first read after a pause waits a moment to measure). - The dashboard only redraws when something changed and does its SSH work on background threads. clipdeck's eww stream waits on inotify instead of polling.
- Clipboard data travels inside the SSH connection's input and output, so it never shows up in
process lists, shell history or logs. Text and PNG images up to 8 MiB are supported. While
clipdeck is open, what it shows is kept in
$XDG_RUNTIME_DIR/clipdeck.json(RAM, your user only), and the file is deleted on close. The other machines' last history (text up to 64 KiB an entry) is cached on disk in~/.cache/clipdeck/(folder 0700, files 0600), like cliphist's own database;CLIPDECK_CACHE=0turns that off andclipdeck forgetdeletes it. - Everything runs as your own user. Without root, other users' processes show CPU and memory, but
not their disk, GPU or network use. Per-process network counts TCP only (from
ss). On Windows, the per-process I/O column includes network too, and processes there can't be ended from Archfleet. - Wake-on-LAN sends a magic packet to the LAN broadcast addresses, then checks every 5 s for up to
2 min. The machine needs Wake-on-LAN enabled in its firmware and on its network card. With
NetworkManager:
nmcli connection modify "<connection>" 802-3-ethernet.wake-on-lan magic. - Test link: ping is the median time to open a TCP connection to port 22. Speed is 64 MB sent and received through SSH, with the login time taken out.
cargo test # unit tests, no network needed
cargo clippy -- -D warnings
cargo build --release # target/release/archfleet
archfleet check # read-only check against your real machinesReleases attach prebuilt Linux (x86_64, aarch64) and Windows binaries, which the installers download when Rust isn't installed.
MIT

