offstage
Claim this toolA second macOS desktop for your coding agent
Free, no paid tierFreeDeveloper Tools
Visit Website FreeVisit Website
Tracked since2026
The Bottom Line
- Price
- Free, no paid tier. Compare plans
Key facts
- Gives your coding agent a separate macOS account so GUI commands run on a different desktop, leaving your screen untouched.
- Works with Claude Code, Codex, and opencode via MCP or CLI, automatically routing commands like simulators, Xcode UI tests, and browser sessions.
- Free and open source under MIT license, requiring only an Apple Silicon Mac and Node 20+.
Pros
- Completely free and MIT licensed, with no paid tiers or premium features.
- Integrates seamlessly as an MCP server for Claude Code, Codex, and opencode, or as a standalone CLI tool.
- Keeps your desktop clean and focused while your agent runs complex GUI-heavy workflows.
Cons
- Requires Apple Silicon and Node 20+, excluding Intel Macs or older systems.
- Setup needs manual sudo access and one-time account creation, which the agent cannot perform itself.
What is offstage?
offstage provides a dedicated macOS account for your coding agent, allowing it to run GUI-heavy tasks like Xcode UI tests, simulators, and browser tests without interrupting your own workflow. The agent operates on its own desktop with its own window server and input, while you keep your screen, keyboard, and mouse. It intercepts commands like xcodebuild, xcrun simctl, open -a, and osascript, routing them to the second account where they run invisibly behind your current session.
For developers using Claude Code, Codex, or opencode, offstage integrates as an MCP server or CLI tool. It distinguishes between GUI commands (routed to the helper account) and headless commands (run in place), and refuses dangerous actions like installing packages or mounting disk images. Setup requires one manual step to create the helper account, but thereafter the agent handles everything automatically. Free and MIT licensed, it requires an Apple Silicon Mac with Node 20 or newer.
Key Features
- Routes GUI commands (xcodebuild, xcrun simctl, open -a, osascript) to a second macOS account
- Supports headless test frameworks (Playwright, Puppeteer, Cypress, WebDriver) in a Linux container with virtual display if Docker is installed
- Leaves headless commands (npm test, vitest) running in place with no performance cost
- Refuses to run installers, .pkg, .dmg, or hdiutil commands for safety
- Provides MCP tools (offstage_route, offstage_run, offstage_session_launch, offstage_session_screenshot, offstage_session_input) and CLI equivalents
Pricing
Free
offstage is completely free to use with no hidden costs.
Reviews

$99Free with your review
Write a reviewReview offstage, get a free AI guide
Share your experience and we will send you Improve Your Thinking Patterns Using ChatGPT, free.
Explore More
offstage FAQ
How does offstage handle commands that could open a window on my screen?
offstage reads each command before it runs and sends it to the cheapest lane that keeps it off your display. For example, xcodebuild test, xcrun simctl, XCUITests, open -a, osascript, or a built .app are routed to the second macOS account for execution. Headless commands like npm test or vitest run in place because they never open a window.
Can offstage run headed browser tests without Docker?
Yes, but only if Docker is installed. Commands like --headed, headless: false, cypress open, or WebGL/GPU flags run in a Linux container with a virtual display that is a real display, just not yours. If Docker is not available, those commands will fail.
What happens if offstage encounters an installer or disk image?
offstage refuses to run installers, .pkg files, .dmg files, or hdiutil commands entirely because both accounts share one machine. No flag overrides this refusal, and the agent must inform you so you can decide manually.
How do I test an app's GUI with offstage?
Use offstage_session_launch to start the app (it waits until the app registers and returns its PID), then offstage_session_screenshot to capture the screen, offstage_session_input to interact via coordinates (in points, not pixels), and screenshot again to confirm. offstage_session_quit closes the app when done.
What does offstage status 'skipped' mean?
It means nothing ran anywhere because the command was flagged as inappropriate for any lane. The agent should show you the fix line from diagnostics and stop. You must never re-run the command outside offstage to work around it, as that would put it on your screen.
Can my coding agent set up the helper account automatically?
No, the agent cannot perform setup because it requires sudo and one click from you. You must run
offstage session setup --create in a terminal manually. The agent can check readiness via offstage doctor.How does offstage handle shared repository access between accounts?
If the helper account cannot read your repository, you must run
offstage session share <dir> on your main account. The agent cannot do this for you, so it should ask you to run that command instead of trying workarounds.What MCP servers and CLI tools does offstage provide for coding agents?
offstage offers MCP tools like offstage_route (to check which lane a command gets), offstage_run (to run it in that lane), offstage_session_launch, offstage_session_screenshot, offstage_session_input, and offstage_session_quit. Equivalent CLI commands are
offstage route -- <cmd> and offstage run -- <cmd>.Source: offstage.viraat.dev