A curated list of amazingly awesome Home Assistant resources.
# AGENTS.md
Guidance for AI coding agents (and the humans driving them) working on this
repository. `CLAUDE.md` is a symlink to this file because Claude is the
odd one out; everyone else already reads `AGENTS.md`.
This is a curated awesome-list, not a software project. Most agent work
here is editing `README.md` and a small set of supporting scripts. The
mechanical rules (entry format, quality bar, license requirements, link
hygiene) already live in `.github/CONTRIBUTING.md` and the scripts under
`scripts/`. This file covers the things those don't: taxonomy, audience,
voice, and behaviors specific to working with an AI agent.
## What this repo is
`Awesome Home Assistant` is a community-curated index of resources that
live *outside* Home Assistant itself: custom integrations installable via
HACS, custom dashboard cards, themes, icon packs, Apps, ESPHome and DIY
projects, blogs, podcasts, YouTube channels, and more. The deployed site
is <https://awesome-ha.com>, built with `mkdocs-material` from `README.md`.
The audience is **Home Assistant users**, with a strong tilt toward
**newcomers and less-technical users**. Section intros and entry
descriptions should make sense to someone setting up their first
dashboard, not to someone who already knows what HACS is.
## Where the actual rules live
Before editing the list or reviewing a PR, read these:
- `.github/CONTRIBUTING.md` for entry format, license requirements,
acceptance criteria, and link hygiene.
- `scripts/check_listing.py <repo-url>` validates a single contribution
end-to-end (age, license, activity, HACS metadata). Run it on every
proposed addition before merging.
- `scripts/check_activity.py` flags entries whose upstream is archived,
deleted, or stale. Runs weekly; opens a maintenance PR.
- `scripts/update_stars.py` keeps the `(N,NNN★)` counts current. Don't
hand-edit star counts.
- `scripts/update_youtube_subs.py` keeps the `(N subs)` counts in the
YouTube Channels section current. Don't hand-edit subscriber counts.
If a rule appears here *and* in CONTRIBUTING.md, CONTRIBUTING.md wins.
## Curation principles
These are judgement calls a linter cannot make for you.
1. **Outside Home Assistant only.** This list does not duplicate
home-assistant.io. Anything documented at
`home-assistant.io/integrations/<name>` is a built-in integration and
does not belong here. Same for HA-internal sections (Hardware, Project
& roadmap, Open Home Foundation, Works With Home Assistant); reference
them sparingly in the intro, never as their own section.
2. **Taxonomy is structural, not topical.** Top-level sections describe
*what kind of thing* an entry is (custom integration, dashboard card,
app, blueprint, blog), not *what topic* it covers (Voice, AI, Energy,
Matter, Zigbee). Topic groupings live as subsections inside a
structural parent. The exception is standalone community projects with
their own ecosystem (ESPHome, Music Assistant, Z2M); those can be
top-level on their own merit.
3. **Detect HACS-as-bootstrap.** Some HACS "integrations" are actually
cards, themes, icon packs, or dashboards using a `custom_component` as
bootstrap glue. Tells: "card", "theme", "dashboard", "icon pack",
"frontend" in the description. Those go under Dashboard Cards / Themes
/ Icon packs / Dashboards, never under Custom Integrations.
## Voice and writing style
These apply to any prose an agent writes: section intros, entry
descriptions, PR titles and bodies, commit messages, code comments.
- **Lead with the user-facing problem, then name the technology.** "Pull
data from sensors that broadcast over Bluetooth, or use Bluetooth itself
for room-level presence detection" beats "BLE-related integrations".
- **Never call the project anything other than "Home Assistant".** Not
"HA", not "Hass", not "Hass.io", not "HASS", not "hassio". This applies
to prose *we* write. Project names that contain those strings (the
"HASS Aarlo" repo, the "Hass.io Google Drive Backup" project, the
`hassio-addons` GitHub org in URLs) stay as-is because they are the
actual names.
- **Don't say "Home Assistant" inside an entry description.** The list's
title already implies it. "A card for controlling robot vacuums" beats
"A Home Assistant card for controlling robot vacuums".
- **No em dashes or en dashes anywhere.** They're a tell that text was
generated by an AI. Use commas, parentheses, or restart the sentence.
- **No marketing fluff.** Strike "powerful", "amazing", "easy to use",
"next-gen", "robust". State what the thing does.
- **Don't reference issue or PR numbers in committed comments.** They rot
as the codebase evolves; that context belongs in commit messages and PR
descriptions instead.
## Reviewing a PR that adds an entry
Run the checks in this order; the first failure ends the review.
1. Does it belong on the list at all? (Outside HA, type-correct, not a
built-in.)
2. `python scripts/check_listing.py <url>` is green.
3. Right section *and* right subsection. Watch for HACS-as-bootstrap.
4. Description follows the voice rules above.
5. `awesome-lint` and `lychee` are green.
If a check fails and the project is close to meeting it (e.g., will pass
the age bar in three weeks), say so and invite resubmission. Be friendly;
many contributors here are first-time open-source contributors and the
list rejecting their submission is often their first OSS feedback.
## Behaviors specific to AI agents
- **Do not push directly to `main`.** Always work on a branch and open a
PR, even for typo fixes.
- **One concern per PR.** Don't bundle a description fix, a section
reorder, and a workflow change. Reviewers and `git revert` both prefer
small, focused changes.
- **Don't claim CI passed unless you saw it pass.** "All checks green" is
a verifiable claim, not a polite closing.
- **Don't fabricate star counts, license names, or last-commit dates.**
Read them from the repo or via `scripts/check_listing.py`. If you
can't, say so.
- **Side quests stay in scope.** If you notice something unrelated worth
fixing, surface it as a follow-up rather than smuggling it into the
current PR.
## Files an agent will touch most often
- `README.md` — the list itself
- `.github/CONTRIBUTING.md` — contributor-facing rules
- `scripts/check_listing.py` / `check_activity.py` / `update_stars.py` /
`update_youtube_subs.py` — maintenance scripts
- `mkdocs.yml` — site config
- `.github/workflows/*.yaml` — link checks, listing checks, weekly maintenance