Wright's Docker appliance is the mandatory turnkey path for a working API, web UI, Hermes integration, and engineering MCP catalog with no source build. It is published for every production release independently of the primary native Hermes path.
Wright is bring-your-own-AI. The image does not bundle an LLM, model weights, API
key, hosted provider, or paid engineering backend. Configure an
OpenAI-compatible endpoint with LLM_API_URL, LLM_API_KEY, and
LLM_API_MODEL.
The base image also does not bundle MCP-specific host software such as FreeCAD, OpenSCAD, CalculiX, Blender, vendor CAD systems, license managers, or hardware drivers. Install and validate those only for the selected MCP server, following the clean-container process in MCP server testing process.
For deeper Hermes setup and provider configuration, see the official Hermes Agent docs and Hermes Desktop docs.
For tagged alpha releases, Docker Hub and GHCR images use:
burhop/wright:<tag>
ghcr.io/burhop/wright:<tag>
Run a published image with your env file:
docker run --rm -p 127.0.0.1:8080:8000 --env-file docker/.env burhop/wright:<tag>Source-build Compose commands below are for contributors. Third-party users should use a published immutable release tag.
| Path | Command | Host URL | Notes |
|---|---|---|---|
| Minimal alpha appliance | docker compose -f docker-compose.minimal.yml up -d --build |
http://localhost:8080 |
Recommended first run; Wright only. |
| MCP appliance flavor | docker compose -f docker-compose.mcp.yml up -d --build |
http://localhost:8080 |
Experimental MCP bundle with separate volumes; see MCP Docker quickstart. |
| Full local stack | docker compose up -d --build |
http://localhost:8000 |
Adds Jaeger tracing on localhost. |
| Test/dev stack | docker compose -f docker-compose.test.yml up -d --build |
http://localhost:8080 |
Bind-mounts source for iteration. |
See Docker image family for the managed standard, Linux amd64 MCP, Linux arm64 MCP, and Windows MCP runtime image profiles.
All checked-in compose files bind host ports to 127.0.0.1 by default. That is
the safe local-first setting.
Copy the template:
cp docker/.env.example docker/.envGenerate a unique Wright control-plane token and replace the placeholder in
docker/.env:
openssl rand -hex 32Set the values for your provider:
LLM_API_URL=https://api.openai.com/v1
LLM_API_KEY=sk-your-key
LLM_API_MODEL=gpt-4.1-mini
UI_THEME=dark
WRIGHT_AUTH_MODE=enforced
WRIGHT_API_TOKEN=<generated-value>Local OpenAI-compatible server example:
LLM_API_URL=http://host.docker.internal:8000/v1
LLM_API_KEY=not-needed
LLM_API_MODEL=local-model-nameOn Linux, host.docker.internal may require:
docker run --add-host=host.docker.internal:host-gateway ...or a compose extra_hosts entry if you create a local override file.
Hosted API style example:
LLM_API_URL=https://your-provider.example.com/v1
LLM_API_KEY=provider-token
LLM_API_MODEL=provider-model-idRecommended first run:
docker compose -f docker-compose.minimal.yml up -d --buildOpen:
http://localhost:8080
Check API health:
curl http://localhost:8080/api/healthHealth is public. Other API routes require the token:
curl -H "Authorization: Bearer ${WRIGHT_API_TOKEN}" \
http://localhost:8080/api/settingsSee Local control-plane security for browser session cookies, origin configuration, remote binding, and compatibility rollback.
Check Hermes connection state through Wright:
curl http://localhost:8080/api/agent/healthThe LLM status may be degraded until your configured endpoint is reachable from inside the container.
The committed compose files bind to localhost. For LAN demos, create a local override file that is not committed:
services:
agent:
ports:
- "0.0.0.0:8080:8000"Then run:
docker compose -f docker-compose.minimal.yml -f docker-compose.lan.yml up -d --buildOnly expose Wright on trusted networks. Put it behind a reverse proxy with TLS and authentication for anything beyond a private demo network.
The compose files use named volumes for:
/home/agent/workspace: user workspaces./home/agent/.local/share/wright: Wright SQLite and application state./home/agent/.config/wright: owner-only Wright configuration and fallback secrets./home/agent/.hermes: Hermes profiles and sessions./var/log: startup, supervisor, and application logs.
The image sets WRIGHT_WORKSPACES_DIR=/home/agent/workspace so newly created
workspaces land in the mounted workspace volume.
The image root filesystem is read-only, Linux capabilities are dropped, and
privilege escalation is disabled. System paths such as /etc, /opt, and
/usr/local come from each new image rather than persisted volumes. Existing
installations using the old broad volumes must follow
Container hardening and migration.
Use docker compose down to stop containers while keeping data. Use
docker compose down -v only when you want to delete the named volumes.
The current public-alpha appliance is documented as a Linux container path, with
linux/amd64 as the CI-smoked build target. linux/arm64, CUDA-enabled local
AI workstations, NVIDIA Container Toolkit, and --gpus all are alpha follow-up
work until the release workflow builds and smokes those variants.
If you run an LLM on the host GPU, keep the model server outside the Wright
container and point LLM_API_URL at it. If a selected MCP server needs GPU
passthrough, validate that server in a clean container and record the exact
driver/toolkit assumptions in the MCP setup recipe.
Use the catalog validation process for selected servers:
- Start from a clean Wright container.
- Read the selected MCP metadata and blocked/dependency status.
- Install only the selected server's package and testable free/open host dependencies.
- Do not add unsafe, proprietary, license-bound, hardware-bound, or credential-bound software to the base image just to make validation pass.
- Run
initialize,notifications/initialized,tools/list, and one safe backend-touching probe before marking a server fully tested.
Problem logs belong in docs/mcp-catalog/testing-problem-log.md; reusable setup
recipes belong in docs/mcp-catalog/mcp-server-setup-recipes.md.
Stop the minimal appliance:
docker compose -f docker-compose.minimal.yml downRemove the appliance and its named volumes:
docker compose -f docker-compose.minimal.yml down -vRemove the built local image when you no longer need it:
docker image rm wright:latest