External Electron App Automation
SkillDocs & knowledgeAutomate user-installed Electron desktop apps (Slack, Discord, VS Code, Notion, Figma, Spotify, etc.) via CDP using this repo's Libretto CLI. Use when the task is to control a local desktop app on the user's machine, not this repo's own Electron app. Triggers: "desktop Slack app", "connect to Electron app", "remote-debugging-port", "CDP desktop app", "automate VS Code desktop app".
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the External Electron App Automation skill
What this skill tells your AI
The instructions your AI receives, as published by saffron-health/libretto in .agents/skills/external-electron-apps/SKILL.md and read by ahel’s review.
Use this skill for external Electron desktop apps running on the user's machine. Do not default to this for this repository's own Electron app unless the user explicitly asks.
Core workflow
- Quit the app if it is already running.
- Relaunch the app with
--remote-debugging-port=<port>. - Connect with
npx libretto connect http://127.0.0.1:<port> --session <session>. - Verify targets with
npx libretto pages --session <session>. - Run interactions with
npx libretto exec "<code>" --session <session>. - Capture evidence with
npx libretto snapshot --session <session>. - When a reusable workflow file is ready, execute it with
npx libretto run ./workflow.ts --cdp http://127.0.0.1:<port>(optional--page page-N).
Launch examples
macOS
open -a "Slack" --args --remote-debugging-port=9222
open -a "Visual Studio Code" --args --remote-debugging-port=9223
open -a "Discord" --args --remote-debugging-port=9224
Linux
slack --remote-debugging-port=9222
code --remote-debugging-port=9223
discord --remote-debugging-port=9224
Windows
"C:\Users\%USERNAME%\AppData\Local\slack\slack.exe" --remote-debugging-port=9222
"C:\Users\%USERNAME%\AppData\Local\Programs\Microsoft VS Code\Code.exe" --remote-debugging-port=9223
Session pattern
Use one session per app:
npx libretto connect http://127.0.0.1:9222 --session slack-desktop
npx libretto pages --session slack-desktop
npx libretto exec "return await page.title()" --session slack-desktop
npx libretto snapshot --session slack-desktop
Interaction examples
npx libretto exec "await page.locator('button:has-text(\"Search\")').click()" --session slack-desktop
npx libretto exec "await page.keyboard.type('incident-123')" --session slack-desktop
npx libretto exec "await page.keyboard.press('Enter')" --session slack-desktop
When selectors are unstable, inspect first:
npx libretto snapshot --session slack-desktop
npx libretto exec "return await page.content()" --session slack-desktop
Multiple pages
Electron apps often have multiple windows/pages. Use pages to list them and --page to target a specific one:
npx libretto pages --session slack-desktop
npx libretto exec --session slack-desktop --page <page-id> "return await page.url()"
npx libretto snapshot --session slack-desktop --page <page-id>
Scripted workflows
After interactive discovery, run a default-exported workflow() against the same CDP endpoint. Libretto attaches to the selected page without navigating to workflow startUrl, so leave the app on the target screen first (or navigate in the handler). Closing the Libretto session does not quit the Electron app.
npx libretto run ./slack-workflow.ts --cdp http://127.0.0.1:9222
npx libretto run ./slack-workflow.ts --cdp http://127.0.0.1:9222 --page page-1
Troubleshooting
- If connection fails, make sure the app was launched with
--remote-debugging-portand relaunch it. - Prefer
127.0.0.1overlocalhostin CDP URLs. - If no pages are listed right after launch, wait 2-5 seconds and retry
pages. - If a session is stale, run
connectagain with the same--session.
Use npx libretto close --session <session> to clear the session. This does not terminate the external app — it only removes the session state so Libretto stops tracking it.
Signals
- GitHub stars
- 891
- Forks
- 69
- Last commit
- Aug 2026
Advanced
- Catalog kind
- skill
- Gateway key
external-electron-apps- Source
- github.com/saffron-health/libretto