Skip to content

Seed File

A seed file preconfigures a device before it ever boots. Drop a dashboard-assistant.yaml next to the image and the device picks up its Home Assistant URL and Wi-Fi on first boot, which is what you want for field deploys or for flashing several tablets at once.

For a single device you do not need one. A display that cannot get online broadcasts its own network and you set it up from your phone: see Wi-Fi setup. A device that boots with a valid seed file joins your network directly and never broadcasts anything.

Physical access = full trust

Any USB stick carrying a dashboard-assistant.yaml is applied automatically, and the file can carry a long-lived token in plain text. Only use seed files on hardware and networks you control, and wipe the stick afterwards.

Populate Seed File

Create a file named exactly dashboard-assistant.yaml. Every key is optional — include only what you want to provision:

# Home Assistant base URL the kiosk should open.
ha_url: "https://homeassistant.local:8123"

# Optional long-lived access token for kiosk auto-login. You normally don't
# need this — the Dashboard Assistant integration provisions a login for the
# device automatically. Only set it to preset a token yourself.
token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiIyZWRlNGE0ZTFjNmQ0ZDY3OTY4ODhmMTk5OGNhNWVjMSIsImlhdCI6MTc4NDcxODk3MywiZXhwIjoyMTAwMDc4OTczfQ.Rd92pdzdYkC8HI3buVO6m9EVVI71Ye-MP_1nwogfOgU"

# Optional Wi-Fi credentials. Omit the whole block on a wired device.
wifi:
  ssid: "MyNetwork"
  psk: "supersecret"

# Optional device API token, the credential Home Assistant uses to talk to this
# device. Leave it out and the device generates its own, which Home Assistant
# picks up when it pairs. Set it to flash a fleet with a token you already know.
api_token: "a-long-random-string"

# Optional list of dashboard pages, replacing whatever the device has. `name` is
# the label in Home Assistant; without one the URL is its own label.
pages:
  - name: "Home"
    url: "https://homeassistant.local:8123/lovelace/0"
  - name: "Kitchen"
    url: "https://homeassistant.local:8123/lovelace/kitchen"
Key Required Description
ha_url no Home Assistant base URL the dashboard loads on boot.
token no Optional. Kiosk login token; normally provisioned by the integration.
wifi.ssid no Wi-Fi network name to join.
wifi.psk no Wi-Fi pre-shared key (password).
api_token no Device API token for the Home Assistant integration. Generated per device if omitted.
pages no List of name + url entries replacing the device's page list. url is required per entry.

Two notes on the optional keys. api_token only takes effect when the daemon next starts, so a stick plugged into a running device needs a reboot for that one key (everything else applies immediately). And pages replaces the list wholesale rather than merging, but importing it does not move the display off the page it is showing.

Apply the Seed File

There are two ways to hand the file to a device. Both require the image to be built with config import enabled (dashboard.configImport.enable = true).

The /boot partition is FAT and readable on any computer. After flashing, mount it and copy dashboard-assistant.yaml to its root.

It is imported once on first boot, while the device is still unprovisioned — so it seeds a fresh image without re-importing on every later boot.

Put dashboard-assistant.yaml in the root of a normal USB stick (any filesystem the OS can mount) and plug it into a running device.

Inserting the stick triggers an import immediately, so you can re-provision a device in the field without reflashing.

Once imported, the setup wizard is skipped and the dashboard goes straight to your Home Assistant instance.

Pairing still works

A seeded device pairs with Home Assistant exactly like a hand-configured one: it is discovered over mDNS and hands over its API token with nothing to type. Writing a seed file does not count as having been paired, and there is no extra step to undo.

If pairing is refused, the device has already been paired once. That is what the gate is for, and the way back is a factory reset from the admin page.