Agent skill

Verify Trayscale

by DeedleFake in DeedleFake/trayscale

Drive the Trayscale GTK 4 / Libadwaita desktop UI the way a user does.

MITAuto-check passed

Install Verify Trayscale

skills CLI
$ npx skills add DeedleFake/trayscale --skill verify-trayscale -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install DeedleFake/trayscale verify-trayscale --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/DeedleFake/trayscale.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.cursor/skills/verify-trayscale .claude/skills/verify-trayscale && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
verify-trayscale
GitHub stars
1.1k
Token cost
~1.9k tokens
SKILL.md length
902 words
Files
10 (incl. scripts)
Skills in repo
2
Repo updated
First seen
Licence
MIT

At a glance

Drive the Trayscale GTK 4 / Libadwaita desktop UI the way a user does.

  • Works in 3 steps: Drive the user path (window, menu… → Capture the tree before the action and… → The after-tree must identify Trayscale…
  • Proving a Trayscale UI change
  • SKILL.md covers Isolation, Launch, Doctor and Drive, plus 3 more sections
  • Calls python3

What it does

Verify Trayscale is an agent skill from DeedleFake/trayscale. Drive the Trayscale GTK 4 / Libadwaita desktop UI the way a user does. Use when proving a Trayscale UI change, checking the main window, About, Preferences, peer search, the this-machine page, or a peer page against a live tailscaled.

Its SKILL.md is about 1.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 11 other files, including scripts (for example `features/README.md`, `features/about.md` and `features/main-window.md`).

It works with Go and Linux. The repository describes itself as: An unofficial GUI wrapper around the Tailscale CLI client. The licence is MIT.

When your agent uses it

  • Proving a Trayscale UI change
  • Checking the main window
  • The this-machine page
  • A peer page against a live tailscaled

Example prompts

  • “/verify-trayscale”

Requirements

  • Python 3

Workflow steps

3 steps, taken from the first numbered list in SKILL.md.

  1. Drive the user path (window, menu action, or listed control), not an internal setter.
  2. Capture the tree before the action and after it when the action changes state.
  3. The after-tree must identify Trayscale (frame 'Trayscale' or application 'trayscale') and the feature's end state.

What it can do on your machine

Read from SKILL.md and the folder at commit 33fa87a. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 1 file in scripts/, which the agent can run.

    Shell commands in SKILL.md call:

    • python3

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Verify Trayscale loads about 1.9k tokens when it runs. Until then it costs about 63 tokens; SKILL.md has 902 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~63
When it runs · the whole SKILL.md, loaded when a task matches
~1.9k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.

SKILL.md

The full file from DeedleFake/trayscale at commit 33fa87a, republished under its MIT licence (© DeedleFake). 902 words, ~1,944 tokens.

Download SKILL.mdSave it as .claude/skills/verify-trayscale/SKILL.md (or your agent's skills folder). This skill also uses 9 other files; get the full folder from GitHub.
name
verify-trayscale
description
Drive the Trayscale GTK 4 / Libadwaita desktop UI the way a user does. Use when proving a Trayscale UI change, checking the main window, About, Preferences, peer search, the this-machine page, or a peer page against a live tailscaled.

Verify Trayscale

Trayscale is an unofficial Tailscale GUI. The user-facing surface is a Libadwaita window titled Trayscale plus an optional tray icon. There is no web UI and no first-party CLI besides tailscale itself.

This skill drives this checkout's binary in an isolated D-Bus session. It does not drive a Trayscale the user already started.

Set CTRL to the helper and run every command from the repo root:

bash
CTRL=.cursor/skills/verify-trayscale/scripts/control-trayscale

Read features/README.md before a proof. Drive every entry point the matching feature file lists, not one convenient path.

Isolation

GApplication owns the session-bus name dev.deedles.Trayscale. A second process on the user bus only activates the first. launch starts dbus-run-session so the user instance can stay running.

Shared with the user and not isolated:

  • tailscaled and the live tailnet
  • the Wayland display (the verify window appears on the current session)

Do not activate use_exit_node, login, change_control_server, admin_dashboard, or quit unless a feature file says to and passes --i-mean-it. Do not click the unnamed header switch (connect/disconnect). Do not toggle Advertise exit node, Allow LAN access, Accept routes, Accept DNS, or Use as exit node.

Two verify launches at once are refused. Two user-plus-verify instances are allowed.

Launch

The helper needs go, glib-compile-schemas, dbus-run-session, gdbus, at-spi2-core, and PyGObject with the Atspi 2.0 typelib (python3 -c 'import gi; gi.require_version("Atspi", "2.0")' must succeed).

bash
$CTRL launch

This compiles dev.deedles.Trayscale.gschema.xml into the run dir, builds ./cmd/trayscale into that run dir, then starts the binary under dbus-run-session with:

  • GSETTINGS_BACKEND=memory and GSETTINGS_SCHEMA_DIR pointing at the run schema
  • TRAYSCALE_PRIVATE=1 (profile names render as profile@example.com)
  • GTK_A11Y=atspi and a private AT-SPI registry
  • isolated XDG_* directories under the run dir
  • LANGUAGE=en and LANG/LC_ALL set to C.UTF-8, so labels match this map whatever the user's locale

Ready when doctor prints "window": "frame 'Trayscale'" and "bus_name_owned": true. First build can take more than a minute. --timeout default is 180 seconds. A dbind-WARNING about /org/a11y/atspi/cache during launch is ignorable if doctor then succeeds.

Tray registration on the private bus is expected to fail (StatusNotifierWatcher is absent). That is isolation working, not a product bug.

If the build fails, launch removes its run directory and exits nonzero. If the D-Bus name never appears, it stops the session and keeps runs/<id>/ for its logs; delete that directory once you have read them.

Teardown is cleanup. There is no long-lived server besides the process launch started.

Doctor

bash
$CTRL doctor

Require all of:

  • pgid_alive true
  • binary_exists true
  • bus_name_owned true
  • window equal to frame 'Trayscale'
  • gsettings_backend equal to memory

Run doctor before the first drive, after any failed drive, and before treating a surprising tree as product behavior. If doctor fails, read runs/<id>/inner.log and runs/<id>/session.log, then cleanup before another launch.

Show full SKILL.md (468 more words)Show less

Drive

GApplication actions are the same handlers the menus and shortcuts call. Object path /dev/deedles/Trayscale on the isolated bus.

bash
$CTRL actions
$CTRL action about
$CTRL action preferences
$CTRL action search-peers

AT-SPI handles that exist in this app:

HandleRoleNotes
TrayscaleframeMain window
Search peerstoggle buttonSidebar search control
profile@example.comcombo boxProfile dropdown under TRAYSCALE_PRIVATE=1
(empty)entryPeer search entry. Present only while search is open
No matching peersgroupingSidebar placeholder when a search matches nothing
This machine, Exit Nodes, Online, OfflinelabelSidebar section titles when connected
Tailscale IPs, Options, Files, Advertised Routes, Network CheckgroupingThis-machine page
Advertise exit node and the other option rowsswitchRead only
Tailscale IPs, Misc., Advertised RoutesgroupingPeer page
Use as exit nodeswitchPeer page of an exit node. Read only
AboutdialogAfter action about
Trayscale, DeedleFakelabelInside the About dialog
PreferencesdialogAfter action preferences
General, TaildropgroupingInside Preferences
bash
$CTRL snapshot --path artifacts/example.tree.txt
$CTRL find --role dialog --name About --exact
$CTRL wait --role dialog --name About --exact --timeout 10
$CTRL click --role toggle --name "Search peers" --exact
$CTRL select --role label --name "<peer sidebar label>" --exact
$CTRL fill --role entry --value "query"

click uses a click/press/activate/toggle action. It refuses to default to clipboard.copy (GTK exposes that on selectable labels). Sidebar rows have empty list item names and no AT-SPI actions; select --name selects the list item that contains that label. That marks the row states=selected but does not change the content page. To show a peer page, search for the peer. When the visible page is not among the matches, the first match becomes the visible page (see features/peer-page.md).

The peer search entry has no accessible name. Address it as --role entry without --name; it is the only entry while no dialog is open. fill replaces its text and the sidebar filters as if the user typed.

press synthesizes AT-SPI key events. On GNOME Wayland those events often do nothing. Prefer action search-peers over press --key Control+f.

Evidence

Store proof under .cursor/skills/verify-trayscale/artifacts/<feature>/. Cleanup deletes runs/ and does not delete artifacts/. Do not commit artifacts; they can contain peer names and Tailscale IPs.

Required for a UI proof:

  1. Drive the user path (window, menu action, or listed control), not an internal setter.
  2. Capture the tree before the action and after it when the action changes state.
  3. The after-tree must identify Trayscale (frame 'Trayscale' or application 'trayscale') and the feature's end state.
bash
$CTRL snapshot --path .cursor/skills/verify-trayscale/artifacts/<feature>/after.tree.txt
$CTRL screenshot --path .cursor/skills/verify-trayscale/artifacts/<feature>/after.png --allow-fail

GNOME Shell on this kind of session returns AccessDenied for org.gnome.Shell.Screenshot. --allow-fail writes after.png.skipped.txt and continues. An AT-SPI snapshot is enough when the screenshot is denied.

Mocks: none. The window talks to the real tailscaled. If Tailscale is down, the offline page (Not Connected) is the correct UI. Do not fake IPN status.

Cleanup

bash
$CTRL cleanup

This signals only the process group recorded at launch (the dbus-run-session pgid). It never pkill trayscale. Confirm the user's instance, if any, is still alive after cleanup.

--keep-run leaves the run directory for log inspection. Artifacts stay either way.

Helpers

scripts/control-trayscale is executable. Commands: launch, doctor, cleanup, actions, action, snapshot, screenshot, find, click, select, fill, press, wait.

© DeedleFake, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 9 other files (scripts) in .cursor/skills/verify-trayscale of DeedleFake/trayscale.

  • SKILL.md
  • .gitignore
  • features/README.md
  • features/about.md
  • features/main-window.md
  • features/peer-page.md
  • features/peer-search.md
  • features/preferences.md
  • features/this-machine.md
  • scripts/control-trayscale

Open the folder on GitHubat commit 33fa87a

Compare with similar skills

Verify Trayscale next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Verify Trayscale compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Verify Trayscale this skillDeedleFake/trayscale1.1k—~1.9kAutomated safety check: PassMIT
Temporal Developerlatitude-dev/latitude-llm4.7k—~1.5kAutomated safety check: PassMIT
Install Mimi Remotegaixianggeng/mimi-remote104—~2.8kAutomated safety check: PassGPL-3.0
Workflow GenerateForestHubAI/edge-agents105—~3.2kAutomated safety check: PassAGPL-3.0
Releasing MarchatCod-e-Codes/marchat137—~801Automated safety check: PassMIT
Modern Gosmallnest/goal-workflow290—~7.2kAutomated safety check: PassMIT

Similar skills

  • Temporal Developer

    latitude-dev/latitude-llm

    This skill should be used when the user asks to "create a Temporal workflow", "write a Temporal activity", "debug stuck workflow", "fix non-determinism error", "Temporal Python", "Temporal…

    4.7k GitHub stars~1.5k tokensUpdated today
    Backend & APIsAuto-check passed
  • Install Mimi Remote

    gaixianggeng/mimi-remote

    安装、配置、配对、迁移、升级、诊断、回滚或卸载 Mimi Remote;在 macOS 上安装和维护 Mimi Remote Mac 菜单栏 App / DMG,或通过 Homebrew、Linux user-systemd 部署 agentd;从源码构建 iPhone/iPad App;配置 Codex 主通道和可选 Claude Code 实验 Runtime。用户提出“安装 Mimi…

    104 GitHub stars~2.8k tokensUpdated yesterday
    MobileAuto-check passed
  • Workflow Generate

    ForestHubAI/edge-agents

    Generate a validated Edge Agents workflow JSON (.workflow.json) from a natural-language description — the node-graph that runs on Edge Agents edge/IoT agents, built from triggers (timer, startup…

    105 GitHub stars~3.2k tokensUpdated 1 mo ago
    Auto-check passed
  • Releasing Marchat

    Cod-e-Codes/marchat

    Prepares marchat releases: version bumps, CHANGELOG, packaging checksums, GitHub Actions release workflow, and Docker tags.

    137 GitHub stars~801 tokensUpdated 6 days ago
    DevOps & CloudAuto-check passed
  • Modern Go

    smallnest/goal-workflow

    Modernize Go code by applying version-appropriate idioms and APIs (gofix-style transformations).

    290 GitHub stars~7.2k tokensUpdated 26 days ago
    DevelopmentAuto-check passed
  • Configuring Horizon

    coollabsio/coolify

    A skill your agent uses whenever the user mentions Horizon by name in a Laravel context.

    63k GitHub starsUsed in 4 repos~898 tokens
    Backend & APIsAuto-check passed

More from DeedleFake/trayscale

  • Regenerate Pgo

    DeedleFake/trayscale

    Regenerate cmd/trayscale/default.pgo by launching an isolated Trayscale, driving representative UI paths under PPROF, then replacing the profile.

    1.1k GitHub stars~984 tokensUpdated today
    Auto-check passed

Works with

Questions about Verify Trayscale

What does Verify Trayscale do?

Drive the Trayscale GTK 4 / Libadwaita desktop UI the way a user does. Verify Trayscale is an agent skill from DeedleFake/trayscale. Drive the Trayscale GTK 4 / Libadwaita desktop UI the way a user does.

When should I use Verify Trayscale?

Verify Trayscale fits situations like: proving a Trayscale UI change; checking the main window; the this-machine page; A peer page against a live tailscaled.

How do I install Verify Trayscale in Claude Code?

Run `npx skills add DeedleFake/trayscale --skill verify-trayscale -a claude-code`. Or copy the skill folder (.cursor/skills/verify-trayscale in DeedleFake/trayscale) into .claude/skills/verify-trayscale in your project. Claude Code loads it when a task matches its description.

How do I install Verify Trayscale in Codex?

Run `npx skills add DeedleFake/trayscale --skill verify-trayscale -a codex`. Or copy the skill folder (.cursor/skills/verify-trayscale in DeedleFake/trayscale) into .agents/skills/verify-trayscale in your project. Codex loads it when a task matches its description.

Can I use Verify Trayscale in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add DeedleFake/trayscale --skill verify-trayscale -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/verify-trayscale, .gemini/skills/verify-trayscale, .github/skills/verify-trayscale and .opencode/skills/verify-trayscale in your project.

What does Verify Trayscale need to run?

Going by SKILL.md and its folder, Verify Trayscale needs the command-line tools its instructions call (python3). Our summary lists: Python 3.

Does Verify Trayscale access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Verify Trayscale safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Verify Trayscale use?

Verify Trayscale is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Verify Trayscale use?

About 1.9k tokens (SKILL.md is roughly 7.8k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Verify Trayscale?

Skills that share tags, products or a category with Verify Trayscale: Temporal Developer (latitude-dev/latitude-llm, 4.7k stars), Install Mimi Remote (gaixianggeng/mimi-remote, 104 stars), Workflow Generate (ForestHubAI/edge-agents, 105 stars) and Releasing Marchat (Cod-e-Codes/marchat, 137 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Verify Trayscale?

DeedleFake (a GitHub user) maintains it in DeedleFake/trayscale, which has 1,052 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on October 9, 2026.

Source: DeedleFake/trayscale on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.