README
ΒΆ
jeeves
"You rang, sir?" β your terminal-native butler for systemd.
A fast, keyboard-driven TUI for systemd. Browse every unit on the box, watch
logs live, inspect unit files, restart things β without leaving the terminal
and without typing sudo systemctl restart <tab><tab><tab> ever again.

Why?
systemctl is a great command. It's a lousy interface.
You want to know what's running, what's failed, what's eating RAM, what
nginx.service actually says, and why it died at 03:14 last night. You shouldn't
need eight terminal windows and a copy-paste pipeline through awk to find out.
jeeves is one screen, one keymap, and no surprises.
Features
- π¦ Browse every service β color-coded state, sub-state, enablement,
description. Filter as you type with
/. Cycle views witha(all / running / failed). Sort withS(name / state / memory / PID). - π Drill in β split-panel detail view with properties on one side and
live
journalctlon the other. Memory, CPU, tasks, traffic, and uptime refresh every 2 seconds automatically.

- π Logs that don't lie β wrap toggle (
w), tail-line cycling ([/], 100 β 2,500), full scrollback (PgUp/PgDn/g/G), and a true follow mode (f) that streamsjournalctl -fstraight into the panel without you reaching for another terminal. - π Inspect the unit file β press
ufor a full-screen, copy-pasteable view of the on-disk service file. No borders, no styling β just the bytes.

- π Safety net β destructive actions (
stop,restart,disable,mask) ask[y/N]before they fire. You won't killsshdwith a stray keystroke. - π Mouse-friendly β scroll wheel works in every viewport. Use it or don't; jeeves doesn't care.
- π System or user bus β
--userfor your own units, default for the system bus. Auto-falls-back when D-Bus says no.
Install
Pick whichever is easiest:
Prebuilt binary (no Go required) β grab the right tarball for your architecture from the Releases page:
| Tarball | Use this if your uname -m is⦠|
Typical hardware |
|---|---|---|
jeeves-linux-amd64.tar.gz |
x86_64 |
Servers, desktops |
jeeves-linux-arm64.tar.gz |
aarch64 |
Pi 3/4/5 on 64-bit Raspberry Pi OS, AWS Graviton |
jeeves-linux-armv7.tar.gz |
armv7l |
Pi 2/3/4 on 32-bit Raspberry Pi OS |
# Example: 32-bit Raspberry Pi OS (Pi 3B+ default)
curl -L https://github.com/aymanhs/jeeves/releases/latest/download/jeeves-linux-armv7.tar.gz \
| tar xz
sudo install jeeves /usr/local/bin/
Via Go:
go install github.com/aymanhs/jeeves@latest
From source:
git clone https://github.com/aymanhs/jeeves
cd jeeves
go build -o jeeves .
Requirements
- OS: Linux with systemd as PID 1. WSL2 works only if you've enabled
systemd in
/etc/wsl.conf. macOS and the BSDs are not supported (no systemd). - systemd: version 230 or newer (Debian 9+, Ubuntu 16.04+, RHEL/CentOS 8+,
any current Arch/Fedora β anything from the last ~decade is fine). Older
systemd is missing the
ListUnitsByPatternsD-Bus method used for the fast startup path. - journalctl: must be on
$PATH(it always is on a systemd box; called out only because we shell out to it for log fetching). - Architecture: amd64, arm64, arm (32-bit Pi). Everything is statically
buildable β
GOOS=linux GOARCH=arm64 go buildon your dev box,scpthe binary, done.
Use
# Manage system units (most of what you care about β needs root for actions)
sudo jeeves
# Manage your user units (no sudo)
jeeves --user
Permissions
- Browsing system units: no root needed. You can open jeeves as a normal user and see every system service.
- Actions on system units (start, stop, restart, enable, disable): require
root or a polkit rule that grants your account
manage-units. Without one of those, the action banner showspermission denied (try running with sudo). --usermode: no root, but you only see your own user units. Good for poking at your~/.config/systemd/user/setup.
Keymap
Service list
| Key | Action |
|---|---|
β/β j/k |
Navigate (wraps at top/bottom) |
PgUp/PgDn Ctrl+U/D |
Page up / down |
Home/End g/G |
Jump to first / last |
Enter β l |
Open details |
/ |
Filter as you type |
a |
Cycle view: all β running β failed |
S |
Cycle sort: name β state β memory β PID (β²/βΌ marks the active column) |
s t r |
Start / Stop / Restart |
e d |
Enable / Disable |
R |
Refresh |
q Ctrl+C |
Quit |
Detail view
| Key | Action |
|---|---|
Tab |
Switch focus: properties β logs |
u |
Open unit file (full screen) |
f |
Follow logs (live tail) |
w |
Toggle log line wrap |
[ / ] |
Decrease / increase log tail length |
s/t/r/e/d |
Service actions (destructive ones prompt y/N) |
β/β PgUp/PgDn g/G |
Scroll logs |
R |
Refresh |
Esc β h |
Back to list |
Unit-file view
Plain text, mouse-selectable, copy-pasteable. R to reload,
Esc/u/β to go back.
Cache
To make startup instant on slow hardware (Pi 3B+, low-end ARM boxes), jeeves
caches the merged service list to disk after each run and paints it on the
next start while the live data is being fetched in the background. A
(cached) tag appears in the header β and a one-shot status banner β so you
always know when you're looking at cached vs live data.
- What's cached: the service list only (names, states, descriptions, enable-states). No logs, no unit-file contents, no actions.
- Where:
$XDG_CACHE_HOME/jeeves/(typically~/.cache/jeeves/, or/root/.cache/jeeves/under sudo). One file per bus (services-system.json,services-user.json). - How long: at most 7 days, then refetched from scratch.
jeeves --cache-info # show where the cache is and what's in it
jeeves --clear-cache # delete it
jeeves --no-cache # skip the cache for this run (no read, no write)
Status
Single-binary, no config file, no daemon, no telemetry. Talks to systemd via
D-Bus directly (no shelling out to systemctl for state β only for
journalctl). Tested on Debian, Ubuntu, Arch, Fedora. Daily-driver on a
Raspberry Pi 3B+.
Contributing
Bugs and feature requests: open an issue.
PRs welcome β keep them focused, and run go vet ./... before sending.
Acknowledgements
Standing on the shoulders of giants:
- Charm.sh β Bubble Tea, Bubbles, and Lipgloss do the TUI heavy lifting. If you're building a Go TUI, start there.
- coreos/go-systemd β the D-Bus
bindings that let jeeves talk to systemd without shelling out to
systemctl.
License
MIT. See LICENSE.
Documentation
ΒΆ
There is no documentation for this package.