c/ua is the Docker Container for Computer-Use AI Agents.
Key metrics and engagement data
Repository has been active for 5 months
⭐900
Want deeper insights? Explore GitObs.com
c/ua ("koo-ah") is Docker for Computer-Use Agents - it enables AI agents to control full operating systems in virtual containers and deploy them locally or to the cloud.
Need to automate desktop tasks? Launch the Computer-Use Agent UI with a single command.
Docker-based guided install for quick use
macOS/Linux/Windows (via WSL):
bash1# Requires Docker2/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/trycua/cua/main/scripts/playground-docker.sh)"
This script will guide you through setup using Docker containers and launch the Computer-Use Agent UI.
Best for contributors and development
This repository includes a Dev Container configuration that simplifies setup to a few steps:
Ctrl+Shift+P
(or ⌘+Shift+P
on macOS)Dev Containers: Clone Repository in Container Volume...
and paste the repository URL: https://github.com/trycua/cua.git
(if not cloned) or Dev Containers: Open Folder in Container...
(if git cloned).Note: On WindSurf, the post install hook might not run automatically. If so, run
/bin/bash .devcontainer/post-install.sh
manually.
.vscode/py.code-workspace
workspace and press http://localhost:7860
and will automatically forward to your host machine.Direct Python package installation
bash1# conda create -yn cua python==3.1223pip install -U "cua-computer[all]" "cua-agent[all]"4python -m agent.ui # Start the agent UI
Or check out the Usage Guide to learn how to use our Python SDK in your own code.
For detailed compatibility information including host OS support, VM emulation capabilities, and model provider compatibility, see the Compatibility Matrix.
Follow these steps to use C/ua in your own Python code. See Developer Guide for building from source.
bash1/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/trycua/cua/main/libs/lume/scripts/install.sh)"
Lume CLI manages high-performance macOS/Linux VMs with near-native speed on Apple Silicon.
bash1lume pull macos-sequoia-cua:latest
The macOS CUA image contains the default Mac apps and the Computer Server for easy automation.
bash1pip install "cua-computer[all]" "cua-agent[all]"
python1from computer import Computer2from agent import ComputerAgent, LLM34async def main():5 # Start a local macOS VM6 computer = Computer(os_type="macos")7 await computer.run()89 # Or with C/ua Cloud Container10 computer = Computer(11 os_type="linux",12 api_key="your_cua_api_key_here",13 name="your_container_name_here"14 )1516 # Example: Direct control of a macOS VM with Computer17 computer.interface.delay = 0.1 # Wait 0.1 seconds between kb/m actions18 await computer.interface.left_click(100, 200)19 await computer.interface.type_text("Hello, world!")20 screenshot_bytes = await computer.interface.screenshot()2122 # Example: Create and run an agent locally using mlx-community/UI-TARS-1.5-7B-6bit23 agent = ComputerAgent(24 computer=computer,25 loop="uitars",26 model=LLM(provider="mlxvlm", name="mlx-community/UI-TARS-1.5-7B-6bit")27 )28 async for result in agent.run("Find the trycua/cua repository on GitHub and follow the quick start guide"):29 print(result)3031if __name__ == "__main__":32 asyncio.run(main())
For ready-to-use examples, check out our Notebooks collection.
bash1# Install Lume CLI and background service2curl -fsSL https://raw.githubusercontent.com/trycua/cua/main/libs/lume/scripts/install.sh | bash34# List all VMs5lume ls67# Pull a VM image8lume pull macos-sequoia-cua:latest910# Create a new VM11lume create my-vm --os macos --cpu 4 --memory 8GB --disk-size 50GB1213# Run a VM (creates and starts if it doesn't exist)14lume run macos-sequoia-cua:latest1516# Stop a VM17lume stop macos-sequoia-cua_latest1819# Delete a VM20lume delete macos-sequoia-cua_latest
For advanced container-like virtualization, check out Lumier - a Docker interface for macOS and Linux VMs.
bash1# Install Lume CLI and background service2curl -fsSL https://raw.githubusercontent.com/trycua/cua/main/libs/lume/scripts/install.sh | bash34# Run macOS in a Docker container5docker run -it --rm \6 --name lumier-vm \7 -p 8006:8006 \8 -v $(pwd)/storage:/storage \9 -v $(pwd)/shared:/shared \10 -e VM_NAME=lumier-vm \11 -e VERSION=ghcr.io/trycua/macos-sequoia-cua:latest \12 -e CPU_CORES=4 \13 -e RAM_SIZE=8192 \14 -e HOST_STORAGE_PATH=$(pwd)/storage \15 -e HOST_SHARED_PATH=$(pwd)/shared \16 trycua/lumier:latest
Module | Description | Installation |
---|---|---|
Lume | VM management for macOS/Linux using Apple's Virtualization.Framework | curl -fsSL https://raw.githubusercontent.com/trycua/cua/main/libs/lume/scripts/install.sh | bash |
Lumier | Docker interface for macOS and Linux VMs | docker pull trycua/lumier:latest |
Computer (Python) | Python Interface for controlling virtual machines | pip install "cua-computer[all]" |
Computer (Typescript) | Typescript Interface for controlling virtual machines | npm install @trycua/computer |
Agent | AI agent framework for automating tasks | pip install "cua-agent[all]" |
MCP Server | MCP server for using CUA with Claude Desktop | pip install cua-mcp-server |
SOM | Self-of-Mark library for Agent | pip install cua-som |
Computer Server | Server component for Computer | pip install cua-computer-server |
Core (Python) | Python Core utilities | pip install cua-core |
Core (Typescript) | Typescript Core utilities | npm install @trycua/core |
For complete examples, see computer_examples.py or computer_nb.ipynb
python1# Shell Actions2result = await computer.interface.run_command(cmd) # Run shell command3# result.stdout, result.stderr, result.returncode45# Mouse Actions6await computer.interface.left_click(x, y) # Left click at coordinates7await computer.interface.right_click(x, y) # Right click at coordinates8await computer.interface.double_click(x, y) # Double click at coordinates9await computer.interface.move_cursor(x, y) # Move cursor to coordinates10await computer.interface.drag_to(x, y, duration) # Drag to coordinates11await computer.interface.get_cursor_position() # Get current cursor position12await computer.interface.mouse_down(x, y, button="left") # Press and hold a mouse button13await computer.interface.mouse_up(x, y, button="left") # Release a mouse button1415# Keyboard Actions16await computer.interface.type_text("Hello") # Type text17await computer.interface.press_key("enter") # Press a single key18await computer.interface.hotkey("command", "c") # Press key combination19await computer.interface.key_down("command") # Press and hold a key20await computer.interface.key_up("command") # Release a key2122# Scrolling Actions23await computer.interface.scroll(x, y) # Scroll the mouse wheel24await computer.interface.scroll_down(clicks) # Scroll down25await computer.interface.scroll_up(clicks) # Scroll up2627# Screen Actions28await computer.interface.screenshot() # Take a screenshot29await computer.interface.get_screen_size() # Get screen dimensions3031# Clipboard Actions32await computer.interface.set_clipboard(text) # Set clipboard content33await computer.interface.copy_to_clipboard() # Get clipboard content3435# File System Operations36await computer.interface.file_exists(path) # Check if file exists37await computer.interface.directory_exists(path) # Check if directory exists38await computer.interface.read_text(path, encoding="utf-8") # Read file content39await computer.interface.write_text(path, content, encoding="utf-8") # Write file content40await computer.interface.read_bytes(path) # Read file content as bytes41await computer.interface.write_bytes(path, content) # Write file content as bytes42await computer.interface.delete_file(path) # Delete file43await computer.interface.create_dir(path) # Create directory44await computer.interface.delete_dir(path) # Delete directory45await computer.interface.list_dir(path) # List directory contents4647# Accessibility48await computer.interface.get_accessibility_tree() # Get accessibility tree4950# Delay Configuration51# Set default delay between all actions (in seconds)52computer.interface.delay = 0.5 # 500ms delay between actions5354# Or specify delay for individual actions55await computer.interface.left_click(x, y, delay=1.0) # 1 second delay after click56await computer.interface.type_text("Hello", delay=0.2) # 200ms delay after typing57await computer.interface.press_key("enter", delay=0.5) # 500ms delay after key press5859# Python Virtual Environment Operations60await computer.venv_install("demo_venv", ["requests", "macos-pyxa"]) # Install packages in a virtual environment61await computer.venv_cmd("demo_venv", "python -c 'import requests; print(requests.get(`https://httpbin.org/ip`).json())'") # Run a shell command in a virtual environment62await computer.venv_exec("demo_venv", python_function_or_code, *args, **kwargs) # Run a Python function in a virtual environment and return the result / raise an exception6364# Example: Use sandboxed functions to execute code in a C/ua Container65from computer.helpers import sandboxed6667@sandboxed("demo_venv")68def greet_and_print(name):69 """Get the HTML of the current Safari tab"""70 import PyXA71 safari = PyXA.Application("Safari")72 html = safari.current_document.source()73 print(f"Hello from inside the container, {name}!")74 return {"greeted": name, "safari_html": html}7576# When a @sandboxed function is called, it will execute in the container77result = await greet_and_print("C/ua")78# Result: {"greeted": "C/ua", "safari_html": "<html>...</html>"}79# stdout and stderr are also captured and printed / raised80print("Result from sandboxed function:", result)
For complete examples, see agent_examples.py or agent_nb.ipynb
python1# Import necessary components2from agent import ComputerAgent, LLM, AgentLoop, LLMProvider34# UI-TARS-1.5 agent for local execution with MLX5ComputerAgent(loop=AgentLoop.UITARS, model=LLM(provider=LLMProvider.MLXVLM, name="mlx-community/UI-TARS-1.5-7B-6bit"))6# OpenAI Computer-Use agent using OPENAI_API_KEY7ComputerAgent(loop=AgentLoop.OPENAI, model=LLM(provider=LLMProvider.OPENAI, name="computer-use-preview"))8# Anthropic Claude agent using ANTHROPIC_API_KEY9ComputerAgent(loop=AgentLoop.ANTHROPIC, model=LLM(provider=LLMProvider.ANTHROPIC))1011# OmniParser loop for UI control using Set-of-Marks (SOM) prompting and any vision LLM12ComputerAgent(loop=AgentLoop.OMNI, model=LLM(provider=LLMProvider.OLLAMA, name="gemma3:12b-it-q4_K_M"))13# OpenRouter example using OAICOMPAT provider14ComputerAgent(15 loop=AgentLoop.OMNI,16 model=LLM(17 provider=LLMProvider.OAICOMPAT,18 name="openai/gpt-4o-mini",19 provider_base_url="https://openrouter.ai/api/v1"20 ),21 api_key="your-openrouter-api-key"22)
Join our Discord community to discuss ideas, get assistance, or share your demos!
Cua is open-sourced under the MIT License - see the LICENSE file for details.
Microsoft's OmniParser, which is used in this project, is licensed under the Creative Commons Attribution 4.0 International License (CC-BY-4.0) - see the OmniParser LICENSE file for details.
We welcome contributions to CUA! Please refer to our Contributing Guidelines for details.
Apple, macOS, and Apple Silicon are trademarks of Apple Inc. Ubuntu and Canonical are registered trademarks of Canonical Ltd. Microsoft is a registered trademark of Microsoft Corporation. This project is not affiliated with, endorsed by, or sponsored by Apple Inc., Canonical Ltd., or Microsoft Corporation.
Thank you to all our supporters!