--- id: saffron-health/libretto/external-electron-apps version: "c990998a" license: MIT install: manual updated: 2026-07-27 --- # external-electron-apps — Control Electron-based desktop applications programmatically by connecting through Chrome DevTools Protocol. This skill enables automation of popular tools like Slack, Discord, and VS Code, letting you interact with their UI elements and workflows as if you were using them directly. Built on reliable browser automation foundations for consistent, repeatable interactions. Publisher: saffron-health · Stars: 841 · Updated: 2026-07-27 Install (manual): `git clone https://github.com/saffron-health/libretto` ## SKILL.md # External Electron App Automation 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 1. Quit the app if it is already running. 2. Relaunch the app with `--remote-debugging-port=`. 3. Connect with `npx libretto connect http://127.0.0.1: --session `. 4. Verify targets with `npx libretto pages --session `. 5. Run interactions with `npx libretto exec "" --session `. 6. Capture evidence with `npx libretto snapshot --session `. ## Launch examples ### macOS ```bash 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 ```bash slack --remote-debugging-port=9222 code --remote-debugging-port=9223 discord --remote-debugging-port=9224 ``` ### Windows ```bash "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: ```bash 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 ```bash 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: ```bash 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: ```bash npx libretto pages --session slack-desktop npx libretto exec --session slack-desktop --page "return await page.url()" npx libretto snapshot --session slack-desktop --page ``` ## Troubleshooting - If connection fails, make sure the app was launched with `--remote-debugging-port` and relaunch it. - Prefer `127.0.0.1` over `localhost` in CDP URLs. - If no pages are listed right after launch, wait 2-5 seconds and retry `pages`. - If a session is stale, run `connect` again with the same `--session`. Use `npx libretto close --session ` to clear the session. This does not terminate the external app — it only removes the session state so Libretto stops tracking it. [View on SkillFed](https://skillfed.io/saffron-health/libretto/external-electron-apps) · [View on GitHub](https://github.com/saffron-health/libretto)