aboutsummaryrefslogtreecommitdiffstats
AgeCommit message (Collapse)AuthorFilesLines
8 daysdocs(spec): an updates module that names the next stepDanilo M.1-0/+149
The conky updates card copies nvtable's table, where installed-behind and repo-behind share a row and are told apart by colour, and it measured "shipped" as the .info version: gamescope and kitty read as ready to install while the binary repo still held the old build. The drawer module sorts each tracked package into one action, from PACKAGES.TXT of the binary repo rather than the recipe: upgrade here, awaiting build, upstream newer, app updates. Slackware is compared mirror against installed, not against slackpkg's local ChangeLog, which `slackpkg update` replaces without installing anything; new and removed packages come from the mirror's ChangeLog. NFS reads go through a timed-out child because the mount is hard. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8 daysfeat(desktop): performance and clipboard pages, a scrolling tile gridDanilo M.13-31/+492
The tile grid sits in a Flickable capped at three rows, so the fourth row the new modules bring scrolls inside that box instead of eating the notification space; a thin accent bar in the margin shows only when a row is hidden. Tiles are reordered with the everyday ones first. Performance shows the island's PerfPanel in a Page, with a tile line of CPU and RAM and the warning dot. Perf.detailed is now a count of live PerfPanel instances instead of a binding in the status pill: the island and the drawer both host the panel, and a bool with two writers would let one clear it under the other. Clipboard reads cliphist when its page opens: search, copy on click or Enter, delete per row, clear all behind a 3 second confirm, image entries as thumbnails decoded once onto tmpfs. Entries reach sh as $1, never inside a command string. A copy closes the drawer through a new Page.dismiss signal the drawer connects like back. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8 daysfeat(status): quiet mode mutes the Claude and opencode soundsDanilo M.7-10/+169
A new registry mode, status.quiet, with a row on the status page. Both tools will play their sounds through notify-sound, which asks statusctl and plays nothing while quiet is on, so their popups stay and only the sound goes. Presentation sets quiet and restores it afterwards, like dnd and nolock: a sound during a call or a game is what quiet is for. notify-sound ignores any argument it has no sound for, because the opencode notifier runs its command on every event, session_started and user_message included. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8 daysrefactor(island): the controls panel goesDanilo M.10-624/+21
Each of its seven tiles opened a drawer page that already existed, and it went unused. SUPER alone will open the drawer instead. Removed with it: the status pill's controls icon, Island.toggleControls, the island IPC target, Controls.js and its test, and the controls list in Prefs. Prefs now holds only the pinned IP; a controls key left in desktop.json is still kept on write, because writes merge into the parsed document. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8 daysdocs(spec): the drawer as the control centerDanilo M.1-0/+129
The drawer keeps its look and takes over: the island's controls panel goes, since each of its tiles opened a drawer page that already existed, and SUPER alone opens the drawer instead. The tile grid scrolls inside a three-row box so new tiles do not eat the notification space. New: a performance page reusing the island's Perf service, a cliphist clipboard page replacing the rofi list, and a quiet mode in the status registry that mutes Claude and opencode sounds through one notify-sound script while their popups stay. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8 daysdocs: the expose and its hot cornerDanilo M.2-38/+83
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8 daysfeat(window-switcher): the expose replaces the grid, with a hot cornerDanilo M.4-134/+202
Previews are placed at their Expose.js rects and sized to them, so each keeps its window's shape and relative size. Title and close show on hover only, so the scatter stays clean; icon and workspace marker always show. The keyboard selection is gone: this is a pointer feature, and Escape is the one key left. The top-right corner of DP-1 opens it after a 250ms glow that grows out of the corner, which is the warning and the way out. Input is only the corner's 2x2 pixels, since a larger input region would eat clicks on the windows below. It re-arms only when the pointer leaves while the expose is closed, or an Escape with the pointer still in the corner reopens it. It hides while status.gaming is set, read straight from the file: linking shared/Status.qml would start a second game poll and fire presentation side effects twice. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8 daysfeat(window-switcher): gravity pulls the scatter toward the centreDanilo M.2-22/+42
On screen the spiral alone read as loose: separation keeps the spiral's gaps, and the previews filled 24 to 30% of the screen. Thirty rounds now pull every window 15% closer to the centre and push them apart again, which fills 35 to 55% and makes each preview up to 1.5x larger. Twenty windows lay out in about 4ms. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8 daysfeat(window-switcher): the expose scatter layoutDanilo M.3-16/+157
layout() seeds windows on a golden-angle spiral, most recent at the centre, pushes overlapping pairs apart along the axis that costs less screen, and fits the result with one scale so sizes stay relative. The spec's first seed, the windows' real positions, was prototyped and dropped: every window on this desk fills its monitor, so they started in one pile, and pushing a pile apart made a line that still overlapped after 300 passes and filled 8 to 15% of the screen. The spiral converged in 1 to 55 passes. Comparing overlaps in raw pixels stacked wide windows into a column, which is why the axis choice divides by the screen's width and height. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8 daysdocs(spec): expose on ALT+TAB and a hot cornerDanilo M.1-0/+132
The window-switcher grid becomes a Mission Control scatter: previews keep their real shape and relative size, seeded from their real positions and pushed apart, then fitted with one scale. A top-right hot corner on DP-1 opens it after a 250ms glow that warns before it fires, and stays inert while gaming. shared/Status.qml is not linked into window-switcher because a second instance would run its own game poll and react to presentation twice; the corner reads status.gaming directly. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysdocs: the performance panelDanilo M.2-2/+48
What the panel shows, the dot's thresholds and their lack of hysteresis, why the public IP is pinned, and what is sampled always versus only while open. AGENTS.md gains two gotchas found building it: FileView reads /proc on reload(), and a hot reload does not resize an existing layer surface, which left the panel cut off after the height was raised. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysfix(perf): review findings in the service and the panelDanilo M.5-16/+26
- The panel loads only while open. Its models are fresh arrays every sample, so a hidden instance rebuilt its rows every 2s for the whole session. - The public IP fetch never kills one already running, and waits 30 minutes from the last attempt, not the last success: a rate-limited or offline fetch was retried every minute. - curl -4, so an IPv6 answer cannot silently stall the VPN check. - CPU load sums only the first eight /proc/stat fields. guest and guest_nice are already inside user and nice, and counting them again read high while VMs ran. - df gets timeout -k; the VRAM scan is not restarted over itself. - The GPU name joins the host constants in Perf.qml. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysfix(island): the window is tall enough for the performance panelDanilo M.1-1/+3
The performance grid runs past the old 360px surface and its disks card was cut off. The surface is click-through outside the pills, so the extra height costs nothing. A hot reload does not resize an existing layer surface; it takes a restart of the desktop component. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysfeat(island): the status pill opens the performance panelDanilo M.2-7/+57
A system monitor icon before the controls icon opens the panel in the status pill's capsule at 600px. A dot on its corner shows the worst of temperatures, RAM, disks and the public IP check, yellow or red, so a problem shows without opening anything. The detailed sampling runs only while the panel is open. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysfeat(perf): the performance panel's card gridDanilo M.1-0/+330
CPU with per-core bars, RAM and temperatures down the left; GPU and network beside it; disks under those two. Colours follow conky's bands so the numbers read as they did there. The pin beside the public IP stores the address shown, and the address turns red when a fresh one differs from the pin. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
10 daysfeat(perf): the performance serviceDanilo M.1-0/+295
CPU, RAM, temperatures and disks are sampled always, so the island's icon can warn with the panel closed; per-core load, the network rate, VRAM and the GPU fan only while the panel is open. hwmon chips are found by name, since their numbers move across boots. df runs under timeout so a dead NFS server keeps the last rows rather than blocking. The public IP keeps conky's cache file and 30 minute pace. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
10 daysfeat(desktop): Prefs holds a pinned public IPDanilo M.1-2/+17
perf.pinnedIp in desktop.json, set from the performance panel's pin button and written only on change. The address lives in the user's state file, never in the repo. setControls and setPinnedIp share one write so both keep keys this version does not know. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
10 daysfeat(perf): pure parsing and arithmetic for the performance panelDanilo M.2-0/+336
/proc/stat deltas, meminfo, df rows, the fdinfo VRAM sum, byte rates, hwmon lookup by chip name, the pubip cache in conky's format, and the bands that colour the panel and the icon. A reading that cannot be made is null, and null never raises the worst band, so a missing sensor cannot raise an alarm. Only a fresh public IP can mismatch the pinned one; a failed fetch goes stale instead. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
10 daysdocs(spec): performance warning is a dot, stale IP a dashDanilo M.1-5/+8
IconImage cannot be recoloured without an effect layer, so the severity shows as a dot on the icon's corner. A stale public IP is a dash with no age, as the Errors section already said. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysdocs(plan): performance panel implementation planDanilo M.1-0/+1518
Nine tasks: two spec corrections, Perf.js with its node test, the pinned IP in Prefs, the Perf service, the panel, the status pill wiring, an on-screen check against the still-running conky widgets, docs, and last the removal of those widgets from conky-theme-udt. The plan's Perf.js was run against its test while planning. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysdocs(spec): performance panel from the conky widgetsDanilo M.1-0/+198
Sub-project 4. An icon in the status pill opens a card grid of CPU, RAM, temperatures, GPU, disks and network, read from the same /proc, /sys and hwmon sources conky uses. The icon warns on temperatures, RAM, disks and a public IP that drifts from a pinned address, since the VPN depends on the ISP's fixed IP. CPU load is left out of the icon because spikes would flicker it. The four conky widgets are removed once the panel is verified beside them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysdocs(island): calendar edits touch only what changedDanilo M.1-2/+4
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysfix(calendar): review findings in calctl and the editorDanilo M.7-59/+170
An edit now rewrites only the fields that changed. A save with nothing changed used to rebuild the alarm, turning ACTION:AUDIO into DISPLAY and dropping ACKNOWLEDGED, re-anchor the start to the local zone, and strip SUMMARY's parameters; the test edits a foreign event unchanged and checks every one survives. get, edit and delete name the calendar the event is in. The same invite synced into two calendars has one UID, and the panel acted on whichever file came first, so editing one copy could overwrite or delete the other. A custom rule's date cannot be moved from the panel: BYDAY=MO stayed on Monday while the start moved, and the series lost the day shown. UNTIL is read back in local time, so a 22:30 series keeps its last occurrence. Files are written 0644 like vdirsyncer's. Enter in the title no longer bypasses the busy guard, which could create an event twice, and a throwing callback no longer leaks its Process. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysdocs: the calendar panel and calctlDanilo M.2-2/+37
The island README gains the panel. AGENTS.md records why calctl reads the vdir itself, the local-time recurrence rule, the system Python it needs, and two traps the build hit: a QML method named escape fails to load, and a pill expanding for any panel grew beside the calendar. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysfeat(calendar): a bell on agenda rows whose event has an alarmDanilo M.1-1/+12
Checking a day's reminders meant opening each event. The bell shows when the event carries its own VALARM, preset or custom. cal-notif's per-calendar defaults are not reflected: they are its configuration, not a property of the event. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysfix(island): the status pill stays at rest while the calendar is openDanilo M.1-1/+1
It expanded for any panel, which was right while it hosted every panel there was. The calendar panel lives in the clock pill, so the status pill grew into an empty box beside it. It now expands for its own two. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysfeat(island): the clock pill opens the calendar panelDanilo M.3-7/+45
A click on the pill opens the panel in its capsule, 620px wide, growing left from the gap so the status pill does not move. Focus goes into the panel so its text fields and Escape work; Escape closes the editor before the panel. The Escape hook is back(), not escape(): QML rejects a method named escape with "Illegal method name", since it shadows the global JS function, and the reload failed until it was renamed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysfeat(calendar): month grid beside the day's agendaDanilo M.1-0/+323
Six weeks from Monday, a dot per calendar with something that day, today and the selection marked. The agenda lists the selected day, all-day first; a click opens the event in the editor, and while the editor is open the grid picks its dates instead of the selection. Escape closes the editor before the panel. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
10 daysfeat(calendar): the event formDanilo M.1-0/+356
Dates come from the month grid beside it; times are typed or scrolled in 15-minute steps. Repeat and alarm offer the presets and show custom, unselectable, for an event carrying something richer, which the save then leaves alone. A failed save keeps the form open with calctl's line. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
10 daysfeat(calendar): the calendar serviceDanilo M.1-0/+102
Runs calctl, one Process per call so a reload and a save never collide, and drops a list that a newer one overtook. Watches the calendar directories the way the mail count watches xapian, so an edit from khal or a cron sync repaints the panel too. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
10 daysfeat(calendar): pure date logic for the panelDanilo M.2-0/+279
Month cells from Monday, which days an event covers, the day's agenda order, the grid's dots, time stepping, and the editor's draft in both directions. Days are strings and arithmetic is in UTC, so the DST change at the end of October never moves a day; the test steps across it. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
10 daysfeat(calendar): calctl creates, edits and deletes eventsDanilo M.2-1/+237
Edits change only what the form owns: a custom rule, extra alarms and properties this tool does not know survive, which the test checks on an event with BYDAY, two alarms and an X- property. Writes go through a temporary file and a rename so khal, cal-notif and vdirsyncer never read half a file, and a vdirsyncer sync is started detached afterwards. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
10 daysfeat(calendar): calctl reads the vdir as JSONDanilo M.2-0/+444
The calendar list comes from khal's config, so there is no second list. Recurrence is expanded with dateutil in naive local time, which keeps a weekly 09:00 at 09:00 across the DST change; the test pins that on 26 October. A rule richer than a plain FREQ, or alarms other than one preset, read as custom, which is what lets an edit leave them alone. A file that fails to parse is skipped rather than blanking the month. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
10 daysdocs(spec): calendar protocol settled while planningDanilo M.1-5/+23
One JSON envelope on stdout for every calctl command, the event as an argument rather than stdin, a get command because the editor edits the series rather than the occurrence clicked, and a pure Cal.js for the date logic so it is tested under node like the island's other helpers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysdocs(plan): calendar panel implementation planDanilo M.1-0/+2202
Ten tasks: protocol corrections to the spec, calctl in two halves with their CLI tests, the pure Cal.js with its node test, the service, the editor, the panel, the island wiring, a pass with the user and docs. Both test suites were run against the plan's own code before committing, and a read-only list against the live calendars measured 0.11s. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysdocs(spec): calendar panel with event editingDanilo M.1-0/+153
Sub-project 3. The clock pill opens a month grid beside the selected day's agenda, and an editor that writes the vdirsyncer calendars through a small Python tool, calctl, rather than khal: khal 0.11 has no JSON output and keeps a cache that is a second view of the same files. Recurrence stops at a plain FREQ and UNTIL, and the form owns one alarm; anything richer in an existing event reads as custom and survives an edit untouched. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysfix(island): review findings in the controls panelDanilo M.5-9/+25
Edit mode let a right-click and the wheel through to the tile, so a right-click opened the drawer and scroll changed volume, against the spec. The drag area now takes both buttons and the wheel. A scroll up on a level already above the cap, such as a mic set to 120% elsewhere, snapped it down to the cap. The cap now only stops a step up. Prefs logs a failed write, which printErrors off had silenced: the new order would otherwise vanish at the next restart with no trace. Its parsed object is renamed from data to doc, so it cannot shadow a base property of that name. The spec now says what was built: JSON.parse rather than a JsonAdapter, and the helper list as it is. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysdocs: the controls panel, its preferences file and bindDanilo M.2-2/+35
The island README gains the panel. AGENTS.md records that a bare SUPER release bind is cancelled by drag and scroll on Hyprland 0.56.2, which was the open risk in the spec, and that FileView creates parent directories while Quickshell.stateDir is per-shell. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysfeat(island): controls panel in the status pill, island IPCDanilo M.3-7/+56
A settings icon in the status pill opens the controls panel in the same capsule the sound panel uses. Right-click on a tile closes the panel and opens its drawer page. The island IPC target reveals the island and toggles the panel, for the SUPER release bind. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysfeat(island): controls grid with an edit modeDanilo M.1-0/+175
Four columns, the visible list from Prefs. Edit mode puts a MouseArea over each tile that drags it and drops it into the slot under its centre, a × that hides it, and a strip of hidden tiles with a + each. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
10 daysfeat(island): a control tile bound to its live stateDanilo M.1-0/+143
Wifi and bluetooth through the Quickshell services, DND, presentation and auto-lock through the Status registry, output and mic through the sound module's tracked nodes. A tile whose backing object has not arrived yet is dimmed and ignores input, which covers the two seconds before Networking and Bluetooth populate. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
10 daysfeat(desktop): preferences file under the state homeDanilo M.1-0/+69
The first preference is the controls panel's visible tiles. The file is written only on a change and keeps keys it does not know, so a broken or newer file is never clobbered by a shell that only read it. State home rather than the runtime dir because it must survive a reboot, rather than ~/.config because the shell writes it. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
10 daysfeat(island): pure tile table and order helpers for controlsDanilo M.2-0/+197
The controls panel's tiles, their icons and drawer pages, and every operation on the visible list: normalize, hide, show, move, the drop slot under a dragged tile, the audio fill and the scroll step. All pure, so the edit mode's logic is tested under node rather than by dragging. normalize keeps an empty list: hiding every tile is a choice, and only a value that is not a list falls back to the default. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
10 daysdocs(spec): controls panel uses named icons and a plain dragDanilo M.1-4/+15
Planning found two places where the spec diverged from the island it extends. Icons go through the icon theme like every other island icon, and drag is one MouseArea per tile with a pure drop-slot helper, which is less code than DragHandler and DropArea and can be tested under node. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysdocs(plan): controls panel implementation planDanilo M.1-0/+1063
Nine tasks: two spec corrections found while planning, the pure helpers with their node test, the preferences singleton, the tile, the panel, the island and IPC wiring, the SUPER release bind with its fallback, a visual pass with the user, and docs. The plan's test was run against the plan's Controls.js before committing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysdocs(spec): controls panel and preferences storeDanilo M.1-0/+147
Sub-project 2. A grid of seven toggles opened from the status pill and by a bare SUPER release, with an edit mode to reorder, hide and show tiles. The visible list lives in a JSON file under the state home, so a tile added to the code later starts hidden rather than appearing unasked. The drawer keeps the detail: right-click on a tile opens its page. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07fix(island): the handle fades out while the pills are shownDanilo M.1-0/+3
It is a handle for revealing the pills, so it gives way to them. While something captures it stays, being the only privacy indicator. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07docs(agents): a branch switch can drop a component until restartDanilo M.1-0/+7
Seen merging the island: the shell reloaded while desktop/island/ did not exist, and stayed without it after the fast-forward restored the files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07docs: the island, and waybar goneDanilo M.8-106/+209
AGENTS.md describes the hybrid model (desktop/ hosts drawer and island) and gains the gotchas found while building the island: UseQApplication for tray menus, WheelHandler vs MouseArea, accent colliding with green, xkb layout switching, and the tray popup un-hovering the island. The Blur waybar measurement becomes history. READMEs drop their present-tense waybar references. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07chore: remove waybarDanilo M.4-84/+12
The island replaces both bars: clock and VM dots in the clock pill, volume, tray, layout flag and privacy in the status pill and its sliver, mail count in the drawer. The icon switch no longer regenerates or reloads waybar, and the mail pill's watcher script goes with it. Workspaces and the taskbar have no persistent view by decision: the flick and the expose cover them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>