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 │╰──────────────────────────────────────────────────────────────────────────────────────╯Commands
Section titled “Commands”hull init
Section titled “hull init” 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. │╰──────────────────────────────────────────────────────────────────────────────────────╯hull validate
Section titled “hull validate” Usage: hull validate [OPTIONS] [path]
╭─ Arguments ──────────────────────────────────────────────────────────────────────────╮│ path <path> Path to multihull.yaml [default: multihull.yaml] │╰──────────────────────────────────────────────────────────────────────────────────────╯╭─ Options ────────────────────────────────────────────────────────────────────────────╮│ --help Show this message and exit. │╰──────────────────────────────────────────────────────────────────────────────────────╯hull schema
Section titled “hull schema” Usage: hull schema [OPTIONS]
╭─ Options ────────────────────────────────────────────────────────────────────────────╮│ --out <path> Write JSON Schema to this file ││ --help Show this message and exit. │╰──────────────────────────────────────────────────────────────────────────────────────╯hull plan
Section titled “hull plan” 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. │╰──────────────────────────────────────────────────────────────────────────────────────╯hull status
Section titled “hull status” 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. │╰──────────────────────────────────────────────────────────────────────────────────────╯hull deploy
Section titled “hull deploy” 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. │╰──────────────────────────────────────────────────────────────────────────────────────╯hull destroy
Section titled “hull destroy” 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. │╰──────────────────────────────────────────────────────────────────────────────────────╯hull logs
Section titled “hull logs” 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. │╰──────────────────────────────────────────────────────────────────────────────────────╯hull controller
Section titled “hull controller” 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. │╰──────────────────────────────────────────────────────────────────────────────────────╯hull snapshot
Section titled “hull snapshot” 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. │╰──────────────────────────────────────────────────────────────────────────────────────╯hull doctor
Section titled “hull doctor” Usage: hull doctor [OPTIONS] [path]
╭─ Arguments ──────────────────────────────────────────────────────────────────────────╮│ path <path> Path to multihull.yaml [default: multihull.yaml] │╰──────────────────────────────────────────────────────────────────────────────────────╯╭─ Options ────────────────────────────────────────────────────────────────────────────╮│ --help Show this message and exit. │╰──────────────────────────────────────────────────────────────────────────────────────╯