Strux OS Documentation
Home
Guide
Concepts
BSP Development
Reference
GitHub
Home
Guide
Concepts
BSP Development
Reference
GitHub
  • Reference

    • CLI Reference
    • strux.yaml Reference
    • Go Runtime Reference
    • Frontend API Reference

strux.yaml Reference

Every key in strux.yaml, the project configuration file at the root of a Strux project. The file is validated against a strict schema on every command that loads it — invalid values fail fast with a per-key error message. For what each subsystem does, follow the guide links in each section.

Three top-level keys are required: project_version, name, and bsp. Everything else is optional.

Shell-safe strings

Many string values feed into build scripts, so the schema rejects characters that could be interpreted by a shell: $, backticks, ;, &, |, <, >, line breaks, and null bytes. Keys marked shell-safe string below enforce this. A shell-safe relative path additionally must be non-empty, have no leading or trailing whitespace, and must not be absolute (no leading / or Windows drive prefix).

Top-level keys

KeyTypeDefaultDescription
project_versionstring (semver)—Required. Your project's version, e.g. 1.2.3 or 1.2.3-beta.1. Must be valid semver (prerelease and build suffixes allowed). Numbers are coerced to strings before validation. Used as the default version label for update bundles.
nameshell-safe string—Required. The project name.
bspshell-safe string—Required. The default board support package — must match a folder under bsp/ in your project. Commands like strux run, strux dev, strux flash, and strux kernel use this BSP. See BSPs.
hostnameshell-safe string—The device hostname.
bootobject—Boot configuration. See boot.splash.
updateobject—System update configuration. See update.
displayobject—Monitor layout and routing. See display.monitors.
rootfsobject—Root filesystem overlay and packages. See rootfs.
scriptsobject[]—Project build scripts run against the assembled rootfs. See scripts.
qemuobject—QEMU settings for local testing. See qemu.
buildobject—Build environment and cache settings. See build.
devobject—Dev mode settings. See dev.

boot.splash

The boot splash screen: the logo shown from power-on until your app takes over. If boot.splash is present, all three keys are required. See Customizing the OS.

KeyTypeDefaultDescription
boot.splash.enabledboolean—Required. Whether to enable the boot splash.
boot.splash.logoshell-safe relative path—Required. Path to the splash logo, relative to the project root, e.g. ./assets/logo.png.
boot.splash.colorstring—Required. Browser background color as a 6-digit hex value without the #, e.g. "000000". Must match [0-9A-Fa-f]{6}. Makes the splash-to-app transition seamless.

update

Enables the signed system update mechanism. See the Updates guide and the update system concept page.

KeyTypeDefaultDescription
update.enabledbooleanfalseEnable system updates for this project.
update.auto_bundlebooleanfalseAutomatically create a signed update bundle after builds.

display.monitors

Maps monitors to frontend routes — each monitor shows your app at a different URL path. If display is present, monitors must contain at least one entry. See the display stack concept page.

KeyTypeDefaultDescription
display.monitors[].pathstring—Required. The frontend route this monitor displays, e.g. / or /tv.
display.monitors[].resolutionstring—Resolution in WIDTHxHEIGHT format, e.g. 1920x1080. Must match \d+x\d+.
display.monitors[].transformstring or number—Output rotation/flip: normal, 0, 90, 180, 270, flipped, flipped-90, flipped-180, or flipped-270. The numeric values 0, 90, 180, 270 may be written unquoted; all values are normalized to strings.
display.monitors[].namesstring[]—Output connector names this entry matches, e.g. HDMI-A-1, DSI-1, Virtual-1.
display.monitors[].input_devicesstring[]—Input device names (e.g. a touchscreen controller) bound to this monitor.

rootfs

Customizes the root filesystem — the Linux filesystem your image boots from. See Customizing the OS.

KeyTypeDefaultDescription
rootfs.overlayshell-safe relative path—Folder copied verbatim onto the root filesystem, e.g. ./overlay.
rootfs.packagesshell-safe string[]—Debian packages to install into the image (package names or locations of .deb files).

scripts

Project build scripts run against the fully assembled root filesystem. Use these for app-specific image customization that doesn't belong in a shared BSP — installing a tool that isn't packaged, dropping in a binary, or running a one-off chroot step. See Customizing the OS.

KeyTypeDefaultDescription
scripts[].locationshell-safe relative path—Required. Path to the script, relative to the project root, e.g. ./scripts/install-yt-dlp.sh.
scripts[].stepstringrootfs_postLifecycle step to run at. rootfs_post (the only step today) runs after rootfs post-processing and before image bundling.
scripts[].descriptionstring—Human-readable label shown in build logs.
scripts[].depends_onstring[]—Files that invalidate the script's cache when changed. Project-relative when prefixed with ./, otherwise resolved like generated artifacts (under dist/).
scripts[].cached_generated_artifactsstring[]—Files (relative to dist/) the script produces. If all exist and no dependency changed, the script is skipped. Omit to run every build — ideal for "always fetch the latest" steps.

