NightWatcher314/sysz

An fzf terminal UI for systemctl

★ 0Forks 0ShellGitHub ↗Compare

README

An fzf terminal UI for Linux systemd and macOS launchd. Cross-platform fork of joehillen/sysz.

Successor: Sovi is the new Go + Bubble Tea rewrite with no third-party runtime CLI dependency. sysz 2.1.0 remains available for existing users.

Features

VERSION: 2.1.0

  • One UI for system and user services on Linux and macOS.
  • Capability-aware actions: unsupported launchd equivalents stay hidden.
  • Explicit launchd domains: gui/$UID and system.
  • Standard plist inventory from LaunchAgents and LaunchDaemons directories.
  • Apple jobs hidden by default and always read-only.
  • sudo only for mutating system-scope actions.
  • Recent/following logs from plist paths, with Unified Logging fallback.
  • Interactive return navigation; completed actions reopen the command menu.
  • State filtering, multi-selection, previews, and command aliases.

Requirements

  • fzf >= 0.27.1
  • Bash >= 4.3
  • Linux: systemd
  • macOS: launchd and Homebrew Bash; Apple's /bin/bash 3.2 is unsupported

Installation

Homebrew

brew install NightWatcher314/formula/sysz

Direct download

curl -L https://github.com/NightWatcher314/sysz/releases/latest/download/sysz -o ~/.local/bin/sysz
chmod +x ~/.local/bin/sysz

Source

git clone https://github.com/NightWatcher314/sysz.git
cd sysz
sudo make install

Usage

A cross-platform fzf terminal UI for systemd and macOS launchd.

Usage: sysz [OPTS...] [CMD] [-- ARGS...]

Only mutating system-scope commands invoke sudo.

OPTS:
  -u, --user               Only show user units or gui/$UID jobs
  --sys, --system          Only show system units or jobs
  -s STATE, --state STATE  Only show entries in STATE (repeatable)
  --all                    Include Apple launchd jobs (read-only)
  -V, --verbose            Print commands before running them
  -v, --version            Print version
  -h, --help               Print this message

CMD:
  start                    Start selected entries
  stop                     Stop entries; launchd uses bootout (unload)
  r, re, restart           Restart selected entries
  s, stat, status          Show status
  en, enable               Enable entries
  d, dis, disable          Disable entries
  j, journal               Show recent logs
  f, follow                Follow logs
  c, cat                   Show unit/plist source
  ed, edit                 Edit systemd unit override
  reload                   Reload systemd unit
  mask, unmask             Mask/unmask systemd unit
  show                     Show raw backend status

  Available interactive commands depend on backend capabilities.
  ARGS are passed to systemctl. launchd rejects unsupported extra args.

Interactive navigation:
  return                   Return from the command menu to the unit list
  After an action, press Enter to reopen the command menu.

Keybindings:
  TAB           Toggle selection.
  ctrl-v        Show unit/job definition in preview.
  ctrl-s        Select states to match. Selection is reset.
  ctrl-p        History previous.
  ctrl-n        History next.
  ?             Show keybindings.
  ESC           Return to units from commands; exit from units.

History:
  $XDG_CACHE_HOME/sysz/history
  Override with SYSZ_HISTORY.

States:
  systemd: values reported by systemctl --state=help
  launchd: running, loaded, not-loaded, disabled

macOS scope:
  user     gui/$UID; ~/Library/LaunchAgents and /Library/LaunchAgents
  system   /Library/LaunchDaemons

Apple jobs under /System/Library and com.apple.* are hidden by default and
always read-only. launchd has no exact daemon-reload, mask, or journalctl
equivalent.

macOS behavior

sysz intentionally does not pretend launchd is systemd:

  • stop uses launchctl bootout, unloading the job.
  • restart uses kickstart -k.
  • enable and disable change launchd overrides; --now also starts or unloads.
  • There is no launchd equivalent for daemon-reload, mask/unmask, or per-unit journal.
  • A loaded job without a PID may be healthy and waiting for demand.
  • Background Items approval and Full Disk Access remain controlled by System Settings.
  • launchctl print is human-readable, not a stable parsing API. Parsing is tolerant; raw output remains the status fallback.

Default inventory:

~/Library/LaunchAgents
/Library/LaunchAgents
/Library/LaunchDaemons

--all also shows /System/Library jobs, but mutations remain blocked.

Development

make lint
make test

# macOS only; creates and removes one temporary gui/$UID LaunchAgent
bash tests/macos-launchd-integration.sh

Acknowledgements

Original sysz by Joe Hillenbrand. Inspired by fuzzy-sys.

Contributors

joehillenNullSenseNightWatcher314croissongrothgarslvebradymloicreyniersavchenko

Issues