Open Computer Use

MCP serverWeb & browsing

Give any LLM its own computer — Docker sandboxes with bash, browser, docs, and sub-agents

Unavailable. This server has no hosted endpoint yet, so ahel can't serve it.

Connect ahel once, and every AI you use reads what you have installed.

From the project's README

As published by yambr/open-computer-use in README.md.

MCP server that gives any LLM its own computer — managed Docker workspaces with live browser, terminal, code execution, document skills, and autonomous sub-agents. Self-hosted, open-source, pluggable into any model.

Online demo: lab.widemoat.ai — Open WebUI with Computer Use already set up, sign in with GitHub or Google. (More ways to try it below.) The old chat.yambr.com address redirects here and will keep doing so.

Where this project is going. Open Computer Use set out to answer one question — can an LLM be given a real computer safely enough to be useful? It answered it, and it is used in production. That result led us somewhere else: Wide Moat, an enterprise AI platform that runs inside a company's own perimeter. It is a different product, not a rewrite of this one, and it is currently developed in private.

Practically, for you:

  • This repository keeps working. It is maintained — fixes, dependency and security updates, and support for the Open WebUI versions it targets. It is not abandoned and not deprecated.
  • Its pace of new features slows down. Our attention has moved to the platform, and that is honest to say up front rather than to leave you guessing from commit dates.
  • The licence promise stands. FSL-1.1-Apache-2.0: use it, fork it, self-host it, redistribute it — and every release converts to Apache-2.0 two years after publication, whatever we do next. Nothing here can be taken back from you.

Worth watching if you like this project: a sandbox integrated natively into Open WebUI, rather than bolted on through a filter and a tool, is one of the things being built on the platform. Try the hosted lab at lab.widemoat.ai or read more at widemoat.ai.

If any of this looks useful, a ⭐ on the repo really helps — thanks!

What is this?

An MCP server that gives any LLM a fully-equipped Ubuntu sandbox with isolated Docker containers. Think of it as your AI's computer — it can do everything a developer can do:

  • Execute code — bash, Python, Node.js, Java in isolated containers
  • Create documents — Word, Excel, PowerPoint, PDF with professional styling via skills
  • Browse the web — Playwright + live CDP browser streaming (you see what AI sees in real-time)
  • Run Claude Code — autonomous sub-agent with interactive terminal, MCP servers auto-configured
  • Use 13+ skills — battle-tested workflows for document creation, web testing, design, and more

Built for production multi-user deployments. Tested with 1,000+ MAU. Each chat session runs in its own isolated Docker container — the AI can install packages, create files, run servers, and nothing leaks between users. Works seamlessly across MCP clients: start with Open WebUI today, switch to Claude Desktop or n8n tomorrow — same backend, no migration.

Key differentiators

FeatureOpen Computer UseClaude.ai (Claude Code web)open-terminalOpenAI Operator
Self-hostedYesNoYesNo
Any LLMYes (OpenAI-compatible)Claude onlyAny (via Open WebUI)GPT only
Code executionFull Linux sandboxSandbox (Claude Code web)Sandbox / bare metalNo
Live browserCDP streaming (shared, interactive)Screenshot-basedNoScreenshot-based
Terminal + Claude Codettyd + tmux + Claude Code CLIClaude Code web (built-in)PTY + WebSocketN/A
Skills system13 built-in (auto-injected) + customBuilt-in skills + custom instructionsOpen WebUI native (text-only)N/A
Container isolationDocker (runc), per chatDocker (gVisor)Shared container (OS-level users)N/A

Works with any MCP-compatible client: Open WebUI, Claude Desktop, LiteLLM, n8n, or your own integration. See docs/COMPARISON.md for a detailed comparison with alternatives.

Live browser streaming

File preview with skills

Frontend design — landing page rendered live in the browser tab

Presentations — custom design system, not the default white template

Build your own skills — package recurring work into reusable functions

Data → chart with analysis

Claude Code — interactive terminal in the cloud

Sub-agent dashboard — monitor and control

See docs/FEATURES.md for architecture details and docs/SCREENSHOTS.md for all screenshots.

Pro tip: Create skills with Claude Code in the terminal, then use them with any model in the chat. Skills are model-agnostic — write once, use everywhere.

Multi-CLI sub-agent runtime (v0.9.2.1+): The sub-agent dispatch supports Claude Code (default), OpenAI Codex, and OpenCode (with OpenRouter / qwen / DeepSeek / 75+ providers). Flip SUBAGENT_CLI=claude|codex|opencode in .env — see docs/multi-cli.md for the worked OpenCode + qwen3-coder + OpenRouter recipe.

