| Age | Commit message (Collapse) | Author | Files | Lines |
|
The bars had no legend. A raindrop in the bars' own colour sits in a
left gutter on their row; the band shifts right by the gutter so the
hour columns stay aligned.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
- details: the wind needle ends in a filled arrowhead instead of a dot,
so the direction it points (where the wind goes) reads one way only.
- hourly, details, sky: raise each card's share so card.standard reaches
the same S (72) as now and week. Title and row text now match across
the five cards (21.6px / 23px), in line with breaktimer and calendar.
The bands (curve, compass, arc) absorb what is left.
- hourly: band labels follow the band height a little more (capped at the
row size), so they do not shrink with the taller header.
- hourly: rain-chance bars at half alpha with a minimum height for any
nonzero chance. Typical chances are a few percent, which scaled honestly
is a 1px bar that no alpha can rescue.
- now: the condition line sits on the card's foot, so the height the
capped type leaves over is not an empty strip at the bottom.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The final print used %d and raised on fractional spans; header now cites a card that exists.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
Hour and day labels go through weather.clock, hourly clamps rain chance and caps at 24 hours, week widens the scale by min and max together and sizes the glyph apart from the text, details compass letters never exceed row text, now always hints at the fetcher.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
Parse now rejects inf and NaN fields, clock() wraps os.date so odd epochs read '--', age_str returns '--' for bad input, duration loses a redundant guard.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
UV and the European AQI carry the ok/warning/critical roles, which puts
critical back on the board.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
- measure returns the ink's left offset as a third value (0 when no ink).
- text_right and text_centre subtract it, so a glyph with a large
x_bearing no longer overruns the right edge.
- standard stringifies a numeric spec.big instead of raising in runs().
- standard draws '--' for a nil row value instead of 'nil'.
- standard clamps its returned y to the inner rect.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
- quote CITY in weather.env.example and note why
- re-geocode when weather-loc lacks a longitude; write it atomically
- parse the air body with --rawfile/fromjson? so a bad body drops only the air line
- set umask before mkdir so the cache dir is 700
- drop the unneeded set -a/set +a around the source
- require at least one digit in the epoch guard
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
phase * 28 wrapped for math.maxinteger; multiply as a float so the
result goes through the non-finite check.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
deg, num, duration and moon_icon now return their missing-value
placeholder for NaN, inf and out-of-range input instead of raising from
%d or utf8.char. sun_t clamps NaN to 0 and age_str returns ? for a NaN
age. Drops the dead -0 fold in deg and fixes a mislabelled assertion.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
card.standard() draws the DESIGN.md card (title left, big value right,
label/value rows) from one fluid size and returns where it stopped, so
the forecast cards share it instead of copying breaktimer's layout five
times.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
Forecast and air quality from Open-Meteo, flattened by jq into the
tab-separated cache lib/weather.lua parses. The city is geocoded once
and cached; a failed air-quality call drops one line, not the cache.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
WMO codes to glyphs and words, moon phase, UV and AQI roles, and a
parser for the tab-separated cache the fetcher will write. Groundwork
for the Mirage-derived forecast cards.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Five weather cards (now, hourly, week, details, sky) adapted from the
Conky-Mirage theme and drawn in this repo's design language, with the
data source moving from OpenWeatherMap to Open-Meteo.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Both cards are now drawn by quickshell, so the conky copies go: the two
widgets, their samplers and texeci lines, their fixtures and icons, and
du_parse with human_bytes, which only the cache card used. kv_parse stays
for breaktimer; its test now runs on an inline string. README gains a
Samplers section listing what conky still schedules, and DESIGN.md's
examples point at the cards that remain. Their slots in the layout are
left open.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The reasons lived as comments in hypr-theme's autostart.lua. That file is
now edited by the quickshell settings window and carries no comments, so
they move here, beside the line they explain: the explicit -c config and
the [workspace special:dash silent] prefix, which the window rule cannot
replace because hl.window_rule rejects silent.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The card was a copy of nvtable's table, where installed-behind and
repo-behind share a row and are told apart by colour, and it read
"shipped" from the .info rather than the binary repo. The drawer's
updates page replaces it: one row per package under the action it needs
next, Slackware included. Removed: the card, its sampler and the
nvchecker run it started every 30 minutes (the drawer runs nvchecker
when its result is older than that), nvtable_parse with its test and
fixture, and the package-up icon. The card's slot in the layout is left
open; rearranging the board is a separate decision.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
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>
|
|
Cairo's toy text API binds one face with no per-glyph fallback, so an
emoji in a calendar event title rendered as a box in Noto Sans.
text/measure/advance now split strings into runs and draw emoji runs
(U+1F000-1FAFF, U+2600-27BF) in monochrome Noto Emoji, restoring the
caller's face afterwards. Nerd Font PUA icons stay in FONT_MONO.
Plain strings and invalid UTF-8 take the old single-call path.
No shaping: ZWJ sequences and flags draw as their parts. Pango via
lgi (built for Lua 5.4) is the upgrade path.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
At 0.1s the per-frame readings (temperatures, RAM, fan RPM) changed
ten times a second and read as jitter. 0.5s keeps the wheel scroll
responsive enough while settling the numbers.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Sum drm-resident-vram0 from DRM fdinfo, the same per-client counters
gputop reads, counting each drm-client-id once since a client repeats
its totals on every fd it holds. One grep over /proc/*/fdinfo, about
10ms warm, sampled through new_gate every ~2s.
The 12 GiB total is hardcoded: xe exposes no VRAM capacity in sysfs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Conky gives Lua no way to request one redraw, so a scroll showed up to
2s late. Pointer enter and leave, which Hyprland sends on every toggle
of the special workspace, now switch conky_set_update_interval between
0.1s and the config's 2s.
At that rate the CPU and network counters would sample over 0.1s
windows and the chart would fill 20x faster, so both now sample through
data.new_gate on the /proc/uptime clock, about every 2s, and redraw
their last values in between. The samplers move to texeci: execi runs
in the main loop and a 0.7s nvtable or an Immich download stalled the
scroll.
Measured: about 12% of one core while visible, 0.5% while hidden.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Moves the nvchecker/nvtable table the login shell printed onto the
dashboard, as a wide card at the bottom centre. bin/updates-sample.sh
caches `nvtable -C -E` every ten minutes and starts nvchecker, fully
detached, at most every 30 minutes. The widget parses the cache and
colours it in the board's language: installed behind upstream is
critical, a shipped .info behind is a warning, with nvtable's status
dots per row and a legend on the bottom line. The mouse wheel scrolls
rows that do not fit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
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>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The years-ago count read as a bare number unless you read the subtitle.
It now carries a small Y at its top-right, where a degree sign sits on a
temperature, and ago under it on the baseline. The subtitle drops its
now redundant "years ago" and keeps only the i/n counter.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
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>
|
|
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>
|
|
The quickshell keybind reminder lists hyprctl binds -j, which reports
Lua actions as an opaque handle, so a bind shows what it does only
through its description. This was the one bind left undescribed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The Slackware card's big value gave no hint it was the slackpkg ChangeLog
age. Add a small line under the title naming it.
The calendar's weekday initials were English. Use the Italian single-letter
form, matching the card's already-Italian breaktimer labels.
|
|
Add card.ICON and a card.title helper that draws the glyph in the
highlight colour before the label, at the label's own size. The eight
labelled cards use it, in both the fit_unit width measurement and the
draw, so the icon cannot overrun a narrow cell. Clock (no label) and
weather (condition glyph already) are unchanged, and the no-data notice
titles stay text-only.
Codepoints were chosen against a rendered contact sheet, not fontconfig
alone, since a wrong codepoint draws a plausible neighbour.
|
|
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.
|
|
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.
|
|
|
|
The workspace rule pinning special:dash to DP-1 does not work: special
workspaces ignore a workspace_rule's `monitor` and open on whichever
monitor has focus. Verified on 0.56.2; upstream hyprwm/Hyprland#7990 and
#5570, both closed in the issues-to-discussions migration rather than
fixed.
The comment claimed the opposite, which was convincing because the rule
does register and `hyprctl workspacerules` reports it enabled. The rule
stays, so the intent is recorded and the line is ready if upstream fixes
it, and the bind now names the manual step: focus DP-1 first.
Also notes that the window stays on DP-3 once opened there, so a later
toggle is cropped until it is moved back, the conky surface being a
fixed 2560x1080.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
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>
|
|
Three changes to the calendar card:
The month grid drops further below the header. The weekday initials sat
close enough to read as part of the header rather than as the top of the
grid.
Event rows carry the date before the time, day/month with no year: the
window is a week and the grid above already names the month, so a year
would spend three characters on the one field that cannot vary.
A legend of the calendar colours is pinned along the card's bottom, and
the event rows now end above it rather than at the card's inner edge. It
lists every calendar khal declared a colour for, in name order so it
does not reshuffle between frames, since pairs() walks a hash.
The row budget also counted one row more than the drawing loop would
draw, which suppressed the '+N more' line exactly when it was needed:
the loop cut the row the count had already spent. Both now test the same
condition.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
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>
|
|
The two rows name two different pieces of hardware and read as one block in a
single colour. heading and highlight are the palette roles that carry no state
meaning, so they can stand for an identity; ok/warning/critical could not,
since those say how something is doing and these strings never change.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
Notes the two things a reader would otherwise get wrong: br0 is a bridge, so
local VM traffic shows up in the chart, and the disks card reads df's
available column rather than computing size minus used, which would overstate
free space by the root-reserved blocks.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
Placement is provisional: there is no settled arrangement yet.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|