Electron App Automation
vercel-labs/agent-browser
Automates Electron desktop apps such as VS Code, Slack or Discord by connecting agent-browser to their Chrome DevTools Protocol port.
Captures screenshots of the running Mailspring dev app for docs, PRs or visual checks by launching it with a debugging port, driving the UI and clipping to an element.
$ npx skills add Foundry376/Mailspring --skill app-screenshots -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Foundry376/Mailspring app-screenshots --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/Foundry376/Mailspring.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/app-screenshots .claude/skills/app-screenshots && 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 "app-screenshots" agent skill from https://github.com/Foundry376/Mailspring/tree/master/.claude/skills/app-screenshots into .claude/skills/app-screenshots/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "app-screenshots", 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/Foundry376/Mailspring/tree/master/.claude/skills/app-screenshotsType 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 Foundry376/Mailspring --skill app-screenshots -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Foundry376/Mailspring app-screenshots --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Foundry376/Mailspring.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/app-screenshots .agents/skills/app-screenshots && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "app-screenshots" agent skill from https://github.com/Foundry376/Mailspring/tree/master/.claude/skills/app-screenshots into .agents/skills/app-screenshots/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "app-screenshots", 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 Foundry376/Mailspring --skill app-screenshots -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Foundry376/Mailspring app-screenshots --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Foundry376/Mailspring.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/app-screenshots .cursor/skills/app-screenshots && 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 "app-screenshots" agent skill from https://github.com/Foundry376/Mailspring/tree/master/.claude/skills/app-screenshots into .cursor/skills/app-screenshots/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "app-screenshots", 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/Foundry376/Mailspring.git --path .claude/skills/app-screenshots--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 Foundry376/Mailspring --skill app-screenshots -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Foundry376/Mailspring app-screenshots --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Foundry376/Mailspring.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/app-screenshots .gemini/skills/app-screenshots && 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 "app-screenshots" agent skill from https://github.com/Foundry376/Mailspring/tree/master/.claude/skills/app-screenshots into .gemini/skills/app-screenshots/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "app-screenshots", 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 Foundry376/Mailspring app-screenshotsInstalls 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 Foundry376/Mailspring --skill app-screenshots -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Foundry376/Mailspring.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/app-screenshots .github/skills/app-screenshots && 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 "app-screenshots" agent skill from https://github.com/Foundry376/Mailspring/tree/master/.claude/skills/app-screenshots into .github/skills/app-screenshots/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "app-screenshots", 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 Foundry376/Mailspring --skill app-screenshots -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Foundry376/Mailspring app-screenshots --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Foundry376/Mailspring.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/app-screenshots .opencode/skills/app-screenshots && 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 "app-screenshots" agent skill from https://github.com/Foundry376/Mailspring/tree/master/.claude/skills/app-screenshots into .opencode/skills/app-screenshots/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "app-screenshots", 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.
app-screenshotsCaptures screenshots of the running Mailspring dev app for docs, PRs or visual checks by launching it with a debugging port, driving the UI and clipping to an element.
The skill works around a blocked screencapture by using the Chrome DevTools Protocol against a dev build of the Electron app that was started with a remote debugging port. It first kills stray Electron and mailsync processes, because orphaned mailsync processes keep the SQLite database open and make later seed scripts fail silently, then launches the app and waits for the window and first sync. Code changes need a full relaunch, whereas edited LESS styles can be reloaded in place, and the window can be shrunk to a documentation-friendly size.
scripts/eval.mjs runs JavaScript in the main window and can capture the whole window or send a real mouse click, and scripts/shoot.mjs runs setup code and then clips one element by selector. The notes give tips for driving the UI: navigating to a sheet through app actions, picking dropdown items with mouse events, setting controlled input values so React notices, preferring real mouse events over synthetic clicks for hover and caret behavior, and waiting after each action. Further scripts anonymize on-screen data and seed tracking metadata.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 4ebb582. 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.
Ships 4 files in scripts/ (JavaScript and Python), which the agent can run.
Shell commands in SKILL.md call:
nodecurlFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use curl, which can reach the network depending on how they are called.
From 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.
Mailspring App Screenshots loads about 1.5k tokens when it runs. Until then it costs about 64 tokens; SKILL.md has 692 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); the scripts in this folder are not scanned.
The full file from Foundry376/Mailspring at commit 4ebb582, republished under its GPL-3.0 licence (© Foundry376). 692 words, ~1,485 tokens.
.claude/skills/app-screenshots/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.screencapture is blocked in this environment (no Screen Recording permission), and
the app has no test-id hooks. The reliable path is Chrome DevTools Protocol against a
dev build launched with a remote-debugging port. Everything below runs from the repo
root unless noted. Scripts live in .claude/skills/app-screenshots/scripts/.
Only one instance can run at a time, so check first. If one is running that you didn't start, it is probably the user's: ask before closing it.
pgrep -fl "[Ee]lectron ./app" # anything listed will be closed by the next line
pkill -f "[Ee]lectron ./app"; pkill -f "app/mailsync --mode sync"; sleep 2
(./node_modules/.bin/electron ./app --enable-logging --dev --remote-debugging-port=9333 > /tmp/app.log 2>&1 &)
sleep 18 # window + plugins + first sync
curl -s localhost:9333/json | grep -c webSocketDebuggerUrl # >0 means readymailsync processes too; they outlive the Electron process and
hold the SQLite DB open (a later seed script will silently fail to commit).location.reload() does nothing in the renderer. Pick up renderer changes with
AppEnv.commands.dispatch('window:reload'); main-process changes (app/src/browser)
need a full relaunch. Edited LESS can be hot-loaded with AppEnv.themes.reloadCoreStyles().AppEnv.getCurrentWindow().setSize(1280, 800).scripts/eval.mjs evaluates JS in the main window (picks the target whose
document.body.className contains window-type-default) and optionally captures the
whole window or dispatches a real mouse click:
node --experimental-websocket scripts/eval.mjs "<js>" [out.png] [clickX clickY]Useful snippets inside the JS:
$m.Actions.focusMailboxPerspective(new (require('../internal_packages/activity/lib/activity-mailbox-perspective').default)($m.FocusedPerspectiveStore.sidebarAccountIds()))DropdownMenu: click .dropdown-menu > div, wait 300ms, then find the
item by text under .menu div and dispatch mousedown and click on it.<input>: set the value through
Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value').set and
dispatch input; plain .value = doesn't reach React.Input.dispatchMouseEvent),
not synthetic el.click() — the two differ for caret placement and :hover.scripts/shoot.mjs runs setup JS, then captures one element by selector using
Page.captureScreenshot with a clip in CSS px:
node --experimental-websocket scripts/shoot.mjs "<setup-js>" "<selector>" out.png [pad] [maxHeight]scale: 1 already yields device pixels (2x on retina). Don't pass scale: 2 — that
produces 4x images.sips -c, which crops from the
centre and pads with black. Use maxHeight to trim tall columns instead.body.is-blurred, greyed traffic
lights). The script strips the class before capturing.setup-js that the
capture runs in, never in a previous invocation, and never call
activeElement.blur() to remove the focus ring — inject a <style> with
outline: none !important instead.The dev mailbox contains real correspondents. Before any capture that leaves the
machine, rewrite the rendered DOM: scripts/anonymize.example.js walks every text
node and title attribute and applies a regex map. Copy it, edit the map for the
current mailbox, and pass its contents as the setup-js (after the view has loaded).
/^ben$/)
rather than phrases (/ben opened/).example.com paths and your own accounts with
you@gmail.com / you@yourcompany.com; sidebar account headers are text nodes too.scripts/seed-tracking-metadata.py writes fake open/click metadata onto real sent
messages. Pattern for any similar seeding:
cp edgehill.db edgehill.db.bak-<reason>.Message.data,
metadata array) and the join table (ModelPluginMetadata) that queries filter on.For illustrative shots (e.g. every kanban column populated) it's fine to move or clone rendered nodes with DOM APIs in the setup JS — but React will throw on its next re-render because its tree no longer matches. So: take staged captures last, one per launch, and relaunch before doing anything interactive again. A blank/"loading" view right after staging is that crash, not a product bug.
Read every PNG back (the Read tool renders images). Things that slipped past
otherwise: focus rings, blurred title bars, un-anonymized names in a second text
node, a broken <img> from a guessed asset path (copy an existing icon's resolved
src and swap the filename), and letterboxed crops.
© Foundry376, GPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 4 other files (scripts) in .claude/skills/app-screenshots of Foundry376/Mailspring.
Open the folder on GitHubat commit 4ebb582
Mailspring App Screenshots 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 |
|---|---|---|---|---|---|---|
| Mailspring App Screenshots this skillFoundry376/Mailspring | 18k | — | ~1.5k | Automated safety check: Pass | GPL-3.0 | |
| Electron App Automationvercel-labs/agent-browser | 44k | 5 repos | ~1.7k | Automated safety check: Pass | Apache-2.0 | |
| OpenWork Electron Browser Automationdifferent-ai/openwork | 24k | — | ~780 | Automated safety check: Pass | Custom licence | |
| Electron Devtools Testingankitvgupta/exo | 496 | — | ~2.4k | Automated safety check: Pass | Custom licence | |
| Interactive TestingPorabuild/Poracode | 114 | — | ~4.5k | Automated safety check: Notes | Apache-2.0 | |
| Go Pedantrychromedp/chromedp | 13k | — | ~3.7k | Automated safety check: Pass | MIT |
vercel-labs/agent-browser
Automates Electron desktop apps such as VS Code, Slack or Discord by connecting agent-browser to their Chrome DevTools Protocol port.
different-ai/openwork
Attaches OpenCode browser tools to the OpenWork Electron dev app through CDP to explore its UI, send a composer task and debug, not to give test verdicts.
ankitvgupta/exo
Test the Electron app interactively using Chrome DevTools Protocol.
Porabuild/Poracode
Run repeatable integration and smoke testing against the real Poracode Electron app through Chrome DevTools Protocol.
chromedp/chromedp
This skill should be used when the user is writing Go code and needs guidance on Go-specific pedantry: error wrapping with fmt.Errorf and %w, interface design (accept interfaces return structs)…
TracecatHQ/tracecat
A skill your agent uses when adding or updating documentation pages in an existing docs site.
Works with
Categories
Captures screenshots of the running Mailspring dev app for docs, PRs or visual checks by launching it with a debugging port, driving the UI and clipping to an element. The skill works around a blocked screencapture by using the Chrome DevTools Protocol against a dev build of the Electron app that was started with a remote debugging port. It first kills stray Electron and mailsync processes, because orphaned mailsync processes keep the SQLite database open and make later seed scripts fail silently, then launches the app and waits for the window and first sync.
Mailspring App Screenshots fits situations like: taking screenshots of the Mailspring dev app for documentation; capturing a single UI element for a pull request; verifying a visual change in the running app; seeding or anonymizing data before a capture.
Run `npx skills add Foundry376/Mailspring --skill app-screenshots -a claude-code`. Or copy the skill folder (.claude/skills/app-screenshots in Foundry376/Mailspring) into .claude/skills/app-screenshots in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Foundry376/Mailspring --skill app-screenshots -a codex`. Or copy the skill folder (.claude/skills/app-screenshots in Foundry376/Mailspring) into .agents/skills/app-screenshots 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 Foundry376/Mailspring --skill app-screenshots -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/app-screenshots, .gemini/skills/app-screenshots, .github/skills/app-screenshots and .opencode/skills/app-screenshots in your project.
Going by SKILL.md and its folder, Mailspring App Screenshots needs JavaScript and Python for the scripts in its folder and the command-line tools its instructions call (node and curl). Our summary lists: A Mailspring development build that runs under Electron; Node.js, run with the experimental WebSocket flag.
SKILL.md contains no URLs. Its commands use curl, which can reach the network depending on how they are called. 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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Mailspring App Screenshots is published under the GPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 1.5k tokens (SKILL.md is roughly 5.9k 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 Mailspring App Screenshots: Electron App Automation (vercel-labs/agent-browser, 44k stars), OpenWork Electron Browser Automation (different-ai/openwork, 24k stars), Electron Devtools Testing (ankitvgupta/exo, 496 stars) and Interactive Testing (Porabuild/Poracode, 114 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Foundry376 (a GitHub organization) maintains it in Foundry376/Mailspring, which has 17,892 GitHub stars. The repository was last updated on October 7, 2026.
Source: Foundry376/Mailspring on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.