schemaVersion
requiredVersion of the bundle.yaml schema format.
App Bundle Specification
bundle.yaml Reference Every app submitted to the Torizon App Hub includes a bundle.yaml file that acts as the single source of truth for the submission. It describes who made the app, what it does, which hardware it supports, and how it is deployed. App Hub reads this file to validate submissions, populate app cards, and power the app detail page.
This reference page is automatically generated from the JSON Schema at schemas/app-bundle.schema.json so it always reflects the current spec. The annotated example at the bottom of this page is the same template shown in the submission editor.
All top-level fields are required unless marked Optional.
Version of the bundle.yaml schema format.
Publisher metadata shown in app discovery and support surfaces.
| Field | Type | Required | Description |
|---|---|---|---|
name | string | yes | Publisher or company display name. |
website | string | yes | Publisher website URL. |
contactEmail | string | yes | Primary support contact email. |
supportUrl | string | yes | Support page URL for users. |
Compatibility constraints for hardware and optional OS versions.
| Field | Type | Required | Description |
|---|---|---|---|
hardware | object | yes | Hardware compatibility declarations. Nested fields machineIdsstring arraySupported machine IDs for this bundle. |
torizonOS | object | no | Optional Torizon OS compatibility constraints. Nested fields minVersionstring– optionalMinimum supported Torizon OS version.maxVersionstring– optionalMaximum supported Torizon OS version.ostreeRefstring– optionalOptional required OSTree reference. |
App identity metadata and deployment targets.
| Field | Type | Required | Description |
|---|---|---|---|
meta | object | yes | App identity and discovery metadata. Nested fields idstringStable, globally-unique identifier (reverse-DNS recommended).namestringHuman-readable app name.versionstringBundle release version (SemVer recommended).summarystringShort markdown summary.descriptionobjectReference to a customer-provided file artifact.licensestring– optionalSPDX identifier (recommended) or a license expression.tagsstring array– optionalOptional discovery tags for filtering and search.linksobject– optionalOptional external links presented in app details. |
targets | object | yes | Deployment targets packaged with this bundle. Nested fields osobject– optionalOS customization deployment target.applicationobject– optionalApplication deployment target based on Docker Compose.subsystemsobject array– optionalOptional subsystem payload targets. |
Every property in bundle.yaml at every nesting level, including nested objects and array item fields. Array items appear as field[]. Pattern-keyed map entries appear as field.<keyId>.
| Property | Type | Required | Description |
|---|---|---|---|
schemaVersion | string | yes | Version of the bundle.yaml schema format. Pattern: ^2\.\d+\.\d+$ |
publisher | object | yes | Publisher metadata shown in app discovery and support surfaces. |
publisher.name | string | yes | Publisher or company display name. |
publisher.website | string | yes | Publisher website URL. |
publisher.contactEmail | string | yes | Primary support contact email. |
publisher.supportUrl | string | yes | Support page URL for users. |
compatibility | object | yes | Compatibility constraints for hardware and optional OS versions. |
compatibility.hardware | object | yes | Hardware compatibility declarations. |
compatibility.hardware.machineIds | string array | yes | Supported machine IDs for this bundle. |
compatibility.hardware.machineIds[] | string | no | One supported machine identifier. |
compatibility.torizonOS | object | no | Optional Torizon OS compatibility constraints. |
compatibility.torizonOS.minVersion | string | no | Minimum supported Torizon OS version. |
compatibility.torizonOS.maxVersion | string | no | Maximum supported Torizon OS version. |
compatibility.torizonOS.ostreeRef | string | no | Optional required OSTree reference. |
bundle | object | yes | App identity metadata and deployment targets. |
bundle.meta | object | yes | App identity and discovery metadata. |
bundle.meta.id | string | yes | Stable, globally-unique identifier (reverse-DNS recommended). Pattern: ^[A-Za-z0-9][A-Za-z0-9._-]{2,127}$ |
bundle.meta.name | string | yes | Human-readable app name. |
bundle.meta.version | string | yes | Bundle release version (SemVer recommended). Pattern: ^[0-9]+(\.[0-9]+){1,2}([\-+][0-9A-Za-z.-]+)?$ |
bundle.meta.summary | string | yes | Short markdown summary. |
bundle.meta.description | object | yes | Reference to a customer-provided file artifact. |
bundle.meta.description.path | string | yes | Must be a Markdown filename (no directory segments). Default: description.md Pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*\.md$ |
bundle.meta.license | string | no | SPDX identifier (recommended) or a license expression. |
bundle.meta.tags | string array | no | Optional discovery tags for filtering and search. |
bundle.meta.tags[] | string | no | One tag label. |
bundle.meta.links | object | no | Optional external links presented in app details. |
bundle.meta.links.homepage | string | no | Product homepage URL. |
bundle.meta.links.documentation | string | no | Documentation URL. |
bundle.meta.links.source | string | no | Source repository URL. |
bundle.meta.links.changelog | string | no | Release notes or changelog URL. |
bundle.targets | object | yes | Deployment targets packaged with this bundle. |
bundle.targets.os | object | no | OS customization deployment target. |
bundle.targets.os.tcbuild | object | yes | Reference to a customer-provided file artifact. |
bundle.targets.os.tcbuild.path | string | yes | Must be a YAML filename (no directory segments). Pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*\.(ya?ml)$ |
bundle.targets.os.gitRepos | object array | yes | Git repositories to shallow-clone for tcbuild.yaml context. |
bundle.targets.os.gitRepos[] | object | no | Git repository source included for OS customization context. |
bundle.targets.os.gitRepos[].url | string | yes | Git repository URL (https://... or ssh://... etc). |
bundle.targets.os.gitRepos[].ref | string | no | Optional git ref (branch/tag/commit). If absent, default branch is used. |
bundle.targets.os.gitRepos[].depth | integer | no | Shallow clone depth. Default is 1 (shallow). Default: 1 |
bundle.targets.os.gitRepos[].submodules | boolean | no | Whether git submodules should be fetched. Default: false |
bundle.targets.os.notes | string | no | Optional notes about OS customization behavior. |
bundle.targets.application | object | no | Application deployment target based on Docker Compose. |
bundle.targets.application.compose | object | yes | Reference to the main docker-compose.yml and optional machine-specific overrides. |
bundle.targets.application.compose.type | string | yes | Literal file reference marker. Values: "file" |
bundle.targets.application.compose.path | string | yes | Main Docker Compose YAML filename (no directory segments). Pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*\.(ya?ml)$ |
bundle.targets.application.compose.sha256 | string | no | SHA-256 checksum encoded as 64 hexadecimal characters. Pattern: ^[A-Fa-f0-9]{64}$ |
bundle.targets.application.compose.sizeBytes | integer | no | Optional file size in bytes. |
bundle.targets.application.compose.overrides | object array | no | Optional per-machine compose override files. |
bundle.targets.application.compose.overrides[] | object | no | Per-machine Docker Compose override file reference. |
bundle.targets.application.compose.overrides[].path | string | yes | Compose override filename (must end with .override.yml). Pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*\.override\.yml$ |
bundle.targets.application.compose.overrides[].machineIds | string array | yes | Machine IDs targeted by this override. |
bundle.targets.application.compose.overrides[].machineIds[] | string | no | One machine ID value targeted by this compose override. |
bundle.targets.application.compose.overrides[].sha256 | string | no | SHA-256 checksum encoded as 64 hexadecimal characters. Pattern: ^[A-Fa-f0-9]{64}$ |
bundle.targets.application.compose.overrides[].sizeBytes | integer | no | Optional file size in bytes. |
bundle.targets.application.configOverrides | object | no | Reference to the app configuration override file and configurable keys. |
bundle.targets.application.configOverrides.type | string | yes | Literal file reference marker. App Hub currently supports only file-based overrides. Values: "file" |
bundle.targets.application.configOverrides.path | string | yes | Configuration filename (no directory segments). Default: config.txt Pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$ |
bundle.targets.application.configOverrides.keys | object | yes | Map of configuration key definitions keyed by stable key IDs. |
bundle.targets.application.configOverrides.keys.<keyId> | object | no | One configuration override key exposed by App Hub. |
bundle.targets.application.configOverrides.keys.<keyId>.type | string | yes | Supported key types for App Hub configuration overrides. Values: "boolean" · "list" |
bundle.targets.application.configOverrides.keys.<keyId>.name | string | yes | Display name shown in App Hub configuration UI. |
bundle.targets.application.configOverrides.keys.<keyId>.description | string | yes | User-facing explanation shown in App Hub configuration tooltips. |
bundle.targets.application.configOverrides.keys.<keyId>.default | any | yes | Default value for this key (`true|false` for boolean, one item from `valuesList` for list). |
bundle.targets.application.configOverrides.keys.<keyId>.valuesList | string array | no | Allowed values for `type: list` keys. |
bundle.targets.application.configOverrides.keys.<keyId>.valuesList[] | string | no | One selectable list value. |
bundle.targets.application.registryCredentials | object array | no | Optional registry credentials for TCB to login and pull private images. |
bundle.targets.application.registryCredentials[] | object | no | Credential entry used to authenticate against a container registry. |
bundle.targets.application.registryCredentials[].registry | string | yes | Registry hostname (e.g., ghcr.io, registry.example.com). |
bundle.targets.application.registryCredentials[].username | string | no | Username for basic auth. |
bundle.targets.application.registryCredentials[].password | string | no | Password for basic auth (prefer secrets reference in future). |
bundle.targets.application.registryCredentials[].token | string | no | Token-based auth (alternative to username/password). |
bundle.targets.application.registryCredentials[].auth | string | no | Base64-encoded Docker auth field (alternative form). |
bundle.targets.application.registryCredentials[].note | string | no | Optional note for maintainers about this credential. |
bundle.targets.application.notes | string | no | Optional notes about application deployment behavior. |
bundle.targets.subsystems | object array | no | Optional subsystem payload targets. |
bundle.targets.subsystems[] | object | no | Additional subsystem payload target definition. |
bundle.targets.subsystems[].name | string | yes | Human-readable subsystem name. |
bundle.targets.subsystems[].subsystemId | string | yes | Mandatory subsystem identifier (mapping handled by app logic later). Pattern: ^[A-Za-z0-9._-]{1,64}$ |
bundle.targets.subsystems[].payload | object | yes | Reference to a customer-provided file artifact. |
bundle.targets.subsystems[].payload.type | string | yes | Literal file reference marker. Values: "file" |
bundle.targets.subsystems[].payload.path | string | yes | Filename in the bundle artifact set (no directory segments). Pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$ |
bundle.targets.subsystems[].payload.sha256 | string | no | SHA-256 checksum encoded as 64 hexadecimal characters. Pattern: ^[A-Fa-f0-9]{64}$ |
bundle.targets.subsystems[].payload.sizeBytes | integer | no | Optional file size in bytes. |
bundle.targets.subsystems[].kind | string | no | Optional human hint (mcu-firmware, fpga-bitstream, etc). |
bundle.targets.subsystems[].notes | string | no | Optional notes about subsystem deployment behavior. |
The complete app-bundle.example.yaml — same template used in the submission editor. Inline comments explain every field.
# Full field reference and documentation: see /docs/bundlespec in the App Hub.
#
# Schema version — identifies the bundle.yaml format version.
schemaVersion: "2.0.0"
# Publisher contact metadata shown in cards/details and used for support.
publisher:
# Public name of the app publisher.
name: "Acme Vision Ltd."
# Main website for this publisher.
website: "https://acmevision.example"
# Support contact email.
contactEmail: "support@acmevision.example"
# URL where users can request support.
supportUrl: "https://acmevision.example/support"
# Hardware and optional OS compatibility declarations.
compatibility:
hardware:
# Supported Torizon machine IDs.
machineIds:
- "verdin-imx8mm"
torizonOS:
# Optional min/max supported Torizon OS versions.
minVersion: "7.2.0"
maxVersion: "7.99.0"
# Optional OSTree ref constraint.
ostreeRef: "torizon/torizon-core-docker"
# App identity/discovery metadata and deployment targets.
bundle:
# App identity and discovery metadata.
meta:
# Stable unique app identifier (reverse-DNS style recommended).
id: "io.torizon.apphub.smart-camera"
# Human-readable app name shown in UI.
name: "Smart Camera Bundle"
# Bundle release version (SemVer recommended).
version: "1.2.0"
# Short markdown summary shown in compact views.
summary: |
## Smart Camera
Edge camera pipeline with AI inference.
# Long markdown description reference.
description:
# Keep literal value "file" for artifact references.
type: file
# Markdown filename included with this submission.
path: "description.md"
# SPDX identifier or license expression.
license: "Proprietary"
# Optional discovery tags.
tags:
- "vision"
# Optional reference links shown in app details.
links:
homepage: "https://acmevision.example/products/smart-camera"
documentation: "https://acmevision.example/docs/smart-camera"
source: "https://git.example/acme/smart-camera"
changelog: "https://acmevision.example/docs/smart-camera/changelog"
# Deployment targets. Keep only sections your app uses.
targets:
# Optional OS customization target.
os:
tcbuild:
# Keep literal value "file" for artifact references.
type: file
# YAML filename included with this submission.
path: "tcbuild.yaml"
# Optional checksum and file size metadata.
sha256: "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
sizeBytes: 1846
# Git repositories cloned as tcbuild context.
gitRepos:
- url: "https://git.example/acme/device-configs.git"
ref: "main"
depth: 1
submodules: false
notes: "OS update built using tcbuild and bundled repos."
# Optional application deployment target.
application:
compose:
# Keep literal value "file" for artifact references.
type: file
# YAML filename included with this submission.
path: "docker-compose.yml"
# Optional checksum and file size metadata.
sha256: "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
sizeBytes: 932
# Optional per-machine compose overrides.
overrides:
- path: "docker-compose.imx8.override.yml"
machineIds:
- "verdin-imx8mp"
- "colibri-imx8x"
- path: "docker-compose.am62.override.yml"
machineIds:
- "verdin-am62"
# Optional app configuration override contract (App Hub specific).
configOverrides:
# Keep literal value "file" for artifact references.
type: file
# Config filename declared in docker-compose.yml `configs`.
path: "config.txt"
# Map of configurable keys (object key is the stable ID).
keys:
enableTelemetry:
type: boolean
name: "Enable telemetry"
description: "Enables anonymous runtime telemetry reporting."
default: true
logLevel:
type: list
name: "Log level"
description: "Selects the runtime log verbosity."
default: "info"
valuesList:
- "debug"
- "info"
- "warn"
- "error"
# Optional credentials to pull private container images.
registryCredentials:
- registry: "ghcr.io"
token: "${GITHUB_TOKEN}"
note: "Token resolved by App Hub pipeline at publish time."
notes: "Single-compose application deployment."
# Optional extra subsystem payload artifacts.
subsystems:
- name: "Aux MCU Firmware"
subsystemId: "mcu0"
payload:
# Keep literal value "file" for artifact references.
type: file
# Artifact filename included with this submission.
path: "mcu_firmware.bin"
# Optional checksum and file size metadata.
sha256: "1111111111111111111111111111111111111111111111111111111111111111"
sizeBytes: 262144
kind: "mcu-firmware"
notes: "Installed onto the device's MCU secondary."
Use the submission editor to create your bundle.yaml from the annotated template or convert an existing Docker Compose file.