Install the CLI with uv tool install hud --python 3.12. Authenticate once with hud set HUD_API_KEY=....
Build & iterate
hud init
Scaffold a new environment package in a fresh <name> directory. The blank template (the default with no preset, and the first option in the interactive picker) writes a minimal local scaffold - env.py (environment, templates, capabilities), tasks.py (concrete task rows), Dockerfile.hud, and pyproject.toml - no network, no API key. Every other preset downloads a starter environment from GitHub instead.
hud serve
Serve an environment’s control channel locally (tcp JSON-RPC). hud dev is a
deprecated alias.
hud deploy
Build and publish to HUD infra in one step. The environment’s name comes
from the Environment(...) declaration in code; deploying the same name again
rebuilds that environment.
Evaluate
hud eval
The primary local iteration loop: run an agent over a task source (.py, directory, or JSON/JSONL), grade the result, and print the reward. Each rollout gets a fresh subprocess for the env - no shared state between tasks.
hud eval loads tasks from the path you pass. In a split project, point it at tasks.py (or . to scan the directory). It spawns env.py for the control channel automatically - you don’t pass both files.
What you don’t need for a local run:
- A HUD API key - local evals don’t hit the platform
hud serve running - hud eval spawns the env subprocess for you
- Docker - unless your env explicitly uses
DockerRuntime
- An SSH connection - the gateway timeout only applies when
env.workspace() is declared
For a platform taskset, pass its name or id directly: hud eval "My Tasks" claude. The tasks are fetched from the platform and the rollouts run remotely by default, since the env source is not on disk.
Single-task runs show step-by-step progress (step number + tool calls). Multi-task batches are silent unless --verbose is passed.
Run a packaged image
hud task start / hud task grade attach to an env already serving locally (e.g. inside a built image, or alongside hud serve), or load one from source with --source. hud task list always reads from source (default .) - it doesn’t attach.
External benchmark formats (currently Harbor) load directly into the runtime
as Tasksets - no conversion step. See Harbor interop.
Inspect
hud jobs [<id>]
Without an id, lists your most recent jobs. With an id, lists every trace in that job.
hud trace <trace_id>
Inspect a single rollout. Reads from the local telemetry JSONL file first
(HUD_TELEMETRY_LOCAL_DIR/<trace_id>.jsonl) and falls back to the platform API.
Set HUD_TELEMETRY_LOCAL_DIR in your environment to write spans to disk during a
rollout so hud trace can read them offline without an API call.
Other commands
See also