Omahub
← All plugins
T

Omatop

by Tobias Wiking

CPU and memory usage in the bar with a per-process breakdown popup, Docker container awareness, and smart process-name resolution.

Security review

No obvious issues detected

Deterministic scan — not a security guarantee

None
Risk level
None
Analyzed commit
cac7c27
Scanned
1 month ago

No potentially dangerous behavior detected in the analyzed commit.

Automated analysis only — not a security guarantee.

AI advisory review

No obvious issues detected

Language-model assessment · ~deepseek/deepseek-v4-flash-latest — advisory only

None
AI risk level
None
Recommendation
install
Model
~deepseek/deepseek-v4-flash-latest
Analyzed commit
cac7c27
Reviewed
1 month ago

This is a benign system monitor widget that reads CPU/memory usage and process information via standard shell commands. It writes only to its own settings through the shell's API, makes no network calls, and contains no obfuscated or destructive code.

How this check works

This review combines the deterministic scan (the rule-based results above) with an independent look at the plugin's code by a language model. The model reads a trimmed sample of the repository's files, the manifest, and the README, then gives a plain-language risk level and a recommendation: install (no notable danger), review (look closer first), or avoid (clearly dangerous).

It runs on the same analyzed commit as the deterministic scan and is strictly advisory — it is not a security guarantee and never blocks a plugin by itself. A human moderator still reviews plugins before they are listed.

AI advisory only — automated analysis, not a security guarantee.

Install
$ omarchy plugin add https://github.com/twiking/omarchy-omatop --enable
Widgets #bar #quickshell #system

Omatop

An Omarchy bar widget that shows CPU and memory usage side by side and, in its popup, which processes are actually eating them.

  • CPU and memory in one widget — both readouts in the bar, both process lists in one popup
  • Per-process breakdown — the top consumers per metric, aggregated by process name
  • Docker-aware — processes inside containers show the container name underneath
  • Smart process names — resolves unhelpful names like MainThread, Nix wrappers, and generic interpreters to the real application

The Omatop popup

This is the Omarchy-shell port of waybar-top-cpu-mem.

Requirements

  • Omarchy with omarchy-shell (Quattro or newer)
  • bash, nproc, top, ps, and free — the coreutils and procps-ng packages an Omarchy install already has
  • A Nerd Font as the bar font, for the metric and chart glyphs (Omarchy's default)
  • Optional: docker — container names appear only when the Docker CLI is present; without it that step is skipped

Omatop needs no elevated privileges: it reads /proc, ps, and (when present) docker ps as your own user.

Install

omarchy plugin add https://github.com/twiking/omarchy-omatop.git
omarchy plugin enable io.github.twiking.omatop

The widget lands in the bar's right section; move it with omarchy bar move.

Update

omarchy plugin update io.github.twiking.omatop

Remove

omarchy plugin disable io.github.twiking.omatop   # takes it off the bar
omarchy plugin remove io.github.twiking.omatop    # deletes the plugin checkout

Removal deletes ~/.config/omarchy/plugins/io.github.twiking.omatop/. Omatop writes nothing outside its own settings keys in the widget's bar.layout entry in ~/.config/omarchy/shell.json; omarchy plugin disable drops that entry, and no other file is touched.

Settings

The popup has a collapsed OMATOP SETTINGS section at the bottom — click the header to expand it and change the refresh interval, the number of processes listed per metric, or what the bar shows (Usage vs Icon only). Changes save immediately.

With the values turned off the bar falls back to a single bar-chart glyph (nf-md-chart_bar), so the widget stays visible and clickable.

There is no config file of Omatop's own: bar widgets are configured inline in their bar.layout entry in ~/.config/omarchy/shell.json, which the shell owns, so the panel writes through the shell's updateEntryInline the same way the first-party widgets do. Editing that entry by hand works just as well:

Key Type Default What it does
processCount integer 1–20 7 How many processes the popup lists per metric
refreshIntervalSec integer 1–60 3 How often stats are sampled
showValues boolean true Show the CPU / MEM readouts; off shows the bar-chart icon instead
{
  "bar": {
    "layout": {
      "right": [
        { "id": "io.github.twiking.omatop", "processCount": 7 }
      ]
    }
  }
}

The bar readout

Each metric is a two-line caption: its name in small type (CPU, MEM) with the current value under it, the two lines centered on each other and sized to fit the bar's height. Vertical bars have no room for text, so they show the bar-chart glyph instead and leave the numbers to the popup.

Interactions

  • Left click — open/close the popup
  • Right click — launch or focus btop
  • Esc — close the popup

How it works

bin/omatop-stats <cpu|memory> [count] collects one metric in a single shot and prints line-based TSV; Panel.qml runs it once per metric on a timer and Model.js parses the output. Running the script by hand is the fastest way to debug a wrong-looking number.

CPU

CPU usage is normalized across all cores to a 0–100% scale (matching tools like btop). top in batch mode measures percentages and ps resolves process names; the two are joined by PID.

Memory

Memory is aggregated per process name using RSS from ps, so multiple instances of the same program (browser tabs, workers) are summed into one row. The bar label shows used memory in GB, the panel adds total RAM after it, and the usage bar shows the percentage of that total.

Process name resolution

Both metrics handle cases where the reported process name is unhelpful:

  • MainThread (Python apps) — resolved from the command line
  • .foo-wrapped / .foo-wrap (Nix wrappers) — resolved to the actual binary name
  • Generic interpreters (node, python, bash, etc.) are skipped in favor of the actual script or app name

Docker detection

Processes running inside Docker containers are detected via cgroup membership (/sys/fs/cgroup/system.slice/docker-*.scope) and matched against docker ps. The container name is shown below the process row.

Docker is entirely optional. With no docker binary the lookup is skipped; if the binary is there but the daemon refuses the connection, the error is ignored; and if the daemon hangs, the call gives up after two seconds. In every case the readout is the same minus container names.

Development

omarchy plugin validate "$HOME/.config/omarchy/plugins/io.github.twiking.omatop"
qmllint -I "$OMARCHY_PATH/shell" Panel.qml

License

MIT — see LICENSE.