Skip to content

CLI

Install with uv tool install multihull. Every command accepts --help.

Usage: hull [OPTIONS] COMMAND [ARGS]...
Deploy always-warm GPU inference containers to many providers from one spec.
╭─ Options ────────────────────────────────────────────────────────────────────────────╮
│ --install-completion Install completion for the current shell. │
│ --show-completion Show completion for the current shell, to copy it or │
│ customize the installation. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────╮
│ init │
│ validate │
│ schema │
│ plan │
│ status │
│ deploy │
│ destroy │
│ logs │
│ controller │
│ snapshot │
│ doctor │
╰──────────────────────────────────────────────────────────────────────────────────────╯
Usage: hull init [OPTIONS] [directory]
╭─ Arguments ──────────────────────────────────────────────────────────────────────────╮
│ directory <path> Project directory [default: .] │
╰──────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────╮
│ --name <str> Service name │
│ --force --no-force Overwrite an existing multihull.yaml │
│ [default: no-force] │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────╯
Usage: hull validate [OPTIONS] [path]
╭─ Arguments ──────────────────────────────────────────────────────────────────────────╮
│ path <path> Path to multihull.yaml [default: multihull.yaml] │
╰──────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────╯
Usage: hull schema [OPTIONS]
╭─ Options ────────────────────────────────────────────────────────────────────────────╮
│ --out <path> Write JSON Schema to this file │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────╯
Usage: hull plan [OPTIONS] [path]
╭─ Arguments ──────────────────────────────────────────────────────────────────────────╮
│ path <path> Path to multihull.yaml [default: multihull.yaml] │
╰──────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────╮
│ --out <path> Directory for rendered payloads [default: .multihull/plan] │
│ --state <path> State database [default: .multihull/state.db] │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────╯
Usage: hull status [OPTIONS] [path]
╭─ Arguments ──────────────────────────────────────────────────────────────────────────╮
│ path <path> Path to multihull.yaml [default: multihull.yaml] │
╰──────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────╮
│ --state <path> State database [default: .multihull/state.db] │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────╯
Usage: hull deploy [OPTIONS] [path]
╭─ Arguments ──────────────────────────────────────────────────────────────────────────╮
│ path <path> Path to multihull.yaml [default: multihull.yaml] │
╰──────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────╮
│ --apply --dry-run Perform real provider calls │
│ [default: dry-run] │
│ --target <str> Limit to this target (repeatable) │
│ --wait --no-wait Wait for every target to report Ready │
│ [default: wait] │
│ --timeout <str> Readiness timeout per target, e.g. 15m │
│ --snapshot-out <path> Snapshot file to write │
│ [default: .multihull/snapshot.json] │
│ --state <path> State database [default: .multihull/state.db] │
│ --image-digest <str> Pin the image to this digest │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────╯
Usage: hull destroy [OPTIONS] [path]
╭─ Arguments ──────────────────────────────────────────────────────────────────────────╮
│ path <path> Path to multihull.yaml [default: multihull.yaml] │
╰──────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────╮
│ --target <str> Limit to this target (repeatable) │
│ --yes -y Skip confirmation │
│ --snapshot-out <path> Snapshot file to write │
│ [default: .multihull/snapshot.json] │
│ --state <path> State database [default: .multihull/state.db] │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────╯
Usage: hull logs [OPTIONS] [path]
╭─ Arguments ──────────────────────────────────────────────────────────────────────────╮
│ path <path> Path to multihull.yaml [default: multihull.yaml] │
╰──────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────╮
│ --provider -p <str> Target provider name │
│ --since <str> How far back to read, e.g. 10m [default: 10m] │
│ --follow -f Keep streaming │
│ --state <path> State database [default: .multihull/state.db] │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────╯
Usage: hull controller [OPTIONS] [path]
╭─ Arguments ──────────────────────────────────────────────────────────────────────────╮
│ path <path> Path to multihull.yaml [default: multihull.yaml] │
╰──────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────╮
│ --interval <str> Reconcile interval, e.g. 30s [default: 30s] │
│ --grpc-listen <str> host:port for the discovery stream │
│ [default: 0.0.0.0:7700] │
│ --snapshot-out <path> Snapshot file to write │
│ [default: .multihull/snapshot.json] │
│ --state <path> State database [default: .multihull/state.db] │
│ --log-level <str> Python log level [default: INFO] │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────╯
Usage: hull snapshot [OPTIONS] [path]
╭─ Arguments ──────────────────────────────────────────────────────────────────────────╮
│ path <path> Path to multihull.yaml [default: multihull.yaml] │
╰──────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────╮
│ --out <path> Snapshot file [default: snapshot.json] │
│ --state <path> State database [default: .multihull/state.db] │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────╯
Usage: hull doctor [OPTIONS] [path]
╭─ Arguments ──────────────────────────────────────────────────────────────────────────╮
│ path <path> Path to multihull.yaml [default: multihull.yaml] │
╰──────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────╯