Sandbox
@Coooolfan/onlyboxes

MCP sandbox platform for code execution

Onlyboxes connects coding agents to a self-hosted execution sandbox. The console manages accounts, workers, and tasks, while worker nodes run Python and terminal commands in isolated environments.

48 stars13 forksGoUpdated 7d ago
Who it's for

Builders who want Claude Code, Codex, or another agent to execute code in a managed sandbox.

What it delivers

You can let an agent run code, keep terminal state, and read outputs without giving it direct access to your machine.

What it does

Control plane and worker plane

The `console` manages users, tokens, workers, and tasks, while `worker` nodes handle execution.

MCP tools

Provides `pythonExec`, `terminalExec`, and `readImage` tools over `/mcp`.

REST and async task APIs

Exposes the same execution actions through HTTP endpoints as well as MCP.

Account and resource isolation

Separates sessions and stateful containers between accounts.

Worker scaling and runtimes

Supports multiple worker implementations, horizontal scaling, and different runtime images.

One-click installer

Includes a Linux install script that sets up console and a `worker-docker` node.

How to get it

  1. 1Create a working directory and a docker-compose.yml file in it
    mkdir -p onlyboxes-console && cd onlyboxes-console
  2. 2Start console
    docker compose up -d
  3. 3Workers reject insecure console endpoints by default; set WORKER_CONSOLE_INSECURE=true…
    # Example
    WORKER_CONSOLE_INSECURE=true \
    WORKER_CONSOLE_GRPC_TARGET=127.0.0.1:50051 \
    WORKER_ID=<worker_id> \
    WORKER_SECRET=<worker_secret> \
    /path/to/onlyboxes-worker-docker

README

Onlyboxes

简体中文

Onlyboxes is a self-hosted code execution sandbox platform for individuals and small teams.

It uses a control-plane (console) and execution-plane (worker) architecture, and exposes both REST APIs and MCP tools.

Key Features

  • Self-hosted all components: control node (console) + worker nodes (worker)
  • Separated control and execution planes:
    • Workers support horizontal scaling
    • Workers support multi-language heterogeneous implementations
    • Workers support multiple runtimes
  • Full account system: resource isolation (stateful containers, sessions) between accounts
  • MCP tools:
    • pythonExec: Python code execution
    • terminalExec: stateful terminal sessions
    • readImage: model-readable images
  • REST API: all MCP tools also available via HTTP + async task API

[!WARNING]

In the current release, console (gRPC + HTTP) does not provide built-in TLS/mTLS.

worker rejects insecure console endpoints by default; plaintext is allowed only when WORKER_CONSOLE_INSECURE=true is explicitly set.

Put both console HTTP (:8089) and gRPC (:50051) endpoints behind your reverse proxy/gateway and enforce TLS for external traffic.

Architecture

Architecture Architecture

One-Click Installer (Linux)

For a single-machine deployment of console + worker-docker, run:

curl -fsSL https://onlybox.es/install.sh | bash

The installer will:

  1. Check the environment (Linux, Docker, Docker Compose v2, systemd)
  2. Download and render the compose template with auto-generated credentials
  3. Start the console via docker compose up -d
  4. Create a normal worker
  5. Download the architecture-matched worker-docker release binary for the default latest version, or your --tag override
  6. Generate and enable a systemd service for the worker
  7. Poll until the worker comes online and print a result summary

Available options:

FlagDefaultDescription
--taglatest published releaseOptional release version override
--workdir$PWD/onlyboxesWorking directory
--yes / -yfalseNon-interactive mode, skip confirmations
--console-http-port8089Console HTTP port (host side)
--console-grpc-port50051Console gRPC port (host side)
--service-nameonlyboxes-worker-dockersystemd service name

Requirements: Linux, systemd, Docker Engine, Docker Compose v2, Python 3.

Quick Start (Manual)

1) Prerequisites

  • Control node:
    • Docker Engine (binaries are also available in releases — no Docker needed if deploying via binary)
  • Worker node:
    • Docker Engine (required by worker-docker)

2) Start the console service

  1. Create a working directory and a docker-compose.yml file in it:

    mkdir -p onlyboxes-console && cd onlyboxes-console
    
    services:
      console:
        image: coolfan1024/onlyboxes:latest
        container_name: onlyboxes-console
        restart: unless-stopped
        environment:
          CONSOLE_HASH_KEY: "replace-with-long-random-key"
          CONSOLE_ENABLE_REGISTRATION: "true"
          CONSOLE_DASHBOARD_USERNAME: "admin"     # only for first run
          CONSOLE_DASHBOARD_PASSWORD: "change-me" # only for first run
        ports:
          - "8089:8089"
          - "50051:50051"
        volumes:
          - ./db:/app/db
    
  2. Replace at least:

    • CONSOLE_HASH_KEY
    • CONSOLE_DASHBOARD_PASSWORD
  3. Start console:

    docker compose up -d
    

