1,400+ 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.

For developers already burned by PyAutoGUI, AutoHotkey, UIAutomation, and screenshot agents.

$ claude mcp add terminator "npx -y terminator-mcp-agent@latest"
1,400+
GitHub stars
430/wk
MCP installs
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
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

json
{
  "mcpServers": {
    "terminator-mcp-agent": {
      "command": "npx",
      "args": ["-y", "terminator-mcp-agent@latest"],
      "env": {
        "LOG_LEVEL": "info"
      }
    }
  }
}

// Claude can now use tools like:
// - click_element
// - type_into_element
// - get_window_tree
// - capture_screenshot
// ... and 30 more

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

Why Terminator?

Desktop automation that actually works.

FeatureTerminatorPlaywrightVision AI
Desktop apps
Browser automation
Reliability>95%>99%~70%
SpeedFastFastSlow
MCP supportVaries
Open sourceVaries
Session reuse
Install

Pick your stack, copy one line

Plug into any AI coding assistant via MCP, or pull the SDK straight into TypeScript, Python, or Rust. Same selectors, same reliability story, six install paths.

One-liner MCP install. Claude Code can drive any Windows app on your desktop, not just the browser.

bash
claude mcp add terminator "npx -y terminator-mcp-agent@latest"

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.