ov/skills/wl-overlay/SKILL.md
Fullscreen Wayland overlays for screen recordings via gtk4-layer-shell. MUST be invoked before any work involving: ov test wl overlay commands, recording overlays, title cards, lower-thirds, countdowns, or fade transitions.
npx skillsauth add overthinkos/overthink-plugins wl-overlayInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
ov test wl overlay creates and manages fullscreen Wayland overlays using the layer-shell protocol via gtk4-layer-shell. Overlays render directly in the compositor, appearing natively in screen recordings without post-production editing. Supports true alpha transparency — desktop content is visible through semi-transparent overlays.
Three components work together:
wl-overlay layer — installs gtk4-layer-shell, gtk4, python3-gobject RPMs + ov-overlay Python daemon/clientov test wl overlay Go commands — CLI that resolves the container and invokes ov-overlay inside itov-overlay daemon — GTK4 application managing multiple named overlay windows via Unix socket IPCThe daemon starts on-demand in a tmux session (ov-overlay-daemon) when the first show command is issued. It persists until hide --all or the tmux session is killed.
| Action | Command | Description |
|--------|---------|-------------|
| Show overlay | ov test wl overlay show <image> --type text --text "Hello" | Display a named overlay |
| Hide one | ov test wl overlay hide <image> --name intro | Remove specific overlay |
| Hide all | ov test wl overlay hide <image> --all | Remove all overlays |
| List | ov test wl overlay list <image> | List active overlays (JSON) |
| Status | ov test wl overlay status <image> | Check daemon health |
Full-screen semi-transparent overlay with centered text. Use for intro/outro title cards.
ov test wl overlay show myimage --type text \
--text "Building a REST API" \
--bg "rgba(0,0,0,0.7)" \
--font-size 64 --name title
Bottom-anchored bar with name and optional subtitle. Use for speaker identification.
ov test wl overlay show myimage --type lower-third \
--text "Andreas Trawoeger" \
--subtitle "Developer" --name speaker
Corner-anchored persistent text at low opacity. Use for draft/preview markers.
ov test wl overlay show myimage --type watermark \
--text "DRAFT" --position bottom-right \
--color red --opacity 0.5 --name wm
Default opacity is 0.3. Positions: top-left, top-right, bottom-left, bottom-right, top, bottom.
Full-screen animated countdown that auto-hides on completion. Use before recording starts.
ov test wl overlay show myimage --type countdown --seconds 5 --name cd
Transparent overlay with a colored rectangle at specified coordinates. Use to draw attention to a screen region.
ov test wl overlay show myimage --type highlight \
--region "430,290,510,50" \
--color "rgba(255,0,0,0.4)" --name hl
Region format: X,Y,Width,Height in pixels.
Full-screen solid color overlay. Use for transitions (fade to black, fade to white).
ov test wl overlay show myimage --type fade --color black --name outro
Any overlay (except countdown, which has built-in auto-hide) can auto-remove after a duration:
ov test wl overlay show myimage --type text --text "INTRO" --duration 5s --name intro
Supported formats: 5s, 1.5m, 500ms, or bare seconds (5).
Overlays compose naturally with ov test record:
# Title card
ov test wl overlay show myimage --type text --text "Building a REST API" \
--bg "rgba(0,0,0,0.9)" --font-size 64 --name title
# Start recording
ov test record start myimage -n demo -m desktop
# Fade out title after 3s
sleep 3
ov test wl overlay hide myimage --name title
# Lower-third speaker ID
ov test wl overlay show myimage --type lower-third \
--text "Andreas Trawoeger" --subtitle "Developer" --name speaker
# ... record content ...
# Fade to black for ending
ov test wl overlay show myimage --type fade --color black --name outro
sleep 2
# Stop recording
ov test record stop myimage -n demo -o demo.mp4
ov test wl overlay hide myimage --all
All overlay types work on all wlroots-based compositors:
| Compositor | Environment | Status | Notes | |-----------|-------------|--------|-------| | sway | sway-browser-vnc | WORKS | Instant rendering, captured by wayvnc | | labwc | selkies-desktop | WORKS | ~15s capture latency in controller mode (no browser). Instant in recordings | | niri | niri-desktop | WORKS | Layer-shell supported via Smithay |
window { background: none; } CSS at daemon startup. Without this, GTK4 on Wayland creates opaque surfacesGtk.DrawingArea + Cairo, not CSS. GTK4 CSS background-color with rgba() does not composite correctly on layer-shell windowsGtk4LayerShell.Layer.OVERLAY (highest z-order, above waybar/swaync)KeyboardMode.NONE — overlays never capture input-1 — overlays don't push other windows/usr/bin/python3 (system Python with PyGObject), not pixi's PythonOn selkies-desktop, pixelflux-screenshot captures from the H.264 WebSocket stream. In controller mode (no browser client connected), the frame rate is very low — screenshots may take 15-30 seconds to reflect overlay changes. This does NOT affect recordings — ov test record captures at 30fps, so overlays appear immediately in recorded video.
Socket: /tmp/ov-overlay.sock (Unix domain, JSON-line)
{"action":"show","type":"text","text":"Hello","name":"intro","bg":"rgba(0,0,0,0.7)"}
{"action":"hide","name":"intro"}
{"action":"hide_all"}
{"action":"list"}
{"action":"status"}
| Flag | Default | Description |
|------|---------|-------------|
| --type | (required) | text, lower-third, watermark, countdown, highlight, fade |
| --text | "" | Text content |
| --subtitle | "" | Subtitle (lower-third only) |
| --name | auto-generated | Overlay identifier for hide/list |
| --position | center | Positioning (watermark: corner anchoring) |
| --bg | type-dependent | Background color (CSS rgba or named) |
| --color | white | Text/highlight color |
| --font-size | 48 | Font size in pixels |
| --opacity | 1.0 (watermark: 0.3) | Overall window opacity |
| --duration | none | Auto-hide after duration (e.g. 5s) |
| --seconds | 3 | Countdown seconds |
| --region | 100,100,400,300 | Highlight region X,Y,W,H |
wl-overlay layer (gtk4-layer-shell + python3-gobject)tmux layer (for daemon hosting)sway-desktop, selkies-desktop, and niri-desktop metalayers/ov:wl — Compositor-agnostic desktop automation (screenshots, input, windows)/ov:record — Terminal and desktop recording (overlays compose with recording workflow)/ov:cdp — Chrome DevTools Protocol (DOM-level interaction)/ov-layers:wl-overlay — Layer reference (RPM packages, dependencies)/ov-layers:sway-desktop — Desktop metalayer (includes wl-overlay)/ov-layers:selkies-desktop — Desktop metalayer (includes wl-overlay)/ov-layers:niri-desktop — Desktop metalayer (includes wl-overlay)Source: ov/wl_overlay.go (Go commands), layers/wl-overlay/ov-overlay (Python daemon/client).
tools
OpenCharly CLI (charly) binary installed into container/VM images for in-container use. Use when working with charly binary deployment inside containers, native D-Bus support, or the full charly toolchain (charly binary + virtualization + gocryptfs + socat).
development
Operator CachyOS workstation profile — a kind:local template + target:local deploy that installs the full dev stack (30 candies) onto a CachyOS host via ShellExecutor. Lives in the overthinkos/cachyos submodule. MUST be invoked before editing or applying the charly-cachyos workstation profile.
tools
Fedora box with the full charly toolchain using shared candies. Rootless-first — runs as uid=1000 with passwordless sudo (no root, no cap_add: ALL). Same candy list as charly-arch. Includes NVIDIA GPU runtime. MUST be invoked before building, deploying, configuring, or troubleshooting the charly-fedora box.
tools
Arch Linux box with the full charly toolchain. Rootless-first — runs as uid=1000 with passwordless sudo (no root, no cap_add: ALL). Composes /charly-coder:charly-mcp so the box is reachable as an MCP gateway on port 18765. NVIDIA GPU runtime composed in. MUST be invoked before building, deploying, configuring, or troubleshooting the charly-arch box.