Default endpoints:

  • Console Web UI / HTTP REST API / MCP endpoint: http://127.0.0.1:8089
  • gRPC: 127.0.0.1:50051

3) Sign in and create an access token

  • Open http://127.0.0.1:8089 in your browser.
  • Sign in with the initialized admin account. Console login page
  • Go to the token management page and create an access token. Token created dialog (one-time plaintext token)
  • Save the plaintext token immediately (it is returned only once).

4) Create a worker

  • Go to Workers page and create a worker. Workers page
  • Copy and securely store the startup command from the creation dialog (WORKER_SECRET is one-time visible). Worker created dialog (startup command and one-time secret)
  • (Optional) Click Open in Startup Tool with Id and Secret to open the startup command builder with the worker id and secret pre-filled.
    • On the opened page, you can edit all available options. The generated startup command appears at the bottom of the page — copy and save it. Startup command builder

5) Run worker

[!WARNING] Workers support different runtimes and environments. The current release only provides worker-docker. This section uses the Docker runtime as an example.

  1. Log in to the machine where the worker will be deployed.

    • Ensure Docker Engine is installed.
    • Ensure the worker can reach the console gRPC endpoint.
  2. Download the latest worker-docker binary from GitHub Releases:

    • https://github.com/onlyboxes/onlyboxes/releases/latest
  3. Use the startup command values from the dashboard, and replace the executable path on the last line with your downloaded binary.

    • Workers reject insecure console endpoints by default; set WORKER_CONSOLE_INSECURE=true only to allow plaintext connections.
    # Example
    WORKER_CONSOLE_INSECURE=true \
    WORKER_CONSOLE_GRPC_TARGET=127.0.0.1:50051 \
    WORKER_ID=<worker_id> \
    WORKER_SECRET=<worker_secret> \
    /path/to/onlyboxes-worker-docker
    

6) Verify readiness

  • Confirm the worker is online on the dashboard Workers page.
  • For REST API request examples, see docs/API.md.
  • If no tokens are configured, /mcp and execution APIs return 401 by design.
  • Add the MCP endpoint http://127.0.0.1:8089/mcp in any LLM Chat Client, set the token, and verify it works correctly. claude-code-demo

FAQ

  • Q: Worker stays offline after starting? A: Check that WORKER_CONSOLE_GRPC_TARGET points to the correct console gRPC address and verify network connectivity.

  • Q: Can a worker be deployed on the same machine as the console? A: Yes.

  • Q: Can a worker run inside Docker? A: In theory, yes. However, it is not recommended because the worker needs access to the host Docker daemon. You would need to handle Docker-in-Docker yourself.

Production Checklist

  • Replace all default credentials.
  • Use a reverse proxy to enforce TLS for :8089 and :50051.
  • Persist and back up the SQLite data directory (CONSOLE_DB_PATH).
  • Run workers on isolated hosts to avoid sharing the Docker daemon with the console.
  • Read the Configuration Reference below for all available options and adjust as needed.

Configuration Reference

Console (console)

Environment VariableDefaultNotes
CONSOLE_HTTP_ADDR:8089Dashboard + REST API listen address
CONSOLE_GRPC_ADDR:50051Worker registry gRPC listen address
CONSOLE_WORKER_CONNECTION_CONFLICT_POLICYREPLACEDuplicate Worker connection policy: REPLACE disconnects the existing connection; REJECT rejects the new connection
CONSOLE_HASH_KEY(required)HMAC key for hashing worker secrets and access tokens
CONSOLE_DB_PATH./db/onlyboxes-console.dbSQLite database path
CONSOLE_DB_BUSY_TIMEOUT_MS5000SQLite busy timeout
CONSOLE_TASK_RETENTION_DAYS30Retention for completed task records
CONSOLE_ENABLE_REGISTRATIONfalseAllow admin to register non-admin accounts
CONSOLE_DASHBOARD_USERNAME(empty)Used only for first admin initialization
CONSOLE_DASHBOARD_PASSWORD(empty)Used only for first admin initialization

Worker (worker-docker)

Environment VariableDefaultNotes
WORKER_ID(required)Issued by POST /api/v1/workers
WORKER_SECRET(required)Issued once by POST /api/v1/workers
WORKER_CONSOLE_GRPC_TARGET127.0.0.1:50051Console gRPC target
WORKER_CONSOLE_INSECUREfalsefalse enforces TLS endpoint; set true only to allow plaintext console gRPC
WORKER_HEARTBEAT_INTERVAL_SEC5Worker heartbeat interval
WORKER_HEARTBEAT_JITTER_PCT20Heartbeat jitter percent
WORKER_PYTHON_EXEC_DOCKER_IMAGEghcr.io/astral-sh/uv:python3.12-bookworm-slimRuntime image for pythonExec
WORKER_TERMINAL_EXEC_DOCKER_IMAGEcoolfan1024/onlyboxes-runtime:defaultRuntime image for terminalExec
WORKER_TERMINAL_OUTPUT_LIMIT_BYTES1048576Per-stream output limit

