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.

It also works after the fact: edit the file on the card later and the device applies the change on its next boot, so a device can be moved to a new network or pointed at a new Home Assistant without reflashing it.

You need one for any device that is not on Ethernet: the display has no way to ask for Wi-Fi credentials on screen, so the seed file is how they reach it. A device that boots with a valid seed file joins your network directly.

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) — editing the file on the boot partition always applies it, because that is read during boot anyway. And pages replaces the list wholesale rather than merging, though 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, and they differ in when they re-apply: the boot partition is read on every boot and acted on whenever the file has changed, while a USB stick is applied each time you plug it in.

After flashing, the card or disk carries a small FAT partition that any computer can read — Windows, macOS and Linux all mount it. Copy dashboard-assistant.yaml to its root.

It is the same partition on every image — x86 and both Raspberry Pis: the EFI system partition, labelled ESP and mounted as /boot on the device. Your file manager shows exactly one readable partition; the other one is btrfs, which Windows and macOS cannot read.

That partition is not empty: alongside the boot files it carries a README.txt and a dashboard-assistant.yaml.example that say all of this, so a card explains itself without this page. Copy the example, drop the .example, and edit it.

Name the file exactly dashboard-assistant.yaml

On Windows, "hide extensions for known file types" makes dashboard-assistant.yaml.example look like dashboard-assistant.yaml. Turn extensions on before renaming, or the device will not find the file.

It is re-read when you change it. The device records a checksum of the file it last imported, so:

  • first boot — the file is applied
  • you edit it and reboot — the new values are applied. This is how you re-provision a device in place: no reflash, no factory reset
  • you leave it alone — nothing is applied, on this or any later boot. Changes you made on the device or from Home Assistant are kept
  • you delete it — same thing. Deleting the file does not reset anything

An edit applies the whole file

Not just the line you changed. That matters for pages, which replaces the device's page list outright — so if you edit ha_url on a device whose pages you have since reordered in Home Assistant, the file's page list wins. Delete the pages block to manage pages from Home Assistant instead.

The file stays on the partition

Importing does not delete it. If it carries a Wi-Fi passphrase, anyone who pulls the card can read it — so delete it once the device is set up if that matters where the device lives.

If a device does not pick the file up, the usual cause is YAML indentation. The device logs what it did, and any parse error, under journalctl -u dashboard-assistant-boot-import.

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.

Unlike the boot partition, this applies every time you plug the stick in, changed or not. There is no checksum involved.

Once the file is applied, the device goes straight to your Home Assistant dashboard.

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.

A factory reset also clears the recorded checksum, so a reset device re-imports the seed file still sitting on its card on the next boot. That is usually what you want when re-deploying a device. When it is not, remove the file from the partition before resetting.