Dogfood
callstackincubator/agent-skills
Systematically explore and test a mobile app on iOS/Android with agent-device to find bugs, UX issues, and other problems.
Display and control HTML content on connected Bitterbot nodes (Mac, iOS, Android) via the canvas host server.
$ npx skills add Bitterbot-AI/bitterbot-desktop --skill canvas -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Bitterbot-AI/bitterbot-desktop canvas --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Bitterbot-AI/bitterbot-desktop.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/canvas .claude/skills/canvas && rm -rf skills-srcUse ~/.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/
Install the "canvas" agent skill from https://github.com/Bitterbot-AI/bitterbot-desktop/tree/main/skills/canvas into .claude/skills/canvas/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Bitterbot-AI/bitterbot-desktop/tree/main/skills/canvasType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Bitterbot-AI/bitterbot-desktop --skill canvas -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Bitterbot-AI/bitterbot-desktop canvas --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Bitterbot-AI/bitterbot-desktop.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/canvas .agents/skills/canvas && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "canvas" agent skill from https://github.com/Bitterbot-AI/bitterbot-desktop/tree/main/skills/canvas into .agents/skills/canvas/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Bitterbot-AI/bitterbot-desktop --skill canvas -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Bitterbot-AI/bitterbot-desktop canvas --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Bitterbot-AI/bitterbot-desktop.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/canvas .cursor/skills/canvas && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "canvas" agent skill from https://github.com/Bitterbot-AI/bitterbot-desktop/tree/main/skills/canvas into .cursor/skills/canvas/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Bitterbot-AI/bitterbot-desktop.git --path skills/canvas--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Bitterbot-AI/bitterbot-desktop --skill canvas -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Bitterbot-AI/bitterbot-desktop canvas --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Bitterbot-AI/bitterbot-desktop.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/canvas .gemini/skills/canvas && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "canvas" agent skill from https://github.com/Bitterbot-AI/bitterbot-desktop/tree/main/skills/canvas into .gemini/skills/canvas/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Bitterbot-AI/bitterbot-desktop canvasInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Bitterbot-AI/bitterbot-desktop --skill canvas -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Bitterbot-AI/bitterbot-desktop.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/canvas .github/skills/canvas && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "canvas" agent skill from https://github.com/Bitterbot-AI/bitterbot-desktop/tree/main/skills/canvas into .github/skills/canvas/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Bitterbot-AI/bitterbot-desktop --skill canvas -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Bitterbot-AI/bitterbot-desktop canvas --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Bitterbot-AI/bitterbot-desktop.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/canvas .opencode/skills/canvas && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "canvas" agent skill from https://github.com/Bitterbot-AI/bitterbot-desktop/tree/main/skills/canvas into .opencode/skills/canvas/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
canvasDisplay and control HTML content on connected Bitterbot nodes (Mac, iOS, Android) via the canvas host server.
Canvas is an agent skill from Bitterbot-AI/bitterbot-desktop. Display and control HTML content on connected Bitterbot nodes (Mac, iOS, Android) via the canvas host server. Use when presenting games, visualizations, dashboards, or interactive demos on a connected device, navigating canvas URLs, capturing canvas snapshots, or debugging canvas connectivity.
Its SKILL.md is about 1.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Development, covering Debugging. It works with Android and iOS. The repository describes itself as: Bitterbot - a mesh of agents that turns shared experience into collective capability. The licence is MIT.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit cd4562a. It shows what the files ask for, not the result of running them.
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.
Shell commands in SKILL.md call:
jqcurlFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
peters-mac-studio-1.sheep-coho.ts.netFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Canvas loads about 1.4k tokens when it runs. Until then it costs about 75 tokens; SKILL.md has 443 words of instructions outside code blocks.
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.
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); files beside SKILL.md are not scanned.
The full file from Bitterbot-AI/bitterbot-desktop at commit cd4562a, republished under its MIT licence (© Bitterbot-AI). 443 words, ~1,423 tokens.
.claude/skills/canvas/SKILL.md (or your agent's skills folder).Display HTML content on connected Bitterbot nodes (Mac app, iOS, Android).
The canvas tool lets you present web content on any connected node's canvas view. Great for:
┌─────────────────┐ ┌──────────────────┐ ┌─────────────┐
│ Canvas Host │────▶│ Node Bridge │────▶│ Node App │
│ (HTTP Server) │ │ (TCP Server) │ │ (Mac/iOS/ │
│ Port 18793 │ │ Port 18790 │ │ Android) │
└─────────────────┘ └──────────────────┘ └─────────────┘canvasHost.root directoryThe canvas host server binds based on gateway.bind setting:
| Bind Mode | Server Binds To | Canvas URL Uses |
|---|---|---|
loopback | 127.0.0.1 | localhost (local only) |
lan | LAN interface | LAN IP address |
tailnet | Tailscale interface | Tailscale hostname |
auto | Best available | Tailscale > LAN > loopback |
Key insight: The canvasHostHostForBridge is derived from bridgeHost. When bound to Tailscale, nodes receive URLs like:
http://<tailscale-hostname>:18793/__bitterbot__/canvas/<file>.htmlThis is why localhost URLs don't work - the node receives the Tailscale hostname from the bridge!
| Action | Description |
|---|---|
present | Show canvas with optional target URL |
hide | Hide the canvas |
navigate | Navigate to a new URL |
eval | Execute JavaScript in the canvas |
snapshot | Capture screenshot of canvas |
In ~/.bitterbot/bitterbot.json:
{
"canvasHost": {
"enabled": true,
"port": 18793,
"root": "/Users/you/bitterbot/canvas",
"liveReload": true
},
"gateway": {
"bind": "auto"
}
}When liveReload: true (default), the canvas host:
Great for development!
Place files in the canvas root directory (default ~/bitterbot/canvas/):
cat > ~/bitterbot/canvas/my-game.html << 'HTML'
<!DOCTYPE html>
<html>
<head><title>My Game</title></head>
<body>
<h1>Hello Canvas!</h1>
</body>
</html>
HTMLCheck how your gateway is bound:
cat ~/.bitterbot/bitterbot.json | jq '.gateway.bind'Then construct the URL:
http://127.0.0.1:18793/__bitterbot__/canvas/<file>.htmlhttp://<hostname>:18793/__bitterbot__/canvas/<file>.htmlFind your Tailscale hostname:
tailscale status --json | jq -r '.Self.DNSName' | sed 's/\.$//'bitterbot nodes listLook for Mac/iOS/Android nodes with canvas capability.
canvas action:present node:<node-id> target:<full-url>Example:
canvas action:present node:mac-63599bc4-b54d-4392-9048-b97abd58343a target:http://peters-mac-studio-1.sheep-coho.ts.net:18793/__bitterbot__/canvas/snake.htmlcanvas action:navigate node:<node-id> url:<new-url>
canvas action:snapshot node:<node-id>
canvas action:hide node:<node-id>Cause: URL mismatch between server bind and node expectation.
Debug steps:
cat ~/.bitterbot/bitterbot.json | jq '.gateway.bind'lsof -i :18793curl http://<hostname>:18793/__bitterbot__/canvas/<file>.htmlSolution: Use the full hostname matching your bind mode, not localhost.
Always specify node:<node-id> parameter.
Node is offline. Use bitterbot nodes list to find online nodes.
If live reload isn't working:
liveReload: true in configThe canvas host serves from /__bitterbot__/canvas/ prefix:
http://<host>:18793/__bitterbot__/canvas/index.html → ~/bitterbot/canvas/index.html
http://<host>:18793/__bitterbot__/canvas/games/snake.html → ~/bitterbot/canvas/games/snake.htmlThe /__bitterbot__/canvas/ prefix is defined by CANVAS_HOST_PATH constant.
hide it or navigate away© Bitterbot-AI, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/canvas of Bitterbot-AI/bitterbot-desktop.
Open the folder on GitHubat commit cd4562a
Canvas 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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Canvas this skillBitterbot-AI/bitterbot-desktop | 2.5k | — | ~1.4k | Automated safety check: Pass | MIT | |
| Dogfoodcallstackincubator/agent-skills | 1.7k | 1 repos | ~1.7k | Automated safety check: Pass | MIT | |
| Grix Code Reviewaskie/grix | 153 | — | ~799 | Automated safety check: Pass | Custom licence | |
| AppsFlyer Unity Bridge DebuggingAppsFlyerSDK/appsflyer-unity-plugin | 178 | — | ~492 | Automated safety check: Pass | MIT | |
| Try Fix Alternative Approachdotnet/maui | 23k | — | ~8.4k | Automated safety check: Pass | MIT | |
| Mobile Debuggingjamditis/claude-skills-journalism | 417 | — | ~5.2k | Automated safety check: Notes | MIT |
callstackincubator/agent-skills
Systematically explore and test a mobile app on iOS/Android with agent-device to find bugs, UX issues, and other problems.
askie/grix
Audit Grix diffs and pull requests for correctness, regressions, security, lifecycle safety, and cross-component contract consistency.
AppsFlyerSDK/appsflyer-unity-plugin
Traces a failing call or callback between C# and the native Android or iOS wrappers of the AppsFlyer Unity plugin to find the first broken link.
dotnet/maui
Attempts one alternative fix for a bug, runs the given test command against it and reports what happened, always differing from existing PR fixes.
jamditis/claude-skills-journalism
Remote JavaScript console and debugging on mobile. An agent skill from jamditis/claude-skills-journalism.
elix22/Sokol.NET
Sokol.NET framework development — use for ANY work in this repo: creating or debugging examples, building/running for desktop/Android/iOS/Web, writing or compiling shaders, adding a new C/C++…
Bitterbot-AI/bitterbot-desktop
Participate in Moltbook — the social network for AI agents. An agent skill from Bitterbot-AI/bitterbot-desktop.
Bitterbot-AI/bitterbot-desktop
A skill your agent uses when a tool error begins with "INTERCEPTOR:", a sent message was silently hedged or rewritten, or the user asks about active guards or blocked actions.
Bitterbot-AI/bitterbot-desktop
Get stock quotes, company info, market data, and crypto prices.
Bitterbot-AI/bitterbot-desktop
A skill your agent uses when anyone asks about bounties (or "forge"), agent earnings, the agent economy, marketplace skills, A2A activity or your network reputation.
Bitterbot-AI/bitterbot-desktop
A skill your agent uses when the user asks how your memory, dreams, hormones or knowledge crystals work, or when you need to interpret memorystatus output.
Bitterbot-AI/bitterbot-desktop
Deploy browser automations as scheduled, API-callable serverless Functions — plus stealth sessions, vault-backed login, captcha solving, and natural-language agent runs via the Notte CLI.
Categories
Display and control HTML content on connected Bitterbot nodes (Mac, iOS, Android) via the canvas host server. Canvas is an agent skill from Bitterbot-AI/bitterbot-desktop. Display and control HTML content on connected Bitterbot nodes (Mac, iOS, Android) via the canvas host server.
Canvas fits situations like: presenting games; interactive demos on a connected device; navigating canvas URLs; capturing canvas snapshots.
Run `npx skills add Bitterbot-AI/bitterbot-desktop --skill canvas -a claude-code`. Or copy the skill folder (skills/canvas in Bitterbot-AI/bitterbot-desktop) into .claude/skills/canvas in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Bitterbot-AI/bitterbot-desktop --skill canvas -a codex`. Or copy the skill folder (skills/canvas in Bitterbot-AI/bitterbot-desktop) into .agents/skills/canvas in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Bitterbot-AI/bitterbot-desktop --skill canvas -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/canvas, .gemini/skills/canvas, .github/skills/canvas and .opencode/skills/canvas in your project.
Going by SKILL.md and its folder, Canvas needs the command-line tools its instructions call (jq and curl).
SKILL.md names 1 domain. In commands or code: peters-mac-studio-1.sheep-coho.ts.net; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
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. Review the folder before installing.
Canvas is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 1.4k tokens (SKILL.md is roughly 5.7k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Canvas: Dogfood (callstackincubator/agent-skills, 1.7k stars), Grix Code Review (askie/grix, 153 stars), AppsFlyer Unity Bridge Debugging (AppsFlyerSDK/appsflyer-unity-plugin, 178 stars) and Try Fix Alternative Approach (dotnet/maui, 23k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Bitterbot-AI (a GitHub organization) maintains it in Bitterbot-AI/bitterbot-desktop, which has 2,467 GitHub stars. The repository holds 17 skills in this directory. The repository was last updated on October 9, 2026.
Source: Bitterbot-AI/bitterbot-desktop on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.