Claude Code skills for Electron app QA — design review, visual testing, and performance benchmarking.
molecule does for Electron apps what gstack does for web apps: provides a persistent daemon with an AI-friendly ref system (@e1, @e2) for interacting with your app's UI via accessibility tree snapshots.
git clone https://github.com/ahappydad/molecule
cd molecule
./setup
# In your Electron project:
$MO launch electron/main.cjs
$MO snapshot -i # See interactive elements
$MO click @e3 # Click an element
$MO fill @e5 "Hello world" # Fill a text input
$MO screenshot /tmp/app.png # Take a screenshot
$MO main-eval "process.uptime()" # Execute in main processClaude Code CLI
└─→ $MO <command>
└─→ HTTP POST localhost:PORT
├─→ Bun.serve() daemon
│ ├─→ Playwright _electron API
│ └─→ Accessibility tree → @ref system
└─→ Your Electron App
molecule launches your Electron app via Playwright's _electron API, maintaining a persistent HTTP daemon for sub-second interactions. The ref system parses the accessibility tree and assigns @e1, @e2, etc. to interactive elements, so Claude can interact with your UI without writing CSS selectors.
| Skill | Description |
|---|---|
/molecule-app |
Launch, interact, and screenshot Electron apps |
/molecule-qa |
Full QA testing with automated bug fixes |
/molecule-qa-only |
QA testing with report only (no fixes) |
/molecule-design-review |
Visual QA + CSS fixes with atomic commits |
/molecule-plan-design-review |
Plan-mode design review (no browser needed) |
/molecule-design-consultation |
Create a complete design system |
/molecule-benchmark |
Electron performance metrics (startup, memory, IPC) |
/molecule-canary |
Post-update monitoring |
click <@ref>— Click an elementfill <@ref> <text>— Fill a text inputtype <@ref> <text>— Type character by characterpress <key>— Press a key combinationselect <@ref> <value>— Select a dropdown optionhover <@ref>— Hover over an elementscroll [up|down] [amount]— Scroll the page
snapshot -i— Interactive elements with refstext [selector]— Get text contentjs <expr>— Execute JavaScript in rendererconsole [--errors]— Read console messagesnetwork [--errors]— Read network requestsscreenshot [path]— Take a screenshot
launch [main.cjs]— Launch the appwindows— List all BrowserWindowswindow <id|title>— Switch active windowmain-eval <expr>— Execute in main processmain-memory— Main process memory usageipc-listen <channel>— Intercept IPC messagesipc-log [channel]— Read intercepted IPCmenu— Read application menumenu-click <path>— Trigger a menu item
Launch mode (default): Full control via _electron.launch() — includes main process access, window management, and IPC interception.
Attach mode: Connect to an already-running app via CDP: $MO launch --attach 9222. Requires the app to be started with --remote-debugging-port=9222. No main process access.
MIT