aboutsummaryrefslogtreecommitdiffstats
path: root/bin
AgeCommit message (Collapse)AuthorFilesLines
10 daysfeat(immich): fall back to the past week's memoriesDanilo M.1-5/+26
A day with no memories left the card showing only a notice. When today has none, immich-fetch.sh now merges the memories of each of the past six days, skipping a day whose request fails, and marks the index with a scope week line. The subtitle names where the photos come from, Today or This week, before the i/n counter, and the empty notice reads no memories this week. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysfeat: add an Immich memories card with click and scrollDanilo M.1-0/+96
A centred card showing today's "N years ago" photos from Immich, one at a time on a 30-second rotation, with when each was taken and where. bin/immich-fetch.sh runs from conky's execi every 30 minutes: it asks /api/memories for today, converts each preview to PNG (Cairo loads nothing else) and writes an index with the year, local capture time and place. The place needs the key's asset.read permission and reads '--' without it. The key lives in ~/.config/udt/immich.env, like the weather key, because a GPG-backed store would raise a pinentry unattended. The dashboard now registers lua_mouse_hook and hands pointer events to the widget under the pointer. On this card, scrolling steps through the photos and a left click opens the photo in Immich's web UI and hides the dashboard so the browser is not stuck beneath it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysfix(calendar): drop the cache when khal is missingDanilo M.1-0/+8
With khal uninstalled the sampler still wrote a cache with a generated key and no events, because khal's stderr is discarded. The card then read "nothing this week" while an event was scheduled. Removing the cache instead shows the card's "no calendar data" face. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-18feat: add a breaktimer cardDanilo M.1-0/+70
Replaces the Waybar module that used to show breaktimer.sh with a card on the dashboard. The card's big value is the phase countdown, coloured by phase with the same language the Waybar module used, and two rows name the phase and what the countdown leads to. Data comes from bin/breaktimer-sample.sh, run by conky at execi 5, which reads the daemon's runtime files into a cache. The sampler owns the kill -0 liveness check, because conky's Lua cannot run a process and a dead daemon must read as 'fermo' rather than a stale 'running'. Drops outside the work-hours window freeze the countdown while the phase stays 'working'. The sampler detects this from the remain file's age and the card reads it as 'outside working hours', which also covers a hung daemon. The phase words and colour roles live in data.breaktimer_parse so they are unit-tested; the card only draws the result.
2026-09-18feat: add a calendar card reading khalDanilo M.1-0/+76
The month grid with the week's appointments below it, colour-coded by calendar. Events come from a cache file rather than a live call: khal costs about 200ms of Python startup, which is two orders of magnitude over the 2-second draw budget, so bin/calendar-sample.sh writes the cache on a 5-minute execi and the widget only parses. Calendar colours are read out of khal's own config by the sampler and mapped onto the board's palette roles, so the card follows a scheme change instead of pinning three literal hues. khal will not emit an ISO date: {start-date} uses the user's dateformat, which carries no year here, and a strftime spec inside the field raises. The sampler asks for {start-date-long} and data.calendar_date recovers the numbers by position, resolving day/month by magnitude and reading a genuinely ambiguous pair day-first. A 2-digit year is refused rather than guessed at. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17docs: correct the claim about counting a symlinked directoryDanilo M.1-4/+9
GNU ls follows a symlink to a directory with or without a trailing slash, so both forms count the packages correctly. Only -d lists the link itself. The original claim came from a count taken where the path did not resolve at all, and it reached the spec, the plan and two commit messages. The count was always right; the reason given for it was not, and a comment that teaches the next reader something false is worse than no comment. Records the real trap in its place: ls aliased to a long format counts its "total" header as a package. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17feat: sample the Slackware facts into a cache fileDanilo M.1-0/+47
Conky's Lua has no lfs, so it cannot stat a file, and counting 2800 package files per draw would be a directory walk every two seconds. Writes epochs rather than formatted dates. The shell function this replaces rebuilds a date from ls -l output with the year hardcoded, which breaks every January and on any file older than six months. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17feat: sample the public IP into a cache fileDanilo M.1-0/+48
The draw hook must never make a network call: a hung request blocks the Cairo draw and freezes the dashboard. Thirty minutes, not the old config's five, because a residential address is stable for days. Validates the response before writing. A captive portal and a rate-limit message both arrive with a 200 and would otherwise be drawn as an address. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17fix: stop the widgets from stalling or raising the drawDanilo M.2-2/+2
Memoize hwmon_dir by chip name so sensor reads no longer popen grep on every frame, cache misses included. Floor fractional byte counts in card.human so it cannot raise. Drop the GPU package-temperature row, which duplicated the headline. Set umask before mkdir in both samplers so a fresh cache directory is not world-readable. Make render.lua exit non-zero on a draw error and tolerate an unset HOME.
2026-09-17feat: add the disks and cache samplersDanilo M.2-0/+73
2026-09-17fix: let the shellcheck directive bind to the source lineDanilo M.1-1/+3
`set -a; . "$ENV_FILE"; set +a` on one line meant the `# shellcheck source=/dev/null` above it attached to the `set`, not the `.`, so SC1090 fired anyway. Split across lines, the directive binds and the script lints clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17fix: correct the .cod rationale, and stop world-reading the cacheDanilo M.1-3/+13
The comment claimed a bad key returns HTTP 200 with an error body, so the status code alone proves nothing. Measured against the live API, that is wrong: a bad key returns 401 and an unknown city 404, and with curl -f both fail at curl without the .cod check ever running. The claim came from the polybar script, which ran curl WITHOUT -f and so genuinely did receive error bodies with a success exit. The check was ported but not the reason for it. It still earns its place behind -f, for a 200 whose body is not usable weather, and the comment now says that instead of something false. The spec carried the same wrong sentence and is corrected too. Separately, the cache landed at 644 in a directory where every other generated file is 600, and the response carries the configured city and its coordinates. A umask before the write puts it at 600 without a window where it is briefly readable. The .cod discrepancy was found by the Task 6 implementer, which noticed the bad-key test produced a different message than the plan predicted and said so rather than reporting the expected text as achieved. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17feat: add the weather fetch scriptDanilo M.1-0/+55
Fetches current weather from OpenWeatherMap into a cache file, meant to run from conky's ${execi 900 ...}. Writes to a temp file in the same directory as the target and renames atomically, so a killed or failed fetch never leaves the widget reading a half-written or error response. Distinguishes HTTP failure from a 200-with-error-body (a bad key returns the latter for some endpoints, the former here), and leaves any existing good cache untouched on either kind of failure. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>