A second Mac that does the work while you chat.
A private macOS virtual machine on your Mac, operated by an AI agent. Delivered files are checked by the host.
Website · Download · Status · Privacy
You describe a task in the chat. The agent looks at the virtual Mac's screen and clicks and types in real apps, such as Safari, TextEdit, Calendar and Finder. Files it produces are handed back only after the host has checked them. You can pause, cancel, or click the virtual Mac to take over at any moment.
Coding agents get the same Mac: the app is also a command line tool and an MCP server, so Claude Code, Codex and others can test GUI apps, installers and websites in a disposable macOS.
The latest published release is 0.9.11. main is preparing 0.9.12: its permission verification and
recovery changes below are still being validated. See the candidate validation record
for passed checks and unavailable test environments.
- Isolated. A full macOS in Apple's Virtualization framework. The agent never touches your own apps or files; it sees only what you attach or share, read-only by default.
- The host keeps the rules. Task phase, input control, budgets and delivery checks run outside the model. The agent is instructed to ask before irreversible actions (sending, paying, deleting, installing).
- Restore the virtual Mac. Snapshots save the running machine, open windows included, in seconds. They do not undo sent messages, remote changes, or writes to writable folders shared from your Mac.
- Survives real life. Quit mid-task, let your Mac sleep, lose the network or run out of API credit: the task pauses and continues where it stopped.
- Bring your own model. Claude, OpenAI, Gemini, DeepSeek, xAI, Mistral, Qwen, Kimi, GLM, Doubao, or any OpenAI- or Anthropic-compatible endpoint.
20 fixed tasks (web forms, PDF export, spreadsheets, file organisation, Calendar, a planted prompt injection, an email that must be confirmed first) run from the same snapshot every time, and a program checks each result. Historical baseline from 2026-10-04, not a verification of the next release (every run, task by task, on the website):
| Agent | Passed | Median turns per task |
|---|---|---|
| Built-in agent 0.9.0 · DeepSeek flash (3 runs) | 59 / 60 | 14 |
| Built-in agent · Claude Opus 5.5 (2 runs) | 40 / 40 | 7 |
| Claude Code through the CLI | 20 / 20 | 11 |
| Claude Code through MCP | 20 / 20 | 19 |
A historical 4.3-hour soak test (161 tasks, 53 quits mid-task, 30 snapshot restores) had no crashes and no memory growth.
With Homebrew:
brew install --cask chatcomputer/tap/chatcomputerThis also puts the chatcomputer command on your PATH; brew upgrade --cask chatcomputer updates it. Or download
ChatComputer.zip from Releases, unzip it and move
ChatComputer.app to Applications. It is signed with a Developer ID and notarized by Apple.
| Requirement | |
|---|---|
| Chip | Apple silicon |
| System | macOS 27 |
| Memory | 16 GB or more |
| Disk | about 70 GB free |
| Model | an API key from a supported provider |
The first launch sets everything up by itself in about 10 minutes: it downloads and installs macOS in the virtual machine (about 26 GB), creates its account, installs the guest agent, grants the agent its permissions, saves a clean starting point, and asks for your model. Later versions update the agent inside the virtual Mac on their own.
If automatic permission setup stops, finish any dialog hidden behind System Settings in the virtual Mac. Grant ChatComputerAgent Device Control (Accessibility on macOS 26) and Screen Recording, then choose I granted them myself. Repeatedly requesting permission is unnecessary. The 0.9.12 candidate verifies two real captures before completing setup; Machine › Verify Screen Capture can check again after an update or restore. Export Diagnostics is available from the setup panel. Its optional guest image can contain your screen content; nothing is uploaded automatically. The candidate's validation status is in docs/VALIDATION-0.9.12.md.
- Complete setup and save and test a model API key.
- Ask: “Open TextEdit, write
Hello from Chat Computer, and save it ashello.txtin the outbox.” - Open the delivered file from the result card. The host checks the output's location, regular-file type, existence and size; it does not guarantee the document's content is correct.
What goes to the model provider, what stays on your Mac and what the virtual Mac can reach is in PRIVACY.md, together with the macOS licence terms for virtual machines (development, testing, personal non-commercial use). If something goes wrong, Help › Export Diagnostics saves a report without keys or passwords; attach it to an issue.
![]() |
![]() |
| Snapshots with memory, branches and one-click restore | Shared folders: inbox, outbox and your own, read-only by default |
The agent works from screenshots, so the model must take images and call tools. Two protocols are supported:
- Anthropic-compatible (Messages API). With Anthropic itself it uses Claude's computer use toolset.
- OpenAI-compatible (Chat Completions with function calling).
Built-in providers are Anthropic, OpenAI, Google Gemini, DeepSeek, xAI, Mistral, Alibaba Qwen,
Moonshot Kimi, Zhipu GLM and ByteDance Doubao, plus any custom compatible endpoint. See
Packages/ChatComputerKit/Sources/ModelProxy/ModelCatalog.swift.
Claude Code, Codex and other agents on your Mac can operate the virtual Mac too. The app's executable doubles
as the chatcomputer command line tool (Settings › Coding agents installs it on your PATH):
Choose the client you already use; Claude Code is not required by the app.
chatcomputer help # usage and guidance for agents
chatcomputer screenshot # saves a PNG and prints its path
chatcomputer elements Save # controls of the app in front, by name, with click coordinates
chatcomputer text # the text of the window in front: page, document, table
chatcomputer click 640 400
chatcomputer type "hello"
chatcomputer save notes.txt # fills in the save dialog; the file lands in the outbox
chatcomputer snapshot take "Before update"
chatcomputer share add ~/Projects/site # read-only in the guest unless --writable
chatcomputer mcp # the same commands as an MCP server on stdioFor Claude Code: claude mcp add chatcomputer -- chatcomputer mcp, or just tell it to use the command.
Agents follow the built-in agent's rules: the first input command takes the input lease, clicking the screen takes
it back, and an idle agent loses it after 2 minutes. The app listens on a 0600 Unix socket in its data folder
(~/.chatcomputer, or the folder chosen during setup). The chat panel collapses to a rail of controls (⌃⌘S) while an agent works.
The rest of this page is for working on Chat Computer itself. AGENTS.md has the rules that are easy to break; docs/STATUS.md has what works, the measurements, known issues and the plan.
project.yml XcodeGen spec (targets, entitlements, Info.plist, version)
Apps/ChatComputer/ host app: main window in AppKit (MainWindow/: guest screen, chat with MarkdownView and
ListViewKit, toolbar); onboarding, Settings and sheets in SwiftUI
Apps/ChatComputerAgent/ guest agent (menu bar app inside the VM)
Packages/ChatComputerAgentKit/ what the guest agent is built from (macOS 26 and later)
BridgeProtocol host⇄guest messages and framing (vsock)
AgentCore (macOS) vsock client and NativeDriver in the guest
Packages/ChatComputerKit/ the host's logic, as a local Swift package (macOS 27); tests for both packages
ChatCore task state machine, control lease, budget, export checks, secret files
ModelProxy Anthropic and OpenAI-compatible clients, provider catalog, computer toolset
Orchestrator the agent loop (AgentRunner)
VMKit (macOS) VM bundle, install, provisioning, DiskImageKit, vmnet
GuestBridge (macOS) vsock server on the host
HostControl (macOS) host-level control of the guest (framebuffer, keyboard, mouse)
ComputerControl `chatcomputer` CLI and MCP server for outside coding agents, control socket
Harness (macOS) cc-harness: live model scenarios and VM probes
scripts/ test-mac.sh, harness.sh, release.sh, test-linux.sh
docs/ STATUS, ROADMAP, DESIGN, proposal
Requires macOS 27 and Xcode 27.
brew install xcodegen
xcodegen generate
open ChatComputer.xcodeprojThe development team is set in project.yml. A stable signature matters: the guest's permission grants
belong to the agent's signing identity.
scripts/test-mac.sh # unit tests, build, host API checks, live scenarios if CC_API_KEY is set
swift test --package-path Packages/ChatComputerKit # unit tests only; keep the shell at the repository root
python3 -m unittest discover -s scripts/tests -v # test-script failure injection, no VM or API key
scripts/harness.sh live-loop --scenario notes # real model against a simulated desktop
scripts/harness.sh vm up --input-test 3 # typing and save-dialog check through the guest agent
scripts/test-linux.sh # portable modules in Docker, without a Mac
scripts/harness.sh vm regress --runs 3 --out new.jsonl # the fixed task set with the built-in agent (scripts/regress)
scripts/regress/external.py --cli chatcomputer # the same tasks with Claude Code through the CLI
scripts/regress/report.py new.jsonl --baseline scripts/regress/results/<old>.jsonl # pass rate and medians vs a baseline
scripts/regress/external.py --via mcp # Claude Code through MCP instead of the CLI
CC_DATA_DIR=/path/to/test-data scripts/regress/external.py --agent codex --model MODEL --via mcp --trace-dir /tmp/cc-regress-traces
scripts/fresh-install.sh build/release/ChatComputer.zip # install a release as a new user would, then put your data back
CC_DATA_DIR=/path/to/test-data scripts/soak.py --app build/release/ChatComputer.app --hours 24
# real model tasks, quits mid-task, snapshots; memory and crashesdocs/STATUS.md §3 lists the test layers and the development environment variables.
Capture a candidate's environment and source fingerprint next to its regression results:
python3 scripts/regress/run-manifest.py --app build/release/ChatComputer.app \
--vm-bundle /path/to/ChatComputer.vm --suite short --model provider:protocol:model --results new.jsonlRun this against the actual app and snapshot being tested; preserve the JSONL and its .manifest.json together.
For Codex results, use the same explicit model and add --external-agent codex to the manifest command.
Compare runs using the same external agent and model; changing the test agent does not replace built-in model checks.
Unavailable API keys or hardware are recorded as skipped, never counted as passed.
The soak runner requires an isolated CC_DATA_DIR and configured model. It binds each submission to
its new persisted task, requires completion with model usage, and exits nonzero if tasks, recovery,
snapshots, or the requested duration are unproven. A quick task that finished before a planned quit
does not count as a quit during a task.
APPLE_ID=… APPLE_SPECIFIC_PASSWORD=… APPLE_TEAM_ID=… scripts/release.shThis signs the app with a Developer ID, notarizes and staples it, checks it with Gatekeeper, and writes
build/release/ChatComputer.zip. Bump MARKETING_VERSION in project.yml first.
Apache 2.0. Not affiliated with Apple; macOS is a trademark of Apple Inc.



