Ha addon scaffold
Agent Skills for Claude Code — scaffold Home Assistant add-ons, review MCP servers, and more. Installable as a plugin marketplace.
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.
What its author says it does
Copied from the file, not written here
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.
SKILL.md
5.6 KB, 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).