Architecture

Looking ahead: a Kubernetes-friendly architecture with object-storage-backed user data and squashfs-packaged skills is being designed in docs/future-architecture/. Docker Compose remains the primary supported path.

Ways to try it

PathURLWhat you needBest for
Free online demo — Open WebUI + Computer Use, models includedlab.widemoat.aiGitHub or Google sign-inTrying it end-to-end in 30 seconds
Self-hostQuick Start belowDocker, ~15 min first buildFull control, air-gapped, heavy use

OAuth only — no email/password, no SMS. On lab.widemoat.ai models are bundled as a free convenience. The hosted MCP endpoint is offline during the transformation; see docs/CLOUD.md.

Quick Start

git clone https://github.com/Wide-Moat/open-computer-use.git
cd open-computer-use
cp .env.example .env
# Edit .env — set OPENAI_API_KEY (or any OpenAI-compatible provider)

# 1. Start Computer Use Server (builds workspace image on first run, ~15 min)
docker compose up --build

# 2. Start Open WebUI (in another terminal)
docker compose -f docker-compose.webui.yml up --build

Open http://localhost:3000 — Open WebUI with Computer Use ready to go.

Note: Two separate docker-compose files: docker-compose.yml (Computer Use Server) and docker-compose.webui.yml (Open WebUI). They communicate via localhost:8081. This mirrors real deployments where the server and UI run on different hosts.

Model Settings (important!)

After adding a model in Open WebUI, go to Model Settings and set:

SettingValueWhy
Function CallingNativeRequired for Computer Use tools to work
Stream Chat ResponseOnEnables real-time output streaming

Without Function Calling: Native, the model won't invoke Computer Use tools.

What's Inside the Sandbox

CategoryTools
LanguagesPython 3.12, Node.js 22, Java 21, Bun
DocumentsLibreOffice, Pandoc, python-docx, python-pptx, openpyxl
PDFpypdf, pdf-lib, reportlab, tabula-py, ghostscript
ImagesPillow, OpenCV, ImageMagick, sharp, librsvg
WebPlaywright (Chromium), Mermaid CLI
AIClaude Code CLI, Playwright MCP
OCRTesseract (configurable languages)
MediaFFmpeg
DiagramsGraphviz, Mermaid
DevTypeScript, tsx, git

Skills

13 built-in public skills + 14 examples:

SkillDescription
pptxCreate/edit PowerPoint presentations with html2pptx
docxCreate/edit Word documents with tracked changes
xlsxCreate/edit Excel spreadsheets with formulas
pdfCreate, fill forms, extract, merge PDFs
sub-agentDelegate complex tasks to Claude Code
playwright-cliBrowser automation and web scraping
describe-imageVision API image analysis
frontend-designBuild production-grade UIs
webapp-testingTest web applications with Playwright
doc-coauthoringStructured document co-authoring workflow
test-driven-developmentTDD methodology enforcement
skill-creatorCreate custom skills
gitlab-explorerExplore GitLab repositories

14 example skills: web-artifacts-builder, copy-editing, social-content, canvas-design, algorithmic-art, theme-factory, mcp-builder, and more.

See docs/SKILLS.md for details.

MCP Integration

The server speaks standard MCP over Streamable HTTP. Point any MCP client at your own deployment.

  • Self-hosted: http://localhost:8081/mcp. Quick sanity check:
    curl -X POST http://localhost:8081/mcp \
      -H "Content-Type: application/json" \
      -H "X-Chat-Id: test" \
      -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}'
    
    Full self-host integration guide (LiteLLM, Claude Desktop, custom clients): docs/MCP.md. The per-chat system prompt rides six redundant MCP-native channels (tool descriptions, /home/assistant/README.md in the sandbox, InitializeResult.instructions, resources/list for uploaded files, plus an HTTP /system-prompt endpoint for legacy integrations) — full map in docs/system-prompt.md.

Configuration

All settings via .env:

VariableDefaultDescription
OPENAI_API_KEYLLM API key (any OpenAI-compatible)
OPENAI_API_BASE_URLCustom API base URL (OpenRouter, etc.)
MCP_API_KEYBearer token for MCP endpoint
DOCKER_IMAGEopen-computer-use:latestSandbox container image
COMMAND_TIMEOUT120Bash tool timeout (seconds)
SUB_AGENT_TIMEOUT3600Sub-agent timeout (seconds)
SINGLE_USER_MODEtrue = one container, no chat ID needed; false = require X-Chat-Id; unset = lenient
PUBLIC_BASE_URLhttp://computer-use-server:8081Browser-reachable URL of the Computer Use server. Baked into /system-prompt and returned to the Open WebUI filter in the X-Public-Base-URL response header — single source of truth for the public URL. Open WebUI filter URL requirements.
CHAT_RESPONSE_MAX_TOOL_CALL_ITERATIONS, ORCHESTRATOR_URL, TOOL_RESULT_MAX_CHARS, TOOL_RESULT_PREVIEW_CHARSSettings on the open-webui container (not CU-server). Required when embedding — see Required setup when embedding Open WebUI.
POSTGRES_PASSWORDopenwebuiPostgreSQL password
VISION_API_KEYVision API key (for describe-image)
ANTHROPIC_AUTH_TOKENAnthropic key (for Claude Code sub-agent)
MCP_TOKENS_URLSettings Wrapper URL (optional, see below)
MCP_TOKENS_API_KEYSettings Wrapper auth key

Custom Skills & Token Management (optional)

By default, all 13 built-in skills are available to everyone. For per-user skill access and custom skills, deploy the Settings Wrapper — see settings-wrapper/README.md.

Personal Access Tokens (PATs): The settings wrapper can also store encrypted per-user PATs for external services (GitLab, Confluence, Jira, etc.). The server fetches them by user email and injects into the sandbox — so each user's AI has access to their repos/docs without sharing credentials. The server-side code for token injection is implemented (docker_manager.py), but the Open WebUI tool doesn't pass the required headers yet. This is on the roadmap — if you need PAT management, open an issue.

MCP Client Integrations

The Computer Use Server speaks standard MCP over Streamable HTTP — any MCP-compatible client can connect. Open WebUI is the primary tested frontend, but not the only option.

ClientSelf-hosted URLStatus
Open WebUIDocker Compose stack included, auto-configuredTested in production
Claude Desktophttp://localhost:8081/mcp — see docs/MCP.mdWorks
n8nMCP Tool node → http://computer-use-server:8081/mcpWorks
LiteLLMMCP proxy config — see docs/MCP.mdWorks
Custom clientAny HTTP client with MCP JSON-RPC — see curl examples in docs/MCP.mdWorks

Open WebUI Integration

Open WebUI is an extensible, self-hosted AI interface. We use it as the primary frontend because it supports tool calling, function filters, and artifacts — everything needed for Computer Use.

Compatibility: This build is strictly built and verified against Open WebUI 0.11.0. The first 3 segments of our build version (v0.11.0.X) always match the Open WebUI base version it targets. If you run a different Open WebUI version, pick the Open Computer Use build whose first 3 version segments match yours — e.g., for Open WebUI 0.8.12 use a v0.8.12.Y build.

Why not a fork? Computer Use itself is not a fork: it bolts on through the official plugin API — tools and functions — so stock Open WebUI works with just the tool and filter installed. (A separate fork does exist for changes that cannot be expressed as plugins, but nothing in this repository depends on it.)

Running Claude Code through a corporate gateway (LiteLLM, Azure, Bedrock)? See docs/claude-code-gateway.md for the three-path operator recipe.

The openwebui/ directory contains:

  • tools/ — MCP client tool (thin proxy to Computer Use Server). Required — this is the bridge between Open WebUI and the sandbox.
  • functions/ — System prompt injector + file link rewriter + archive button. Required — without it the model doesn't know about skills and file URLs.
  • patches/ — Build-time fixes for artifacts, error handling, file preview. Optional but recommended — improves UX significantly.
  • init.sh — Auto-installs tool + filter on first startup. Optional — you can install manually via Workspace UI instead.
  • init.sh — Installs the tool and filter on first start and sets their valves.

How auto-init works