A rootfs_post script runs with $ROOTFS_DIR pointing at the extracted rootfs, the full build environment (TARGET_ARCH, BSP_NAME, PROJECT_NAME, …), and these helper functions: run_in_chroot / strux_chroot, strux_install_file <src> <abs-dest> [mode], and strux_progress / strux_progress_bar. The harness repacks the rootfs in place after a successful run, so downstream bundling picks up the changes automatically; a failing script aborts the build. Scripts must be idempotent (overwrite, don't append).

qemu

Controls how strux run and strux dev launch the image in QEMU. If qemu is present, enabled and network are required. See Running in QEMU.

KeyTypeDefaultDescription
qemu.enabledboolean—Required. Whether to use QEMU for local testing.
qemu.networkboolean—Required. Whether to enable QEMU networking.
qemu.usbobject[]—USB devices to pass through to the VM. Manage this list with strux usb — see the CLI reference.
qemu.usb[].vendor_idstring—Required per entry. USB vendor ID as exactly 4 hex digits, e.g. "1234".
qemu.usb[].product_idstring—Required per entry. USB product ID as exactly 4 hex digits, e.g. "5678".
qemu.flagsshell-safe string[]—Extra flags appended to the QEMU command line, e.g. -m 2G.

build

Build environment and cache configuration. See the build pipeline and caching concept pages.

KeyTypeDefaultDescription
build.host_packagesshell-safe string[]—Packages installed into the strux-builder Docker image (repository packages only).
build.cache.enabledbooleantrueEnable the smart build cache.
build.cache.force_rebuildstring[]—Build steps that always rebuild regardless of cache state.
build.cache.ignore_patternsstring[]—File patterns excluded from cache dependency hashing.

dev

Configures strux dev: the dev server, the WebKit inspector, and USB networking. See the Dev Mode guide.

dev.server

If dev.server is present, use_mdns_on_client and client_key are required.

KeyTypeDefaultDescription
dev.server.fallback_hostsobject[]—Hosts the dev server binds to and the dev client tries when mDNS discovery fails.
dev.server.fallback_hosts[].hostshell-safe string—Required per entry. Host address, e.g. 10.0.2.2 (the QEMU guest's address for the host machine).
dev.server.fallback_hosts[].portinteger (positive)—Required per entry. Port on that host, e.g. 8000.
dev.server.use_mdns_on_clientboolean—Required. Whether the on-device dev client uses mDNS discovery to find the dev server. mDNS lets devices find services on the local network by name, without configuration.
dev.server.client_keystring—Required. Shared key the device uses to authenticate against the dev server. Also the default key for strux update send.

dev.inspector

The WebKit inspector gives you browser devtools for the app running on the device, served over HTTP.

KeyTypeDefaultDescription
dev.inspector.enabledbooleanfalseEnable remote debugging — open the inspector URL in any browser.
dev.inspector.portinteger (positive)9223Port for the inspector HTTP server.

dev.usb

USB networking between your machine and a device connected over a USB cable.

KeyTypeDefaultDescription
dev.usb.enabledbooleantrueEnable USB networking in dev mode.
dev.usb.subnetstring192.168.7.0/24Subnet for the USB network link. Must be an IPv4 CIDR with at least two usable addresses (prefix length 0–30), e.g. 192.168.7.0/24.

Full example

A complete, real-world strux.yaml. Every key validates against the schema described above.

# Required: semver project version — also the default label for update bundles
project_version: 1.1.3

# Required: project name
name: test

# Required: the default BSP (a folder under bsp/)
bsp: ht109-rk3576s

# Device hostname
hostname: test

# Monitor-to-route mapping: each monitor shows a different frontend route
display:
  monitors:
    - path: /                  # main panel shows the root route
      resolution: 1920x1080
      names:
        - DSI-1                # connector name on real hardware
        - Virtual-1            # connector name in QEMU
      input_devices:
        - ILITEK               # touchscreen bound to this monitor
    - path: /tv                # second screen shows the /tv route
      resolution: 1920x1080
      names:
        - HDMI-A-1
        - Virtual-2

boot:
  splash:
    enabled: true
    logo: ./assets/logo.png    # relative path, PNG
    color: "000000"            # 6-digit hex, no leading #

# Signed system updates
update:
  enabled: true
  auto_bundle: true            # bundle automatically after builds

# Root filesystem customization
rootfs:
  overlay: ./overlay           # copied verbatim into the OS filesystem
  packages:                    # Debian packages installed into the image
    - curl
    - wget
    - openssh-server
    - ffmpeg

# Project build scripts run against the assembled rootfs
scripts:
  - location: ./scripts/install-yt-dlp.sh
    step: rootfs_post          # the only step today
    description: "Install latest yt-dlp from GitHub releases"
    # No cached_generated_artifacts → runs every build (always fetches latest)

# QEMU settings for local testing
qemu:
  enabled: true
  network: true
  # usb:                       # managed by `strux usb add` / `strux usb list`
  #   - vendor_id: "1234"
  #     product_id: "5678"
  flags:
    - -m 2G                    # extra QEMU flags

build:
  host_packages:               # extra packages in the builder Docker image
    - curl
    - wget

dev:
  server:
    fallback_hosts:            # tried when mDNS discovery fails
      - host: 10.0.2.2         # the host machine, as seen from the QEMU guest
        port: 8000
    use_mdns_on_client: true
    client_key: X0MPYU5D0DXWY0UHHWPWKCCEHT5EHEPR
  inspector:
    enabled: true              # browser devtools for the on-device app
    port: 9223
Last Updated:: 6/18/26, 3:43 AM
Contributors: Miguel Medeiros
Prev
CLI Reference
Next
Go Runtime Reference