aboutsummaryrefslogtreecommitdiffstats
path: root/README.md
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-10-13 11:35:00 +0200
committerDanilo M. <danix@danix.xyz>2026-10-13 11:35:00 +0200
commit3943e08dabe684b409a3ac99c9371fbeb5df5cdb (patch)
tree7dcedbb2d64a04e59ab239a8c40c04f0f0cf29aa /README.md
parentb2fe3f493efc12dd300f0e2b2ede5660ee70c193 (diff)
downloadconky-theme-udt-3943e08dabe684b409a3ac99c9371fbeb5df5cdb.tar.gz
conky-theme-udt-3943e08dabe684b409a3ac99c9371fbeb5df5cdb.zip
feat: system, gpu, disks and network move to the quickshell islandHEADmaster
The quickshell island's performance panel now shows CPU, RAM, temperatures, the GPU, disks and network, and warns from the status pill when something runs hot, fills up, or the public IP drifts from the pinned one. Two dashboards drawing the same numbers would drift apart, so the four widgets go, with the disks and public IP samplers. The island keeps writing ~/.cache/udt/pubip.txt in the same format. The freed space is left empty for the user to rearrange. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Diffstat (limited to 'README.md')
-rw-r--r--README.md138
1 files changed, 16 insertions, 122 deletions
diff --git a/README.md b/README.md
index b137121..ad6f930 100644
--- a/README.md
+++ b/README.md
@@ -63,45 +63,33 @@ in the source, so no real location appears in committed files.
## System widgets
-Seven cards cover the machine itself:
-
-- **System**: CPU load as a per-core equaliser, the CPU and motherboard model
- as two rows under the header, RAM used/total, and every temperature (CPU
- package, CCD die, NVMe and two board sensors).
-- **GPU**: Arc B580 package and VRAM temperatures, VRAM in use as a bar, and
- fan speed.
-- **Disks**: `/`, `/home`, `/data` and one NFS mount per server, as usage
- rings, with free space and total size printed under each ring. Two servers
- are configured, each with the same export mounted twice; the card shows one
- mount per server so no number appears twice.
+Three cards cover the machine itself:
+
- **Cache**: `~/.cache` total and its four largest subdirectories.
-- **Network**: LAN and public address, and download/upload throughput as two
- lines on one chart. See below.
- **Slackware**: distribution version, package count, kernel, install age, and
time since the last `slackpkg` ChangeLog update. See below.
- **Updates**: nvtable's table of tracked packages behind upstream, scrolled
with the mouse wheel. See below.
-The disks and cache cards read a cache file that a sampler writes; they never
-call `du` or `statfs` themselves. `statfs` on an unreachable NFS path blocks,
-and the disks sampler exists so that a dead server costs a stale cache rather
-than a frozen draw. Sampling is scheduled by conky itself: `conky.text` carries
+CPU, RAM, temperatures, the GPU, disks, network and the public address used to
+be cards here. They moved to the performance panel of the quickshell island
+(`desktop/island/` in the quickshell repo), which also warns from the status
+pill. The island keeps writing `~/.cache/udt/pubip.txt`.
+
+The cache card reads a cache file that a sampler writes; it never calls `du`
+itself. Sampling is scheduled by conky itself: `conky.text` carries
a threaded `${texeci}` per sampler, even though that block renders nothing under Cairo.
${texeci 900 ~/.config/conky/bin/weather-fetch.sh}
- ${texeci 60 ~/.config/conky/bin/disks-sample.sh}
${texeci 900 ~/.config/conky/bin/cache-sample.sh}
- ${texeci 1800 ~/.config/conky/bin/pubip-sample.sh}
${texeci 900 ~/.config/conky/bin/slackware-sample.sh}
${texeci 300 ~/.config/conky/bin/calendar-sample.sh}
${texeci 1800 ~/.config/conky/bin/immich-fetch.sh}
${texeci 600 ~/.config/conky/bin/updates-sample.sh}
-The disks sampler runs once a minute; the cache, Slackware and public-IP
-samplers run every 15, 15 and 30 minutes respectively, because `du -sh
+The cache and Slackware samplers run every 15 minutes, because `du -sh
~/.cache` walks the tree and takes about 100ms warm, which is fine on a slow
-cycle and unthinkable on the 2-second draw, and a residential public address
-does not change often enough to warrant asking more frequently. The calendar
+cycle and unthinkable on the 2-second draw. The calendar
sampler runs every five minutes: khal costs about 200ms of Python startup,
which rules out calling it from a draw, and the cache has to notice both a
vdirsyncer run and the day rolling over. Tying them to
@@ -109,9 +97,7 @@ conky means nothing samples while the dashboard is down.
To run a sampler by hand:
- ./bin/disks-sample.sh; echo "exit: $?"
./bin/cache-sample.sh; echo "exit: $?"
- ./bin/pubip-sample.sh; echo "exit: $?"
./bin/slackware-sample.sh; echo "exit: $?"
./bin/calendar-sample.sh; echo "exit: $?"
./bin/updates-sample.sh; echo "exit: $?"
@@ -119,38 +105,11 @@ To run a sampler by hand:
All print nothing and exit 0 on success, and all write a temp file and rename
it over the target, so the widget never reads a half-written file.
-### Network
-
-The chart plots download and upload as two lines on **one shared vertical
-scale**: scaled independently they would lie about their relative size, which
-is the entire reason to draw them together. The window peak is printed at the
-chart's top-left and the live rates at the bottom corners, each in its line's
-colour. History is module state inside `widgets/network.lua`, one sample per
-pixel column of the chart so it is exactly as wide as the card and never
-interpolates; it does not survive a `restart.sh` or a conky restart, so the
-chart starts empty and fills left to right.
-
-The rates come from the graphed interface's own byte counters under
-`/sys/class/net`, read on every draw: two file reads, no subprocess. The LAN
-address comes from `ip -4 addr show br0` and is memoized on first success,
-retried while nil because a bridge may not be up yet when conky starts. The
-public address comes from the cache file `bin/pubip-sample.sh` writes; once
-that cache is older than four hours the card shows `--` instead, because an
-address that may no longer be yours displayed with confidence is worse than a
-dash.
-
-**`br0` is a bridge, not a physical interface**, and the `IFACE` constant at
-the top of `widgets/network.lua` is the one edit that changes which interface
-is graphed. VM-to-host traffic crosses a bridge without reaching the router,
-so a local copy of that traffic appears in the chart. This carries over
-unchanged from the previous text config and is accepted behaviour, not a bug.
-
### Slackware
The big top-right value is the time since `/var/lib/slackpkg/ChangeLog.txt`
last changed, coloured `ok` under 24 hours, `warning` to a week, `critical`
-beyond, the same three-role language the system, GPU, disks and cache cards
-use. Below it: distribution version, package count, kernel, and install age
+beyond, the same three-role language the cache card uses. Below it: distribution version, package count, kernel, and install age
(the root filesystem's birth time, where the filesystem records one).
### Calendar
@@ -236,43 +195,15 @@ at most every 30 minutes, detached so conky never waits on the network; its
results show up on the next sample. `nvtable` is looked up in `~/bin` too,
since conky launched by the compositor lacks the login shell's `PATH`.
-### Host bindings
-
-These hwmon bindings, and the ceilings beside them, are specific to this machine
-and will not port. They are written down because the alternative is
-rediscovering them from a wrong reading.
-
-| chip | file | label | warning / critical |
-|---|---|---|---|
-| `k10temp` | `temp1_input` | CPU package | 75 / 90 |
-| `k10temp` | `temp3_input` | CCD die | 75 / 90 |
-| `nvme` | `temp1_input` | WD_BLACK SN850X | 60 / 70 |
-| `xe` | `temp2_input` | Arc B580 package | 75 / 85 |
-| `xe` | `temp3_input` | Arc B580 memory | 80 / 90 |
-| `xe` | `fan1_input` | Arc B580 fan RPM | none |
-| `gigabyte_wmi` | `temp2_input` | board | 60 / 70 |
-| `gigabyte_wmi` | `temp3_input` | board | 60 / 70 |
-
-Chips are globbed by the contents of their hwmon `name` file, never by index:
-indices drift across kernel and hardware reorders and a stale one silently
-reports a different chip. `Tccd1` is read straight from sysfs rather than by
-shelling out to `sensors`; same number, no subprocess. The `gigabyte_wmi` chip
-exposes five unlabelled temperatures, two of which the old conky config showed;
-they are labelled "board" rather than given a meaning they may not have.
-
### One colour language across every card
Anything with a comfortable range and an uncomfortable one is coloured by the
same three roles, so a card reads without learning a new scheme: `ok` below the
first threshold, `warning` between them, `critical` above the second.
-Filesystems, cache usage and CPU load use 25% and 75%. Temperatures use a
-per-sensor pair (the table above), because 70C is unremarkable on a CPU package
-and alarming on an NVMe. The Slackware card's ChangeLog age uses the same
+Cache usage uses 25% and 75%. The Slackware card's ChangeLog age uses the same
three roles on an hour scale (24 / 168) instead of a percentage. These are
-starting values, host-specific exactly as the
-bindings are, and sit in one table per widget so they are easy to retune once
-real numbers under load are known.
+starting values, and sit in one table per widget so they are easy to retune.
## Changing the layout
@@ -336,9 +267,9 @@ cell is left sparse; size it off the height alone and a short cell shrinks the
text to a whisper. The robust way is a measured fit: `card.fit_unit()` returns
the largest base size at which every row still fits the width, and the widget
takes the smaller of that and its height budget. Larger cell, larger type; a row
-that would collide pulls the size back down. The GPU, cache and system cards do
+that would collide pulls the size back down. The cache card does
this. A card that cannot afford the measuring pass can still key off width with
-a clamp, `math.max(lo, math.min(hi, inner.w * k))`; the clock, weather and disks
+a clamp, `math.max(lo, math.min(hi, inner.w * k))`; the clock and weather
cards do.
**Decide where the slack goes, and let one element absorb it.** The clock pins
@@ -443,9 +374,6 @@ widget passes its own. The clock uses `FONT_CLOCK` (Oswald, OFL-1.1, under
substitutes a default for a name it does not know, which looks exactly like the
font "not applying".
-**Sensors are globbed by hwmon `name`, never by index.** Indices drift across
-kernel and hardware reorders, and a stale one silently reports a different chip.
-
**`${execi}` fires even though `conky.text` renders nothing.** Cairo output
covers the text stream, so the `execi` that refreshes the weather cache is
invisible, but it still runs on schedule. This was checked with a probe config
@@ -475,40 +403,6 @@ half empty. Fill the cell instead: `card.fit_unit()` measures the rows and
returns the largest size that fits the width, the widget takes the smaller of
that and its height budget, and a row that would collide pulls the size down.
-**A bare `df` would silently mis-read every disk figure.** The user's shell
-aliases `df` to `df -h`, so `bin/disks-sample.sh` calls `/usr/bin/df -P -B1` by
-absolute path. `-P` is the POSIX format, one line per filesystem with the
-mountpoint last, and `-B1` is bytes so the parser never interprets a suffix. An
-alias or a function would hand the parser `1.6G` where it expects an integer,
-and every figure would be quietly wrong.
-
-**The disks card shows `df`'s available column, not `size - used`.** On this
-machine's root filesystem the two differ by about 13GB of root-reserved
-blocks, which exist on disk but are not available to any non-root user. A
-card that computed free space as `size - used` would overstate it by exactly
-that reserve.
-
-**The Arc B580 reports no utilisation through any stable interface.** The `xe`
-driver exposes no `gpu_busy_percent` (unlike `amdgpu`) and `intel_gpu_top`
-refuses the device. The GPU card therefore has no load bar; it shows what the
-hardware actually reports rather than inventing a number.
-
-**VRAM in use comes from DRM fdinfo**, the per-client counters `gputop` reads:
-`drm-resident-vram0` in `/proc/<pid>/fdinfo/<fd>`, summed once per
-`drm-client-id`. Only processes readable by conky's user are seen, so a GPU
-client running as another user is not counted. The card's 12 GiB total is
-hardcoded: xe puts no VRAM capacity in sysfs.
-
-**`/data` has no temperature.** It sits on a spinning disk with no hwmon chip;
-reading its SMART temperature would need `smartctl` as root and would spin up a
-sleeping disk on every poll. The NVMe composite temperature is freely readable
-and is shown; `/data` simply has none.
-
-**Per-core counters are module-level in `widgets/system.lua`.** Load is a delta
-between frames, so the counter has to outlive the draw; one created inside
-`draw` would sample against nothing and report nil forever. The aggregate
-counter is the same.
-
## License
GPLv2 only. See `LICENSE`.