Manifest reference
One file per studio, at the root of the studio's own repository as helmstudio.yaml. The registry holds pointers to these, never copies. This schema is the whole extension surface: if supporting a studio needs a change to the daemon rather than a change here, the schema is wrong.
A studio's helmstudio.yaml, field by field. Generated from schema/manifest.json; helm validate checks a manifest against the same file, and adds rules a schema cannot state, such as a process's working directory staying inside the studio.
Required at the top: id, kinds, name, processes, requires, runtime.
/build
type array of object
Executed in declared order, each in its own cwd. Non-zero exit stops the sequence; Retry resumes at the first step that has not succeeded.
/build/*/cwd
type string
Relative to the studio root. Must not escape it.
/build/*/name
type string
Shown in the install checklist. Defaults to the command.
/build/*/optional
type boolean · default false
A non-zero exit marks the step skipped rather than failing the install.
/build/*/run required
type string · minLength 1
The schema gives this field no description.
/build/*/shell
type one of "sh", "bash", "powershell", "cmd" · default "sh"
Declared now so a later Windows port does not invalidate every manifest ever written.
/build/*/timeout_s
type integer · minimum 1 · default 3600
The schema gives this field no description.
/capabilities
type array of one of "kv", "records", "assets", "gallery", "timeline", "jobs", "gallery.read_all", "kv.shared", "handoff.send"
Least privilege, shown to the user before install as sentences rather than identifiers. No capabilities means no token is issued at all.
/description
type string · maxLength 140
One line for the card. Clamped to a single line in the UI.
/hue
type object
Identity colour, used only as a 3px stripe, a dot and a timeline clip — never as a button fill. Also injected as --helm-studio-accent. A studio without one is assigned from a generated ramp.
/hue/dark required
type #/$defs/hex
/hue/light required
type #/$defs/hex
/id required
type string · pattern "^[a-z][a-z0-9-]{1,38}[a-z0-9]$"
Stable slug. Used for paths, routes, token scope and the local override filename. Immutable once published.
/import
type object
A one-time, idempotent importer run on first launch under helmstudio, adopting data the studio already has. Never moves or deletes the originals.
/import/cwd
type string
The schema gives this field no description.
/import/run required
type string
The schema gives this field no description.
/import/shell
type one of "sh", "bash", "powershell", "cmd" · default "sh"
The schema gives this field no description.
/kinds required
type array of one of "video", "image", "audio", "text" · minItems 1
A list, not an enum: ltx and h3 are video AND audio.
/license
type string
SPDX identifier where possible.
/license_url
type string · format "uri"
The schema gives this field no description.
/local_path
type string
Absolute path to an existing checkout. When set, cloning is skipped. Development only — a registry manifest never sets this.
/name required
type string · minLength 1 · maxLength 60
Display name, lowercase as the studio names itself (e.g. 'h3 studio').
/network
type array of string
Hostnames this studio is expected to contact at build or run time. The smoke harness flags anything else.
/peak_ram_gb
type integer · minimum 1
What the model actually occupies once loaded. Drives the switch dialog's arithmetic, so an estimate is better than nothing.
/processes required
type array of #/$defs/process · minItems 1
The supervised process group. Started in dependency order, each health-gated before its dependents; stopped in reverse.
/python
type object
Presence makes the daemon create a per-studio uv environment pinned to this version before any build step. Environments are never shared between studios.
/python/extras
type array of string
The schema gives this field no description.
/python/version required
type string · pattern "^3\\.(9|1[0-9])$"
The schema gives this field no description.
/ref
type string
Branch, tag or commit. A registry entry always pins one.
/repo
type string · format "uri"
git clone URL. Required unless local_path is set.
/requires required
type object
os and arch mismatches block Install. Memory and disk shortfalls warn with the real number and let the user proceed.
/requires/arch required
type array of one of "arm64", "amd64" · minItems 1
The schema gives this field no description.
/requires/disk_gb
type integer · minimum 1
Checkout, build output and weights together.
/requires/os required
type array of one of "darwin", "linux", "windows" · minItems 1
The schema gives this field no description.
/requires/ram_gb
type integer · minimum 1
Minimum to install. A shortfall warns; it does not block.
/requires/tools
type array of string
Probed before the first build step. Failing fast here beats failing inside make.
/run
type #/$defs/process
Sugar for a single process with role 'main' and name 'studio'. Mutually exclusive with processes[].
/runtime required
type object
framework and backends are separate because PyTorch-on-cuda and PyTorch-on-mps are entirely different answers for a given machine.
/runtime/backends required
type array of one of "metal", "mps", "cuda", "rocm", "cpu", "vulkan" · minItems 1
Device backends this studio can actually use. The host check runs against THIS, not arch — a studio whose backends the host cannot provide is blocked, not warned.
/runtime/framework required
type one of "native-kernel", "mlx", "pytorch", "ggml", "onnx", "jax", "other"
How inference is implemented. 'native-kernel' means hand-written Metal/CUDA/C with no Python framework in the loop.
/runtime/language
type string
The engine's own stack, shown as prose (e.g. 'c', 'go', 'python').
/runtime/precision
type array of one of "fp32", "bf16", "fp16", "fp8", "int8", "int4"
The schema gives this field no description.
/schema_version
type integer
Manifest schema major. Omitted means 1.
/sdk
type object
Majors pinned separately. The daemon injects matching bundle URLs at launch so a helmstudio update never jumps a studio across a major.
/sdk/css
type #/$defs/semverRange
/sdk/runtime
type #/$defs/semverRange
/sdk/ui
type #/$defs/semverRange
/storage
type object
The schema gives this field no description.
/storage/collections
type array of object
The schema gives this field no description.
/storage/collections/*/fts
type array of string
The schema gives this field no description.
/storage/collections/*/index
type array of string
Top-level JSON fields to build scoped expression indexes on at install time.
/storage/collections/*/name required
type string · pattern "^[a-z][a-z0-9_]*$"
The schema gives this field no description.
/storage/quota
type object
Per-studio caps enforced on write. A studio in a retry loop must not be able to fill a disk.
/storage/quota/kv_bytes
type integer · minimum 1024
The schema gives this field no description.
/storage/quota/records
type integer · minimum 1
The schema gives this field no description.
/submodules
type boolean · default false
The schema gives this field no description.
/test
type object
The schema gives this field no description.
/test/profile
type string
A reduced configuration — smaller model, fewer steps, shorter clip — so the smoke test exercises the real code path in under two minutes. Without one, nothing generative is testable in CI.
/test/smoke
type string
Path to the smoke test definition, relative to the studio root.
/weights
type array of object
The schema gives this field no description.
/weights/*/dest required
type string
Directory name under the shared models root.
/weights/*/files
type array of string
Allow-list of paths to fetch, and the presence check used when a directory is linked instead of downloaded.
/weights/*/name required
type string · pattern "^[a-z][a-z0-9_]*$"
The placeholder key: {models.<name>} in a process command.
/weights/*/optional
type boolean · default false
The schema gives this field no description.
/weights/*/repo required
type string
Hugging Face repo id.
/weights/*/revision
type string · default "main"
The schema gives this field no description.
/weights/*/selectable
type boolean · default false
One of a set the user picks between, bound to {models.selected}. The choice is made before install, on the approval preview, defaulting to the first selectable weight declared; install downloads only that one, and the others are fetched or linked on demand. It can be changed while the studio is not running, without a new approval. A launch with no selection is refused. iris studio takes exactly one checkpoint per run.
/weights/*/size_gb
type number · minimum 0
For the disk pre-check, before any bytes move.
$defs/hex
type string · pattern "^#[0-9a-fA-F]{6}$"
The schema gives this field no description.
$defs/portNumber
type integer · minimum 1024 · maximum 65535
The schema gives this field no description.
$defs/process
type object
The schema gives this field no description.
#/$defs/process/autostart
type boolean · default true
False lets a user start a worker on demand from the studio page.
#/$defs/process/busy
type object
Liveness is not occupancy. A studio may be running and holding nothing, or running and holding 21 GB. Without this the switch dialog is guessing. Asked only when a heavy launch would stop this studio; an answer never changes process or health state (docs/decisions.md M5 Q12).
#/$defs/process/busy/path
type string · pattern "^/"
HTTP GET on the process's assigned port. Answers 200 with a JSON object: {"busy": boolean (required) — work in flight, "loaded": boolean — holds a model, "message": string, "progress": number 0..1}. Any other status, a body without a boolean busy, a progress outside 0..1, or no answer within 2 s reads as unknown, which is never shown as idle.
#/$defs/process/cmd required
type string · minLength 1
Template. Substitutes {port}, {ports.<name>}, {models.<name>}, {models.selected}, {root}, {data}, {venv}.
#/$defs/process/cwd
type string
Relative to the studio root.
#/$defs/process/depends_on
type array of string
Names of sibling processes that must be healthy first. The validator rejects unknown names and cycles.
#/$defs/process/env
type object
The schema gives this field no description.
#/$defs/process/health
type object
Exactly one probe shape. A failed health check never restarts a main process — an eight-minute generation must survive a slow probe.
#/$defs/process/health/exec
type string
A command whose zero exit means healthy. For a worker with no endpoint.
#/$defs/process/health/interval_s
type integer · minimum 1 · default 2
The schema gives this field no description.
#/$defs/process/health/path
type string · pattern "^/"
HTTP GET expected to return 200.
#/$defs/process/health/tcp
type boolean
A successful connect to the assigned port is enough.
#/$defs/process/health/timeout_s
type integer · minimum 1 · default 180
The budget, shown to the user as elapsed against it. A studio that loads 20 GB before answering needs a large one; a thin wrapper needs a small one so a dead process is reported quickly.
#/$defs/process/heavy
type boolean · default false
Marks the process that holds the model. The one-heavy-group-at-a-time rule is evaluated on this member.
#/$defs/process/name required
type string · pattern "^[a-z][a-z0-9_-]*$"
Unique within the studio. Exposed to siblings as {ports.<name>}.
#/$defs/process/port
type object
Omit entirely for a process that listens on nothing.
#/$defs/process/port/fixed
type #/$defs/portNumber
Refuses to start when taken, naming the occupant. For a process that cannot accept a port flag.
#/$defs/process/port/prefer
type #/$defs/portNumber
Advisory. Used when free, otherwise the daemon assigns from its range.
#/$defs/process/restart
type one of "never", "on-failure" · default "never"
A main process is never auto-restarted. A sidecar with on-failure retries with backoff, at most three times in ten minutes, then the group fails.
#/$defs/process/role
type one of "main", "sidecar", "worker", "oneshot" · default "main"
main owns the UI and the Launch button. oneshot runs to completion before dependents start.
#/$defs/process/shell
type one of "sh", "bash", "powershell", "cmd" · default "sh"
The schema gives this field no description.
#/$defs/process/ui
type string · pattern "^/"
Path the Open button targets. Meaningful on a main process.
$defs/semverRange
type string · pattern "^[\\^~]?[0-9]+(\\.[0-9]+){0,2}$"
The schema gives this field no description.