l-dotfiles-gui-testing
The one procedure for launching an app, game, editor or viewer only to screenshot or check it, on a headless Hyprland output of the agent's own, with muted…
Skill by lsck0
Chalk Labs
Need help deploying l-dotfiles-gui-testing?
Chalk Labs sets up agents like this inside real teams: connected to your tools, tested on your data, with a human in the loop where it matters.
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/lsck0-l-dotfiles-gui-testing
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: testing, agent-building
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md and code. Checked Oct 26, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/l-dotfiles-gui-testing
What's inside
- Skill name
l-dotfiles-gui-testing- Description
- The one procedure for launching an app, game, editor or viewer only to screenshot or check it, on a headless Hyprland output of the agent's own, with muted audio and clean teardown. Load before any agent starts a GUI program the user is not watching.
- License
- MIT
- Instructions
- 102 lines in SKILL.md · view on GitHub
Before installing
- Instructions read files in your home folder (~/.ssh, ~/.aws…)
Files (1)
- SKILL.md
SKILL.md (first lines)
# gui-testing
A program launched only to check something never shows on the user's monitors. Each agent creates its own headless
output, uses it and removes it; several agents can do this at once.
## Never
- `hyprctl keyword monitor`, `hl.monitor`, a monitor rule or position: an auto-positioned output follows the rightmost
one and can push a real monitor off-screen. Create the headless output and nothing else (a nested Hyprland's own
config, below, is the only place for `hl.monitor`).
- Bare `grim`: it captures the headless areas too. Always `grim -o HEADLESS-N`.
- `pkill -f <pattern>`: it matches the agent's own shell. Kill by PID.
- Removing an output you did not create.
## Procedure
```bash
hyprctl monitors -j | jq -r '.[].name' # before
hyprctl output create headless
hyprctl monitors -j | jq -r '.[] | select(.name | startswith("HEADLESS")) | "\(.name) \(.id) \(.activeWorkspace.id)"'
pactl load-module module-null-sink sink_name=agent-null # keep the printed module index
```
The name not in the before list is yours: `HEADLESS-N`, its id and workspace `<ws>`. `exec_cmd` returns no pid, so
`sh -c` writes its own pid and `exec`s the app (the second argument is window rules; an unknown effect is refused):
```bash
pidfile=/tmp/<agent>-app.pid
hyprctl dispatch "hl.dsp.exec_cmd('sh -c \"echo \$\$ > $pidfile; exec env PULSE_SINK=agent-null <app>\"', { workspace = '<ws> silent' })"
pid=$(cat $pidfile)
hyprctl clients -j | jq --argjson pid "$pid" '.[] | select(.pid == $pid) | {class, title, monitor, workspace: .workspace.name}'
grim -o HEADLESS-N /tmp/<agent>-shot.png
```
- An app that forks its window off a launcher (electron, steam, flatpak) has another pid: find it by class or title
against a `hyprctl clients -j` from before the launch.
- `monitor` must be your output's id. A window on a physical monitor is killed at once by PID and the launch fixed,
never moved by focusing it.
## Apps that escape the exec rule
The workspace rule holds only for what the started pid maps. Re-exec wrappers (`soffice`), splash then main window
(GIMP), parentless X11 dialogs (HexChat's Network List at global 0,0) can land on the user's screen. Two paths:
- The real binary. LibreOffice: `/usr/lib/libreoffice/program/soffice.bin --writer
-env:UserInstallation=file://$HOME/.config/libreoffice/<agent>`; a fresh profile exits once to restart, so launch
twice.
- Otherwise a nested Hyprland on your workspace (about 940x490 on a scale-2 headless output). It runs on a private
runtime dir `$rt` that links only the outer compositor's socket and pulse, so the compositor, its `dbus-run-session`
portals (`$rt/doc`) and everything started inside stay off the user's `/run/user/$UID`. Keep the path short: a
socket path over 108 bytes fails, so never the scratchpad. A window rule under test goes into its config:
```bash
rt=/run/user/$UID/ag-<agent>; mkdir -m 700 $rt
ln -s $XDG_RUNTIME_DIR/$WAYLAND_DISPLAY $XDG_RUNTIME_DIR/$WAYLAND_DISPLAY.lock $XDG_RUNTIME_DIR/pulse $rt/
cat > /tmp/<agent>-nested.lua <<'EOF'
hl.monitor({ output = "", mode = "preferred", position = "auto", scale = 1 })
hl.config({ misc = { disable_hyprland_logo = true, disable_splash_rendering = true }, ecosystem = { no_update_news = true } })
EOF
hyprctl dispatch "hl.dsp.exec_cmd('sh -c \"exec env -u HYPRLAND_INSTANCE_SIGNATURE -u DISPLAY XDG_RUNTIME_DIR=$rt dbus-run-session Hyprland -c /tmp/<agent>-nested.lua\"', { workspace = '<ws> silent' })"
nested=$(ls $rt/hypr)
XDG_RUNTIME_DIR=$rt HYPRLAND_INSTANCE_SIGNATURE=$nested hyprctl dispatch "hl.dsp.exec_cmd('env PULSE_SINK=agent-null <app>')"
XDG_RUNTIME_DIR=$rt HYPRLAND_INSTANCE_SIGNATURE=$nested hyprctl clients -j | jq '.[] | {class, title, pid, at, size}'
```
- `wayland-<n>` below is the nested compositor's own socket: the one in `$rt` you did not link.
- A QML test runs a trimmed shell copy inside (`quickshell -p <copy>`, a `shell.qml` with only the plugin), started and
called as in the next section.
- The nested compositor is the `aquamarine` client in the outer `hyprctl clients -j`: check its `monitor` is your
output's id, as for any app, kill the apps inside, then it.
- Confined apps write only where their AppArmor profile allows: zathura's `-c` as `~/.config/zathura/<agent>`, chromium's
`--user-data-dir` as `/tmp/.org.chromium.Chromium.<agent>`. Remove state an app keeps across runs (zathura's
`~/.local/share/zathura/bookmarks.sqlite`) with the test files.
## Test quickshell: private runtime dir
The shell keeps state under `$XDG_RUNTIME_DIR` (`quickshell/`, `toggles/`, cava's config). `Lock.qml` writes its
crash-recovery marker `$XDG_RUNTIME_DIR/quickshell/locked` while locked: a test shell on the real runtime dir that
locks and is killed leaves `/run/user/$UID/quickshell/locked`, and the user's live shell locks the screen on its next
start. A test quickshell runs only inside the nested `dbus-run-session` Hyprland, which hands it `$rt` (a private
runtime dir keeps it off the user's state, not off the user's session bus: `l-dotfiles-quickshell-dev`).
```bash
qspidfile=/tmp/<agent>-qs.pid
XDG_RUNTIME_DIR=$rt HYPRLAND_INSTANCE_SIGNATURE=$nested hyprctl dispatch "hl.dsp.exec_cmd('sh -c \"echo \$\$ > $qspidfile; exec env PULSE_SINK=agent-null quickshell -p <copy>\"')"
XDG_RUNTIME_DIR=$rt WAYLAND_DISPLAY=wayland-<n> qs ipc -p <copy> call lock isLocked
```
`qs ipc` for that shell needs both its `XDG_RUNTIME_DIR` and its `WAYLAND_DISPLAY`. `pipewire-0` stays unlinked: the
audio widgets stay empty (`Failed to connect pipewire context`), and linking it hands the test shell the user's real
audio graph. A `/run/user/$UID/quickshell/locked` you find was left by a test: remove it only after `qs ipc -p
~/.config/quickshell call lock isLocked` prints `false` for the user's shell.
## Teardown
```bash
kill $pid; rm $pidfile
pactl unload-module <index>
hyprctl output remove HEADLESS-N
```
Only your own output and sink. A killed test quickshell leaves every helper it started running, reparented to
`systemd --user`: take `pgrep -P $(cat $qspidfile)` before `kill $(cat $qspidfile)`, then kill by PID the ones still
alive. No nested Hyprland outlives the test. Then `rm -r $rt $qspidfile` (a still mounted `$rt/doc` first
`fusermount3 -u $rt/doc`), and with the test files the per-agent app state:
`rm -r ~/.config/libreoffice/<agent> ~/.config/zathura/<agent>` and zathura's `bookmarks.sqlite`.
A failed user `xdg-document-portal.service` (status 21) is left by a nested Hyprland that ran on the real runtime dir:
tell Luca, never restart it yourself.From lsck0/arch-dotfiles, MIT.
More from lsck0/arch-dotfiles
- 0.606score
l-agent-task-db
lsck0
Shared taskwarrior/timewarrior conventions for the task-mode skills: db layout, tasks/context/ folder, stage/human-in-the-loop tag vocabulary, scaffolding.
SkillAFreshness: A★ 3Claude Code +9 - 0.604score
l-multi-agent-task-mode
lsck0
Self-poll a per-project taskwarrior db and spawn persona workers (Herdr/Hermes under HERDR_ENV, else Claude Code Agent tool) to advance multiple +agent-task…
SkillAFreshness: A★ 3Claude Code +9 - 0.601score
l-auto-memory
lsck0
Keep a project's agent knowledge current: a per-project skills/ folder of project-specific workflows (how to use the project, develop on it, use its tools…
SkillAFreshness: A★ 3Claude Code +9 - 0.601score
l-dotfiles-apparmor-profile
lsck0
Writing or adjusting an AppArmor profile or local/ drop-in in configs/base/apparmor, loading it, reading denials, apparmor.test.nu, and the enforce vs…
SkillAFreshness: A★ 3Claude Code +9 - 0.601score
l-multi-agent-mode
lsck0
Live orchestrator for one idea worked now, no task db: task-planner plans, orchestrator spawns/drives workers (Herdr/Hermes under HERDR_ENV, else Claude Code…
SkillAFreshness: A★ 3Claude Code +9 - 0.601score
l-dotfiles
lsck0
Layout and conventions of Luca's arch-dotfiles repo (~/projects/arch-dotfiles), the source of truth for his system configuration: configs, platforms, install…
SkillAFreshness: A★ 3Claude Code +9 - 0.600score
l-dotfiles-streaming
lsck0
The OBS setup in configs/creating/obs (the Streaming, VirtualCam and Bare collections, profiles, websocket on 4455, obs-mcp, the bar's obs widget, the…
SkillAFreshness: A★ 3Claude Code +9 - 0.598score
l-persona-auditor-general
lsck0
Passive general audit: best practices, style, maintainability.
SkillAFreshness: A★ 3Claude Code +9 - 0.597score
l-dotfiles-toggles
lsck0
Adding an on/off or n-state switch as scripts/toggles/toggle-<name>.nu with lib.nu, its root half, and wiring it into quickshell and the menu.
SkillAFreshness: A★ 3Claude Code +9 - 0.597score
l-dotfiles-vm-test
lsck0
The end-to-end test, dot test run: bootstrap from the Arch ISO in a libvirt VM through the whole unattended chain, plus its logs, screenshot and teardown.
SkillAFreshness: A★ 3Claude Code +9 - 0.597score
l-dotfiles-install
lsck0
Installing a machine from this repo (owner, generic, WSL), how the unattended boot chain runs, and adding another login on an installed machine.
SkillAFreshness: A★ 3Claude Code +9 - 0.597score
l-dotfiles-quickshell-dev
lsck0
Editing the quickshell shell (bar, launcher, lock, notifications, OSD) in configs/desktop/quickshell, live reload, logs, IPC calls and screenshots of its…
SkillAFreshness: A★ 3Claude Code +9
Signals
- Stars
- 3
- Forks
- 1
- Open issues
- 0
- Last commit (this folder)
- Oct 21, 2026 (9 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/lsck0/arch-dotfiles
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from lsck0
- 0.606score
l-agent-task-db
lsck0
Shared taskwarrior/timewarrior conventions for the task-mode skills: db layout, tasks/context/ folder, stage/human-in-the-loop tag vocabulary, scaffolding.
SkillAFreshness: A★ 3Claude Code +9 - 0.604score
l-multi-agent-task-mode
lsck0
Self-poll a per-project taskwarrior db and spawn persona workers (Herdr/Hermes under HERDR_ENV, else Claude Code Agent tool) to advance multiple +agent-task…
SkillAFreshness: A★ 3Claude Code +9 - 0.601score
l-multi-agent-mode
lsck0
Live orchestrator for one idea worked now, no task db: task-planner plans, orchestrator spawns/drives workers (Herdr/Hermes under HERDR_ENV, else Claude Code…
SkillAFreshness: A★ 3Claude Code +9 - 0.601score
l-dotfiles-apparmor-profile
lsck0
Writing or adjusting an AppArmor profile or local/ drop-in in configs/base/apparmor, loading it, reading denials, apparmor.test.nu, and the enforce vs…
SkillAFreshness: A★ 3Claude Code +9 - 0.601score
l-dotfiles
lsck0
Layout and conventions of Luca's arch-dotfiles repo (~/projects/arch-dotfiles), the source of truth for his system configuration: configs, platforms, install…
SkillAFreshness: A★ 3Claude Code +9 - 0.601score
l-auto-memory
lsck0
Keep a project's agent knowledge current: a per-project skills/ folder of project-specific workflows (how to use the project, develop on it, use its tools…
SkillAFreshness: A★ 3Claude Code +9
Done for you
Rather not set it up yourself?
Chalk Labs scopes, builds and runs agents for your team: the task audit, the eval harness, the integrations and the weekly ops report. Fixed scope, priced before we start.
See how we build AI agents →Read the case studies
Chalk Labs is a two-founder AI and growth studio. We build AI agents, CRMs and MVPs for Web3 and AI companies, and have shipped 50+ product and token launches.
- launches shipped
- 50+
- launches shipped
- media placements
- 500+
- media placements
- founders on every account
- 2
- founders on every account
Press we've placed: Forbes · CoinDesk · Decrypt · Cointelegraph · The Block
Rahil Jain, Co-founder, Chalk Labs. Ex-Goldman Sachs engineer. You talk to the person who builds it.
Get l-dotfiles-gui-testing running in your business
Tell us what you want to automate. A founder replies within one working day with a plan, not a pitch deck.
Cite this page
l-dotfiles-gui-testing skill. Agent Mart. https://agentmart.dev/skills/lsck0-l-dotfiles-gui-testing (last updated 2026-10-24)