aboutsummaryrefslogtreecommitdiffstats
path: root/dashboard.lua
AgeCommit message (Collapse)AuthorFilesLines
10 daysfeat(dashboard): move the Immich card to the top of the boardDanilo M.1-1/+1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysfeat: add an Immich memories card with click and scrollDanilo M.1-0/+26
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>
2026-09-18refactor: unify card no-data face and fluid sizingDanilo M.1-1/+3
Extract card.notice so every cached card's no-data state is one fluid, theme-consistent face instead of a copy per widget, and delete the fixed-size card.label it replaces. Derive weather's arc geometry from its band (pad, curve room, sun dot, time labels) instead of fixed pixels, and cap the arc at a proportion of the card's width rather than 240px. Derive disks' bar-fallback height and its address type from the card's own label scale. Standardise the big-value factor to 1.0 across the fit_unit cards and document the big-value colour rule and the disks headline exception.
2026-09-18feat: add a breaktimer cardDanilo M.1-0/+2
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-18chore: place the calendar card on the boardDanilo M.1-4/+4
Calendar to the middle column, with the clock and weather shifted down and right to make room for it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18feat: add a calendar card reading khalDanilo M.1-0/+2
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-17feat: put the network and slackware cards on the boardDanilo M.1-0/+4
Placement is provisional: there is no settled arrangement yet. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17feat: move the cards to the right of the screenDanilo M.1-4/+4
Groups the machine cards into the right-hand columns and leaves the clock and weather alone on the left, rather than spreading all six across the middle. Provisional: there is no settled arrangement for the board yet. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17feat: add the disks and cache cardsDanilo M.1-0/+2
disks draws a ring per filesystem from the df sample, with the NFS server address read from the device field and a labelled-bar fallback when the rings would be too small to read. cache shows the ~/.cache total and its four largest children from the du sample. card.ring now resets the cairo path first: a preceding card.text() leaves a current point, and cairo_arc() joins to it with a straight line, so the disks rings were drawn with stray chords. The ring primitive had no caller until now, which is why it went unnoticed.
2026-09-17feat: add the GPU cardDanilo M.1-0/+1
2026-09-17feat: add the system card with a per-core equaliserDanilo M.1-0/+1
2026-09-17feat: expose the warning palette roleDanilo M.1-0/+1
2026-09-17feat: 16x12 grid, clock at 1.5 columnsDanilo M.1-3/+3
A finer grid to place cards in smaller increments. The clock takes a fractional 1.5-column span, which rect_for supports because it is plain arithmetic with no integer assumption; note that a span of w covers w cells plus the w-1 gaps between them, so 1.5 is slightly wider than one and a half bare cells. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17feat: move to an 8x6 grid, and let the weather card fit any cell heightDanilo M.1-6/+4
The grid was 4x2, which made every placement decision a coarse one. 8x6 gives 299x157 cells, so a card can be sized in something closer to the increments the layout actually wants. Nothing in rect_for needed changing: it derives cell size from COLS and ROWS, so this is a two-number edit. Note that ROWS has to cover the tallest row in use. A widget placed on row 3 of a two-row grid is computed at y=1068 on a 1080px screen and draws off the bottom, silently. The arc band no longer has a minimum height. It had one, and in a cell 40px shorter than the content wanted, the minimum won and pulled the curve up through the stat rows, drawing the sunrise time across the word WIND. It now takes what is genuinely left and is skipped below the height where it could be read, so the same widget composes in a 2x2 or a 2x3 cell without overlapping anything. Checked by rendering the widget offscreen at 2x1, 2x2 and 2x3 before restarting conky. Layout is now a 1x3 clock with a 2x3 weather card beneath it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17feat: put the weather card under the clock, scale its type to widthDanilo M.1-5/+5
Placement is column 1 row 2, directly beneath the clock, which drops to a single-row cell to make room. The card's type now scales off the cell WIDTH rather than its height. Scaling off height meant the text shrank every time the cell got shorter, and beside the clock's numerals the card read as a whisper. Width is the stable dimension for this layout and is what constrains the text anyway, since the stat rows run edge to edge. Verified against the live dashboard, not only the offscreen render: the two disagreed about type size precisely because the offscreen harness was cropped to the card and never showed it next to the clock. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17fix: size the weather card to its contentDanilo M.1-1/+4
The first draft placed every band at a fixed pixel offset and let the arc absorb whatever height was left. In a 1x2 cell on this monitor that is 794px of arc: a cathedral arch under a fifth of a card of content, nothing like the mockup it was shaped after. Three changes, all visible in an offscreen render of the real widget: - Type sizes and band offsets scale with the rect, within clamps, so the proportions hold on the 1920 monitor as well as this one. - The arc gets a bounded band that follows the stats instead of being pinned to the bottom, so no dead strip opens between them. - The layout gives the widget a 1x1 cell. Its content is about 350px tall and a full-height cell cannot be filled without inventing data. Found before restarting conky by loading conky's own cairo bindings standalone and rendering the widget to a PNG, which is a far tighter loop than install, restart, switch workspace, screenshot. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17feat: add the weather cardDanilo M.1-0/+1
Draws current conditions plus a sunrise-to-sunset arc in widgets/weather.lua, placed at col 2 in dashboard.lua's layout. Schedules the periodic fetch via execi in conky.conf.in, tying refresh to conky's own lifecycle. The no-data env-file probe now closes its handle explicitly: the branch reruns every draw until a fetch succeeds, so an unclosed io.open there would leak one handle per frame. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16test: check grid maths on both real screen sizesDanilo M.1-0/+5
The grid's justification is that one layout table works on differently shaped screens, so assert it: every cell lands inside the margins at 2560x1080 and 1920x1080, a spanning cell absorbs the gap it covers, and no shipped layout entry falls outside the declared grid. dashboard.lua exports its internals for this; cairo and lib.card are stubbed via package.preload since they only exist inside Conky. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16feat: draw to a Wayland Cairo surface with an error overlayDanilo M.1-0/+154
Entry point, grid maths, palette parsing and widget dispatch. Uses conky_surface(), not cairo_xlib_surface_create: under out_to_wayland the Xlib drawable and visual are both nil, so the idiom every Conky-Lua tutorial uses cannot work here. The pcall overlay lands before any widget exists, because Conky reports a Lua fault as a blank screen with no message on any stream. Verified by injecting a fault and seeing it reported. A missing widget names itself in its own cell rather than leaving the cell empty. conky.conf here is a development config with literal colours; the templated one arrives with the UDT wiring. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>