Modular YAML packages under packages/, loaded via
homeassistant.packages: !include_dir_named packages in configuration.yaml.
The package id is the filename stem. Subdirectory names organize the repo; they are not part of the package id.
packages/
├── areas/ # Location-specific config
├── functions/ # Cross-area functionality
├── integrations/ # Core / integration config
├── private/ # Local-only packages (gitignored except README)
├── projects/ # Multi-device projects
├── routines/ # Time- and event-based routines
├── system/ # HA system management
├── test/ # Experimental packages
└── toys/ # Non-essential / fun
One file per location: lights, room automations, sensors, scenes.
Examples: back_yard.yaml, office.yaml, master_bathroom.yaml
Cross-cutting behavior: energy, HVAC, presence, security, dimmers.
Examples: energy.yaml, hvac.yaml, presence.yaml
Platform and integration settings (HomeKit, InfluxDB, Awtrix, etc.).
Self-contained multi-device projects (mycology, aquaponics, blinds).
Schedules and recurring flows (day, night, work, doge, events).
Core management: areas registry helpers, Lovelace, maintenance, shell commands.
Optional / seasonal behavior (halloween, party lights).
Local-only packages loaded by Home Assistant but not committed. Use for personal
or sensitive routines (health, habits, private reminders). See
packages/private/README.md.
- One concern per package file
- Prefer entity ids and automation ids from
.agents/context/nomenclature.md - Follow section order and size limits in
.agents/skills/package-organize/SKILL.md - Document non-obvious dependencies in-file with comments
- Validate config after changes (Developer Tools → YAML, or config-validate skill)
- Pick the directory that matches the concern
- Add
snake_case.yaml(filename stem becomes the package id) - Use the package-organize section headers and naming prefixes
- Validate before relying on it in production