An Omarchy shell plugin (Quickshell, Hyprland) that turns your top-bar icon into an advanced task manager — live system monitoring, per-app history, process control, and privacy alerts.
- Live bar stats — CPU, temps, RAM, network, and more as a compact, customizable icon
- App Window with tabs for Activity (live graphs, 1H/6H/1D), Apps (running processes + trust status), Alerts, Events, and Settings
- Per-app details — CPU/mem/GPU/I/O history, provenance, and live socket counts (no root needed)
- Privacy alerts — notified when camera, mic, or location get used
- Process control — kill, suspend/resume, renice, or permanently disable an app
- Historical database — SQLite-backed samples every 2s, downsampled over time
- Sustained alert hysteresis — resource alarms must hold across samples and stay latched for a grace window, so the bell doesn't flicker near a threshold
- Privacy-tier alerts — process-level spikes are toggleable via the "App Activity" sensitivity, so the window can stop naming specific processes
- Per-process network attribution — optional toggle; turning it off hides the per-process net column entirely (instead of showing zeroes)
- Adaptive sampling + stale indicator — the bar back-off when idle and warns when fresh data stops arriving
- Configurable alert sensitivity — alert thresholds resolve from a single model (mild / medium / severe profiles, with per-metric overrides) shared by the bar, app window, and CLI; switch from the Settings tab or
omcontrol alert-prefs set-profile <mild|medium|severe> - Self-healing config + storage — a corrupt
alert_prefs.json/barstats.jsonis quarantined to<file>.corrupt(with a warning) instead of silently passing bad state, and alert-prefs writes are atomic; collector health is tracked soomcontrol statusreports healthy/stale/failed sampling
omarchy plugin add https://github.com/Davedes83/OmaControl.git --enableAdd the widget to ~/.config/omarchy/shell.json:
{
"bar": {
"layout": {
"right": [{ "id": "davedes.omcontrol" }]
}
}
}omarchy restart shellThe bar widget and CLI record while the shell is running. To also fill history
when the shell is closed, enable the hardened user service (fixed PATH,
LC_ALL=C, strict umask, process-group timeouts on every helper):
systemctl --user enable --now ~/.config/omarchy/plugins/davedes.omcontrol/systemd/omcontrol-collect.serviceVerify: systemctl --user status omcontrol-collect and omcontrol status.
- Left-click — open/close the App Window
- Middle-click — refresh sample
- Right-click — context menu (jump to tab, enforce rules, kill top process)
Also ships a CLI — omcontrol status [--json], omcontrol top [--history 30m] [--sort peak|cpu|mem|combined] [--json|--csv], omcontrol history [--metric cpu] [--seconds 300] [--json|--csv], omcontrol app kill <name>, omcontrol prune [--metrics|--procs|--events], omcontrol vacuum, and omcontrol alert-prefs ... — run omcontrol --help for the full list.
omarchy plugin remove davedes.omcontrol
systemctl --user disable --now omcontrol-collect- Omarchy Linux, Hyprland, Quickshell
sqlite3,python3,nvidia-smi(optional, for GPU metrics)
The test suite exercises the schema migration/repair paths, the collector
end-to-end, prefs.py validation + lock/atomic-rename concurrency, corruption
quarantine for both preference stores, alert-threshold profile/override
resolution, and the enforcement dry-run contract (mocked systemctl) — all
against throwaway state, so the user's real history.db is never touched.
Run it under any shell you like:
tests/run-tests.sh # default: sh
tests/run-tests.sh dash # strict POSIX (Debian/Ubuntu default sh)
tests/run-tests.sh bash --posix # bash in POSIX compatibility modeCI (.github/workflows/ci.yml) runs the suite under dash, bash, and
bash --posix, plus static gates: shellcheck, shfmt --diff, Python
compileall, JSON validation, and a structural QML/JS bracket-balance check.
qmllint runs as an informational step only — it needs the Quickshell module
tree the CI image doesn't ship.
MIT