11 KiB
GitHub Copilot & Claude Code Instructions
This repository contains the Home Assistant Supervisor, a Python 3 based container orchestration and management system for Home Assistant.
Supervisor Capabilities & Features
Architecture Overview
Home Assistant Supervisor is a Python-based container orchestration system that communicates with the Docker daemon to manage containerized components. It is tightly integrated with the underlying Operating System and core Operating System components through D-Bus.
Managed Components:
- Home Assistant Core: The main home automation application running in its own container (also provides the web interface)
- Add-ons: Third-party applications and services (each add-on runs in its own container)
- Plugins: Built-in system services like DNS, Audio, CLI, Multicast, and Observer
- Host System Integration: OS-level operations and hardware access via D-Bus
- Container Networking: Internal Docker network management and external connectivity
- Storage & Backup: Data persistence and backup management across all containers
Key Dependencies:
- Docker Engine: Required for all container operations
- D-Bus: System-level communication with the host OS
- systemd: Service management for host system operations
- NetworkManager: Network configuration and management
Add-on System
Add-on Architecture: Add-ons are containerized applications available through add-on stores. Each store contains multiple add-ons, and each add-on includes metadata that tells Supervisor the version, startup configuration (permissions), and available user configurable options. Add-on metadata typically references a container image that Supervisor fetches during installation. If not, the Supervisor builds the container image from a Dockerfile.
Built-in Stores: Supervisor comes with several pre-configured stores:
- Core Add-ons: Official add-ons maintained by the Home Assistant team
- Community Add-ons: Popular third-party add-ons repository
- ESPHome: Add-ons for ESPHome ecosystem integration
- Music Assistant: Audio and music-related add-ons
- Local Development: Local folder for testing custom add-ons during development
Store Management: Stores are Git-based repositories that are periodically updated. When updates are available, users receive notifications.
Add-on Lifecycle:
- Installation: Supervisor fetches or builds container images based on add-on metadata
- Configuration: Schema-validated options with integrated UI management
- Runtime: Full container lifecycle management, health monitoring
- Updates: Automatic or manual version management
Update System
Core Components: Supervisor, Home Assistant Core, HAOS, and built-in plugins
receive version information from a central JSON file fetched from
https://version.home-assistant.io/{channel}.json. The Updater class handles
fetching this data, validating signatures, and updating internal version tracking.
Update Channels: Three channels (stable/beta/dev) determine which version
JSON file is fetched, allowing users to opt into different release streams.
Add-on Updates: Add-on version information comes from store repository updates, not the central JSON file. When repositories are refreshed via the store system, add-ons compare their local versions against repository versions to determine update availability.
Backup & Recovery System
Backup Capabilities:
- Full Backups: Complete system state capture including all add-ons, configuration, and data
- Partial Backups: Selective backup of specific components (Home Assistant, add-ons, folders)
- Encrypted Backups: Optional backup encryption with user-provided passwords
- Multiple Storage Locations: Local storage and remote backup destinations
Recovery Features:
- One-click Restore: Simple restoration from backup files
- Selective Restore: Choose specific components to restore
- Automatic Recovery: Self-healing for common system issues
Supervisor Development
Python Requirements
- Compatibility: Python 3.13+
- Language Features: Use modern Python features:
- Type hints with
typingmodule - f-strings (preferred over
%or.format()) - Dataclasses and enum classes
- Async/await patterns
- Pattern matching where appropriate
- Type hints with
Code Quality Standards
- Formatting: Ruff
- Linting: PyLint and Ruff
- Type Checking: MyPy
- Testing: pytest with asyncio support
- Language: American English for all code, comments, and documentation
Code Organization
Core Structure:
supervisor/
├── __init__.py # Package initialization
├── const.py # Constants and enums
├── coresys.py # Core system management
├── bootstrap.py # System initialization
├── exceptions.py # Custom exception classes
├── api/ # REST API endpoints
├── addons/ # Add-on management
├── backups/ # Backup system
├── docker/ # Docker integration
├── host/ # Host system interface
├── homeassistant/ # Home Assistant Core management
├── dbus/ # D-Bus system integration
├── hardware/ # Hardware detection and management
├── plugins/ # Plugin system
├── resolution/ # Issue detection and resolution
├── security/ # Security management
├── services/ # Service discovery and management
├── store/ # Add-on store management
└── utils/ # Utility functions
Shared Constants: Use constants from supervisor/const.py instead of hardcoding
values. Define new constants following existing patterns and group related constants
together.
Supervisor Architecture Patterns
CoreSysAttributes Inheritance Pattern: Nearly all major classes in Supervisor
inherit from CoreSysAttributes, providing access to the centralized system state
via self.coresys and convenient sys_* properties.
# Standard Supervisor class pattern
class MyManager(CoreSysAttributes):
"""Manage my functionality."""
def __init__(self, coresys: CoreSys):
"""Initialize manager."""
self.coresys: CoreSys = coresys
self._component: MyComponent = MyComponent(coresys)
@property
def component(self) -> MyComponent:
"""Return component handler."""
return self._component
# Access system components via inherited properties
async def do_something(self):
await self.sys_docker.containers.get("my_container")
self.sys_bus.fire_event(BusEvent.MY_EVENT, {"data": "value"})
Key Inherited Properties from CoreSysAttributes:
self.sys_docker- Docker API accessself.sys_run_in_executor()- Execute blocking operationsself.sys_create_task()- Create async tasksself.sys_bus- Event bus for system eventsself.sys_config- System configurationself.sys_homeassistant- Home Assistant Core managementself.sys_addons- Add-on managementself.sys_host- Host system accessself.sys_dbus- D-Bus system interface
Load Pattern: Many components implement a load() method which effectively
initialize the component from external sources (containers, files, D-Bus services).
API Development
REST API Structure:
- Base Path:
/api/for all endpoints - Authentication: Bearer token authentication
- Consistent Response Format:
{"result": "ok", "data": {...}}or{"result": "error", "message": "..."} - Validation: Use voluptuous schemas with
api_validate()
Use @api_process Decorator: This decorator handles all standard error handling
and response formatting automatically. The decorator catches APIError, HassioError,
and other exceptions, returning appropriate HTTP responses.
from ..api.utils import api_process, api_validate
@api_process
async def backup_full(self, request: web.Request) -> dict[str, Any]:
"""Create full backup."""
body = await api_validate(SCHEMA_BACKUP_FULL, request)
job = await self.sys_backups.do_backup_full(**body)
return {ATTR_JOB_ID: job.uuid}
Docker Integration
- Container Management: Use Supervisor's Docker manager instead of direct Docker API
- Networking: Supervisor manages internal Docker networks with predefined IP ranges
- Security: AppArmor profiles, capability restrictions, and user namespace isolation
- Health Checks: Implement health monitoring for all managed containers
D-Bus Integration
- Use dbus-fast: Async D-Bus library for system integration
- Service Management: systemd, NetworkManager, hostname management
- Error Handling: Wrap D-Bus exceptions in Supervisor-specific exceptions
Async Programming
- All I/O operations must be async: File operations, network calls, subprocess execution
- Use asyncio patterns: Prefer
asyncio.gather()over sequential awaits - Executor jobs: Use
self.sys_run_in_executor()for blocking operations - Two-phase initialization:
__init__for sync setup,post_init()for async initialization
Testing
- Location:
tests/directory with module mirroring - Fixtures: Extensive use of pytest fixtures for CoreSys setup
- Mocking: Mock external dependencies (Docker, D-Bus, network calls)
- Coverage: Minimum 90% test coverage, 100% for security-sensitive code
Error Handling
- Custom Exceptions: Defined in
exceptions.pywith clear inheritance hierarchy - Error Propagation: Use
fromclause for exception chaining - API Errors: Use
APIErrorwith appropriate HTTP status codes
Security Considerations
- Container Security: AppArmor profiles mandatory for add-ons, minimal capabilities
- Authentication: Token-based API authentication with role-based access
- Data Protection: Backup encryption, secure secret management, comprehensive input validation
Development Commands
# Run tests, adjust paths as necessary
pytest -qsx tests/
# Linting and formatting
ruff check supervisor/
ruff format supervisor/
# Type checking
mypy --ignore-missing-imports supervisor/
# Pre-commit hooks
pre-commit run --all-files
Always run the pre-commit hooks at the end of code editing.
Common Patterns to Follow
✅ Use These Patterns:
- Inherit from
CoreSysAttributesfor system access - Use
@api_processdecorator for API endpoints - Use
self.sys_run_in_executor()for blocking operations - Access Docker via
self.sys_dockernot direct Docker API - Use constants from
const.pyinstead of hardcoding - Store types in (per-module)
const.py(e.g. supervisor/store/const.py)
❌ Avoid These Patterns:
- Direct Docker API usage - use Supervisor's Docker manager
- Blocking operations in async context (use asyncio alternatives)
- Hardcoded values - use constants from
const.py - Manual error handling in API endpoints - let
@api_processhandle it
This guide provides the foundation for contributing to Home Assistant Supervisor. Follow these patterns and guidelines to ensure code quality, security, and maintainability.