Browser Use Ships macOS Harness to Give AI Full Desktop Control
Browser-use just open-sourced a six-primitive Python harness that hands an LLM direct control of macOS without app-specific tools or wrappers.
PRO- Browser-use released macOS Harness, an MIT-licensed Python package that gives an LLM direct control of a Mac.
- Six primitives (see, key, type, click, ax, script) replace app-specific tool schemas entirely.
- Uses CGWindow, CGEvent to a PID, Accessibility API, Apple Events, and CDP under the hood.
- Captures background windows and sends input without stealing focus or moving your real cursor.
- Installs via
uv tool install macos-harness; skill file teaches Codex or Claude Code the workflow automatically. - Anonymous telemetry is on by default but excludes prompts, screenshots, paths, and app names.
The team behind Browser Use, best known for their Browser Harness project, has shipped a Mac equivalent. macOS Harness is a small MIT-licensed Python package that hands an LLM the keys to your entire desktop, and it takes a deliberately minimalist approach: no adapters for Slack, no plugins for Final Cut, no pre-baked recipes for anything. The pitch is a thin harness that lets an LLM complete almost any task on a Mac by writing whatever glue is missing, mid-task. One Python process connected directly to macOS, your real browser, and your files.
The whole Mac in six calls
Instead of exposing a growing catalogue of tool schemas, the harness reduces desktop control to a handful of primitives. Everything the model can do to your Mac routes through six calls: mac.see, mac.key, mac.type, mac.click, mac.ax, and mac.script. A typical session looks like this:
macos-harness <<'PY'
frame = mac.see("Spotify")
mac.key("cmd+k", app="Spotify")
mac.type("Alessia Cara", app="Spotify")
mac.click(640, 420, app="Spotify")
item = mac.ax.at(640, 420, app="Spotify")
mac.script('tell application "Spotify" to play')
print(browser.page_info())
print(list(Path.home().iterdir()))
PY
Everything runs inside one persistent Python process, so browser, Path, and subprocess sit alongside the mac.* calls. When the model needs something the primitives don't cover, it writes ordinary Python on the spot rather than waiting for a maintainer to add an integration.
This story is for Pro members
You've reached the end of the free preview. Upgrade to AlphaSignal Pro to read the full article - and everything else behind the paywall.