On first docker compose up, the init script automatically:

  1. Creates an admin user (admin@open-computer-use.dev / admin)
  2. Installs the Computer Use tool via POST /api/v1/tools/create
  3. Installs the Computer Use filter via POST /api/v1/functions/create
  4. Configures tool and filter valves (ORCHESTRATOR_URL=http://computer-use-server:8081 — internal URL for server↔server, seeded into both Valves)
  5. Marks the tool public-read (access grants for both group:* and user:* wildcards) — so non-admin users see the tool in their workspace
  6. Marks the filter both active and global (two separate toggles: /toggle and /toggle/global) — active-but-not-global is silently inert and a common manual-setup mistake
  7. Merges {function_calling: "native", stream_response: true} into DEFAULT_MODEL_PARAMS via POST /api/v1/configs/models — every model gets the right defaults without per-model Advanced Params clicks

A marker file (.computer-use-initialized) prevents re-running on subsequent starts.

Note: Open WebUI doesn't support pre-installed tools from the filesystem — they must be loaded via the REST API. The init script automates this so you don't have to do it manually.

Manual setup (if not using docker-compose)

If you run Open WebUI separately, you need to manually:

  1. Go to Workspace > Tools → Create new tool → paste contents of openwebui/tools/computer_use_tools.py
  2. Set Tool ID to ai_computer_use (required for filter to work)
  3. Configure Valves: ORCHESTRATOR_URL = internal URL of your Computer Use Server (http://computer-use-server:8081 for Docker compose)
  4. Open the tool's ⋯ → Share menu and set access to Public (grants read to both group:* and user:* wildcards) — otherwise only your admin account sees the tool and non-admin users get an empty tool list with no error
  5. Go to Workspace > Functions → Create new function → paste openwebui/functions/computer_link_filter.py
  6. Enable the filter: toggle Active and toggle Global in the Functions list — these are two separate switches, and active-but-not-global means the filter loads but is never applied to chats
  7. In your model settings, set Function Calling = Native and Stream Chat Response = On. Or set them globally once in Admin → Settings → Models → Advanced Params (function_calling: native, stream_response: true) — that becomes DEFAULT_MODEL_PARAMS for every model.

The docker-compose stack handles all of this automatically.

Required setup when embedding Open WebUI into your own stack

If you run Open WebUI outside the stock docker-compose.webui.yml — your own compose, Kubernetes, Portainer, or a downstream repo — there are four traps that will silently break Computer Use. All four hit us in production. Check in this order.

Step 1 — A stock upstream image is all this repo needs

Install the tool and the filter and Computer Use works against ghcr.io/open-webui/open-webui as published. Nothing here has to be rebuilt.

This used to be the opposite: the repository carried eight patch scripts and a Dockerfile that applied them to an already-built image, and pulling upstream silently skipped all of them. Those patches are gone. Three of the problems they addressed have since been fixed upstream; the rest live as source commits in a fork, which is a separate concern from running this integration.

Preview URL detection needs no build-time host configuration either — the iframe origin is read from the URL the model wrote, which comes from the server's PUBLIC_BASE_URL.

Step 3 — Two URL settings, two roles (public vs internal)

v4.0.0: the old "three FILE_SERVER_URL places that must match" footgun is gone. There are now only two places and two distinct roles — public (browser-reachable) vs internal (Docker-local). The COMPUTER_USE_SERVER_URL build-arg was removed in v0.9.2.0 — fix_preview_url_detection is now host-agnostic (see Step 2).

WhereRoleWho reads itProd (with domain)Local dev (Docker Desktop)
PUBLIC_BASE_URL env on the computer-use-server container (docker-compose.yml / .env)PUBLIC — baked into /system-prompt links + returned to filter via X-Public-Base-URL response headerServer (single source of truth for public URL)https://cu.your-domain.comhttp://localhost:8081
Filter + Tool Valves ORCHESTRATOR_URL (seeded by init.sh from ORCHESTRATOR_URL env on the open-webui container)INTERNAL — server↔server fetch of /system-prompt; MCP tools/call forwardingFilter and tool (Docker network)http://computer-use-server:8081http://computer-use-server:8081

⚠️ Do NOT point ORCHESTRATOR_URL at your public domain. It technically works, but every MCP request then goes browser→CDN→Traefik→container. Any hiccup in that chain kills the stream mid-tool-call and the user sees MCP call failed: Session terminated. Stay inside the Docker network.

The filter no longer has a public-URL Valve at all — it reads the public URL from the server's X-Public-Base-URL response header and caches it alongside the prompt. One public knob, one internal knob.

See also docs/openwebui-filter.md.

Step 4 — Four env vars on the open-webui container

Copy-paste into your downstream compose environment: block:

services:
  open-webui:
    environment:
      # --- Computer Use required env vars (read by build-time patches) ---
      - CHAT_RESPONSE_MAX_TOOL_CALL_ITERATIONS=200
      - TOOL_RESULT_MAX_CHARS=50000
      - TOOL_RESULT_PREVIEW_CHARS=2000
      # Internal URL of the Computer Use server — seeded by init.sh into both
      # Tool and Filter Valves, and read by the fix_large_tool_results patch.
      # Same Docker network: use the service DNS name.
      - ORCHESTRATOR_URL=http://computer-use-server:8081

Shortened here. Read the whole README on GitHub.

Signals

GitHub stars
121
Forks
29
Last commit
Sep 2026
Advanced
Delivery
open-computer-use MCP server → your ahel gateway (mcp.ahel.ai) → every connected AI client.
Catalog kind
mcp-server
Gateway key
io-github-yambr-open-computer-use
Source
github.com/yambr/open-computer-use