Playwright,
for every app on your desktop
Open-source desktop automation that drives native Windows apps through accessibility APIs, not OCR or pixel matching. Playwright-shaped SDK plus an MCP server that gives Claude, Cursor, and VS Code real OS-level hands.
const desktop = new Desktop();
await desktop.openApplication('notepad');
// find by role + name, not pixels or OCR
await desktop
.locator('role:Button && name:Save')
.click();Accessibility tree, not pixels. For devs burned by PyAutoGUI, AutoHotkey, and screenshot computer-use.
Claude, but with hands on your desktop
An honest transcript: one prompt, real MCP tool calls, structural selectors. No screenshots, no OCR loop, no pixel matching. The same flow runs from Cursor, VS Code, Windsurf, or any MCP client.
one-line install · works in Claude Code, Cursor, VS Code, Windsurf, Claude Desktop
Windows
Full support
macOS
In development
Linux
In development
From brittle pixels to structural selectors
Same automation, two worlds apart. Hardcoded coordinates and image matches break the moment your DPI, theme, or layout shifts. Terminator queries the accessibility tree, so the script just keeps working.
PyAutoGUI / AutoHotkey
brittleimport pyautogui, time
# pray the user's DPI hasn't changed
pyautogui.click(x=842, y=317)
time.sleep(1.5)
pyautogui.click(x=842, y=317) # double-click hack
# image match the Save button — fails on dark mode,
# theme changes, locale, antialiasing, scaling...
loc = pyautogui.locateOnScreen(
'save_btn.png', confidence=0.85
)
if loc is None:
raise Exception("Save button not found 🤞")
pyautogui.click(loc)
pyautogui.typewrite("invoice.pdf", interval=0.05)
pyautogui.press('enter')- Coordinates break on every DPI / resolution change
- PNG image matching fails on themes, locale, antialiasing
- Sleep-then-pray sync, no real waits, no element semantics
Terminator
structuralimport { Desktop } from '@mediar-ai/terminator';
const desktop = new Desktop();
await desktop.openApplication('notepad');
// find by role + name, not pixels
await desktop
.locator('role:Button && name:Save')
.click();
// real input, real focus, real waits
await desktop
.locator('role:Edit && name:File name')
.typeText('invoice.pdf');
await desktop
.locator('role:Button && name:Save')
.click();
// done. survives DPI, theme, and layout changes.- Selectors target real UI elements, not pixels
- Survives DPI, theme, locale, and most layout changes
- Auto-waits, type-safe, fluent Playwright-style API
What developers ship with Terminator
Give Claude / Cursor / Windsurf real OS-level hands beyond the browser.
Replace flaky PyAutoGUI / Selenium-for-desktop scripts on legacy WinForms, WPF, and Electron.
Drive Excel, SAP, Outlook, and line-of-business apps without a hosted RPA platform.
Mix accessibility-tree actions with vision fallback only when you actually need it.
Click
Find and click any UI element by role, name, or text. No XPath. No brittle selectors.
Type
Input text into any field. Handles focus, clearing, and special keys automatically.
See
Capture screenshots, read UI trees, OCR text, or use AI vision for complex elements.
Built for reliability
Deterministic automation through Windows accessibility APIs. Falls back to AI vision only when needed.
TypeScript SDK
Full-featured Desktop class with 60+ methods. Type-safe, async/await, fluent API.
MCP Server
35 tools for Claude, Cursor, and VS Code. AI assistants can control any app.
Smart Selectors
role:Button && name:Submit — intuitive selector syntax that just works.
Cross-App
Not just browsers. Automate Notepad, Excel, SAP, legacy apps — anything with a UI.
100x Faster
Pre-recorded workflows run instantly. No AI latency for deterministic paths.
AI Recovery
When the unexpected happens, Gemini vision kicks in to handle dynamic UIs.
Simple, powerful API
Playwright-style API that works on any Windows application.
TypeScript SDK
import { Desktop } from '@mediar-ai/terminator';
const desktop = new Desktop();
// Open Notepad and type
await desktop.openApplication('notepad');
const editor = await desktop
.locator('role:Edit')
.first();
await editor.typeText('Hello from Terminator!');
// Click a button
const saveBtn = await desktop
.locator('role:Button && name:Save')
.first();
await saveBtn.click();MCP for Claude
# Once Terminator MCP is installed, Claude can call:
# click_element type_into_element
# get_window_tree capture_screenshot
# open_application run_workflow
# wait_for_element get_element_text
# ... and 30 more tools, all over the
# accessibility tree, no pixels involved.
you ▸ open notepad and write "hello, world"
claude ▸ open_application("notepad")
claude ▸ locator("role:Edit").type_text("hello, world")
✓ done in 312ms (1 call, 0 retries)Get the install command and ready-to-paste JSON for Claude Desktop, Cursor, VS Code, and Windsurf via the install gate above.
Selector Cheatsheet
| Selector | Finds |
|---|---|
| role:Button | Any button |
| name:Submit | Element named "Submit" |
| role:TextBox && name:Email | Email input field |
| text:Click me | Element with text |
| window:Notepad >> role:Edit | Editor in Notepad |
Terminator vs PyAutoGUI, AutoHotkey, and screenshot agents
If you're only automating Chrome, use Playwright. This table is for the other 80% of the desktop, where you're currently picking between brittle pixel scripts, hand-walked UIA trees, and slow vision loops.
| Capability | Terminator accessibility tree + MCP | PyAutoGUI / AutoHotkey pixels + coordinates | Screenshot agents computer-use, OCR loops |
|---|---|---|---|
| Element lookup by role + name | |||
| Survives DPI / theme / layout shifts | Sometimes | ||
| Step latency | ~50-300ms | ~100ms + sleeps | 2-8s / step |
| Token cost per action | $0 | $0 | image tokens / step |
| Drop-in MCP for Claude / Cursor / VS Code | Varies | ||
| TypeScript + Python + Rust SDKs | Python only | Varies | |
| Auto-waits (no time.sleep guessing) | |||
| Vision fallback when AX is missing | |||
| Cross-platform target (Win + macOS) | Windows stable, macOS in dev | ||
| MIT license, self-hosted, no vendor | Varies |
Plug into any MCP client in under a minute
Drop your email and we'll send the one-line Claude Code install plus ready-to-paste JSON for Claude Desktop, Cursor, VS Code, and Windsurf. Same entry point everywhere.
Honest FAQ
Straight answers, including when Terminator is the wrong tool.
How is this different from PyAutoGUI or AutoHotkey?+
Is it just a wrapper around Windows UIAutomation?+
Does it use screenshots, OCR, or pixel matching?+
Which AI coding assistants can drive it via MCP?+
Should I use this instead of Playwright for browser work?+
Is macOS and Linux support ready?+
Is it really MIT-licensed and open source?+
Ship your first automation today
One-liner MCP install. Full TypeScript, Python, and Rust bindings. MIT licensed. Star the repo to follow the project, or book a call if you're building something serious.