agent-activity
Streams what the agent is doing into the room, as rows the desktop client renders in an **events drawer** above the composer (collapsed: avatar, pulsing dots,…
Reusable pattern for focus-based auto-dimming of Electron overlay windows — when the app loses focus, all overlay windows fade to a low opacity; when an overlay regains focus, they return to their configured opacity. Use when building always-on-top Electron overlays that should
$ npx -y skills add sonichi/sutando --skill electron-overlay-dimming --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/electron-overlay-dimmingContext preview
The summary Claude sees to decide when to auto-load this skill.
Reusable pattern for focus-based auto-dimming of Electron overlay windows — when the app loses focus, all overlay windows fade to a low opacity; when an overlay regains focus, they return to their configured opacity. Use when building always-on-top Electron overlays that should
name: electron-overlay-dimming description: Reusable pattern for focus-based auto-dimming of Electron overlay windows — when the app loses focus, all overlay windows fade to a low opacity; when an overlay regains focus, they return to their configured opacity. Use when building always-on-top Electron overlays that should recede while the user works in other apps.
A small, self-contained pattern for always-on-top Electron overlays: the overlays stay readable while in use but **fade out of the way** when the user clicks into another application, and **restore** when focus returns to an overlay. First shipped in the `benchmark-overlay` app.
opacity drops to a dim level (~0.2).
opacity (not blindly to 1.0 — it respects any per-overlay opacity the user set).
Two pitfalls the pattern handles:
1. **Inter-overlay clicks.** Clicking from overlay A to overlay B fires a `blur` then a `focus`. Dimming on raw `blur` would flicker. The fix: on `blur`, defer ~80 ms and only dim if `BrowserWindow.getFocusedWindow()` is then `null` — i.e. the *app* truly lost focus, not just one window. 2. **Configured opacity.** Overlays may each have a user-set base opacity. Auto-dim must dim *from* and restore *to* that value, so opacity is always computed as `appDimmed ? DIM_OPACITY : overlay.config.opacity`.
const DIM_OPACITY = 0.2;
let appDimmed = false;
function effectiveOpacity(o) {
return appDimmed ? DIM_OPACITY : o.config.opacity;
}
function applyOpacityAll() {
for (const o of Object.values(OVERLAYS)) {
if (o.win && !o.win.isDestroyed()) o.win.setOpacity(effectiveOpacity(o));
}
}
app.on('browser-window-focus', () => {
if (appDimmed) { appDimmed = false; applyOpacityAll(); }
});
app.on('browser-window-blur', () => {
// Defer so an A→B overlay click doesn't briefly dim.
setTimeout(() => {
if (!appDimmed && !BrowserWindow.getFocusedWindow()) {
appDimmed = true;
applyOpacityAll();
}
}, 80);
});Any code path that sets a window's opacity (e.g. a config handler) must route through `effectiveOpacity()` so opacity changes made while dimmed don't undim the window.
Live implementation: `~/projects/benchmark-overlay/main.js` — the `benchmark-overlay` app applies this across three overlay windows (AI Benchmarks, System Resources, Hub Overlay).
My AI Stand — Realtime by Day, Rewriting Itself by Night. Summon my AI superpower. Voice, vision, screen, meetings, calls when I'm engaged. Learns my patterns, ships its own code when I'm not. Runs across my Macs, interacts with people & their Stands.
Repo: sonichi/sutando
Streams what the agent is doing into the room, as rows the desktop client renders in an **events drawer** above the composer (collapsed: avatar, pulsing dots,…
Local Agent Registry — a standalone, dependency-free service that tracks running Claude Code (and other) agent instances. Agents self-register on startup and…
**Prefer the `ag2-space` MCP tools when they are connected and the room exposes them** — availability is per-room and per-actor, so check…
Deterministic final-answer normalizer — a last-step pass for any task that ends in a *precise* answer (a number, a short string, a comma-list). Applies the…
Transcribes audio files and voice notes to text via Gemini 2.5-flash. Integrates with Slack, Discord, and Telegram bridges so voice clips surface as readable…
Act back on the owner's Bee wearable — the TOOL half of the Bee integration (channels-vs-tools split). The Bee CHANNEL (ag2-sparrow's `sources/bee.py` watcher)…