selkies/skills/wl-record-pixelflux/SKILL.md
Desktop video recorder via selkies WebSocket capture bridge for selkies-desktop. Use when working with the wl-record-pixelflux candy.
npx skillsauth add overthinkos/overthink-plugins wl-record-pixelfluxInstall 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.
| Property | Value |
|----------|-------|
| Install files | charly.yml, task:, pixelflux-record (Python script) |
| Depends | selkies (capture bridge + WebSocket stream), ffmpeg (MP4 muxing) |
Provides pixelflux-record for recording desktop video on selkies-desktop. Connects to the capture bridge at /tmp/charly-capture.sock which relays the same H.264 frames that the browser sees via the selkies WebSocket stream. No direct ScreenCapture API access -- taps into the existing selkies streaming pipeline to avoid creating a second capture instance (the Rust backend only supports one active capture at a time).
Why not wf-recorder? labwc running nested inside pixelflux can't deliver wlr-screencopy frames. The capture bridge bypasses this by tapping into the selkies WebSocket stream directly.
/tmp/charly-capture.sock (started by selkies-capture-server)STREAM\n to request continuous H.264 frame data4-byte length + raw H.264 data pairs-use_wallclock_as_timestamps 1| Property | Value |
|----------|-------|
| Depends | selkies (capture bridge + stream), ffmpeg (muxing) |
| Install | ~/.local/bin/pixelflux-record (Python script) |
| Capture | Via /tmp/charly-capture.sock (selkies WebSocket bridge) |
| Output | MP4 (H.264 video + optional AAC audio) |
| Audio | PulseAudio monitor source via ffmpeg |
# Direct usage
pixelflux-record output.mp4 # 30fps, video only
pixelflux-record output.mp4 --fps 60 # 60fps
pixelflux-record output.mp4 --audio # video + audio
pixelflux-record output.mp4 --fps 60 --audio # 60fps + audio
# Stop with Ctrl-C
charly eval record# Start desktop video recording (auto-detects pixelflux-record)
charly eval record start selkies-desktop -n demo --mode desktop --audio
# Run commands (visible in recording)
charly eval record cmd selkies-desktop "echo hello" -n demo
# Interact with desktop
charly eval cdp open selkies-desktop "https://example.com"
charly eval wl click selkies-desktop 640 360
# Stop and copy to host
charly eval record stop selkies-desktop -n demo -o demo.mp4
selkies process (single ScreenCapture singleton — process-wide)
├── ScreenCapture (captures full composited desktop)
├── WebSocket server :8081 (broadcasts H.264 frames)
└── Capture bridge thread (internal WebSocket client)
└── Unix socket /tmp/charly-capture.sock
└── pixelflux-record connects here (STREAM mode)
└── pipes H.264 frames to ffmpeg
Singleton note: The ScreenCapture instance is process-wide and lives inside the selkies Python process. pixelflux-record never spawns its own capture; it only attaches to the existing STREAM socket. This is architecturally important because pixelflux's WaylandBackend construction is expensive (EGL context + dmabuf allocators + GPU texture pools) and was the subject of a memory leak fix in commits 6be85eb (singleton enforcement) and 7977b91 (per-frame cleanup_texture_cache()). If you ever see two selkies-capture processes inside the container, that's a regression — see /charly-selkies:selkies (Pixelflux Memory Management) for the diagnostic recipe.
selkies-desktop metalayer/charly-selkies:selkies-labwc (via selkies-desktop metalayer)/charly-selkies:selkies-labwc-nvidia (via selkies-desktop metalayer)/charly-eval:record -- charly eval record start --mode desktop auto-detects pixelflux-record/charly-core:charly-update -- Per-instance update pattern used to roll out the per-frame cleanup_texture_cache() fix across live instances/charly-selkies:wl-screenshot-pixelflux -- Screenshot companion (same capture bridge, same singleton)/charly-selkies:wf-recorder -- Alternative for sway-desktop (wlr-screencopy)/charly-selkies:selkies -- Parent candy (provides capture bridge, WebSocket stream, and the ScreenCapture singleton — see Pixelflux Memory Management)/charly-selkies:selkies-desktop-layer -- Metalayer that composes this recorder into the full browser-accessible desktop/charly-selkies:ffmpeg -- Required dependency (MP4 muxing)Use when the user asks about:
wl-record-pixelflux candy/charly-image:layer — candy authoring reference (charly.yml schema, task verbs, service declarations)/charly-eval:eval — declarative testing (eval: block, charly eval box, charly eval live)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.