1,500+ on GitHubMIT licensedWindows-native

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.

the whole API · @mediar-ai/terminator
const desktop = new Desktop();
await desktop.openApplication('notepad');

// find by role + name, not pixels or OCR
await desktop
  .locator('role:Button && name:Save')
  .click();
50-300ms
per step
vs 2-8s for screenshot agents
$0
tokens / action
vs image tokens every step
structural
survives DPI / theme
vs one pixel shift breaks it

Accessibility tree, not pixels. For devs burned by PyAutoGUI, AutoHotkey, and screenshot computer-use.

delivered instantly·no spam·unsubscribe anytime
1,500+
GitHub stars
54k+
crates.io downloads
35+
MCP tools shipped
3×
SDKs: TS · Python · Rust
Drives real apps for AI agents in
Claude Code·Cursor·VS Code·Windsurf·any MCP client
How it actually runs

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.

claude code · terminator MCPlive
$ claude
you ▸ open notepad and write "hello, world"
claude ▸ on it. using the terminator MCP server.
→ terminator.open_application("notepad")
→ terminator.locator("role:Edit").type_text("hello, world")
✓ notepad now contains "hello, world" (1 tool call · 312ms · accessibility tree)
you ▸ now save it as note.txt to the desktop
claude ▸ saving via the file menu.
→ terminator.locator("role:MenuItem && name:File").click()
→ terminator.locator("role:MenuItem && name:Save As").click()
→ terminator.locator("role:Edit && name:File name").type_text("note.txt")
→ terminator.locator("role:Button && name:Save").click()
✓ note.txt saved. zero pixel matches. zero hardcoded coordinates.
waiting for next prompt
More example workflows

one-line install · works in Claude Code, Cursor, VS Code, Windsurf, Claude Desktop

SUPPORTED

Windows

Full support

COMING SOON

macOS

In development

COMING SOON

Linux

In development

The PyAutoGUI tax

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

brittle
python
import 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

structural
typescript
import { 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

AI agents

Give Claude / Cursor / Windsurf real OS-level hands beyond the browser.

QA & testing

Replace flaky PyAutoGUI / Selenium-for-desktop scripts on legacy WinForms, WPF, and Electron.

Back-office RPA

Drive Excel, SAP, Outlook, and line-of-business apps without a hosted RPA platform.

Computer-use loops

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.

01

TypeScript SDK

Full-featured Desktop class with 60+ methods. Type-safe, async/await, fluent API.

02

MCP Server

35 tools for Claude, Cursor, and VS Code. AI assistants can control any app.

03

Smart Selectors

role:Button && name:Submit — intuitive selector syntax that just works.

04

Cross-App

Not just browsers. Automate Notepad, Excel, SAP, legacy apps — anything with a UI.

05

100x Faster

Pre-recorded workflows run instantly. No AI latency for deterministic paths.

06

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

typescript
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

bash
# 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

SelectorFinds
role:ButtonAny button
name:SubmitElement named "Submit"
role:TextBox && name:EmailEmail input field
text:Click meElement with text
window:Notepad >> role:EditEditor in Notepad
The honest comparison

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.

CapabilityTerminator
accessibility tree + MCP
PyAutoGUI / AutoHotkey
pixels + coordinates
Screenshot agents
computer-use, OCR loops
Element lookup by role + name
Survives DPI / theme / layout shiftsSometimes
Step latency~50-300ms~100ms + sleeps2-8s / step
Token cost per action$0$0image tokens / step
Drop-in MCP for Claude / Cursor / VS CodeVaries
TypeScript + Python + Rust SDKsPython onlyVaries
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 vendorVaries
Honest caveat: AX/UIA coverage varies app-to-app. Custom-drawn canvases and games still need vision — Terminator falls back to Gemini for those, no separate loop required.
Install

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?+
PyAutoGUI and AutoHotkey send synthetic keystrokes and click coordinates; they don't know what a button is. Terminator queries the accessibility tree, so selectors like role:Button && name:Save match structurally. Scripts stop breaking the first time layout shifts by two pixels or the user's DPI changes.
Is it just a wrapper around Windows UIAutomation?+
The Rust core uses UIA on Windows and AX on macOS under the hood, but the public API is Playwright-shaped: locators, chaining, retries, a unified selector syntax. You don't hand-walk the UIA tree, and you get the same SDK from TypeScript, Python, or Rust.
Does it use screenshots, OCR, or pixel matching?+
Not by default. Element lookups walk the accessibility tree and are deterministic. Vision (Gemini) is only the fallback when an element isn't exposed to accessibility (think custom-drawn canvases or games). Most line-of-business apps never need it.
Which AI coding assistants can drive it via MCP?+
Anything that speaks Model Context Protocol: Claude Code, Cursor, VS Code's MCP support, Windsurf. One-liner install: claude mcp add terminator "npx -y terminator-mcp-agent@latest". The MCP server ships 35+ tools (click, type, read tree, capture screenshot, run workflow).
Should I use this instead of Playwright for browser work?+
No. If you're only automating Chrome or Firefox, Playwright has a richer DevTools-level API and should stay your default. Terminator shines when you need to hop between apps in a single run (browser to Excel to SAP to a native dialog), or when the target isn't a browser at all.
Is macOS and Linux support ready?+
Windows is the stable, primary target. macOS (AXUIElement) is in active development; the waitlist above is the real sign-up, not a joke. Linux (AT-SPI) is further out. If you need cross-platform today, start with Windows.
Is it really MIT-licensed and open source?+
Yes. Source at github.com/mediar-ai/terminator. Published on crates.io (terminator-rs), npm (@mediar-ai/terminator), and PyPI (terminator). No hosted platform, no bot orchestration, no RBAC. It's a framework, not an RPA vendor.

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.