API Surfaces

  • Dashboard auth: /api/v1/console/*
  • Worker management (admin): /api/v1/workers*
  • Command execution: /api/v1/commands/echo, /api/v1/commands/terminal
  • Task execution: /api/v1/tasks*
  • MCP (Streamable HTTP): POST /mcp

Development

Local dev orchestration

scripts/dev.sh runs console / web / website in a tmux session. Every subcommand returns immediately, and logs land in scripts/.dev/<svc>.log.

scripts/dev.sh start              # start all three
scripts/dev.sh start console web  # console + web only
scripts/dev.sh status             # session, port listeners, window state
scripts/dev.sh logs console       # last 200 log lines
scripts/dev.sh creds              # console admin credentials
scripts/dev.sh stop               # stop everything

Web dev URL defaults to http://127.0.0.1:5178 and proxies /api/* and /mcp to http://127.0.0.1:8089.

Workers are not orchestrated — their startup arguments vary per implementation, so start them manually. Full usage: scripts/README.md.

Useful docs

  • Unified API reference: docs/API.md
  • Console internals: console/README.md
  • Worker internals: worker/worker-docker/README.md
  • API/proto guide: api/README/proto.md
  • Web app guide: web/README.md

Release & Images

  • GitHub workflow: .github/workflows/package-release.yml — run it manually from the Actions tab, pick the branch and enter the version (e.g. 0.7.2); the tag is created from that branch. Turn off latest when patching an older line so the newest release keeps the label
  • Website-only deploy: .github/workflows/deploy-website.yml — manual, independent of a release
  • Console Docker image: coolfan1024/onlyboxes:<version> and coolfan1024/onlyboxes:latest
  • Terminal runtime images: coolfan1024/onlyboxes-runtime:<version>-default, <version>-default-cn, and <version>-lobehub; stable aliases are default, default-cn, lobehub, and latest (same as default)
  • Console binary includes embedded web assets

Security and Operational Notes

  • Console does not provide built-in TLS/mTLS in this release; worker-docker requires explicit WORKER_CONSOLE_INSECURE=true to connect over plaintext.
  • Put console HTTP (:8089) and gRPC (:50051) behind a reverse proxy/gateway and enforce TLS on public/external links.
  • WORKER_SECRET and access token plaintext values are returned only at creation time.
  • Dashboard login sessions are in-memory and are invalidated when console restarts.

Links

License

GNU AGPL v3.0

Files in the repo

Repository payload17 top-level entries
  • .agents
  • .claude
  • .github
  • api
  • console
  • docker
  • docs
  • scripts
  • static
  • web
  • website
  • worker
  • .gitignore
  • AGENTS.md
  • CLAUDE.md
  • LICENSE
  • README.md

Discussion (0)

Ask about usage, or say what you built with it

Sign in to join the discussion.

No comments yet. Be the first to say what this is good for.

More connectors

High-performance code intelligence MCP server. Indexes codebases into a persistent knowledge graph — average repo in milliseconds. 158 languages, sub-ms queries, 99% fewer tokens. Single static binary, zero dependencies.

43k

Universal provider proxy for OpenAI Codex & Claude Code — use any LLM (Claude, Gemini, Grok, DeepSeek, Ollama…) with Codex CLI, App, SDK, and Claude Code

14k
okf-memory/
okf-agent-memory

Git-native persistent memory for AI coding agents. Implements Google OKF v0.2 with sub-300µs in-memory BM25 search, embedded MCP server, and progressive disclosure. Slashes token bloat by 80% with zero external databases or dependencies. Built in pure Go.

547
tirth8205/
code-review-graph

Local-first code intelligence graph for MCP and CLI. Builds a persistent map of your codebase so AI coding tools read only what matters, with benchmarked context reductions on reviews and large-repo workflows.

31k
2akouwu/
reverify

Stop your AI from making things up — it proposes, deterministic tools decide, every claim checked against ground truth with evidence. Grounded facts and context survive resets. Reverse engineering is the proving ground. MCP server + CLI.

1.1k
t8y2/dbxConnectors

20 MB lightweight cross-platform database client for 90+ databases, including MySQL, PostgreSQL, SQLite, Redis, MongoDB, DuckDB, SQL Server, and Dameng. Built-in AI, MCP Server, CLI, desktop and Docker. | 轻量级跨平台数据库管理工具,支持 MySQL、PostgreSQL、SQLite、Redis、MongoDB、达梦等 90+ 数据库,提供桌面端、Docker、CLI、内置 AI 助手和 MCP Server。

19k