---
name: External Electron Apps
slug: external-electron-apps
category: Automation
description: "External Electron Apps automates user-installed Electron desktop apps through Libretto and CDP. Use it to control apps like Slack, VS Code, Discord, Notion, Figma, or Spotify on the user's machine."
github: "https://github.com/saffron-health/libretto/tree/main/.agents/skills/external-electron-apps"
language: TypeScript
stars: 877
forks: 67
install: "npx degit https://github.com/saffron-health/libretto/tree/main/.agents/skills/external-electron-apps ~/.claude/skills/external-electron-apps"
installs_to: ~/.claude/skills/external-electron-apps
source_path: .agents/skills/external-electron-apps/SKILL.md
collection_size: 23
category_size: 1523
collection_url: "https://dirskills.com/collections/saffron-health/libretto"
added: 2026-08-22T05:21:18.371Z
last_synced: 2026-08-22T05:21:18.371Z
canonical_url: "https://dirskills.com/skills/external-electron-apps"
---

# External Electron Apps

External Electron Apps automates user-installed Electron desktop apps through Libretto and CDP. Use it to control apps like Slack, VS Code, Discord, Notion, Figma, or Spotify on the user's machine.

**Install:**

```bash
npx degit https://github.com/saffron-health/libretto/tree/main/.agents/skills/external-electron-apps ~/.claude/skills/external-electron-apps
```

## README

# 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=<port>`.
3. Connect with `npx libretto connect http://127.0.0.1:<port> --session <session>`.
4. Verify targets with `npx libretto pages --session <session>`.
5. Run interactions with `npx libretto exec "<code>" --session <session>`.
6. Capture evidence with `npx libretto snapshot --session <session>`.
7. 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

```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 <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.

```bash
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-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 <session>` to clear the session. This does not terminate the external app — it only removes the session state so Libretto stops tracking it.
