Thank you for your interest in contributing!
- Fork the repository on GitHub
- Clone your fork locally
- Run
make setup(installs dependencies + pre-commit hooks) - Verify:
make check && make test
For detailed setup instructions, see Getting Started.
| Branch | Purpose |
|---|---|
main |
Single branch for development and releases. Protected by ruleset. |
| Feature branches | Created from main, named feat/..., fix/..., or chore/.... |
- Create a branch from
main(git checkout main && git pull && git checkout -b feat/my-feature) - Follow the hexagonal architecture
- Run
make check && make test - Update
CHANGELOG.mdunder[Unreleased](see Changelog) - Update the affected documentation (see Documentation)
- Commit using conventional commit format
- Base branch: always
main - Squash merged: each PR becomes a single commit on
main - Provide a clear description of what changes and why
- All CI checks must pass before merge:
- Tests (HA 2025.1.0 + latest)
- Lint (ruff + translation keys)
- Validate (HACS + hassfest)
Every PR must include an entry under [Unreleased] in CHANGELOG.md, following the Keep a Changelog format:
## [Unreleased]
### Added
- New feature description
### Fixed
- Bug fix descriptionUse the appropriate section: Added, Changed, Deprecated, Removed, Fixed, Security.
PRs that don't affect user-facing behavior (CI config, dev tooling) can use the skip-changelog label.
Documentation lives in docs/, with the canonical agent/contributor guide in AGENT.md. A PR that changes behavior, architecture, registers, entities, or a public workflow must update the affected docs in the same PR — see the code-area → doc-file map in AGENT.md. Verify statements against the code before relying on them; don't copy claims on trust.
Releases follow a fixed flow (make bump → commit → push → GitHub release with tag). When drafting the release, use the release template so the PR/commit title, the release title, and the description stay consistent with past releases.
en.jsonis the source of truth -- edit it directly when adding new translatable strings- Other languages can be contributed via Weblate (no coding required) or via PR
- If editing JSON files directly, check for concurrent Weblate changes on the same keys to avoid merge conflicts
Code style is enforced automatically:
- Ruff handles both linting and formatting (ruleset in
pyproject.tomlunder[tool.ruff]) - Pre-commit hooks run ruff on every commit
- See AGENT.md for detailed conventions
No manual formatting is needed -- just run make check before committing.