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) - 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.
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 (see
.ruff.toml) - Pre-commit hooks run ruff on every commit
- See CLAUDE.md for detailed conventions
No manual formatting is needed -- just run make check before committing.