Ha addon scaffold
Scaffold a production-ready Home Assistant add-on: config.yaml with UI options schema, multi-arch Dockerfile + build.yaml, s6-overlay services, Ingress web UI wiring, GHCR CI, DOCS/CHANGELOG, and an add-on repository.yaml. Use when creating a new Home Assistant add-on, adding an add-on to a repository, or setting up HA add-on CI/CD. Triggers on: home assistant add-on, hass.io addon, scaffold ha addon, ingress addon, addon repository.From its SKILL.md
npx -y skills add selic/skills --skill ha-addon-scaffoldAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
5.6 KB, ~1.4k tokens by cl100k_base, as published. Nobody here has run it
Home Assistant add-on scaffold
You generate a complete, installable Home Assistant add-on that follows the Supervisor add-on spec and ships as a multi-arch GHCR image. Prefer editing an existing add-on repo over creating files from scratch when one is present.
Phase 0 — Gather intent
From $ARGUMENTS (or by asking, max 3 questions) establish:
- slug — lowercase,
[a-z0-9_]+, unique in the repo (e.g.parkingcam). - purpose — one sentence for
description. - runtime — Python / Node / shell? Long-running service or one-shot?
- needs — camera/entity access? MQTT discovery? Ingress web UI? Bundled model/asset?
- arch — default
aarch64+amd64; addarmv7/armhf/i386only if asked.
Do not ask about anything you can infer. If it's an existing repo, read
repository.yaml and a sibling add-on first to match conventions.
Phase 1 — Repository layout
An add-on repository (what users add by URL) looks like:
<repo>/
├── repository.yaml # name, url, maintainer
├── README.md # how to add the repo + what the add-ons do
├── LICENSE
├── .github/workflows/ # builder.yaml (GHCR), lint.yaml
└── <slug>/ # one directory per add-on
├── config.yaml # add-on manifest (the contract with Supervisor)
├── build.yaml # base images per arch + OCI labels
├── Dockerfile
├── DOCS.md # shown in the add-on's Documentation tab
├── CHANGELOG.md # Keep a Changelog + SemVer
├── translations/en.yaml # config option labels/descriptions
└── rootfs/ # overlaid onto the image (s6 services, app code)
repository.yaml:
name: <Nice Name> Add-ons
url: https://github.com/<owner>/<repo>
maintainer: <Name> <email>
Phase 2 — config.yaml (the manifest)
This is the highest-leverage file — it defines the whole UI. Key rules:
versionis a string ("1.0.0") and must matchCHANGELOG.md+ the CI tag.image: ghcr.io/<owner>/{arch}-<slug>—{arch}is substituted by the builder.- Expose every tunable via
options(defaults) +schema(validation). Use real validators:int(min,max),float(min,max),list(a|b|c),match(^regex$), trailing?for optional,str/bool/password. - Request only the access you use:
hassio_api,homeassistant_api,auth_api,map: ["config:rw", "share:rw"],ports:(map tonullto keep optional). - Web UI →
ingress: true+ingress_port: <n>+panel_icon/panel_title. startup: application,boot: auto,init: falsefor a normal service add-on.
Mirror the option keys 1:1 in translations/en.yaml so the UI shows labels, not
raw keys.
Phase 3 — Image: build.yaml + Dockerfile
build.yamlsetsbuild_fromper arch to the officialghcr.io/home-assistant/{arch}-base-debian:bookworm(or-base:for Alpine), and OCIlabels(title, description, source, licenses).DockerfilestartsARG BUILD_FROM/FROM ${BUILD_FROM}, installs deps,COPY rootfs /, and ends withCMD [ "/init" ](s6-overlay entrypoint).- Bundle large assets (models, weights) under
rootfs/opt/<slug>/…and commit them explicitly; keep training/dev artifacts out via.gitignore.
Phase 4 — Process supervision (s6-overlay)
Under rootfs/etc/:
cont-init.d/00-bootstrap— one-shot setup (render config from options viabashio::config, migrate old paths). Executable,#!/usr/bin/with-contenv bashio.services.d/<name>/run— one per long-running process (app + web UI get separate, independently supervised services). Executable.
Read options with bashio::config 'key'; log with bashio::log.info.
Phase 5 — CI (.github/workflows/)
builder.yaml— onpushtomain(path-filtered to the add-on) and on tag push, build multi-arch withhome-assistant/builderand push to GHCR. ⚠️ The tag trigger must beon.push.tags: ["v*"]— there is nopush_tagsevent; a top-levelpush_tags:key is silently ignored and tag releases won't build. Grantpermissions: { contents: read, packages: write }.lint.yaml— runhome-assistant/actionshassfest/add-on lint on PRs.
Phase 6 — Docs + release checklist
DOCS.md— install steps, every config option, first-run setup, troubleshooting.README.md(repo root) — how to add the repository URL to the Supervisor, and a one-paragraph pitch per add-on. Note that add-ons are not distributed via HACS (HACS is integrations/cards) — users add the repo URL directly.- Before calling it publishable, verify:
- repo is public
- GHCR package
ghcr.io/<owner>/<arch>-<slug>is public (else installs fail) -
versionmatches acrossconfig.yaml,CHANGELOG.md, and the release tag - LICENSE holder is correct (GitHub detects a clean SPDX license)
Output
Write real files (not a description of them). After scaffolding, print the exact install instructions and the remaining manual gates (make public, GHCR visibility).
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.
Gives 0 of the 12 instructions most project setup skills give in ~1.4k tokens
Counted across 1,553 of the 3,091 authors here whose files we hold, read 2026-09-06
- Write the configuration filein 36 of 1553
- Create the directory structurein 35 of 1553, across 33 files
- Verify the setupin 31 of 1553, across 28 files
- Run the setup scriptin 30 of 1553, across 29 files
- Pre-determine the required sample sizein 29 of 1553, across 12 files
- Check if the configuration already existsin 29 of 1553
- Document every testin 26 of 1553, across 10 files
- Start with a hypothesisin 26 of 1553, across 11 files
- Ask one question at a timein 22 of 1553
- Test a single variable per testin 21 of 1553, across 9 files
- Read product marketing context before asking questionsin 19 of 1553, across 8 files
- Do not peek and stop earlyin 18 of 1553, across 7 files
Said here and by no other author read
- Prefer editing an existing add-on repo
- Establish slug, purpose, runtime, needs, and arch
- Read repository and sibling add-on first
- Expose every tunable via options and schema
- Request only the access you use
- Set ingress to true for web UI
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.