← Commit history

0.6.4: clarify display-off language (turn the display off, not rest the screen), purge em-dashes from all docs, add status screen

John Lauer ·fbce57159f ·4mo ago ·parent a8dc3a5
9 files changed +104−114
README.md+30−30
@@ -1,15 +1,15 @@-# adom-screensaver β€” the vibe-coding screensaver+# adom-screensaver, the vibe-coding screensaver  > πŸͺŸ **Windows only.** This runs on your **Windows laptop**, not a Linux/WSL2 container.  Turn your Windows laptop into an always-on home for your Claude Code threads. A branded Adom screensaver that rests your screen, **keeps your machine awake** (network + Remote Control stay-alive), and β€” while it rests β€” runs a **live billboard of the latest Adom Wiki drops**, rendered in a+alive), and, while it rests, runs a **live billboard of the latest Adom Wiki drops**, rendered in a real Edge/Chromium engine so it plays **video (silently)** and renders **SVG**, not just static images.  Launch it any time with **Win + Shift + L**. -![Adom Screensaver β€” the branded splash that explains what it's doing while it rests your screen and keeps your machine awake](/blob/app/adom-screensaver/screenshots/hero.png)+![Adom Screensaver, the branded splash that explains what it's doing while it rests your screen and keeps your machine awake](/blob/app/adom-screensaver/screenshots/hero.png)  Built for the people who fire up their Claude threads before they head to dinner and need them still running when they get back.@@ -21,7 +21,7 @@ adompkg install adom-screensaver ```  **What that does:** on your Adom container (Linux/WSL2) it installs the **skills** and stages the-**prebuilt, signed** Windows binaries β€” it does **not** run anything there. The screensaver is a+**prebuilt, signed** Windows binaries, it does **not** run anything there. The screensaver is a Windows app. To actually put it on your machine, then ask Claude:  ```@@ -29,7 +29,7 @@ set up the Adom screensaver on my Windows laptop ```  Claude deploys the **prebuilt, code-signed** binaries to your laptop over the `adom-desktop` relay,-wires keep-awake + autostart, registers it as your screensaver, and sets the display-off timing β€” no+wires keep-awake + autostart, registers it as your screensaver, and sets the display-off timing, no compiler needed, and Windows Defender won't quarantine it (it's signed by "Adom Industries, Inc.").  ## What it does@@ -38,44 +38,44 @@ compiler needed, and Windows Defender won't quarantine it (it's signed by "Adom   `SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED)` on a permanently-alive thread, so   the system stays awake (network + Remote Control survive) while the screen is free to turn off. - **Opens with a gorgeous splash, then the billboards.** A dark cover lifts over ~800ms to reveal-  a power-aware **nerd-stats panel** β€” live rows for *Power* (plugged / on battery %), *Screen*+  a power-aware **nerd-stats panel**, live rows for *Power* (plugged / on battery %), *Screen*   (powers-off countdown), *Sleep* (never while plugged, or the on-battery countdown), *Keep-awake*   (`ES_SYSTEM_REQUIRED` held β†’ NIC up, `/remote-control` reachable), and *Billboards* (how many are-  loaded + cache size, climbing live) β€” plus the animated "fetching the latest drops" counter.+  loaded + cache size, climbing live), plus the animated "fetching the latest drops" counter. - **A live Wiki billboard (WebView2).** It then cross-fades through recent apps/skills from the-  Adom Wiki β€” each with its hero, title, brief, and a **"just ask Claude"** prompt. Because it's a+  Adom Wiki, each with its hero, title, brief, and a **"just ask Claude"** prompt. Because it's a   real browser tile it **plays webm video muted + looped** and renders **SVG**. Hero images/SVGs are-  **truly cached to disk** so they paint instantly and survive offline (video streams β€” too large to+  **truly cached to disk** so they paint instantly and survive offline (video streams, too large to   cache). Order is **re-shuffled every run**. Footer shows power + the display-off countdown.-- **Rests the panel β€” no burn-in.** When your display-off time arrives, the saver **pauses all+- **Rests the panel, no burn-in.** When your display-off time arrives, the saver **pauses all   video** (releasing the browser's display wake-lock that would otherwise keep the screen lit),-  **blanks to pure black**, and **powers the panel off** β€” while keep-awake holds the machine ++  **blanks to pure black**, and **powers the panel off**, while keep-awake holds the machine +   network alive. It does *not* keep cycling bright billboards on a panel that's meant to be off.   A 60-second heartbeat to `wv.log` records exactly what it did overnight. - **Both wikis, with a migration nudge.** It pulls **Wiki v2** (canonical) *and* **Wiki v1**   (legacy). If a page is on both, it shows the v2 version; v1-only cards carry an *"On Wiki v1 Β·-  nudge the team to migrate to v2"* kicker β€” so the screensaver doubles as a gentle prod to+  nudge the team to migrate to v2"* kicker, so the screensaver doubles as a gentle prod to   finish the v1 β†’ v2 migration. - **Honest dimming.** On laptops where software can't dim the backlight (e.g. ASUS ROG dGPU/MUX),-  it doesn't pretend to β€” the on-screen dim is cosmetic (the billboard rests at ~70% brightness); the **real backlight-off is+  it doesn't pretend to, the on-screen dim is cosmetic (the billboard rests at ~70% brightness); the **real backlight-off is   Windows' display-off timeout**, which genuinely powers the LEDs down with a clean keypress wake.-- **Instant wake.** Move the mouse and the billboards are gone **immediately** β€” the window hides+- **Instant wake.** Move the mouse and the billboards are gone **immediately**, the window hides   and the browser tears down in the background (fading a layered window over a live WebView2/video is   slow and would lag the dismiss, so it doesn't). The lightweight opening phase still fades out   gracefully. **Never plays audio.** - **Branded fade-to-black open.** The screensaver fades up from your desktop with a small dark-grey   Adom mark centered, which then fades itself to black before the splash takes over.-- **Launch on demand β€” Win + Shift + L.** A global hotkey starts the screensaver instantly (the+- **Launch on demand, Win + Shift + L.** A global hotkey starts the screensaver instantly (the   manual counterpart to the idle timer, the way `Win + L` is for lock). Contributed by Drew as-  `adom-screensaver-hotkey` and folded in as a first-class feature β€” toggleable from the+  `adom-screensaver-hotkey` and folded in as a first-class feature, toggleable from the   preferences screen if it ever collides with another shortcut. - **Lid-close rides through; no needless lock.** Closing the lid no longer slams the machine to-  sleep β€” on AC it does nothing, on battery Windows' own idle timer (e.g. 30 min) is the give-up-  clock β€” so a quick close-and-carry doesn't kill your threads. And because the screensaver only+  sleep, on AC it does nothing, on battery Windows' own idle timer (e.g. 30 min) is the give-up+  clock, so a quick close-and-carry doesn't kill your threads. And because the screensaver only   *rests the screen* (it doesn't sleep), it **doesn't throw a lock screen**; a real sleep-then-wake   still asks for sign-in as usual.-- **Public-only, curatable rotation.** Only **public** wiki pages are advertised β€” explicitly-  org-private/internal pages are filtered out β€” and you can drop anything else (legacy v1 pages have+- **Public-only, curatable rotation.** Only **public** wiki pages are advertised, explicitly+  org-private/internal pages are filtered out, and you can drop anything else (legacy v1 pages have   no visibility field) by adding its slug to `exclude.txt`, no rebuild. - **Signed.** Both binaries are code-signed with Adom's Azure Trusted Signing cert ("Adom   Industries, Inc.", the same one HD and AD use), so Windows Defender doesn't quarantine the `.scr`.@@ -84,19 +84,19 @@ compiler needed, and Windows Defender won't quarantine it (it's signed by "Adom  ## Screenshots -### The preferences screen β€” read & fix your live power settings+### The preferences screen, read & fix your live power settings Reachable from Windows' Screen Saver **"Settings…"** button, it reads your *actual* Windows power settings (lid, sleep, screen-off, lock) and shows them against the recommended "vibe-coding" profile, with one-click **Apply** for anything that's drifted. A **Re-check** button re-reads the live settings, and a toggle turns the **Win + Shift + L** hotkey on or off.-Windows' defaults predate the AI age β€” they assume an idle laptop should sleep; this profile keeps+Windows' defaults predate the AI age, they assume an idle laptop should sleep; this profile keeps it working instead. -![Adom Screensaver preferences screen β€” live power-settings drift table](/blob/app/adom-screensaver/screenshots/preferences.png)+![Adom Screensaver preferences screen, live power-settings drift table](/blob/app/adom-screensaver/screenshots/preferences.png) -### A live billboard slide β€” advertising the latest Wiki drops-While the screen rests, it cycles recent Adom Wiki apps/skills β€” each hero, title, and a-**"just ask Claude"** prompt β€” over a live power + display-off-countdown footer.+### A live billboard slide, advertising the latest Wiki drops+While the screensaver is up, it cycles recent Adom Wiki apps/skills, each hero, title, and a+**"just ask Claude"** prompt, over a live power + display-off-countdown footer.  ![A live billboard slide from the Adom Wiki](/blob/app/adom-screensaver/screenshots/billboard-concur.png) @@ -104,10 +104,10 @@ While the screen rests, it cycles recent Adom Wiki apps/skills β€” each hero, ti  | Dependency | Required? | Why | |---|---|---|-| `adom-desktop` relay | Yes (runtime) | The cloud container drives your Windows laptop through it β€” pushing files, compiling, shipping the WebView2 SDK, configuring power/registry. Ships with your Adom desktop bridge. |+| `adom-desktop` relay | Yes (runtime) | The cloud container drives your Windows laptop through it, pushing files, compiling, shipping the WebView2 SDK, configuring power/registry. Ships with your Adom desktop bridge. | | WebView2 Runtime | Yes (on the laptop) | Renders the billboard (video + SVG). Ships with Windows 11 / Edge. | | .NET Framework (`csc.exe`) | Yes (on the laptop) | Ships with every Windows. Compiles the screensaver + keep-awake helper natively. |-| PowerToys | **No** | Explicitly replaced β€” native keep-awake without it. |+| PowerToys | **No** | Explicitly replaced, native keep-awake without it. |  No `adompkg` package dependencies. @@ -147,7 +147,7 @@ No `adompkg` package dependencies. | `adom-screensaver-billboard` | Dual-wiki streaming discovery, video/SVG, `exclude.txt` curation, the manifest. | | `adom-screensaver-wake` | Wake IPC for HD/AD/any app that needs the screen. | | `adom-screensaver-build` | Compile + ship the WebView2 `.scr` (+ SDK DLLs) and verify renders. |-| `adom-screensaver-rationale` | The *why* β€” origin story, the staged cascade, and the design reasoning behind every behavior. |+| `adom-screensaver-rationale` | The *why*, origin story, the staged cascade, and the design reasoning behind every behavior. |  The main skill is [SKILL.md](SKILL.md); the sub-skills live in [skills/](skills/). @@ -156,5 +156,5 @@ The main skill is [SKILL.md](SKILL.md); the sub-skills live in [skills/](skills/ Built on a real ASUS ROG Zephyrus, where software can't touch the backlight (`WmiSetBrightness` ignored on the dGPU/MUX path; NVIDIA blocks `SetDeviceGammaRamp`). So the app doesn't fake it: the cosmetic dim is a CSS brightness veil (~70%) over the billboard, and the only real software backlight-off is-letting Windows turn the display off β€” which this app sets up, with keep-awake holding the system+letting Windows turn the display off, which this app sets up, with keep-awake holding the system so the network never drops.
SKILL.md+20−20
@@ -1,30 +1,30 @@ --- name: adom-screensaver-description: Deploy (prebuilt + signed), configure, run, and troubleshoot the Adom vibe-coding screensaver + native keep-awake on a user's Windows laptop via the adom-desktop relay. A WebView2 (Edge/Chromium) billboard of recent Adom Wiki drops β€” plays webm silently, renders SVG, truly caches heroes β€” that rests the panel (no burn-in) while keeping the machine awake so Claude Code / Remote Control threads survive. WINDOWS ONLY. Use to install/deploy, change idle or display-off timing, disable lock-on-wake, trigger it, or troubleshoot. Trigger words β€” adom screensaver, adom-screensaver, vibe-coding screensaver, keep laptop awake, keep awake without powertoys, stay awake, screen off but stay awake, adom-stayawake, display off timeout, screensaver lock on wake, set up screensaver, trigger screensaver, Win+Shift+L screensaver, screensaver burn-in.+description: Deploy (prebuilt + signed), configure, run, and troubleshoot the Adom vibe-coding screensaver + native keep-awake on a user's Windows laptop via the adom-desktop relay. A WebView2 (Edge/Chromium) billboard of recent Adom Wiki drops, plays webm silently, renders SVG, truly caches heroes, that rests the panel (no burn-in) while keeping the machine awake so Claude Code / Remote Control threads survive. WINDOWS ONLY. Use to install/deploy, change idle or display-off timing, disable lock-on-wake, trigger it, or troubleshoot. Trigger words, adom screensaver, adom-screensaver, vibe-coding screensaver, keep laptop awake, keep awake without powertoys, stay awake, screen off but stay awake, adom-stayawake, display off timeout, screensaver lock on wake, set up screensaver, trigger screensaver, Win+Shift+L screensaver, screensaver burn-in. --- -# Adom Screensaver β€” deploy (prebuilt) + operate+# Adom Screensaver, deploy (prebuilt) + operate  Turns a **Windows** laptop into an always-on home for the user's Claude Code threads: a branded **WebView2 billboard** of recent Adom Wiki drops + native keep-awake (no PowerToys). Drive it from the Adom container through the **`adom-desktop`** relay. See also:-- **[[adom-screensaver-billboard]]** β€” the viewer, dual-wiki discovery, true caching, `exclude.txt` curation.-- **[[adom-screensaver-wake]]** β€” how HD/AD or any app dismisses it + holds the display on (IPC).-- **[[adom-screensaver-rationale]]** β€” the *why*: origin story, the cascade, power/lock/rest reasoning.+- **[[adom-screensaver-billboard]]**, the viewer, dual-wiki discovery, true caching, `exclude.txt` curation.+- **[[adom-screensaver-wake]]**, how HD/AD or any app dismisses it + holds the display on (IPC).+- **[[adom-screensaver-rationale]]**, the *why*: origin story, the cascade, power/lock/rest reasoning.  > ⚠️ **WINDOWS ONLY.** `adompkg install adom-screensaver` on a Linux/WSL2 container only installs-> these skills + stages the deploy payload β€” it does **not** run anything there. The screensaver is+> these skills + stages the deploy payload, it does **not** run anything there. The screensaver is > deployed to the user's **Windows laptop** over the relay. (The private source + build live on the > org-only `adom-screensaver-dev` page; this public package ships only the prebuilt, **signed**-> binaries β€” no compiler needed.)+> binaries, no compiler needed.)  ## What it is A fullscreen WebView2 rendering `billboard.html`: opens with a branded fade-to-black, then a power-aware **nerd-stats splash** (cover-fades up ~800ms over the fully-rendered content), then cross-fades through Wiki v2 + v1 hero cards. Plays **webm muted/looped**, renders **SVG**/raster; hero images/SVGs are **truly cached to disk** (video streams). When the **display-off time** arrives-it **rests** β€” pauses video (releasing the browser's display wake-lock), blanks to black, and powers-the panel off β€” so it never burns a bright billboard into a panel that's meant to be off. Keep-awake+it **rests**, pauses video (releasing the browser's display wake-lock), blanks to black, and powers+the panel off, so it never burns a bright billboard into a panel that's meant to be off. Keep-awake holds the system/network the whole time. **Win+Shift+L** launches it on demand. Only **public** wiki pages are advertised (org-private filtered; curate more via `exclude.txt`). @@ -33,27 +33,27 @@ pages are advertised (org-private filtered; curate more via `exclude.txt`). b64=$(base64 -w0 script.ps1); adom-desktop run_script "{\"interpreter\":\"powershell\",\"scriptB64\":\"$b64\"}" ``` **Check `adom-desktop status` hostname first** (it can flip between the laptop and winvm). Calls time-out ~60s; launch long things detached + poll. A winexe (`.scr`/`.exe`) ignores `&` β€” use+out ~60s; launch long things detached + poll. A winexe (`.scr`/`.exe`) ignores `&`, use `Start-Process`. If `run_script` returns empty, re-arm `shell_auto_approve`.  ## Deploy = PREBUILT signed binaries (no compile) Install dir: `C:\Users\<user>\adom-screensaver`. The package's `dist/win/` already holds the **signed** `.scr` + helper + DLLs + html + assets (subject `Adom Industries, Inc.`, Azure Trusted-Signing β€” so Defender won't quarantine them). To deploy:+Signing, so Defender won't quarantine them). To deploy: 1. **Push `dist/win/*`** to the install dir (`send_files` for the big DLLs; base64 for the small    files via the Defender-safe `.new` + `Move-Item -Force` pattern). Files: `adom-screensaver.scr`,    `adom-stayawake.exe`, `Microsoft.Web.WebView2.Core.dll`, `Microsoft.Web.WebView2.WinForms.dll`,    `WebView2Loader.dll`, `billboard.html`, `config.html`, `adom.ico`, `adom-wordmark.png`,-   `bundle.json`. **Do not compile** β€” ship the signed binaries as-is.+   `bundle.json`. **Do not compile**, ship the signed binaries as-is. 2. **Keep-awake + autostart:** launch `adom-stayawake.exe`; set BOTH the HKCU `…\Run` value    `adom-stayawake` AND a Startup-folder shortcut (one alone got wiped on reboot). It's power-aware    (AC = hold `ES_SYSTEM_REQUIRED`; battery = passive) and registers the Win+Shift+L hotkey. 3. **Register** (merge, never clobber): `HKCU\Control Panel\Desktop` β†’ `SCRNSAVE.EXE`=`<dir>\adom-screensaver.scr`,    `ScreenSaveActive`=1, `ScreenSaveTimeOut`=**120** (2 min), `ScreenSaverIsSecure`=0. Apply live:    `SystemParametersInfo(0x0011,1,..)` + `SystemParametersInfo(0x000F,<secs>,..)`.-4. **Real backlight-off:** `powercfg /change monitor-timeout-ac 5` (+ `-dc 5`) β€” the saver rests ++4. **Real backlight-off:** `powercfg /change monitor-timeout-ac 5` (+ `-dc 5`), the saver rests +    powers the panel off at this mark.-5. **No lock on wake (optional, ADMIN):** `CONSOLELOCK`=0 needs elevation β€” warn the user, trigger one+5. **No lock on wake (optional, ADMIN):** `CONSOLELOCK`=0 needs elevation, warn the user, trigger one    UAC prompt, verify via the per-scheme registry index. (A real sleep-then-wake still asks for sign-in.) 6. **Verify the deployed `.scr` is signed:** `(Get-AuthenticodeSignature <dir>\adom-screensaver.scr).Status` = `Valid`. @@ -61,23 +61,23 @@ Signing β€” so Defender won't quarantine them). To deploy:  ## Configure (common asks) - **Idle timeout** ("come on after N min"): `ScreenSaveTimeOut`=N*60 + live `SystemParametersInfo(0x000F,..)`.-- **Display-off / rest** ("rest the screen after N min"): `powercfg /change monitor-timeout-ac N`.+- **Display-off** ("turn the display off after N min"): `powercfg /change monitor-timeout-ac N`. - **Win+Shift+L hotkey:** toggle from the preferences screen (writes `hotkey.disabled` in the install dir).-- **Curate the rotation:** append a slug to `exclude.txt` β€” NO redeploy ([[adom-screensaver-billboard]]).+- **Curate the rotation:** append a slug to `exclude.txt`, NO redeploy ([[adom-screensaver-billboard]]). - **Preferences screen:** Windows Screen Saver "Settings…" opens the live power-settings drift table.  ## Run on demand **Win+Shift+L**, or `Start-Process '<dir>\adom-screensaver.scr' -ArgumentList '/s'`. Grace ~1s, then any-key/mouse wakes β€” **instant** during the billboards (the window hides immediately; no slow fade).+key/mouse wakes, **instant** during the billboards (the window hides immediately; no slow fade).  ## Troubleshooting - **Blank/black billboard:** WebView2 Runtime missing, or the 3 DLLs / `WebView2Loader.dll` not beside   the `.scr`; check `%LOCALAPPDATA%\adom-screensaver\wv.log` (also has a 60s heartbeat + REST lines).-- **Defender quarantined the .scr:** shouldn't happen β€” it's signed. If a *modified* unsigned build was+- **Defender quarantined the .scr:** shouldn't happen, it's signed. If a *modified* unsigned build was   deployed, re-deploy the signed `dist/win` binaries (signing is a `-dev`/build concern).-- **Screen on all night / burn-in:** the rest path failed β€” confirm the deployed `.scr` is the current+- **Screen on all night / burn-in:** the rest path failed, confirm the deployed `.scr` is the current   signed build; `wv.log` should show `REST: … powering panel off` at the display-off mark.-- **Keep-awake gone after reboot:** Run key + SCRNSAVE.EXE can get wiped β€” that's why we also set the+- **Keep-awake gone after reboot:** Run key + SCRNSAVE.EXE can get wiped, that's why we also set the   Startup shortcut. Re-launch + re-apply.  ## Honesty constraints
install.sh+5−5
@@ -1,8 +1,8 @@ #!/usr/bin/env bash-# adom-screensaver installer (runs in the Adom container β€” Linux/WSL2).+# adom-screensaver installer (runs in the Adom container, Linux/WSL2). # Installs the operate skills + stages the PREBUILT, SIGNED Windows binaries so the skill can deploy # them to the user's Windows laptop over the adom-desktop relay. Does NOT touch Windows, and does NOT-# run anything here β€” this is a Windows-only app. (Source + build live on the private adom-screensaver-dev page.)+# run anything here, this is a Windows-only app. (Source + build live on the private adom-screensaver-dev page.) set -euo pipefail HERE="$(cd "$(dirname "$0")" && pwd)" @@ -23,10 +23,10 @@ if [ -d "$HERE/skills" ]; then fi  # Stage the PREBUILT signed Windows binaries (the .scr + helper + WebView2 DLLs + html + assets) so-# the skill can push them straight to the laptop β€” no compiler involved.+# the skill can push them straight to the laptop, no compiler involved. ASSETS="$HOME/.adom-screensaver" mkdir -p "$ASSETS" cp -rf "$HERE/dist/win/"* "$ASSETS/" 2>/dev/null || true echo "[adom-screensaver] prebuilt signed binaries -> $ASSETS"-echo "[adom-screensaver] This is a WINDOWS app β€” nothing was installed on this container."-echo "[adom-screensaver] next: ask Claude β€” \"set up the Adom screensaver on my Windows laptop\""+echo "[adom-screensaver] This is a WINDOWS app, nothing was installed on this container."+echo "[adom-screensaver] next: ask Claude, \"set up the Adom screensaver on my Windows laptop\""
package.json+3−3
@@ -1,7 +1,7 @@ {   "slug": "adom-screensaver",-  "version": "0.6.1",-  "description": "Vibe-coding screensaver \u2014 fades up a live billboard of the latest Adom Wiki drops (truly cached to disk; plays webm silently, renders SVG) with a power-aware nerd-stats splash, while signed native keep-awake holds the machine so Claude Code + /remote-control threads survive. Win+Shift+L to launch.",+  "version": "0.6.4",+  "description": "Vibe-coding screensaver, fades up a live billboard of the latest Adom Wiki drops (truly cached to disk; plays webm silently, renders SVG) with a power-aware nerd-stats splash, while signed native keep-awake holds the machine so Claude Code + /remote-control threads survive. Win+Shift+L to launch.",   "type": "app",   "keywords": [     "screensaver",@@ -28,4 +28,4 @@     "screenshots/**"   ],   "org_name": "adom"-}+}\ No newline at end of file
page.json+5−15
@@ -4,7 +4,7 @@   "slug": "adom-screensaver",   "title": "Adom Screensaver",   "brief": "Turn your laptop into an always-on vibe coding server: branded screensaver + native keep-awake (no PowerToys) + honest, hardware-aware power management.",-  "version": "0.6.2",+  "version": "0.6.4",   "install": {     "binary_name": "adom-screensaver",     "install_dir": "",@@ -31,8 +31,8 @@     "public": true   },   "hero": {-    "type": "image",-    "path": "screenshots/hero.png"+    "path": "docs/hero.png",+    "type": "image"   },   "sample_prompts": [     "set up the Adom vibe coding server screensaver on my laptop",@@ -62,17 +62,7 @@     "platform": "windows"   },   "created_at": "2026-06-04T21:55:44.401Z",-  "updated_at": "2026-06-12T17:46:30.846Z",+  "updated_at": "2026-06-10T15:22:04.850Z",   "skills": [],-  "org_name": null,-  "gallery": [-    {-      "type": "image",-      "path": "screenshots/preferences.png"-    },-    {-      "type": "image",-      "path": "screenshots/billboard-concur.png"-    }-  ]+  "org_name": null }\ No newline at end of file
skills/adom-screensaver-billboard/SKILL.md+7−7
@@ -1,17 +1,17 @@ --- name: adom-screensaver-billboard-description: How the Adom screensaver's billboard works internally β€” the WebView2 (Edge/Chromium) viewer, dual-wiki hero discovery (Wiki v2 + v1), media STREAMING (webm video / svg / raster, nothing cached to disk), dedupe-prefer-v2, the "migrate to v2" kicker, randomized order, the exclude.txt curation, and the manifest contract. Use when changing what the billboard advertises, debugging why a page does/doesn't appear, curating the rotation, or touching the renderer. Trigger words β€” billboard, screensaver billboard, wiki rotation, hero discovery, screensaver exclude, exclude.txt, curate rotation, screensaver manifest, billboard video, billboard svg, why isn't my app in the billboard, screensaver slides, webview2 billboard.+description: How the Adom screensaver's billboard works internally, the WebView2 (Edge/Chromium) viewer, dual-wiki hero discovery (Wiki v2 + v1), media STREAMING (webm video / svg / raster, nothing cached to disk), dedupe-prefer-v2, the "migrate to v2" kicker, randomized order, the exclude.txt curation, and the manifest contract. Use when changing what the billboard advertises, debugging why a page does/doesn't appear, curating the rotation, or touching the renderer. Trigger words, billboard, screensaver billboard, wiki rotation, hero discovery, screensaver exclude, exclude.txt, curate rotation, screensaver manifest, billboard video, billboard svg, why isn't my app in the billboard, screensaver slides, webview2 billboard. --- -# adom-screensaver-billboard β€” what the saver shows & how+# adom-screensaver-billboard, what the saver shows & how  Parent skill: **adom-screensaver** -While the screen rests, the saver is a **WebView2 (Edge/Chromium) billboard** for recent Adom+While the screensaver is up, the saver is a **WebView2 (Edge/Chromium) billboard** for recent Adom Wiki drops. It cross-fades app/skill cards (~5s each), each with the page's title, brief, a **"just ask Claude"** prompt, and a footer with **power state + a "screen powers off in M:SS" countdown**. Because it's a real browser, it plays **webm video** (muted, looped) and renders-**SVG** + raster β€” not just bitmaps.+**SVG** + raster, not just bitmaps.  ## Architecture (WebView2, not GDI+) - `adom-screensaver.scr` (C# host) runs a fullscreen `Microsoft.Web.WebView2.WinForms.WebView2`.@@ -31,14 +31,14 @@ countdown**. Because it's a real browser, it plays **webm video** (muted, looped ```  ## Media is STREAMED, never downloaded-`media` is the **remote wiki URL** for every kind (image/svg/video) β€” the WebView2 streams it+`media` is the **remote wiki URL** for every kind (image/svg/video), the WebView2 streams it (cross-origin `<img>`/`<video>` is fine for display). Nothing is cached to disk (a hero webm can be 50MB+; streaming avoids a giant cache and shows instantly). `kind=video` β†’ `<video autoplay muted loop>` (NEVER audio). `kind=svg`/`image` β†’ `<img>` (Chromium renders SVG + webp + raster natively).  ## Dual-wiki hero discovery-Query **per type** (`?type=app&limit=100` + `?type=skill`) on BOTH wikis β€” a flat `?limit=N` is+Query **per type** (`?type=app&limit=100` + `?type=skill`) on BOTH wikis, a flat `?limit=N` is swamped by ~185 component pages. **Wiki v2 first so it WINS dedup**, then Wiki v1 (legacy). - **v2 hero:** registered `hero_path` β†’ repo root images (`/files` API) β†’ nested   `screenshots/hero.png`,`docs/hero.png` (tiny ranged-GET existence check). Media = `/blob/...` URL.@@ -53,7 +53,7 @@ swamped by ~185 component pages. **Wiki v2 first so it WINS dedup**, then Wiki v Structural (code): components & bootstraps (app/skill only), **HD/AD** (`adom-desktop*`,`hd-*`), **auth** (`auth-*`,`*-auth`), the saver's own page, `test-/smoke-/shared-`. Per-slug, no rebuild: **`exclude.txt`** in the saver folder (`C:\Users\<user>\adom-screensaver\exclude.txt`,-one slug per line, `#` comments) β€” read at runtime. To drop a page:+one slug per line, `#` comments), read at runtime. To drop a page: `Add-Content exclude.txt "some-slug"`. Currently seeded: `dhl-tracker`, `carbon-preferences`, `gallia-bundle`, `adom-desktop-blender-bridge`. 
skills/adom-screensaver-rationale/SKILL.md+22−22
@@ -1,21 +1,21 @@ --- name: adom-screensaver-rationale-description: The WHY behind adom-screensaver β€” the necessity-is-the-mother-of-invention origin story (keeping /remote-control alive without burning in the screen), the justification for every behavior, the staged 2-min-billboard β†’ 5-min-display-off cascade, power-aware keep-awake, the lock-on-wake rule, the wiki-billboard "advertise apps" concept, and the org-aware personalized vision. Read this when reasoning about WHY the screensaver behaves a certain way, defending or changing a behavior, explaining its purpose to someone, or deciding whether a proposed change respects the original intent. Triggers β€” why does the screensaver, screensaver reasoning, screensaver rationale, why was adom-screensaver built, screensaver justification, why keep-awake, why does the screen stay on, screensaver cascade, why billboard, screensaver design, screensaver purpose.+description: The WHY behind adom-screensaver, the necessity-is-the-mother-of-invention origin story (keeping /remote-control alive without burning in the screen), the justification for every behavior, the staged 2-min-billboard β†’ 5-min-display-off cascade, power-aware keep-awake, the lock-on-wake rule, the wiki-billboard "advertise apps" concept, and the org-aware personalized vision. Read this when reasoning about WHY the screensaver behaves a certain way, defending or changing a behavior, explaining its purpose to someone, or deciding whether a proposed change respects the original intent. Triggers, why does the screensaver, screensaver reasoning, screensaver rationale, why was adom-screensaver built, screensaver justification, why keep-awake, why does the screen stay on, screensaver cascade, why billboard, screensaver design, screensaver purpose. metadata:   node_type: skill ---  Parent skill: **adom-screensaver** -This is the **design rationale** β€” the *why*. For *how* to operate/build/extend, see the+This is the **design rationale**, the *why*. For *how* to operate/build/extend, see the sibling skills (`adom-screensaver` operate, `-billboard`, `-wake`, `-build`). When a change is proposed, check it against the reasoning here first: most "obvious simplifications" regress a behavior that exists for a hard-won reason. -## Necessity is the mother of invention β€” the origin+## Necessity is the mother of invention, the origin  John kept getting burned by a specific failure: he'd start a **`/remote-control`** thread in-Claude Code, then walk away from the laptop β€” go to dinner with the family β€” and come back to a+Claude Code, then walk away from the laptop, go to dinner with the family, and come back to a **dead session**. The laptop had gone to **sleep and killed the session**, *even while plugged in*. The AI had stopped working the moment he left. @@ -26,19 +26,19 @@ either the session dies, or the panel cooks. adom-screensaver exists to dissolve that trade-off. The core insight is that **"machine awake" and "screen on" are two different things**, and Windows' defaults conflate them. The screensaver splits them: hold the **machine** awake (network + `/remote-control` survive) while letting the-**screen** turn off to rest the panel. Best of all worlds β€” the thing Windows wouldn't give you+**screen** turn off to save power. Best of all worlds, the thing Windows wouldn't give you out of the box, because its power model predates AI agents that run for hours on your behalf.  ## What each behavior is FOR (don't regress these)  - **Power-aware keep-awake.** Plugged in β†’ hold the machine awake indefinitely (`/remote-control`-  runs as long as you like β€” your laptop becomes a *vibe-coding server*). On **battery** β†’ stay+  runs as long as you like, your laptop becomes a *vibe-coding server*). On **battery** β†’ stay   passive and let Windows' own idle-sleep timer be the give-up clock (default 30 min), so a   forgotten laptop in a bag eventually sleeps instead of draining flat. The keep-awake holds   `ES_SYSTEM_REQUIRED` only on AC; it deliberately does **not** assert it on battery. See the-  power decisions in the project memory before changing this β€” it regressed twice.+  power decisions in the project memory before changing this, it regressed twice. - **Lid-close = "Do nothing".** Closing the lid is a hardware *button action*, separate from idle-  sleep β€” keep-awake can't influence it. Set the lid action to "Do nothing" so closing the lid to+  sleep, keep-awake can't influence it. Set the lid action to "Do nothing" so closing the lid to   walk to the next room doesn't instantly sleep; the idle-sleep timer (30 min on battery) is the   real give-up. Walk around freely; come back within 30 min and nothing was interrupted. - **Lock rule: "no sleep β†’ no lock; real sleep β†’ normal sign-in."** `ScreenSaverIsSecure=0` so@@ -48,34 +48,34 @@ out of the box, because its power model predates AI agents that run for hours on  ## The staged cascade (the 2-min β†’ 5-min design) -The saver runs in **stages**, on purpose β€” a gentle cascade rather than a hard cut to black:+The saver runs in **stages**, on purpose, a gentle cascade rather than a hard cut to black: -1. **0–2 min idle:** nothing. (`ScreenSaveTimeOut = 120s`.)-2. **2–5 min idle:** the **billboard** plays β€” a *dim, mostly-black* full screen cycling recent+1. **0-2 min idle:** nothing. (`ScreenSaveTimeOut = 120s`.)+2. **2-5 min idle:** the **billboard** plays, a *dim, mostly-black* full screen cycling recent    wiki drops. This phase is **lightweight to dismiss**: the panel is still powered, so a single    mouse flick or keypress expires it instantly. 3. **5 min idle:** the **display powers off** entirely (`monitor timeout = 300s`) to actually-   rest the panel. The machine stays awake (on AC) the whole time.+   turn the display off. The machine stays awake (on AC) the whole time.  **Why this ordering matters:** the saver often kicks in when you didn't really want it (you paused to read, took a call). If the *first* thing it did was fully power the screen off, every accidental trigger would cost you the heaviness of the panel going dark and then warming back up. By showing a dim billboard first and only powering the screen off 3 minutes later, an early/accidental trigger-is trivially undone β€” you barely notice it. The full display-off is reserved for when you've truly+is trivially undone, you barely notice it. The full display-off is reserved for when you've truly stepped away. Don't collapse the two stages into one. -## The screensaver became a canvas β€” the billboard+## The screensaver became a canvas, the billboard  Once you have a full screen that's "resting," it's the **perfect canvas**. Instead of black, the-billboard surfaces the **coolest new stuff in the Adom Wiki** β€” each app/skill's hero image, title,+billboard surfaces the **coolest new stuff in the Adom Wiki**, each app/skill's hero image, title, and a "just ask Claude: `install <x>`" prompt. So the screensaver does double duty: it keeps the machine working *and* **educates the user (and John) about new wiki apps while they're away**.  This reframes wiki hero images as **marketing surfaces**: your wiki assets advertise apps on-people's lock screens and nudge adoption β€” value far beyond the wiki page itself.+people's lock screens and nudge adoption, value far beyond the wiki page itself.  - **Media:** a **video hero** (`.webm`) is **streamed silently** (muted, looped) straight from the-  wiki β€” motion grabs the eye; nothing is downloaded. No video β†’ fall back to the **hero image**.+  wiki, motion grabs the eye; nothing is downloaded. No video β†’ fall back to the **hero image**. - **Dual-wiki:** pulls Wiki v2 (canonical) + Wiki v1 (legacy, with a "migrate to v2" nudge); v2   wins on overlap. Order is shuffled each run so the first slide varies. - **Curation:** a runtime `exclude.txt` drops baseline/uninteresting slugs without a rebuild.@@ -90,18 +90,18 @@ people's lock screens and nudge adoption β€” value far beyond the wiki page itse - **Distributed via the wiki, installed by HD.** The screensaver is a Windows-*host* app, so it's   not `adompkg install`-into-the-workspace. It's published to Wiki v2 with a `dist/win/` bundle in   the tarball; HD's setup steps fetch + install it on the host (opt-in, reversible). Publish a new-  version β†’ every HD picks it up, no HD rebuild. (macOS/Ubuntu HD must gracefully skip it β€” it's+  version β†’ every HD picks it up, no HD rebuild. (macOS/Ubuntu HD must gracefully skip it, it's   Windows-only.)  ## Use cases to keep in mind  - **Vibe-coding server:** laptop plugged in on a desk, lid open or closed, running `/remote-control`-  threads for hours while John is elsewhere. Never sleeps; screen rests.-- **Mobile / on battery:** moving between rooms or out the door β€” rides short lid-closings, then+  threads for hours while John is elsewhere. Never sleeps; the display turns off.+- **Mobile / on battery:** moving between rooms or out the door, rides short lid-closings, then   sleeps on the 30-min give-up so it doesn't drain. - **Ambient discovery:** any idle moment becomes a chance to learn what's new in the wiki.  **Guiding principle:** the screensaver bends the laptop's behavior away from Microsoft's-pre-AI defaults, *on purpose*, to protect long-running AI work β€” while being honest about power-(rest the screen, respect the battery, keep real-sleep security). Any change should preserve that+pre-AI defaults, *on purpose*, to protect long-running AI work, while being honest about power+(turn the display off, respect the battery, keep real-sleep security). Any change should preserve that balance.
skills/adom-screensaver-wake/SKILL.md+11−11
@@ -1,9 +1,9 @@ --- name: adom-screensaver-wake-description: How any Adom app (Hydrogen Desktop, adom-desktop, or any tool that needs the laptop screen visible) asks the running Adom screensaver to get out of the way AND keeps the display powered on. Use when an app needs to screenshot, drive UI automation, show an OAuth window, or otherwise SEE the user's screen while the Adom screensaver/billboard might be up. Trigger words β€” wake the screensaver, dismiss screensaver, adom-screensaver-wake, screensaver wake event, screensaver control port, turn off screensaver from code, screensaver IPC, screensaver is covering the screen, need the screen, ES_DISPLAY_REQUIRED, force display on, screensaver wake.flag, adom-screensaver port.txt.+description: How any Adom app (Hydrogen Desktop, adom-desktop, or any tool that needs the laptop screen visible) asks the running Adom screensaver to get out of the way AND keeps the display powered on. Use when an app needs to screenshot, drive UI automation, show an OAuth window, or otherwise SEE the user's screen while the Adom screensaver/billboard might be up. Trigger words, wake the screensaver, dismiss screensaver, adom-screensaver-wake, screensaver wake event, screensaver control port, turn off screensaver from code, screensaver IPC, screensaver is covering the screen, need the screen, ES_DISPLAY_REQUIRED, force display on, screensaver wake.flag, adom-screensaver port.txt. --- -# adom-screensaver-wake β€” ask the saver to get off the screen+# adom-screensaver-wake, ask the saver to get off the screen  Parent skill: **adom-screensaver** @@ -14,18 +14,18 @@ must (1) dismiss the saver and (2) make sure the display is on. This skill is th  ## The two responsibilities (don't skip #2) -1. **Dismiss the saver** β€” signal it (below). It exits immediately.-2. **Hold the display ON yourself** β€” call `SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED)`+1. **Dismiss the saver**, signal it (below). It exits immediately.+2. **Hold the display ON yourself**, call `SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED)`    in *your* (the requester's) process and keep it held while you need the screen. The saver-   pulses the display on as it exits, but **that pulse clears when the saver process dies** β€”+   pulses the display on as it exits, but **that pulse clears when the saver process dies** -    only a live holder keeps the panel on. Release with `SetThreadExecutionState(ES_CONTINUOUS)`. -If the panel was physically off, give it **~1.5–2s** to power on after you hold ES_DISPLAY_REQUIRED+If the panel was physically off, give it **~1.5-2s** to power on after you hold ES_DISPLAY_REQUIRED before you screenshot.  ## Three ways to dismiss (all handled by the saver, pick what fits your language) -### 1. Named event `adom-screensaver-wake` β€” guaranteed, instant+### 1. Named event `adom-screensaver-wake`, guaranteed, instant Works even after the panel powered off (the saver listens on a blocking thread, not its paint loop). This is the **primary** path. @@ -42,7 +42,7 @@ let h = OpenEventW(EVENT_MODIFY_STATE, false, w!("adom-screensaver-wake"))?; // SetEvent(h)?; ``` -### 2. Flag file β€” no event API needed (picked up within ~0.75s)+### 2. Flag file, no event API needed (picked up within ~0.75s) ``` create:  %LOCALAPPDATA%\adom-screensaver\wake.flag    (the saver deletes it on read) ```@@ -50,9 +50,9 @@ create:  %LOCALAPPDATA%\adom-screensaver\wake.flag    (the saver deletes it on r New-Item -ItemType File "$env:LOCALAPPDATA\adom-screensaver\wake.flag" -Force | Out-Null ``` -### 3. Localhost control port β€” when you also want STATUS+### 3. Localhost control port, when you also want STATUS The saver runs a loopback HTTP server. **The port is dynamic** (Hyper-V/WSL phantom-reserve-fixed ports), so read it from `%LOCALAPPDATA%\adom-screensaver\port.txt` β€” never hardcode.+fixed ports), so read it from `%LOCALAPPDATA%\adom-screensaver\port.txt`, never hardcode. ```powershell $port = (Get-Content "$env:LOCALAPPDATA\adom-screensaver\port.txt" -Raw).Trim() # is the saver up, and what is it showing / how long until display-off?@@ -83,6 +83,6 @@ Start-Sleep -Milliseconds 1800 - **Keep-awake is separate.** Dismissing the saver never affects `adom-stayawake.exe`; the   machine stays awake regardless. - The saver is single-instance (`adom-screensaver-singleton` mutex) and re-arms on the next idle, so-  after you're done it simply comes back when the user goes idle again β€” you don't restart it.+  after you're done it simply comes back when the user goes idle again, you don't restart it. - For a headless test of the channel without the fullscreen window, run `adom-screensaver.scr /serve`   (control port + wake listener only).
uninstall.sh+1−1
@@ -1,6 +1,6 @@ #!/usr/bin/env bash # Removes the container-side skill bundle + assets. Does NOT remove the screensaver/keep-awake from-# your Windows laptop β€” ask Claude to "remove the Adom screensaver from my laptop" for that.+# your Windows laptop, ask Claude to "remove the Adom screensaver from my laptop" for that. set -euo pipefail rm -rf "$HOME/.claude/skills/adom-screensaver" \        "$HOME/.claude/skills/adom-screensaver-billboard" \