home-assistant/iOS
38.1
Weak · 1 October 2026
222.5k
lines of production code
Swift
primary language
2
measurements over time
What this system is
This system is the official native iOS, macOS, and Apple Watch companion application for Home Assistant, enabling direct control and monitoring of smart home environments. It provides a comprehensive interface for managing entities, automations, and energy dashboards, with deep integrations into Apple's ecosystem including Siri, Shortcuts, and Live Activities. The application ensures reliable, real-time interaction with the Home Assistant server through secure network communication, on-device voice processing, and robust background synchronization.
How it got here
2016–2020 — SwiftUI migration and localization expansion
80 changes.
The project underwent a major architectural shift by migrating the iOS and watchOS apps from UIKit to SwiftUI, replacing the Realm database with GRDB, and modernizing the build infrastructure with Swift Package Manager and Fastlane. This period also focused on extensive internationalization, adding comprehensive localization support for numerous languages, while introducing new features like Siri Intents, dynamic notifications, and automated asset synchronization.
2021–2025 — SwiftUI migration and iOS 18 integration
101 changes.
This period focused on a comprehensive migration of the codebase to SwiftUI, replacing legacy UIKit implementations across onboarding, settings, and core features like Assist and barcode scanning. It introduced extensive support for iOS 18, including Control Center widgets, App Intents, and Live Activities, while establishing a new GRDB-based local database and a modular design system.
2026 — SwiftUI migration and Apple Watch expansion
98 changes.
The project focused on migrating core UI components, including settings and the app container, from UIKit to SwiftUI while significantly expanding Apple Watch capabilities with native controls, complications, and independent data fetching. This period also introduced extensive platform integrations such as iOS Live Activities, Dynamic Island toasts, and deep Siri/Shortcuts support for entity control and state queries.
Features
Add 'Run Scripts' widget with configurable script selection
Users can now add a widget to their home screen that runs multiple Home Assistant scripts at once. The widget allows selecting specific scripts via a picker, with limits on the number of scripts based on the widget size (e.g., 3 for small, 20 for extra-large). It includes an option to show a confirmation notification after execution and displays server names when multiple servers are configured. The widget is not discoverable in the Shortcuts app and syncs network information before running.
Sources/Extensions/AppIntents/Widget/Script · high confidence
Add Areas widget to display Home Assistant areas floor-by-floor
A new iOS widget has been added that displays Home Assistant areas organized by floor, matching the order shown in the frontend dashboard. The widget supports small, medium, and large families, paginates content when there are many areas, and allows users to tap area tiles to open the corresponding area view or tap the background to open the areas dashboard. It uses the app's existing local database for data and persists the current page per server and widget family.
Sources/Extensions/Widgets/Areas · high confidence
Add Assist widget with multi-pipeline support and App Intents
The Assist widget extension now uses App Intents to allow users to configure one or more Assist pipelines directly on the widget, replacing the previous single-pipeline limitation. The widget supports systemSmall, systemMedium, and accessoryCircular families, displaying a grid of pipeline tiles on larger sizes and a single action on smaller ones. Tapping a tile opens the corresponding Assist conversation in the app. On iOS 18, the widget supports tinted rendering modes, while earlier versions use a standard appearance. The widget also includes preview support for the gallery and handles legacy configurations for backward compatibility.
Sources/Extensions/Widgets/Assist · high confidence
Add Assist, Area, Complication, and Folder items to the Apple Watch home screen
The Apple Watch home screen now supports adding Assist pipelines, Assist prompts, Areas, Complications, and Folders alongside existing entities. This change introduces a new on-watch add flow (WatchConfigAddView) that lets users select these new item types, choose specific servers or pipelines from the mirrored database, and configure names, icons, and colors. Assist prompts allow users to define custom text to send to an Assist pipeline, while Areas allow grouping entities by room. Complications can be added directly to the item list, and Folders can be created to organize items. The edit view (WatchConfigItemEditView) has been updated to handle configuration for these new types, including specific fields for Assist prompts and color pickers adapted for the watch interface.
Sources/WatchApp/Home/Edit · high confidence
Add Bulgarian (bg) language support
The app now includes a complete Bulgarian localization, adding the Bulgarian language option for users. This update provides translated strings for the core interface, frontend panels, app shortcuts, and Siri integration, ensuring the app is fully usable in Bulgarian.
Sources/App/Resources/bg.lproj · high confidence
Add Catalan (Spain) localization for app shortcuts and core UI
Users with their device language set to Catalan (Spain) will now see the app interface translated, including app shortcuts (e.g., turning lights on/off, checking entity states), core component labels (such as lights, covers, and sensors), frontend panel titles (like Home, Climate, and Configuration), and system permission descriptions. This change introduces the initial Catalan translation files for the companion app, ensuring that key interactions and settings are displayed in the user's preferred language.
Sources/App/Resources/ca-ES.lproj · high confidence
Add Common Controls widget for iOS home screens
A new 'Common Controls' widget is now available on iOS home screens, displaying your most frequently used entities (such as lights and switches) with their current state and area name. The widget supports small, medium, and large sizes, allows filtering by specific domains, and lets users choose whether to display entity states and last update times. Tapping an entity tile opens its details, while the icon portion allows direct control for compatible entities, mirroring the behavior of the in-app frontend.
Sources/Extensions/Widgets/CommonlyUsedEntities · high confidence
Add Control Center widgets to open Home Assistant entities and cameras
Users can now add iOS Control Center widgets that open specific Home Assistant entities or cameras directly in the app. The new 'Open Entity' and 'Open Camera' controls allow users to configure which entity to open, choose a custom icon, and set a display name. Tapping the widget launches the app and navigates to the selected entity's detail view.
Sources/Extensions/Widgets/Controls/OpenEntity · high confidence
Add Database Explorer to debug settings
A new Database Explorer view has been added to the app's settings, allowing users to inspect the local SQLite database contents. The feature lists all database tables and provides a detailed view for each, including row-level data inspection, text search, and server-specific filtering where applicable. This tool is intended for debugging and development purposes.
Sources/App/Settings/DatabaseExplorer · high confidence
Add Energy dashboard widget with multi-source support and smart fallbacks
Users can now add an Energy widget to their home screen to view a summary of their energy dashboard at a glance. The widget supports configuration for specific energy sources (grid, solar, battery, gas) and time periods (today, yesterday, this week, this month). It displays key metrics including grid consumption and export, solar generation, battery charge/discharge, and gas usage, along with monetary costs where applicable. The widget intelligently handles empty states by falling back to the previous day's data during early morning hours and shows a connection message if the server URL is unavailable. It also provides live power readings for grid, solar, and battery sources on compact layouts and deep-links to the full energy dashboard in the app.
Sources/Extensions/AppIntents/Widget/Energy · high confidence
Add Energy widget with multi-source support and lock screen layouts
Introduces a new Energy widget that displays solar, grid, battery, and gas consumption data across home screen (small, medium, large) and lock screen (circular, rectangular, inline) layouts. The widget supports live instantaneous power readings and period totals, handles empty states with retry controls for connection issues, and respects source preferences by hiding unavailable meters.
Sources/Extensions/Widgets/Energy · high confidence
Add English (UK) localization for app shortcuts and core components
The app now includes dedicated English (UK) localization files for app shortcuts and core UI components. Users will see English (UK) translations for Siri and Spotlight shortcuts (such as 'Open entity details' and 'Turn on entity') and standard component states (like 'Active', 'Closed', 'On', 'Off') across the interface.
Sources/App/Resources/en-GB.lproj · high confidence
Add Entities widget with extra-large portrait support
A new Entities widget is available, allowing users to create a grid of tiles for specific Home Assistant entities (such as lights, switches, or sensors) from a chosen server. The widget displays entity states and icons, with the icon acting as a control for actionable entities and the rest of the tile opening the entity details in the app. It supports small, medium, large, and extra-large portrait families, and includes a configuration option to show the last update time.
Sources/Extensions/Widgets/Entities · high confidence
Add Intent extension handler
Added a new IntentHandler class that serves as the entry point for the app's Siri Intents extension, delegating intent resolution to a central factory.
Sources/Extensions/Intents · high confidence
Add Mac toolbar entity management screen
Users can now manage Mac toolbar entities via a new settings screen that lists configured items, displays their associated server name (if multiple servers are present), and allows removal of individual entities through a confirmation dialog. The screen also provides instructions on how to add entities and supports search indexing for its section headers.
Sources/App/Settings/MacToolbar · high confidence
Add Matter device commissioning support via Home Assistant extension
This change introduces a new Matter extension that enables users to commission Matter devices directly from the frontend. The extension registers a \MatterRequestHandler\ that implements the Apple device-setup extension protocol, allowing the app to select Thread networks (using Extended PAN ID for selection), validate device credentials, and initiate commissioning by sending a \matter/commission\ request to the Home Assistant server. It also handles post-commissioning configuration such as naming the device and assigning it to rooms.
Sources/Extensions/Matter · high confidence
Add Portuguese (Brazil) localization for app shortcuts and core UI strings
The app now includes a complete Portuguese (Brazil) translation for the iOS companion interface. This update adds localized strings for App Shortcuts (enabling Siri and Spotlight integration for actions like turning lights on/off or checking entity states) and core UI components, including panel labels (Home, Climate, Energy, etc.), device states (On, Off, Locked, etc.), and permission descriptions. Users with their device language set to Portuguese (Brazil) will now see these interface elements in their native language.
Sources/App/Resources/pt-BR.lproj · high confidence
Add Script widget to run automation scripts from the home screen
Users can now add a dedicated Script widget to their home screen to view and execute automation scripts directly. The widget displays a list of configured scripts with their names, icons, and optional server names, allowing users to tap an item to run the associated script via an AppIntent. It supports small, medium, large, extra-large, and circular accessory widget sizes, and is designed to be disfavored in the CarPlay widget gallery.
Sources/Extensions/Widgets/Script · high confidence
Add Siri Focus status reporting with debounce logic
The app now supports sharing its current Focus mode status with Siri via a new \INShareFocusStatusIntent\ handler. To prevent Home Assistant from seeing transient blank states during Focus switches, the handler introduces a 5-second delay before reporting the status, ensuring the system state has settled. This is implemented in \FocusStatusIntentHandler.swift\ and wired up via \IntentHandlerFactory.swift\.
Sources/Shared/Intents · high confidence
Add Siri intent support for sharing focus status
The Intents extension now supports the \INShareFocusStatusIntent\, allowing users to trigger the action via Siri using the phrase "Share focus in Home Assistant". This change adds the necessary \AppIntentVocabulary.plist\ files for localization and updates the \Info.plist\ to register the intent, enabling Siri integration for this specific focus-sharing capability.
Sources/Extensions/Intents/Resources · high confidence
Add Swedish localization for app shortcuts and core UI strings
The app now includes Swedish translations for Siri App Shortcuts (such as opening, closing, and dimming entities) and core interface strings for components, states, and frontend panels, enabling Swedish-speaking users to interact with Home Assistant features via voice shortcuts and see localized labels in the app.
Sources/App/Resources/sv.lproj · high confidence
Add Vietnamese localization for app shortcuts and core UI
The app now includes Vietnamese language support for Siri Shortcuts (App Shortcuts) and core interface elements. Users can now interact with the app via voice commands in Vietnamese, such as turning entities on/off, dimming lights, and checking states. Additionally, core UI strings for components (like lights, locks, and climate), frontend panels, and permission descriptions are translated, ensuring a fully localized experience for Vietnamese-speaking users.
Sources/App/Resources/vi.lproj · high confidence
Add WebSocket API support for Energy Dashboard data
This change introduces the underlying API models and request methods required to populate the Energy Dashboard widget. It adds Swift types for fetching energy configuration (\EnergyInfo\, \EnergyPreferences\), retrieving historical statistics (\EnergyStatistics\), and resolving unit metadata for gas sources (\EnergyStatisticsMetadata\), enabling the dashboard to display grid, solar, battery, and gas consumption data.
Sources/Shared/API/WebSocket/Energy · high confidence
Add ability to copy entity and page deeplinks
Users can now generate and copy deeplinks for entities and pages via a new sheet interface. The DeeplinkView presents the generated URL with a copy-to-clipboard button, supports expanding the link for full visibility, and includes a toggle to include the server name in the link when multiple servers are configured. The DeeplinkPresenter handles presenting this sheet with appropriate height constraints and modal styles for Catalyst and iOS.
Sources/App/Frontend/EntityDeeplink · high confidence
Add app icon shortcuts configurator
Users can now configure up to four app icon shortcuts directly from the app's Settings. This new configuration screen allows adding, removing, reordering, and customizing shortcuts for entities, scripts, scenes, folders, assist prompts, and complications. The shortcuts are updated dynamically as the database syncs, ensuring titles and icons reflect current entity names rather than internal IDs, and the system prevents older updates from overwriting newer ones to maintain stability.
Sources/App/Settings/AppIconShortcuts · high confidence
Add calendar widget
A new Home Screen widget is available that merges upcoming events from any number of Home Assistant calendars into a single list. Users can configure the widget to select specific calendars and optionally display the calendar name for each event. The widget supports small, medium, large, and extra-large sizes, updates automatically based on event transitions, and includes a refresh button to manually update the timeline.
Sources/Extensions/Widgets/Calendar · high confidence
Add client event title extraction for notifications
A new extension on UNNotificationContent has been added to the shared client events module. This change introduces a computed property that constructs a readable event title by combining the notification's title and subtitle, or falling back to the alert message from the userInfo payload if the title is empty. This allows the application to consistently display formatted notification details within the client events interface.
Sources/Shared/ClientEvents/Extensions · high confidence
Add custom notification icons for automations
The NotificationService extension now includes an Info.plist configuration that registers support for the INSendMessageIntent. This enables the service to handle specific SiriKit intents, allowing for custom notification behaviors and icons when automations involve sending messages.
Sources/Extensions/NotificationService/Resources · high confidence
Add entities to CarPlay, Apple Watch, Mac toolbar, NFC tags, and deep links
Users can now add Home Assistant entities to various platform features directly from the frontend. The app exposes new external bus commands that allow the frontend to query and execute actions for adding an entity to CarPlay quick access, Apple Watch favorites, a custom iOS widget, the Mac toolbar, or an NFC tag. It also supports generating a deep link for the entity. This change introduces the \EntityAddToAction\ protocol and \EntityAddToHandler\ to manage these platform-specific integrations and the \WidgetSelectionView\ for choosing existing widgets or creating new ones.
Sources/App/Frontend/ExternalMessageBus · high confidence
Add fan control widget and Siri support
Users can now control fans directly from the iOS Control Center via a new widget and use Siri to toggle fans. This change introduces the ControlFan widget configuration, a FanIntent for voice commands, and an IntentFanEntity that allows fans to be selected by area, device, or floor context.
Sources/Extensions/Widgets/Controls/Fan · high confidence
Add full app configuration import and export
A new Import/Export configuration screen in Settings › Debugging allows you to back up and restore your entire app setup in a single JSON file. The export captures all configured categories—including app settings, watch and CarPlay configurations, custom widgets, quick actions, Mac toolbar, kiosk mode, notification categories and snooze actions, NFC tags, and reminders sync—along with general preferences like zoom, privacy, and location sources. The import replaces all existing configuration with the file's contents, sanitizing server references so that only servers currently signed in on the device are restored, while deliberately excluding credentials, keychain data, cached Home Assistant data, and diagnostics to protect privacy.
Sources/App/Settings/ConfigurationTransfer · high confidence
Add iOS 18 Control Center button widget
Users can now add a button to the iOS 18 Control Center to trigger a button entity (such as a light switch or input button) directly from the widget. This new widget allows configuration of the target server, the specific button entity, a custom icon, and display text, and it provides area, device, and floor context for easier identification. Tapping the button in the Control Center sends a press command to the selected entity.
Sources/Extensions/Widgets/Controls/Button · high confidence
Add iOS 18 Control Center scene widget
This change introduces a new Control Center widget for iOS 18 that allows users to run scenes directly from the lock screen or Control Center. The implementation adds a \ControlScene\ widget configuration, a value provider to fetch scene data, and an \IntentSceneEntity\ to expose scenes as selectable entities within the App Intents framework. Users can configure the widget with a specific scene, choose an icon, enable confirmation notifications, and set custom display text.
Sources/Extensions/Widgets/Assist/Control, Sources/Extensions/Widgets/Scene/Control · high confidence
Add iOS 18 Control Center widget for covering blinds and shades
Users can now add a Control Center widget to toggle cover entities (such as blinds and shades) directly from their iOS home screen. This new widget, available on iOS 18, displays the current open/closed state and allows for immediate toggling via a toggle action. It supports configuration options to select the specific cover entity, choose custom icons for open and closed states, and set a custom display name. The widget integrates with the app's entity system, providing context like area, device, and floor names, and ensures network connectivity is refreshed before executing the toggle intent.
Sources/Extensions/Widgets/Controls/Cover · high confidence
Add iOS 18 Control Center widget for opening pages
Users can now add an Open Page control to the iOS 18 Control Center, allowing quick access to specific pages directly from the control interface. This new feature introduces a configurable widget where users can select a target page, customize the display icon, and set custom display text. The control leverages AppIntents to launch the specified page, with placeholder states shown when configuration is pending.
Sources/Extensions/Widgets/OpenPage/Control · high confidence
Add iOS 18 Control Widget for running scripts
This change introduces a new Control widget for iOS 18 that allows users to run scripts directly from the Control Center. The implementation includes a \ControlScript\ widget configuration, a \ControlScriptsValueProvider\ to manage script data and display options, and an \SFSymbolEntity\ to enable users to select custom icons for their script controls. Users can configure the script to run, choose an icon, enable confirmation notifications, and set custom display text.
Sources/Extensions/Widgets/Script/Control · high confidence
Add iOS Control Widget and App Intents for triggering automations
Users can now trigger Home Assistant automations directly from the iOS Control Center widget and via Siri using App Intents. This change introduces the \AutomationAppIntent\ to handle execution, including optional haptic feedback and confirmation notifications, and provides the \ControlAutomation\ widget configuration for iOS 18+ to display and launch these automations from the lock screen or home screen.
Sources/Extensions/Widgets/Controls/Automation · high confidence
Add iOS Focus Filter integration for reporting Focus states
Users can now connect the app to iOS Focus modes via a new Focus Filter in Settings. This feature introduces a new Focus settings screen where users can create and manage named Focus profiles, view the last reported name, and check sensor/permission status. It also includes an App Intents implementation that allows iOS to run the filter in the background, ensuring that Focus state changes are reported to Home Assistant even when the app is not actively running.
Sources/App/Settings/Focus · high confidence
Add interactive Todo List widget with Siri and App Intents support
The Todo List widget now supports direct interaction via App Intents, allowing users to complete items and refresh the widget timeline directly from the home screen or through Siri. This change introduces new AppIntent implementations for completing specific todo items and refreshing the widget, alongside an AppEntity to enable Siri discovery and configuration of the widget. The widget view has been updated to include haptic feedback on interactions and improved due-date display logic for sub-hour timeframes, while the configuration intent allows users to select specific servers and todo lists to display.
Sources/Extensions/Widgets/TodoList · high confidence
Add on-device speech recognition and text-to-speech capabilities
Assist now supports local speech-to-text and text-to-speech processing, allowing voice interactions to run entirely on the device without sending audio to a server. This includes a new voice picker UI for selecting TTS voices, automatic detection of installed speech languages, and audio session management to ensure correct playback behavior during conversations.
Sources/App/Assist/Local · high confidence
Add on-device voice tools server for Home Assistant integration
The app now includes a local VoiceToolsServer that implements the Wyoming protocol, allowing Home Assistant to perform on-device speech-to-text transcription and text-to-speech synthesis directly through the app. This feature introduces a new settings screen where users can enable the server, configure the network port, and view available on-device languages and voices. The server advertises itself via Bonjour, handles audio streaming and conversion, and ensures all speech processing remains on the device for privacy.
Sources/App/VoiceToolsServer · high confidence
Add opt-in Apple Health sensor configuration
Users can now configure which Apple Health metrics are reported to Home Assistant via a new Health settings screen. This screen lists available metrics grouped by category, allows enabling or disabling them individually or in bulk, and handles the necessary HealthKit permission requests. Sensor selection is specific to the connected server, and users can view the latest reported values for enabled sensors directly in this list.
Sources/App/Settings/Sensors/Health · high confidence
Add response models for Home Assistant API endpoints
New data models have been added to parse Home Assistant API responses, including configuration details (ConfigResponse), discovered server information with instance ID handling (DiscoveredHomeAssistant), logbook entries (LogbookEntry), mobile app registration tokens (MobileAppRegistrationResponse), and stream camera paths (StreamCameraResponse). These types enable the app to correctly deserialize and utilize data from the Home Assistant Core API.
Sources/Shared/API/Responses · high confidence
Add sensor state widget configuration and data provider
Users can now add a widget to their home screen that displays the current state of selected sensors. This change introduces the App Intents configuration (\WidgetSensorsAppIntent\) allowing users to pick a server and up to 20 sensors (depending on widget size), and the timeline provider (\WidgetSensorsAppIntentTimelineProvider\) which fetches real-time sensor data from Home Assistant entities. The widget supports all standard iOS sizes (small, medium, large, extra-large) with specific sensor limits per size, and includes preview samples for the widget gallery.
Sources/Extensions/AppIntents/Widget/Sensor · high confidence
Add sensor widget with deep-linking and multi-size support
A new sensor widget is introduced, displaying sensor values with units and icons (falling back to a grid icon if missing). Tapping a sensor entry opens the app to that entity's detailed information dialog via a deep link, while placeholder or unconfigured entries trigger a refresh. The widget supports small, medium, large, and extra-large portrait sizes and is marked as disfavored in the CarPlay widget gallery.
Sources/Extensions/Widgets/Sensor · high confidence
Add utility extensions for safe array access, URL parsing, and UI helpers
This change introduces a suite of new utility extensions in the app's utilities folder to improve code safety and simplify common UI tasks. It adds a safe subscript for arrays to prevent out-of-bounds crashes, a method to parse URL query parameters into a dictionary, and a SwiftUI environment key for accessing safe area insets. Additionally, it includes helpers for parsing CSS RGB color strings into UIColor, cropping images to a circle, scaling images to specific sizes, and managing background tasks with proper main-thread access for time-remaining checks.
Sources/App/Utilities/Extensions · high confidence
Add vacuum controls to Apple Watch
Users can now control supported vacuum cleaners directly from the Apple Watch app. The new Entity Details screen provides start, pause, stop, and return-to-dock buttons based on the device's capabilities. It also includes a fan speed selector and a locate button. For vacuums that support area cleaning, a dedicated screen allows users to select specific mapped areas in a specific order to clean, provided the paired iPhone is reachable to fetch the area list.
Sources/WatchApp/Home/EntityDetails/Vacuum · high confidence
Added Assist Pipeline and Server Action pickers for Magic Items
Users can now configure the 'Assist' and 'Perform action' behaviors for Magic Items through dedicated UI pickers. The Assist Pipeline Picker allows selecting from available assist pipelines across servers, while the Server Action Picker lets users choose specific server actions (like \light.turn\_on\) to trigger, displaying friendly names and icons for easier identification.
Sources/App/Settings/MagicItem · high confidence
Added Chinese (Simplified) localization for app shortcuts and core UI
The app now includes Chinese (Simplified) translations for Siri Shortcuts and App Intents, allowing users to interact with Home Assistant entities via voice commands in Chinese. This update also adds Chinese translations for core component states (such as on/off, locked/unlocked), frontend panel labels (like Home, Lights, Climate), and system permission descriptions (e.g., location, microphone, camera), ensuring a fully localized experience for Chinese-speaking users.
Sources/App/Resources/zh-Hans.lproj · high confidence
Added Czech (cs) localization for app shortcuts, core components, and frontend panels
Users can now see the app interface in Czech, including translations for app shortcuts (e.g., "Open entity", "Turn on light"), core component states (e.g., "On", "Off", "Locked"), and frontend panel labels (e.g., "Home", "Climate", "Settings"). This new localization file set ensures that Siri shortcuts, device status indicators, and main navigation menus are displayed in Czech for users with that language preference.
Sources/App/Resources/cs.lproj · high confidence
Added Hebrew localization for app shortcuts and core UI strings
The app now supports Hebrew (he.lproj) for Siri app shortcuts and core interface elements. Users can now trigger actions like turning on/off entities, dimming lights, and checking states via Siri in Hebrew. Additionally, core UI strings for entity states (e.g., 'on', 'off', 'locked'), component titles (e.g., 'Light', 'Climate'), and frontend panels (e.g., 'Home', 'Settings') are now translated, ensuring a fully localized experience for Hebrew-speaking users.
Sources/App/Resources/he.lproj · high confidence
Added Hungarian (hu) localization for the iOS app
This change introduces the initial Hungarian language support for the Home Assistant iOS application. It adds the \hu.lproj\ resource bundle containing localized strings for the app interface, including core components, frontend panels, app shortcuts, and Siri/App Intents, allowing Hungarian-speaking users to interact with the app in their native language.
Sources/App/Resources/hu.lproj · high confidence
Added Indonesian (Bahasa Indonesia) localization
Users can now use the app in Indonesian. This change adds the complete set of localized strings for the Indonesian language, including core interface text, component labels, app shortcuts, and Siri phrases, enabling full language support for this locale.
Sources/App/Resources/id.lproj · high confidence
Added Korean localization for app shortcuts and core UI strings
The app now includes Korean (ko-KR) translations for app shortcuts (e.g., "Open entity details", "Turn on/off"), core component states (e.g., "on", "off", "locked"), frontend panel labels (e.g., "Home", "Settings", "Map"), and privacy permission descriptions. This enables Korean-speaking users to interact with Siri shortcuts and view the interface in their language.
Sources/App/Resources/ko-KR.lproj · high confidence
Added Slovenian (sl) localization for app shortcuts and core UI strings
The app now includes a new Slovenian language resource bundle, providing translations for app shortcuts (such as turning entities on/off, dimming lights, and opening details), core component states (like lights, covers, and locks), frontend panel labels, and permission descriptions. This enables users with Slovenian device settings to see the interface and Siri shortcuts in their native language.
Sources/App/Resources/sl.lproj · high confidence
Added Spanish (Mexico) localization for app shortcuts and core UI strings
Users with Spanish (Mexico) locale settings will now see translated text for Siri and App Shortcuts (e.g., "Open entity details", "Turn on light") and core application strings, including component states (e.g., "Encendido", "Desactivado"), frontend panel labels (e.g., "Configuración", "Energía"), and permission descriptions. This change introduces the initial Spanish (Mexico) translation files for these areas, ensuring the interface and voice commands are displayed in the user's language.
Sources/App/Resources/es-MX.lproj · high confidence
Added Thread credential management service
The app now includes a new service layer for managing Thread network credentials, allowing users to retrieve, save, and delete Thread credentials stored in the Apple Keychain. This capability supports Matter device commissioning by enabling the app to use Home Assistant-defined Thread network credentials.
Sources/Shared/Services · high confidence
Added Traditional Chinese (zh-Hant) localization for app shortcuts and core UI
Users with Traditional Chinese language settings will now see the app interface, including app shortcuts, core component states, frontend panels, and permission descriptions, translated into Traditional Chinese. This change introduces new localized string files (AppShortcuts.strings, Core.strings, Frontend.strings, InfoPlist.strings, and Localizable.strings) to support the zh-Hant locale, ensuring that actions like turning on/off entities, viewing states, and system prompts are displayed in the user's preferred language.
Sources/App/Resources/zh-Hant.lproj · high confidence
Added Ukrainian localization for app shortcuts and core UI strings
The app now includes Ukrainian language support for Siri Shortcuts (AppShortcuts.strings) and core interface elements (Core.strings, Frontend.strings, Localizable.strings). Users can now interact with the app via Ukrainian Siri commands such as turning lights on/off, checking entity states, and opening entity details, while the app's internal UI panels, component labels, and permission descriptions are also translated into Ukrainian.
Sources/App/Resources/uk.lproj · high confidence
Added Welsh (cy-GB) localization for app shortcuts and core UI
The app now includes a new Welsh (cy-GB) language pack, providing translations for app shortcuts (such as opening or turning off entities), core component states (like lights, locks, and climate), and frontend panel labels (such as Home, Climate, and Settings). This enables users with Welsh language preferences to interact with Siri shortcuts and navigate the app interface in their native language.
Sources/App/Resources/cy-GB.lproj · high confidence
Added infrastructure for TestFlight beta tester communications
The app now includes a dedicated system to display messages exclusively to TestFlight beta testers. This change introduces a catalog for defining communication content, an engine that filters messages based on the current platform, app version, and OS requirements, and a SwiftUI view to present the message with optional call-to-action links. The feature is currently initialized with an empty catalog, meaning no messages are shown by default, but the underlying mechanism is in place for future beta-specific updates.
Sources/App/TestFlightCommunication · high confidence
Added mobile app registration request models and networking infrastructure
This change introduces new request models for mobile app registration and update registration within the shared API layer. The \MobileAppRegistrationRequest\ class now handles serialization of app and device details (such as app ID, version, device name, model, OS info, and encryption support) using the ObjectMapper library, while \MobileAppUpdateRegistrationRequest\ handles updates for app version and device metadata. Additionally, a new \NetworkQueue\ file has been added to the networking layer to support request handling.
Sources/Shared/API/Requests, Sources/Shared/Networking · high confidence
Added voice notification sound packs and shared framework metadata
The app now includes three new voice notification sound packs—Alexa, Generic, and Morgan Freeman—allowing users to choose from a wider variety of audio styles for smart home alerts such as motion detection, door status, and water leaks. Additionally, a shared Info.plist has been added to provide metadata for the shared framework bundle.
Sources/App/Resources/Sounds, Sources/Shared/Resources · high confidence
App Intents now work on watchOS via REST transport
App Intents are now usable on watchOS by introducing a shared transport layer that switches between WebSocket (on iOS/macOS) and REST API (on watchOS). This change enables Siri integration on the watch for actions like calling services, rendering templates, querying entities, and running Assist prompts, ensuring the same intent logic works across platforms despite watchOS network restrictions.
Sources/Shared/Intents/AppIntent/Transport · high confidence
App follows Home Assistant frontend theme mode and adds browser integration utilities
The app now automatically matches the light or dark appearance of the connected Home Assistant frontend, respecting the user's frontend profile setting while falling back to the device style when no preference is set. Additionally, the app now supports opening links in Firefox, Firefox Focus, and Firefox Klar, and provides a new utility to read hardware occlusion regions (such as camera cutouts) to ensure UI content is properly inset on modern devices.
Sources/App/Utilities · high confidence
Apple Watch app rebuilt with SwiftUI and new Assist, sensor, and complication features
The Apple Watch application has been rebuilt using the SwiftUI lifecycle, replacing the legacy WatchKit approach to enable better integration with modern iOS features like App Intents and dynamic notification scenes. This update introduces a dedicated Assist experience, including a configurable Assist button and complication that allow users to launch voice sessions directly from the watch face or home screen. Users can now configure which sensors the watch reports to Home Assistant on a per-server basis, and the app includes a new developer settings panel for troubleshooting complication refreshes and magic item execution. Additionally, the app now supports rectangular complications, improved background database synchronization via a staging store, and fixes for previous watchdog crashes and stale complication values.
Sources/WatchApp · high confidence
Apple Watch home screen now supports Assist items, folders, and rectangular complications
The Apple Watch home screen now displays Assist pipelines and prompts, allowing users to start voice sessions or send text commands directly from the home layout. Folders are supported, enabling users to group and navigate to sub-items. Rectangular complications are rendered inline in the item list, showing live entity values (such as battery or door status) with a stale-data warning when updates are delayed. Additionally, magic item execution errors are now shown in a full-screen readable view instead of a small alert, and a developer verbose execution trace screen provides a live, step-by-step log of item runs for diagnostics.
Sources/WatchApp/Home/MagicItemRow · high confidence
Apple Watch home screen now supports folders
Users can now organize items on the Apple Watch home screen by creating folders. The iPhone configuration interface includes a new folder view for managing folder contents (adding, removing, and reordering items) and editing folder properties like name, icon, and colors. The main configuration screen provides an option to add folders, which appear as distinct items in the watch home layout.
Sources/App/Settings/AppleWatch/HomeCustomization · high confidence
Apple Watch light controls with brightness, color, and temperature sliders
The Apple Watch app now includes a dedicated light controls screen accessible by tapping a light row. This screen allows users to toggle power, adjust brightness via a gradient slider, select colors from a palette, and set color temperature using a warm-to-cool slider. The implementation uses a custom gradient slider component to provide visual feedback for these settings on the watch interface, with debounced updates to prevent flooding the server during adjustments.
Sources/WatchApp/Home/EntityDetails/Light · high confidence
Apple Watch registers as a standalone Home Assistant device
The Apple Watch now registers itself directly with Home Server instances as an independent \mobile\_app\ device, rather than relying solely on the paired iPhone. This change introduces a dedicated registration and reporting system that allows the watch to report its own sensors (such as battery level and state) via its own webhook, ensuring data is sent even when the iPhone is unreachable. The watch's device name is derived from the iPhone's registered name to keep it grouped logically in the Home Assistant UI, and sensor enablement settings are now stored per-server to match the iPhone's behavior.
Sources/Shared/Watch/DeviceRegistration · high confidence
Auto-connect to discovered Home Assistant server during onboarding
The onboarding flow now automatically connects to a Home Assistant instance if only one is discovered via mDNS, skipping the manual selection step. This is implemented in the new \OnboardingServersListView\ and \OnboardingScanningInstanceRow\ components, which handle the discovery list, auto-connect logic with a brief delay, and the UI for the auto-connect confirmation sheet. If multiple servers are found, the user is presented with the list to choose from, and manual URL entry remains available as an alternative.
Sources/App/Onboarding/Steps/Servers · high confidence
Automated alternate icon generation script
A new shell script (AlternateGenerator.sh) has been added to the icons/Alternates directory. This script automates the creation of alternate app icons by resizing PNG source files to @2x and @3x resolutions and placing them into the app's Resources folder, while also generating the necessary Info.plist key entries for each icon variant.
icons/Alternates · high confidence
Automated tooling to sync frontend brand icons and color themes with the native app
New build scripts in the Tools directory now automatically generate Swift source files for brand icons and frontend color themes directly from the Home Assistant frontend repository. The \BuildBrandIcons.py\ script extracts custom SVG logo path data from the frontend's \CUSTOM\_ICONS\ map and writes a \BrandIcon.swift\ enum, ensuring the native app displays the same partner and service logos as the web interface. Similarly, \BuildFrontendColors.py\ parses the frontend's CSS custom properties (from \color.globals.ts\) to generate a \FrontendColors.swift\ enum, allowing the native UI to mirror the frontend's light and dark theme palettes. These tools replace manual updates, keeping the native app's visual assets synchronized with the latest frontend releases.
Tools · high confidence
Automatic server switching based on location and Wi-Fi
The app now automatically switches to the server associated with the user's current home when it becomes active, using Wi-Fi SSID matching or GPS proximity to \zone.home\ regions. This feature respects manual overrides for the duration of a visit and explicitly skips switching when the app is opened via a deep link, ensuring the link's intended destination is preserved. Additionally, the 'Closest Server' row now indicates whether the result was determined by being on the home network or by geographic proximity.
Sources/App/ServerSwitching · high confidence
Browse areas and control devices on Apple Watch
Users can now navigate the Apple Watch home screen by area, drilling down into specific devices to access their controls and sensors. This change introduces new views for listing areas, selecting servers when multiple are present, and displaying grouped device entities with custom section headers. It also adds dedicated control screens for climate and fan entities, allowing users to adjust temperature, humidity, HVAC modes, fan speed, and power directly from the watch.
Sources/WatchApp/Home · high confidence
Custom icons for communication notifications
Communication notifications now display custom sender icons instead of generic placeholders. The system supports both Material Design Icons (MDI) and custom image URLs, parsing these from notification payloads and rendering them via the Intents framework. Downloaded image icons are automatically downsampled and cached to optimize performance and memory usage within the notification service extension.
Sources/Shared/Notifications/NotificationSender · high confidence
Danish localization for app shortcuts and core UI
The app now includes Danish translations for Siri Shortcuts (AppShortcuts.strings) and core interface elements (Core.strings, Frontend.strings, InfoPlist.strings, Localizable.strings). Users can now interact with app shortcuts and view standard UI text in Danish, including translations for entity states, component titles, and permission descriptions.
Sources/App/Resources/da.lproj · high confidence
Dutch localization for app shortcuts and core components
The app now includes Dutch translations for Siri shortcuts (AppShortcuts.strings) and core UI elements (Core.strings, Frontend.strings, Localizable.strings), enabling users to interact with Home Assistant entities and navigate the interface in Dutch.
Sources/App/Resources/nl.lproj · high confidence
Enable scene activation via Siri and App Intents
Users can now trigger scenes directly through Siri or the App Intents framework. This new capability allows for hands-free control, with options to receive a confirmation notification and haptic feedback upon execution. The intent syncs network information before running the command to ensure reliability and provides immediate feedback on success or failure.
Sources/Extensions/Widgets/Scene · high confidence
Enhanced Jinja template editor with syntax highlighting and entity suggestions
The Jinja template editor in the complication builder now features syntax highlighting for Jinja expressions and keywords, making templates easier to read. It also provides context-aware autocomplete suggestions: as you type an entity ID inside quotes or expressions, relevant entities from your server appear as tappable pills with display names and context (Floor, Area, Device). Tapping a known entity ID in the template now highlights it as a tappable pill, allowing you to replace it with a different entity via the entity picker. The editor also shows a live preview of the template's result at the top, including color swatches for color-expecting templates.
Sources/App/Templating · high confidence
Expose current onscreen page to Siri via App Intents
The app now identifies the specific frontend page currently displayed in the web view and exposes it to Siri. This is achieved by introducing an \OnscreenPage\ struct that extracts the panel path and title from the URL, and an \OnscreenPageIdentifier\ that links this state to the existing \PageAppEntity\. This allows Siri to resolve references to the currently viewed page, enabling features like "Add entity to" the active screen, while respecting the user's existing Siri privacy settings for server exposure.
Sources/App/Frontend/OnscreenPage · high confidence
Finnish localization for app shortcuts and core components
The app now includes Finnish translations for Siri Shortcuts (AppShortcuts.strings) and core UI elements (Core.strings, Frontend.strings, Localizable.strings), enabling Finnish-speaking users to interact with app shortcuts and view component states in their native language.
Sources/App/Resources/fi.lproj · high confidence
Home Assistant entities and calendars are now searchable via Spotlight
The app now indexes Home Assistant entities and calendars into the system Spotlight index, allowing users to find devices, areas, and calendars by name, context (such as room or server), or entity ID directly from the system search bar. Tapping a search result opens the entity's more-info dialog in the frontend. The indexing logic handles deduplication and keyword expansion to improve match relevance, defers reindexing to the foreground to avoid background database locks, and supports system-requested partial or full reindexes for up-to-date results.
Sources/App/Utilities/Spotlight · high confidence
In-flight greeting toast with cabin pressure detection
The app now detects when you are on a plane and displays a "have a great flight" toast notification. Detection relies on three signals: matching known in-flight Wi-Fi SSIDs (including LATAM), monitoring cabin air pressure via the device barometer (which works without connectivity or GPS), and verifying high ground speed/altitude via GPS. A new Settings toggle lets you enable or disable these flight greetings, and the toast is shown at most once per flight with a six-hour cooldown.
Sources/App/FlightGreetings · high confidence
Initial Greek localization for Home Assistant Companion
The app now supports the Greek language, providing translated strings for the user interface, app shortcuts, Siri integration, and system permission descriptions. This change adds the necessary resource files (AppShortcuts, Core, Frontend, InfoPlist, and Localizable) to display the app in Greek for users with that locale setting.
Sources/App/Resources/el.lproj · high confidence
Initial Japanese localization for the iOS app
Japanese language support has been added to the iOS application. This update introduces the complete set of localized strings for the user interface, including app shortcuts, core component states (such as on/off, open/closed), frontend panel labels, and system permission descriptions, enabling Japanese-speaking users to interact with the app in their native language.
Sources/App/Resources/ja.lproj · high confidence
Initial Malayalam (ml) localization for the iOS app
The app now supports Malayalam, adding translations for app shortcuts, core component states, frontend panels, and permission descriptions. Users can now interact with Siri shortcuts, view entity states, and navigate the interface in Malayalam.
Sources/App/Resources/ml.lproj · high confidence
Initial fastlane automation setup for iOS/macOS builds and CI
This change introduces the initial fastlane configuration for the Home Assistant iOS app, establishing the automated build, test, and deployment pipeline. It includes the main Fastfile orchestrating modular lanes for setup, quality, provisioning, assets, localization, versioning, testing, and platform-specific builds (iOS and macOS). Configuration files define the Apple ID and team ID via environment variables, specify the Xcode project and release scheme, configure Match for certificate management, and set up Snapfile for automated screenshot generation across multiple devices and languages. The setup also integrates plugins for icon generation, TestFlight tester cleanup, and Emerge, while providing documentation for the available lanes and modular structure.
fastlane · high confidence
Initial repository configuration and developer tooling setup
The repository is initialized with essential configuration files for development and contribution. This includes an AI agent instruction router (AGENTS.md) and policy (AI\_POLICY.md) to guide code generation and review, alongside standard open-source governance documents like the Contributor License Agreement (CLA.md) and Code of Conduct (CODE\_OF\_CONDUCT.md). Developer tooling is established through SwiftLint and SwiftFormat configurations, a Ruby version file, and a sample environment file (.env.sample) for Fastlane credentials. Build system integration is handled via .gitattributes to manage Xcode project merges, a .gitignore for build artifacts, and a SwiftGen configuration (swiftgen.yml) to generate type-safe Swift code from assets and strings.
(repo-wide) · high confidence
Introduce App Labs feature flags and CarPlay Assist debug settings
The Settings module now includes an App Labs system for managing persisted feature flags via a new AppLabsStore, allowing experimental capabilities to be toggled and observed in real-time. Additionally, a new CarPlayAssistDebugSettings structure has been added, exposing granular controls for audio categories, modes, sample rates, and TTS playback strategies to aid in troubleshooting CarPlay integration.
Sources/Shared/Settings · high confidence
Introduce App Labs settings screen for experimental features
A new App Labs section has been added to the app settings, allowing users to toggle experimental features directly. This screen is currently limited to TestFlight builds and exposes platform-specific experiments, including a native sidebar for macOS Catalyst and a native tab bar for iOS (available on iOS 26+). Users can enable or disable these features via toggles, with the interface handling empty states and searchability automatically.
Sources/App/Settings/AppLabs · high confidence
Introduce Apple Reminders sync with Home Assistant todo lists
This change adds a new Reminders sync feature, allowing users to pair Apple Reminders lists with Home Assistant todo lists. The implementation includes a settings view to configure sync direction (one-way or two-way), conflict resolution preferences, and foreground/background refresh intervals. It introduces a background refresher using BGTaskScheduler to keep lists in sync when the app is not active, and handles date synchronization by moving reminder alerts and start dates alongside due dates to prevent stale notifications. The sync engine also respects Home Assistant todo list capabilities, ensuring that unsupported fields like notes or timed due dates are not sent to lists that cannot store them.
Sources/App/Utilities/RemindersSync · high confidence
Introduce Apple Watch Assist with voice and text interaction
This change introduces the Apple Watch Assist feature, allowing users to interact with the assistant directly from their wrist. The implementation includes a new chat interface (ChatBubbleView) for displaying responses, a voice orb for recording feedback, and a volume control screen. Users can now send voice recordings or typed prompts to the iPhone, which handles the processing and streams the response back to the watch. The feature supports on-device text-to-speech playback and maintains the session state even when the watch is wrist-down, ensuring a seamless experience for quick queries and smart home control.
Sources/WatchApp/Assist · high confidence
Introduce Apple Watch complication widget with self-fetching and Assist control
This change adds a new WatchWidgets extension that brings Home Assistant complications to the Apple Watch face. It supports all standard accessory families (circular, rectangular, inline, and corner) with customizable layouts, colors, and icons. The widget includes a built-in 'Assist' control for launching the voice assistant and a generic placeholder. A key behavioral improvement is the widget's ability to self-fetch live entity states directly from the Home Assistant server using its own WidgetKit timeline, bypassing the need for the main watch app to wake up. This self-fetch mechanism includes throttling to prevent network storms, mTLS authentication, and automatic handling of expired or rejected access tokens to avoid IP bans. The implementation also ensures previews in the complication picker show neutral data rather than stale live values.
Sources/WatchWidgets · high confidence
Introduce Connection Security Level Block view
Users now see a dedicated screen that checks and displays connection security requirements, such as whether the device is on the home network and if location permissions are granted. The view allows users to open system settings or change connection security preferences directly from the app, providing clear feedback on network status and required actions.
Sources/App/Frontend/WebView/ConnectionSecurityLevelBlock · high confidence
Introduce Custom Widgets for iOS 17+
This change adds a new Custom Widgets feature for iOS 17 and later, allowing users to create home screen widgets that display specific Home Assistant entities, scripts, scenes, or buttons. The implementation includes a timeline provider that fetches entity states and a UI that supports custom colors, entity state indicators, and configurable tap behaviors. Users can configure widgets to show the last update time and entity states, with the widget configuration intent explicitly marked as not discoverable in the Shortcuts app.
Sources/Extensions/Widgets/Custom · high confidence
Introduce Live Activity support with Dynamic Island and Lock Screen widgets
This change adds the core SwiftUI views and widget configuration for Home Assistant Live Activities on iOS 17.2+. It introduces a Dynamic Island presentation (compact and expanded) and a Lock Screen/StandBy view that display activity titles, messages, and icons. The widgets support real-time progress bars (with configurable fill direction and color) and chronometer-style timers (countdown and bounded count-up), along with critical text fallbacks. A tap handler is included to navigate to the relevant server context via a deep link.
Sources/Extensions/Widgets/LiveActivity · high confidence
Introduce MacBridge module for macOS-specific native capabilities
This change introduces the MacBridge module, a new native layer for macOS that provides core platform integrations. It adds a status item implementation that supports right-click menus and modifier-key interactions, monitors network connectivity (including Wi-Fi details and interface hardware addresses), and exposes screen information. Additionally, it implements app termination and reopen handling via delegate swizzling to manage background tasks and browser-opening preferences, and allows configuring a login item for the app.
Sources/MacBridge · high confidence
Introduce WebSocket message models and panel data structures
The app now includes dedicated Swift models for Home Assistant WebSocket communication, including \WebSocketMessage\ for handling generic commands and results, \AuthRequestMessage\ for authentication, \SubscribeEvents\ for event subscriptions, and \Event\ for incoming event data. Additionally, \HAPanel\ and \HAPanels\ structures are added to decode and manage panel/dashboard information from the server, supporting features like sidebar visibility and sorting logic that aligns with Home Assistant Core 2026.3+ behavior.
Sources/Shared/API/WebSocket · high confidence
Introduce connectivity diagnostics and download manager UI
This change adds a new Connectivity Check feature that allows users to run diagnostics (DNS resolution, port reachability, TLS certificate validation, and server connection) with results displayed in a new SwiftUI view. It also introduces a Download Manager interface that tracks download progress, handles success and failure states, and provides options to share or open the downloaded file, with specific behavior for Mac Catalyst to keep files in the downloads folder.
Sources/App/Frontend/DownloadManager · high confidence
Introduce custom widget builder in settings
Users can now create, name, and configure custom widgets directly within the app's Settings. This new feature adds a dedicated builder interface where you can select items, arrange their order, and preview the widget layout before saving. The settings screen includes a list of your custom widgets with options to edit, delete, or reload them, and provides a link to documentation for guidance.
Sources/App/Settings/Widgets · high confidence
Introduce iOS Live Activities support
This change adds support for iOS Live Activities, allowing real-time updates to appear in the Dynamic Island and on the Lock Screen. The implementation includes a shared attributes and content state structure that mirrors Android notification fields for compatibility, supporting features like progress bars, chronometers, custom colors, and tap-to-open actions. A thread-safe registry manages the lifecycle of activities, handling start, update, and end operations, while local push mechanisms ensure updates are delivered even when the app is in the background.
Sources/Shared/LiveActivity · high confidence
Introduce iOS local push extension for Home Assistant
Added a new iOS app extension (PushProvider) that enables local push notifications for Home Assistant. This extension manages connections to configured servers, handles periodic sensor updates, and processes remote commands received via local push, improving responsiveness for users on iOS devices.
Sources/Extensions/PushProvider · high confidence
Introduce in-app Assist with streaming responses and pipeline management
This change adds the core data models, request builders, and service layer for the in-app Assist feature, enabling users to interact with Home Assistant via voice or text directly within the app. The implementation supports streaming LLM responses for real-time text feedback, manages Assist pipelines (including caching them in the local database to avoid repeated fetches), and handles conversation context via conversation IDs. It also introduces robust error handling for pipeline startup failures, ensuring users receive immediate feedback if a run is rejected by the backend, rather than hanging indefinitely.
Sources/Shared/Intents/AppIntent/AssistInApp · high confidence
Introduce local push notification support
Added a new local push notification system that allows the app to receive notifications directly from Home Assistant without relying on Apple Push Notification service (APNS). This includes a new \LocalPushManager\ to handle subscription and delivery, \LocalPushEvent\ parsing for notification content, and configuration classes for the push provider. The implementation supports notification confirmation, live activities, and integrates with the existing notification history store.
Sources/Shared/Notifications/LocalPush · high confidence
Introduce mTLS client certificate support for Home Assistant connections
The HANetworking package now supports mutual TLS (mTLS) authentication. Users can import PKCS\#12 client certificates into the Keychain, which are then used to authenticate with Home Assistant servers that require them. This includes support for intermediate certificates in the trust chain and allows certificate transfer to paired Apple Watch devices for consistent authentication across platforms.
Sources/HANetworking · high confidence
Introduce native iOS tab bar in App Labs
App Labs now includes a native iOS tab bar that displays up to four pinned dashboards as tabs, with a 'More' tab for additional pages, plus dedicated Search and Assist actions. Users can customize the tab order and visibility via a long-press gesture or the More list, and the bar adapts to a vertical layout on compatible devices. The tab bar integrates with the web frontend, supports server-specific accent colors, and includes profile, notification, and settings controls in the toolbar.
Sources/App/Frontend/WebView/NativeTabBar · high confidence
Introduction of ToastPresenter for toast management
A new ToastPresenter class has been added to handle the state and lifecycle of toast notifications. This component manages the currently displayed toast, supports auto-dismissal via a configurable duration, and provides methods to show and hide toasts, serving as the state holder for the SwiftUI toast overlay.
Sources/Shared/Toast · high confidence
Italian localization files added for app shortcuts, core components, and frontend panels
The app now includes Italian language support for key interface areas. New localized string files have been added for App Shortcuts (enabling Siri and Spotlight commands like opening entities or adjusting lights), Core components (providing Italian labels for device states and entity types such as lights, locks, and sensors), Frontend panels (translating navigation items like Home, Climate, and Settings), and InfoPlist (localizing permission descriptions for camera, location, and microphone access).
Sources/App/Resources/it.lproj · high confidence
Manual URL entry onboarding screen with smart scheme suggestions
The onboarding flow now includes a dedicated screen for manually entering server URLs. This view disables autocorrection and capitalization to ensure accurate input, and intelligently suggests appending 'http://' or 'https://' prefixes once the user types a few characters, provided no scheme is already present. It also handles invalid URL formats by displaying an error alert and adapts its navigation presentation for macOS Catalyst versus iOS.
Sources/App/Onboarding/Steps/Servers/ManualURLEntry · high confidence
Native What's New screen for release highlights
Users will now see a native in-app screen after updating to version 2026.9.1, replacing previous methods of communicating changes. This screen highlights new features such as Live Activities and the Energy widget, with content tailored to the user's platform (iOS or Mac) and OS version. Tapping an item either opens a detailed native article with Markdown support or links to external documentation in a Safari sheet.
Sources/App/WhatsNew · high confidence
Native pull-to-refresh with haptic feedback in the Home Assistant web view
The Home Assistant web view now supports a native pull-to-refresh gesture that works independently of the web frontend. This change introduces a new observer and UI component that detect the pull distance, provide haptic feedback during the drag, and trigger a refresh when the threshold is crossed. The implementation is responsive to device orientation, adjusting the pull threshold based on the viewport height to ensure consistent usability in both portrait and landscape modes. The native loader indicator is shown during the refresh, and the web view content fades out to reveal the native UI, improving the perceived performance and responsiveness of the refresh action.
Sources/App/Frontend/WebView/HomeAssistantView · high confidence
Native sidebar for App Labs on macOS
This change introduces a native macOS sidebar for the App Labs feature, replacing the web-based sidebar with a SwiftUI implementation. It allows users to view, reorder, and hide panels directly in the app, with changes synced to the frontend via \frontend/set\_user\_data\. The sidebar supports drag-and-drop reordering, hiding/showing panels, setting a default dashboard, and displays persistent notification counts. It also respects user preferences for panel order and visibility, falling back to legacy localStorage settings if needed.
Sources/App/Frontend/WebView/MacSidebar · high confidence
New API infrastructure and service integrations
The API layer now includes support for Home Assistant calendar and todo list operations, allowing users to view and manage events and tasks directly within the app. A new \AppTriggerSource\ enum tracks the origin of service calls (e.g., Watch, Widget, Siri), enabling better diagnostics and context for actions. The update also introduces a robust MJPEG streamer for camera feeds with mTLS support, a \PerServerContainer\ for managing per-server state, and a \PeriodicUpdateManager\ to handle background connectivity. Additionally, dynamic notification actions are now configurable via \MobileAppConfig\, and the API client now supports responses from service calls that return data.
Sources/Shared/API · high confidence
New Apple Health sensor catalog and background delivery
The app now includes a comprehensive catalog of Apple Health metrics—spanning activity, body, heart, nutrition, respiratory, sleep, and vitals categories—and delivers them as Home Assistant webhook sensors. This change introduces the underlying data structures and the \HealthKitSensor\ provider that queries HealthKit, while \HealthKitSensorUpdateSignaler\ ensures updates are received in the background via HealthKit's background delivery mechanism.
Sources/Shared/API/Webhook/Sensors/Health · high confidence
New Apple Watch screens for controlling locks and covers
The Apple Watch app now includes dedicated detail screens for Lock and Cover entities, replacing any previous direct-tap toggles. Tapping a lock row opens a screen with explicit Lock, Unlock, and (if supported) Open buttons; the Open action requires a confirmation dialog to prevent accidental unlatching, and buttons are disabled when the action is invalid for the current state or while a command is pending. Tapping a cover row opens a screen with a position slider (for covers that support positioning) and Open/Stop/Close buttons, with debounced slider updates and a brief polling hold-off to prevent value snapping. Both screens display a loading indicator while state is unknown, show a stale-data warning if the connection is lagging, and provide haptic feedback on command execution.
Sources/WatchApp/Home/EntityDetails/Lock · high confidence
New CarPlay configuration interface with folders and assist prompts
The app introduces a dedicated CarPlay configuration screen that allows users to manage Quick Access items, including the ability to create folders to group entities and assist pipelines. Users can now add 'Assist prompt' items alongside standard entities and pipelines, and organize their layout using either a grid or list view. The interface also supports promoting Quick Access folders to dedicated tabs and includes a troubleshooting section for adjusting Assist audio playback strategies.
Sources/App/Settings/CarPlay · high confidence
New Gauge widget with flexible content sources and script actions
Users can now add a Gauge widget to their Home Screen or Lock Screen that displays data from three sources: a Home Assistant entity, a circular watch complication, or a Jinja2 template. The widget allows configuring the gauge type, value range, and labels, and supports running a Home Assistant script with an optional confirmation notification. It also includes preview samples for the widget gallery and handles API errors gracefully by showing placeholders.
Sources/Extensions/AppIntents/Widget/Details, Sources/Extensions/AppIntents/Widget/Gauge · high confidence
New HADesignSystem package with frontend-aligned SwiftUI components and color tokens
The app now includes the HADesignSystem package, which ports Home Assistant frontend UI components (such as cards, tiles, controls, and status indicators) into native SwiftUI views. This ensures visual parity with the web frontend by using generated color enums (FrontendColors) and semantic color definitions that mirror the frontend's CSS custom properties, including support for light and dark themes. The package also introduces new components like AppleLikeBottomSheet and AssistVoiceOrb, providing a consistent, platform-native look and feel across the app while maintaining a single source of truth for design tokens.
Sources/HADesignSystem · high confidence
New Live Activity settings screen with sample payloads and documentation link
A new Live Activity settings view has been added, allowing users to manage active activities, sync their status, and access a collection of static and animated sample configurations. The samples section includes a lightweight YAML syntax highlighter to improve readability of payload data, and a direct link to the Live Activities documentation is now available within the settings.
Sources/App/Settings/LiveActivity · high confidence
New Magic Item picker supports Areas, Assist Pipelines, and Watch Complications
The Magic Item add flow now includes dedicated views for selecting Areas, Assist Pipelines, and Watch Complications in addition to standard entities. Users can add an Area to their Watch configuration, select an Assist Pipeline for CarPlay or App Icon Shortcuts (iOS 26+), or pick an existing rectangular Watch Complication. Each picker supports server grouping, search filtering, and immediate addition to the configuration.
Sources/App/Settings/MagicItem/Add · high confidence
New Manage Storage screen in Settings \> Debugging
A new Manage Storage screen has been added under Settings \> Debugging, allowing users to view and reclaim space used by various app data categories. The screen groups storage into buckets such as app data, caches, web content, logs, downloads, and temporary files, displaying their sizes and indicating which items are deletable. Users can search, filter by category, sort by size or name, and delete reclaimable items (like caches and logs) with a confirmation dialog. Essential app data, user-provided content, and other protected items are locked and explained to prevent accidental loss. The implementation includes background measurement and cleaning logic, with specific handling for file systems, WebKit caches, network response caches, and SQLite database tables (including VACUUM to reclaim space).
Sources/App/Settings/ManageStorage · high confidence
New Settings screens and debug tools
The Settings area has been migrated to SwiftUI, introducing several new capabilities. Users can now customize the app icon via a new selector screen. A new Debug section includes a Keychain Explorer to view stored credentials, a Manage Storage screen, and a Database Transfer feature that allows exporting and importing specific configuration parts (watch, complications, CarPlay, widgets, shortcuts) as JSON files. The About screen now displays acknowledgements and license text for Swift Package Manager dependencies directly in the app.
Sources/App/Settings · high confidence
New Share extension for triggering Home Assistant events
Users can now use the system share sheet to trigger Home Assistant events directly from other apps. The new Share extension accepts text and a single URL, sending them as event data to the configured Home Assistant instances. If the request succeeds, the share sheet completes; if it fails, an alert displays the error and allows the user to cancel.
Sources/Extensions/Share · high confidence
New Siri and Spotlight shortcuts for Home Assistant entities
Users can now control Home Assistant devices directly through Siri and Spotlight search on iOS 17 and later. This update introduces app shortcuts for turning entities on and off, checking their state, opening and closing covers, setting thermostat temperatures, and adjusting light brightness. Each shortcut is localized and features distinct icons in the Shortcuts app and Spotlight results to help users easily identify and trigger the correct command.
Sources/App/Utilities/AppShortcuts · high confidence
New Siri voice control commands for Home Assistant entities
This change introduces a suite of new App Intents that allow users to control Home Assistant devices via Siri. Users can now turn on, off, or toggle lights and covers, set brightness levels, lock or unlock doors, and adjust thermostat temperatures. The implementation includes specific entity types (lights, locks, covers, thermostats) and supports controlling entire areas (e.g., "turn on the kitchen lights"). After a command, Siri provides a spoken confirmation and, on supported platforms, displays a card showing the entity's current state, which is read back from the server to ensure accuracy.
Sources/Extensions/AppIntents/Control · high confidence
New WebRTC-based camera player with improved gesture controls and connection reliability
The camera player now uses a new WebRTC implementation that fetches server-provided STUN/TURN configuration to improve remote streaming reliability. The player view supports pinch-to-zoom and double-tap-to-reset gestures, and includes a talkback microphone feature. Connection handling has been enhanced with a server connection gate to prevent signaling attempts during network drops, along with configurable timeouts for connection establishment, stall detection, and automatic retry logic to fall back to HLS if WebRTC fails.
Sources/App/Cameras/CameraPlayer/WebRTC · high confidence
New complication source and reload intent for lock-screen widgets
Lock-screen widgets (gauge and details) now support a new 'Complication' content source, allowing users to display their existing watch complications directly on the home screen or lock screen. This change introduces the necessary AppIntents entities and resolvers to fetch and render both entity-based and template-based complications using the same views as the watch. Additionally, a 'Reload widgets' AppIntent is added, enabling users to manually refresh all widget timelines via Siri or Shortcuts. Entity-based widgets also now round numeric values to the entity's configured display precision for consistent formatting.
Sources/Extensions/AppIntents/Widget · high confidence
New connection settings UI with webhook reachability checks and URL explanation
The connection settings screen has been rebuilt in SwiftUI, introducing a dedicated view to explain how internal and external URLs are selected and used. Users can now see all possible webhook URLs (including the Home Assistant Cloud cloudhook) for a server, identify which one is currently active, and manually check the reachability of each endpoint. The settings also include a new privacy section for configuring location and sensor data sharing, and allow importing client certificates for mTLS authentication.
Sources/App/Settings/Connection · high confidence
New data models for Assist, Apple Watch complications, and Home Assistant areas
The app's local database schema now includes models for the Assist feature (including a new start mode setting and pipeline configuration), fully customizable Apple Watch complications (supporting formula-based content, slot visibility, and color overrides), and Home Assistant areas (denormalized with floor and entity data). These models enable the Assist start mode preference, granular control over Watch complication layouts, and area-based browsing on the Watch home screen.
Sources/HAModels · high confidence
New debug views and App Intents for Home Assistant calendar management
This change introduces a debug interface for inspecting Home Assistant calendars and adds App Intents to manage calendar events. The debug views (CalendarsDebugServerListView, CalendarsDebugListView, CalendarDebugView) allow users to browse calendars per server, view a month grid of events, and check supported features (create, update, delete). Additionally, new App Intents (CreateCalendarEventAppIntent, DeleteCalendarEventAppIntent, GetCalendarEventsAppIntent) enable Siri and Shortcuts to create, delete, and retrieve events from Home Assistant calendars, with support for recurrence scopes and repeat frequencies.
Sources/App/Settings/Calendars · high confidence
New device naming step in onboarding flow
Users are now prompted to name their device during the onboarding process. This new screen allows users to enter a custom name, pre-filled with the current device name (or a simulator identifier in debug builds), and includes validation to prevent saving names shorter than three characters. If a name conflict occurs, the error is displayed inline, and a loading indicator appears while the name is being saved.
Sources/App/Onboarding/Steps/DeviceName · high confidence
New dynamic notification content extensions for camera, map, and media
The Notification Content extension now supports rich, interactive dynamic notifications. Users can view live camera feeds directly in the notification using WebRTC (with HLS and MJPEG fallbacks), view interactive maps with location pins, and play video or audio attachments. Image attachments, including animated GIFs, are also rendered natively within the notification interface.
Sources/Extensions/NotificationContent · high confidence
New entity details and mode selection screens for Apple Watch
Users can now tap a sensor row on the Apple Watch home screen to view a dedicated details screen showing the current state, last changed/updated timestamps, and entity attributes, with stale-data warnings. Additionally, a new mode selection interface allows users to choose options (such as HVAC or vacuum modes) from a list, with the current selection highlighted.
Sources/WatchApp/Home/EntityDetails · high confidence
New kiosk push commands and notification tap actions
Users can now control kiosk mode directly via push notifications, with new commands to show or hide the screensaver and camera, set screen brightness and system volume, change the screensaver mode, reload the dashboard, or return to the default dashboard. Additionally, tapping a notification that has no other specific action (like opening a URL or showing an entity) will now present an alert with the notification's available actions, allowing users to execute them without needing to press and hold the notification.
Sources/App/Notifications · high confidence
New live complication previews in the editor
The Apple Watch complication editor now includes a live preview panel that renders the complication in real-time on the iPhone. This preview supports all four WidgetKit families (circular, corner, rectangular, and inline) and displays them simultaneously in a watch-face layout, or individually in a floating zoomed view. It fetches live entity data and evaluates custom templates to show exactly how the complication will appear on the watch, including icons, values, gauges, and custom colors, ensuring the on-screen preview matches the on-device rendering.
Sources/App/Settings/AppleWatch/Complications/Preview · high confidence
New local database tables for app configuration and features
The app now persists configuration for several new features and UI customizations in its local database instead of relying solely on user defaults or transient state. This includes tables for Kiosk mode settings, CarPlay configuration (tabs, quick access, folders), Apple Watch home screen layout, Mac toolbar entity lists, Assist voice settings (on-device STT/TTS, start mode), Apple Reminders sync, Siri entity exposure, App Labs feature flags, custom widgets, and frontend theme variables. Existing users will have these settings initialized from legacy storage where applicable, ensuring their preferences are preserved.
Sources/Shared/Database/Tables · high confidence
New localized string files for App Shortcuts and Core components
The app now includes dedicated localized string files for App Shortcuts and Core components, providing English translations for Siri shortcuts (such as turning lights on/off, setting temperatures, and checking entity states) and standard Home Assistant entity states (like 'On', 'Off', 'Locked', 'Open'). This ensures that native Siri interactions and core UI state labels are properly localized for English-speaking users.
Sources/App/Resources/en.lproj · high confidence
New network input screen for onboarding
A new HomeNetworkInputView has been added to the onboarding flow, allowing users to manually enter their network name and, on macOS Catalyst, their hardware address. The view automatically loads current network information and provides validation to ensure at least one field is populated before proceeding.
Sources/App/Onboarding/Steps/Permissions/Steps/LocalAccessAndNetworkInput/NetworkInput · high confidence
New onboarding screens for local access disclaimer and location permissions
The onboarding flow now includes two new steps: a disclaimer screen explaining that the server is accessible only locally, and a permission request screen for location access. Users will see these views during setup, allowing them to acknowledge the local-only access model and choose to share or skip location permissions before continuing.
Sources/App/Onboarding/Steps/Permissions/Steps/LocalAccessOnlyDisclaimer · high confidence
New sensor types and improved audio direction detection
This update introduces several new sensors to Home Assistant, including Camera Motion and Camera Stream (MJPEG) for kiosk and wall-mounted use cases, a Pressure sensor using the device barometer, and an App Version sensor. It also adds a dedicated Audio Output sensor to report active playback devices (e.g., Bluetooth, AirPlay) and refines the existing Audio Input/Output sensors on macOS Catalyst to correctly distinguish between recording and playback directions, preventing false positives when a device is used for both.
Sources/Shared/API/Webhook/Sensors · high confidence
New settings for enhanced web security and template customization
The General settings screen now includes a toggle for WebKit's Enhanced Security heuristic, allowing users to opt back into stricter security checks on plain-HTTP connections when relevant. Additionally, a new Template Editor has been added, enabling users to customize the menu bar text with server-specific templates and preview the rendered output in real-time before saving.
Sources/App/Settings/General · high confidence
New shared UI and data extensions for orientation, encoding, and security
This update adds a suite of new extension files to the shared codebase to support broader app features. It introduces orientation handling utilities (AVCaptureVideoOrientation, UIScreen) that correctly map device states to video orientations, addressing camera stream issues on iPad. It adds Codable support for SwiftUI Colors and MaterialDesignIcons to enable data serialization, and provides a mapping from Material Design icons to SF Symbols for consistent iconography across platforms. Additionally, it includes a View modifier to blur content when screen capture is detected, enhancing privacy for sensitive views, along with utility extensions for hex encoding, image assets, view controllers, and rounded corners.
Sources/Shared/Extensions · high confidence
New widget configuration and filtering infrastructure
This change introduces the underlying data models and logic for managing widget configurations and entity filtering within the app. It adds \CustomWidget\ to handle persistent storage of custom widget definitions, including item states for confirmation workflows, and \WidgetDomainFilter\ to allow users to include or exclude specific entity domains (like lights or sensors) from widget displays. Additionally, \WidgetsKind\ enumerates the supported widget types, covering both standard widgets (e.g., Assist, Scripts, Sensors) and iOS 18 Control Center controls (e.g., Light, Switch, Cover, Fan), establishing the structural foundation for these new UI elements.
Sources/Shared/Widget · high confidence
Norwegian (Bokmål) localization for app shortcuts and core UI
The app now includes Norwegian (Bokmål) translations for app shortcuts (Siri/Spotlight) and core interface elements. Users will see localized strings for actions like turning entities on/off, dimming lights, and checking states, as well as standard UI components such as device states (e.g., 'On', 'Off', 'Locked'), panel titles (e.g., 'Home', 'Climate', 'Settings'), and permission descriptions for camera, location, and microphone access.
Sources/App/Resources/nb.lproj · high confidence
Per-server Siri exposure controls for calendars and to-do lists
Users can now manage which Home Assistant servers are accessible to Siri, and for each exposed server, choose specific calendars and to-do lists to share. The new Siri settings screen provides a toggle to enable or disable Siri access per server, and an option to configure individual calendar and list exposure with a default selection. Changes are applied immediately, updating the system's Siri index and shortcuts without requiring a restart.
Sources/App/Settings/Siri · high confidence
Polish localization for app shortcuts and core components
The app now includes Polish translations for Siri and App Shortcuts (e.g., turning lights on/off, checking entity states) and core UI strings for Home Assistant components like lights, covers, and climate devices, as well as frontend panel labels and permission descriptions.
Sources/App/Resources/pl-PL.lproj · high confidence
Run Script App Intent for Siri and Widgets
Users can now execute Home Assistant scripts via Siri, Apple Watch complications, and iOS/macOS widgets. This change introduces a new 'Run Script' App Intent that allows selecting scripts from the local entity mirror, with options for haptic feedback and confirmation notifications. The intent is available on watchOS 9.4+ and syncs network info before execution, ensuring scripts run reliably across platforms without requiring a WebSocket connection.
Sources/Extensions/AppIntents/Script · high confidence
Russian localization for app shortcuts and core components
The app now includes Russian translations for Siri Shortcuts (AppShortcuts.strings) and core UI components (Core.strings, Frontend.strings, Localizable.strings), enabling users to interact with the app via voice commands and view interface text in Russian.
Sources/App/Resources/ru.lproj · high confidence
Siri can now control the entity currently displayed in the app
Users can now use voice commands like 'turn this off', 'open this', or 'add this to CarPlay' to act on the smart home entity currently shown in the app's more-info dialog, rather than having to name the device again. This is achieved by publishing specific App Intents identifiers that map the on-screen entity to Siri's resolution system, supporting various entity types such as lights, thermostats, locks, and covers.
Sources/App/Frontend/OnscreenEntity · high confidence
Siri can now read live entity states
Users can ask Siri for the current status of Home Assistant entities (such as lights, sensors, or switches) via the new "Get entity state" App Intent. Siri returns a spoken answer accompanied by a visual card showing the entity's name, formatted state, and contextual location (floor, area, device). This capability relies on a new set of App Intents and entity types in the \EntityState\ extension, which expose voice-readable entities filtered to user-facing devices in rooms, ensuring that Siri suggestions remain relevant and safe for querying.
Sources/Extensions/AppIntents/EntityState · high confidence
Siri integration for Home Assistant calendars and reminders
Users can now manage Home Assistant calendars and to-do lists via Siri and Apple Intelligence on iOS 27. This adds schema entities and intents for creating, updating, and deleting calendar events, as well as creating and deleting reminders. The implementation respects per-server and per-entity exposure settings, allowing users to control which calendars and lists Siri can access. It also includes Spotlight indexing for calendar events and handles Home Assistant's specific API limitations, such as ignoring attendee data for events and resolving reminder lists when multiple are available.
Sources/App/Utilities/AppIntentSchemas · high confidence
Siri integration for entity controls and quick-access destinations
Users can now control Home Assistant entities and add them to quick-access surfaces (Apple Watch, CarPlay, Mac toolbar) via Siri and Shortcuts. A new "Add entity to" intent lets you add an entity to these destinations directly from voice or shortcut commands, while the app now donates control intents (turn on/off, open/close, lock) to Siri and Spotlight based on your frontend activity, enabling voice suggestions for actions you frequently perform.
Sources/App/Utilities/AppIntents · high confidence
Support for Home Assistant Live Activities on iOS
The app now supports Home Assistant Live Activities on iOS 17.2+, allowing real-time updates for timers and progress tracking directly on the Lock Screen and in Dynamic Island. This change introduces a new command handler that processes \live\_activity\ and \live\_update\ notification payloads, parsing fields such as progress, chronometer, and custom colors to update the activity state. It also includes logic to handle hand-offs from the push notification extension to the main app, ensuring Live Activities can be started and updated reliably even when the app is not in the foreground.
Sources/Shared/Notifications/NotificationCommands · high confidence
Support for controlling entire areas by domain and enhanced entity state rendering
Users can now control all entities of a specific type within a named area (e.g., "Living room lights") via voice commands or widgets, using the new AreaTarget model which groups entities by domain and area. This change also introduces detailed capability models for climate, cover, fan, and light entities, enabling more precise controls on CarPlay and Apple Watch. Additionally, datetime sensor states are now formatted into human-readable relative or absolute dates instead of raw ISO strings, and entity icons are resolved to match the frontend's logic for better visual consistency.
Sources/Shared/Domain · high confidence
Support for dynamic notification actions and custom categories
The Notification Content Extension now supports dynamic, per-notification actions and custom icons. This is enabled by adding a 'DYNAMIC' category to the extension's Info.plist, which allows notifications to include interactive action buttons (such as replies) and custom metadata like icons and colors, as demonstrated by the new test payloads for camera, map, communication, and dynamic notification types.
Sources/Extensions/NotificationContent/Resources · high confidence
Support for kiosk commands and custom notification icons in push payloads
The SharedPush module now parses and forwards kiosk control commands (set brightness and set volume) via the 'level' and 'volume' fields in push payloads, allowing remote device management. It also supports custom notification icons for automations by processing icon-related data keys, and handles attachments for images, videos, and audio. This change introduces the LegacyNotificationParser to handle these specific payload structures, ensuring that these new command types and visual customizations are correctly interpreted and passed to the client application.
Sources/SharedPush · high confidence
Turkish localization for app shortcuts and core components
The app now includes Turkish language support for app shortcuts (such as opening or closing entities) and core UI components (including states, device types, and frontend panels). This allows Turkish-speaking users to interact with Siri shortcuts and view standard interface elements in their native language.
Sources/App/Resources/tr.lproj · high confidence
Watch complications now fetch live data directly from the server
The watch app no longer relies solely on the iPhone to relay state changes for complications. A new \ComplicationStateFetcher\ allows the watch to perform its own REST API requests to Home Assistant, including handling authentication, mTLS, and timeouts. This enables the \WatchComplicationSnapshotPoller\ to refresh complication data every 5 seconds while the complication is visible, ensuring values stay current and preventing the face from freezing on stale data. The system also supports rendering custom templates directly on the watch and provides credentials to the widget extension for independent self-fetching.
Sources/WatchApp/Complication · high confidence
WatchOS REST API client and request relay logic
A new REST client (\HomeAssistantRESTClient\) and centralized request performer (\ServerRequestPerformer\) have been added to the shared API layer. This enables the watchOS app to communicate with Home Assistant via HTTP instead of WebSockets, which are restricted on watch hardware. The implementation includes logic to relay requests through the paired iPhone when available, handles bearer token timeouts with specific limits, and improves logging to distinguish between relayed and direct watch requests.
Sources/Shared/API/REST · high confidence
iOS 18 Control Center widgets and Spotlight entity indexing
The widget extension now supports iOS 18 Control Center controls (such as Assist, Light, Switch, Cover, Fan, Automation, Script, Scene, and Button) alongside the existing home screen widgets, and introduces a new Spotlight entity index that allows users to search for and open Home Assistant entities directly from system search results.
Sources/Extensions/Widgets · high confidence
iOS 18+ Dynamic Island toast notifications
On iOS 18 and later, the app now displays non-interactive toast notifications in the Dynamic Island area to indicate status changes, such as transaction success or failure. These toasts appear as a top overlay that does not block touches to the underlying content, automatically adapting their width and height based on the device's horizontal size class and whether a Dynamic Island is present. The implementation ensures that the toast window does not interfere with kiosk mode or other status bar visibility settings by respecting the app's current status bar state when the toast is dismissed.
Sources/Shared/Toast/DynamicIslandToast · high confidence
Removals
Removal of legacy UI test suite
The legacy \HomeAssistantUITests\ test class has been removed from the project. This deletion eliminates the previous UI testing infrastructure, which was previously used for automated screenshots and integration with iTunes Connect (iTC), in favor of the current screenshot and testing automation approach.
HomeAssistantUITests · high confidence
Removed legacy iOS starter template files
The default \AppDelegate\, \FirstViewController\, and \SecondViewController\ files that were part of the initial Xcode project template have been removed from the HomeAssistant iOS application. These files contained only boilerplate code and were not part of the functional Home Assistant integration, so their deletion cleans up the codebase without affecting user-facing features.
HomeAssistant · high confidence
Architecture
Centralized complication rendering context for watch, editor, and widgets
A new \ComplicationRenderContext\ struct has been introduced to centralize the resolution of complication data (values, units, fractions, icons, and slot texts) for the Apple Watch face, the in-app editor preview, and iPhone lock-screen widgets. This ensures that all three surfaces render identically by deriving rendering inputs from a single \WatchComplicationConfig\ and live entity state, handling gauge fractions, template formula resolution, and color tinting in one place.
Sources/Shared/Watch/Complications · high confidence
Extract design system into HADesignSystem SPM package
The shared design system has been extracted into its own Swift Package Manager (SPM) package, HADesignSystem. This change introduces a new ServersPickerPillList component for selecting servers via a horizontal pill interface and establishes HADesignSystemExports to re-export dependent packages (HAIconic, HAModels, HANetworking, HAWatchCommunicationMessages, and HAUtilities on iOS), ensuring that existing code importing the original Shared module continues to resolve symbols without modification.
Sources/Shared/DesignSystem · high confidence
Extracted Apple Watch communication message models into a dedicated package
The watch-to-phone communication protocol has been formalized by extracting message definitions into the new HAWatchCommunicationMessages package. This introduces structured payloads for the Assist pipeline (including audio chunking with backpressure, text input, and on-device TTS), database mirroring, vacuum area queries, and HTTP request relaying. It also defines the wire identifiers for interactive and guaranteed messages, establishes protocol versioning (current version 4) to manage capability negotiation, and sets explicit payload size limits to prevent WatchConnectivity transfer failures.
Sources/HAWatchCommunicationMessages · high confidence
Generated Swift localization and resource accessors
The app now uses SwiftGen to generate type-safe Swift wrappers for localized strings and plist configuration values. This change introduces generated enums (CoreStrings, FrontendStrings, L10n) and helper extensions that provide compile-time access to UI text and bundle metadata, replacing previous manual or less structured localization access patterns.
Sources/Shared/Resources/Swiftgen · high confidence
Migrate build configuration to xcconfig files
Build settings such as code signing, deployment targets, and optimization flags are now managed through dedicated xcconfig files (HomeAssistant.xcconfig, HomeAssistant.debug.xcconfig, HomeAssistant.release.xcconfig) instead of being embedded in the project file. This change centralizes configuration, allowing for easier management of different build schemes and development teams, and introduces a mechanism for local overrides via an ignored HomeAssistant.overrides.xcconfig file.
Configuration · high confidence
Behavioural changes
1 commit (0 fixes) modifying icons/OldIcons
A change to existing behaviour in icons/OldIcons — 1 commit, 9 files.
icons/OldIcons · medium confidence · unverified
8 commits (1 fix) modifying Configuration/Provisioning
A change to existing behaviour in Configuration/Provisioning — 8 commits (1 fix), 26 files.
Configuration/Provisioning · medium confidence · unverified
AI agent instructions reorganized into modular skills
The \.claude/skills\ file has been converted into a symbolic link pointing to \../.agents/skills\, indicating that the AI agent's instruction set has been moved to a new directory structure to support modular skills.
.claude · low confidence
Animated splash-to-screen transition replaces static launch screen
The app now uses a SwiftUI-based overlay to create a seamless visual hand-off from the system launch screen to the first app view. Instead of a static image, the splash logo morphs (animates position and crossfades) into the logo of the destination screen (such as the Stand By or Onboarding Welcome screens) before fading out. This transition is disabled on Mac Catalyst, where the overlay remains invisible, and includes a fail-safe timeout to ensure the app remains responsive if no destination logo is detected.
Sources/App/Container/LaunchSplash · high confidence
App configuration and resource updates
The app now includes Google Service configuration files for both debug and release builds, enabling Firebase and Google services integration. The Info.plist has been updated to support new capabilities including CarPlay scenes, Siri Intents for reloading widgets and running scripts, and various privacy usage descriptions for features like HealthKit, Focus status, and NFC. Additionally, the loading screen now uses an animated SVG logo, and a new JavaScript bridge (WebSocketBridge.js) allows the native app to persist frontend theme variables and control pinch-to-zoom behavior.
Sources/App/Resources · high confidence
App container and settings presentation rewritten in SwiftUI
The app's core container and settings presentation have been migrated from UIKit to SwiftUI. This introduces a new \AppContainerCoordinator\ to manage the web view and scene lifecycle, and a dedicated \AppSettingsPresenter\ that drives the settings sheet and server picker. Settings requested from the frontend are now pushed onto a navigation stack in compact layouts, while other entry points use a sheet. The server picker is integrated into the settings sheet at a medium detent, allowing users to switch servers without losing their place in settings. A new \AppPresentationDismisser\ ensures that incoming deep links and notifications clear all SwiftUI overlays (sheets, covers) to prevent them from being hidden behind existing UI.
Sources/App/Container · high confidence
Apple Watch complications rebuilt in SwiftUI with a modern entity/template builder
The Apple Watch complications settings have been completely rewritten in SwiftUI, replacing the previous Eureka-based controllers. This introduces a new 'Builder' flow for creating and editing modern complications, allowing users to select an entity or custom Jinja template as the data source, with a live, floating preview that stays visible while scrolling. The editor supports full customization of display templates, gauge and ring styles, icon selection with color picking, and column alignment. A new root screen organizes complications by group, supports duplication, and provides a manual reload button to push changes to the watch. Legacy ClockKit-era complications are still accessible via a separate list for backward compatibility.
Sources/App/Settings/AppleWatch/Complications · high confidence
Apple Watch home screen and configuration overhaul
The Apple Watch experience has been rebuilt to support a configurable home screen with List and Grid layouts, allowing users to add specific entities or browse entire areas directly from the watch. A new database mirror syncs server reference data (entities, devices, areas, and Assist pipelines) to the watch, enabling offline configuration and faster entity resolution. The home screen now displays sensors alongside controls, groups entities by device, and supports real-time configuration changes synced from the iPhone. Additionally, complication updates are now immediate via a dedicated refresh request, and notification snooze actions are synchronized to the watch.
Sources/Shared/Watch · high confidence
Assist recording view now uses animated bars instead of waves
The Assist recording interface has been updated to replace the previous wave animation with a new visual consisting of five animated vertical bars. These bars feature staggered, organic height animations and a soft background glow, while an instruction text fades out after two seconds to guide the user during the recording process.
Sources/App/Assist/Views · high confidence
Badge sensors that only report while the app is open
The Sensors settings list now visually distinguishes sensors that cease reporting once the app moves to the background. A new 'Foreground Only' badge appears next to the state of sensors like Camera Motion, Camera Stream, Kiosk Brightness, Kiosk Volume, and Kiosk Screensaver, clarifying that their values are static in the background rather than indicating a failure. This change also introduces a 'Toggle All' switch to enable or disable all sensors for a server at once, and adds a 'Labs' label to the Focus Name sensor row to indicate its experimental status.
Sources/App/Settings/Sensors/List · high confidence
Barcode scanner camera implementation migrated to SwiftUI
The barcode scanner's camera user interface has been rebuilt using SwiftUI, replacing the previous UIKit-based implementation. This change introduces a new view hierarchy (BarcodeScannerView, BarcodeScannerCameraView) and a dedicated data model (BarcodeScannerDataModel) to manage the camera session and preview stream. The scanner now displays a live camera feed with a centered scanning square overlay and includes a flashlight toggle button within the scanning area. The underlying camera logic remains AVFoundation-based, but the presentation layer is now fully integrated with the app's SwiftUI architecture.
Sources/App/BarcodeScanner · high confidence
Bluetooth permission screen migrated to SwiftUI
The Bluetooth permission request interface has been rebuilt using SwiftUI, replacing the previous UIKit implementation. This change introduces a new \BluetoothPermissionView\ and a dedicated \BluetoothPermissionViewModel\ to handle the CoreBluetooth authorization flow, while leveraging a shared \PermissionRequestView\ component for consistent UI presentation. Users will experience the same permission request behavior but with the underlying architecture aligned to the app's broader migration to SwiftUI.
Sources/App/PermissionScreen · high confidence
Brand logos now render as scalable vector images instead of missing font glyphs
The app now correctly displays brand icons (such as Matter, ESPHome, MQTT, and Music Assistant) by rendering their SVG paths directly as images, replacing the previous behavior where they appeared as missing characters due to being absent from the bundled icon font. This change also introduces a caching layer for icon rendering to improve performance and includes a migration system that automatically maps deprecated Material Design Icons names to their current equivalents.
Sources/HAIconic · high confidence
BuildTools package structure updated for SPM
The BuildTools package now includes an intentionally empty source file to serve as a pin for command-line build tools, reflecting the move of support modules to Swift Package Manager (SPM).
BuildTools · low confidence
Camera player now selects stream type based on reported capabilities
The camera player now queries the Home Assistant server for the specific streaming methods a camera supports (WebRTC, HLS, or MJPEG) via the \camera/capabilities\ websocket command. Instead of blindly attempting WebRTC first, the app builds a playback plan based on these reported capabilities, ensuring it uses the most appropriate stream type for each camera. This change also includes a new HLS asset loader that routes requests through the app's authenticated session, fixing playback issues for servers requiring client certificates or security exceptions.
Sources/App/Cameras/CameraPlayer · high confidence
CarPlay operations now have deadlines and error alerts
CarPlay actions (such as toggling lights or locks) now include a 10-second timeout and a dedicated error-alert system. If a command does not complete within the deadline, or if the server connection is lost, the driver sees a clear alert explaining the failure instead of the row remaining stuck in an "Executing…" state. This ensures the interface always settles and provides feedback even during network issues or server timeouts.
Sources/CarPlay · high confidence
Client event logging now uses local JSON files instead of GRDB
The app has switched its internal client event logging mechanism from a GRDB database to a local JSON file. This change, located in the ClientEvents model layer, is designed to prevent crashes and reduce UI lag during cold launches and when opening settings by avoiding database overhead. Events are now appended line-by-line to a shared JSON cache file, which is trimmed to a limit of 1000 entries to manage storage, ensuring smoother performance and greater stability for the logging system.
Sources/Shared/ClientEvents/Model · high confidence
Consistent entity context subtitles across all pickers and Siri intents
Entity pickers, configuration screens, and Siri-based App Intents now display a unified secondary context line (e.g., 'Floor • Area • Device') under entity names. This change introduces a shared \EntityContextSubtitle\ logic that ensures the same hierarchical context is shown whether you are selecting an entity in the app, configuring a widget, or using Siri, while intelligently avoiding redundant information like repeating the entity name as the device name.
Sources/Extensions · high confidence
Details widget now supports mirrored watch complications and script-based actions
The Lockscreen Details widget has been updated to render mirrored watch complications on the accessory rectangular family, displaying data like battery levels using the shared complication view. Additionally, the widget's action mechanism has migrated from legacy iOS Actions to a script-based system, allowing users to run scripts with an optional confirmation notification toggle. The widget has also been moved to the Lockscreen location and is now disfavored in the CarPlay widget gallery.
Sources/Extensions/Widgets/Lockscreen/Details · high confidence
Dynamic notification actions now adapt to platform capabilities
The app now registers notification categories with dynamic actions that are conditionally enabled based on the platform. On non-Catalyst devices, a 'Loading' action is included in the DYNAMIC notification category to support real-time updates, while this action is explicitly removed on Catalyst to prevent unsupported behavior. This change ensures that users on Catalyst do not see loading states for dynamic notifications, while other platforms retain this feedback mechanism.
Sources/App/Settings/Observation · high confidence
Enhanced notification handling with history, snoozing, and watch compatibility
The notification system now includes a persistent history of local and remote notifications, allowing users to review past alerts. Snoozed notifications are visually distinguished with a prefix and can be rescheduled locally while preserving dynamic actions. To fix Apple Watch text-input issues, notification actions are now split between system and app handling based on input type and authentication requirements. Additionally, duplicate action identifiers in payloads are automatically deduplicated, and debug notifications can be toggled via settings.
Sources/Shared/Notifications · high confidence
Entity picker now supports multiple selection and advanced filtering
The entity picker has been updated to allow selecting multiple entities, with a confirmation button appearing at the bottom of the list when multiple items are chosen. The interface now includes domain and area filters, as well as grouping options, enabling users to narrow down the list of available entities. A search field with fuzzy matching is automatically focused when the picker appears, and the view displays entities grouped by area or domain for easier navigation.
Sources/App/Settings/EntityPicker · high confidence
Estonian localization for app shortcuts and core components
The app now includes Estonian translations for Siri app shortcuts (such as opening/closing entities, dimming lights, and setting temperatures) and core UI strings for device states (like on/off, open/closed) and component titles (such as lights, locks, and cameras). This allows users interacting with the app via Siri or viewing device statuses in Estonian to see fully localized labels and actions.
Sources/App/Resources/et.lproj · high confidence
French localization for app shortcuts and core components
The French language resources now include translations for app shortcuts (such as turning entities on/off, dimming lights, and opening details) and core component states (like active, closed, or locked). This ensures that Siri shortcuts and system-level status messages display correctly in French.
Sources/App/Resources/fr.lproj · high confidence
Gauge widget now supports Home Screen (systemSmall) and design-system rendering
The Gauge widget has been updated to support the systemSmall family, allowing it to appear on the Home Screen in addition to the Lock Screen and Apple Watch. The widget's rendering has been migrated to the app's design system, ensuring consistent styling across platforms, and it now mirrors the circular complication view for Home Screen displays by applying a black background to maintain text visibility. This change also introduces a 'notify when run' toggle for script-based gauges, enabling users to receive confirmation notifications when a script is triggered from the widget.
Sources/Extensions/Widgets/Lockscreen/Gauge · high confidence
Generated Swift asset catalog wrapper for image resources
A new Swift file has been added to provide type-safe access to shared image assets (such as the logo, thread icon, and cloud badge) via the \Asset\ enum. This generated code replaces manual asset loading, ensuring consistent image retrieval across iOS, macOS, tvOS, and watchOS platforms while handling bundle resolution automatically.
Sources/Shared/Assets · high confidence
German localization for app shortcuts and core UI strings
The German language resource files (de.lproj) have been updated to include translations for app shortcuts (e.g., turning entities on/off, dimming lights) and core UI components (such as state labels like 'Active' or 'Closed', and panel titles like 'Apps' or 'Climate'). This ensures that users with German language settings see localized text for Siri shortcuts, system states, and main navigation panels.
Sources/App/Resources/de.lproj · high confidence
Improv device discovery and provisioning UI migrated to SwiftUI
The Improv onboarding flow for discovering and connecting to devices has been rewritten using SwiftUI. This change introduces a new \ImprovDiscoverView\ that manages the device scanning, selection, and Wi-Fi credential provisioning states. Users will experience this as the updated interface for setting up Improv-compatible devices, replacing the previous UIKit-based implementation with a modern, declarative UI structure.
Sources/Improv · high confidence
Improv views migrate to DesignSystem and SFSafeSymbols
The ImprovFailureView and ImprovSuccessView have been moved to the Sources/Improv/Views directory and updated to use the centralized DesignSystem class for spacing and corner radius values, replacing hardcoded constants. Hardcoded SFSymbol strings are replaced with SFSafeSymbols enums for safer icon usage, and the success view's button styling is simplified to use a standard .primaryButton style instead of custom background and shape modifiers.
Sources/Improv/Views · high confidence
Improved error messaging for App Intents
App Intents now display specific, user-friendly error messages to Siri and Shortcuts instead of generic failures. A new \ShortcutAppIntentError\ type ensures that localized error descriptions are correctly passed through to the user interface, providing clearer feedback when an action fails.
Sources/Shared/Intents/AppIntent · high confidence
Improved feedback and error handling for custom widget interactions
Custom widget interactions now provide immediate haptic feedback on both iOS and watchOS to confirm taps, and display local notifications if an action fails (e.g., server unreachable or intent execution error). The system also better manages confirmation states for split tiles and attempts to reflect state changes after toggles, reducing confusion when updates are delayed.
Sources/Extensions/Widgets/Custom/AppIntents · high confidence
Improved location data reliability and crash prevention
The location subsystem now sanitizes CoreLocation data to prevent crashes caused by invalid or non-finite values (such as those reported on iOS 14.5), ensuring that bad coordinates or accuracy metrics are replaced with safe defaults rather than causing application failures. Additionally, the one-shot location request mechanism has been refactored to safely handle main-thread requirements, preventing deadlocks and crashes when called from background threads or promise chains. The system also filters out implausibly small latitude/longitude values near zero, which were occasionally reported by older iOS versions, and applies stricter quality checks to location updates based on accuracy and age.
Sources/Shared/Location · high confidence
Improved notification attachment handling with error fallbacks
The notification system now includes robust error handling for attachments: if an image or camera snapshot fails to load, a generated error image is displayed instead of showing nothing. This ensures users always see visual context in notifications, even when network or API issues prevent the actual attachment from downloading.
Sources/Shared/Notifications/NotificationAttachments · high confidence
Improved panel update reliability and area deep-linking support
The app now handles panel data updates more robustly by cancelling pending requests when the app enters the background, preventing database write conflicts and crashes that previously occurred during suspension. Additionally, the system now automatically determines and stores the correct dashboard path for area deep-links, allowing widgets to navigate directly to specific areas without requiring an active connection.
Sources/Shared/Panels · high confidence
Improved webview reliability and Siri integration
The webview now detects and recovers from blank frontend renders by cleaning the cache and reloading, and displays a specific empty state for client certificate (mTLS) issues with an import flow. Siri integration is enhanced by exposing the current page and the entity shown in the more-info dialog, allowing Siri to act on the visible entity. A zoom transition is added for opening Assist from the frontend, and the app now respects cloud opt-outs when suggesting re-authentication URLs.
Sources/App/Frontend/WebView/WebViewController · high confidence
Improved webview reliability and gesture handling
The app now handles webview authentication failures more gracefully by rejecting pending \getExternalAuth\ requests when the app is in the background, preventing the webview from getting stuck on a "Reconnecting…" loader. Additionally, a new gesture handler allows users to perform actions like navigating back, opening pages in a browser, creating deeplinks, and switching servers directly from the webview, with light haptic feedback confirming each action.
Sources/App/Frontend/Extensions · high confidence
Introduce ActiveStateManager and restructure database update logic
The app now tracks macOS/macCatalyst active status (idle, locked, sleeping, etc.) via a new ActiveStateManager, allowing the app to adjust behavior based on system state. Additionally, the AppDatabaseUpdater has been refactored to process server updates sequentially in a queue, improving reliability and preventing concurrent database write conflicts.
Sources/Shared/Environment · high confidence
Introduce Vapor-based Push Server with APNS support and legacy notification parsing
The PushServer component has been re-implemented as a standalone Vapor application, replacing the previous Firebase integration. This new server handles push notifications via Apple Push Notification service (APNS) using configuration values such as APNS topic and keys, and includes a legacy notification parser to maintain compatibility with existing command types like camera controls, badge clearing, and location updates. The change introduces a new deployment model using Docker and includes comprehensive test coverage for the notification parsing logic and rate-limiting behavior.
Sources/PushServer · high confidence
Introduce connection security level selection in onboarding
The onboarding flow now includes a dedicated screen where users can choose between 'Most secure' and 'Less secure' connection security levels. This change replaces the previous local access permission prompt with a clearer security-level choice, defaulting to the most secure option. The implementation adds a reusable \SelectionOptionView\ component to handle the radio-button-style selection UI, ensuring consistent styling and accessibility across the app.
Sources/App/Onboarding/Steps/Permissions/Steps/LocalAccessAndNetworkInput/LocalAccess · high confidence
Introduce dedicated Assist audio recording and playback components
This change introduces new, dedicated components for handling Assist audio: \AudioPlayer\ manages TTS playback with robust audio session management (ensuring correct category/mode switching to prevent silence) and supports mTLS servers by downloading audio when streaming fails due to certificate requirements; \AudioRecorder\ handles microphone input on a background queue to avoid main-thread hangs, enforcing a 16kHz sample rate and emitting normalized audio levels for UI feedback; and a helper extension extracts audio data from Core Media sample buffers. These components replace ad-hoc audio handling to improve reliability for both on-device and server-based Assist interactions.
Sources/App/Assist/Audio · high confidence
Introduce shared background task management and watch background refresh scheduling
The app now uses a centralized \BackgroundTask\ system in the shared common layer to manage iOS background execution time, ensuring that critical operations like watch database mirrors, reminders sync, and legacy model cleanup are protected from suspension. This change introduces a new \WatchBackgroundRefreshScheduler\ to optimize watchOS background updates by aligning them with complication refresh windows, and adds a \DiskCache\ implementation for persistent data storage. Additionally, new URL helper extensions ensure widget deep links include authenticity tokens for secure handling.
Sources/Shared/Common · high confidence
Kiosk mode receives a comprehensive settings overhaul with new screensaver and sensor controls
The Kiosk settings interface has been restructured into a new, modular SwiftUI architecture, introducing dedicated views for screensaver customization, sensor management, and entry button appearance. Users can now configure a clock-style screensaver with adjustable size, boldness, and date display, as well as a dimming mode and an OLED-friendly pixel-shift option. A new Sensors section allows direct enabling or disabling of kiosk-specific sensors (mode, brightness, volume, and screensaver) from within the app. Additionally, the kiosk entry button is now fully customizable, allowing users to hide it, change its position to any corner, and adjust its background and icon colors, while authentication requirements and remote command confirmations remain configurable.
Sources/App/Settings/Kiosk · high confidence
Launcher app now starts via code instead of a nib file
The Launcher app's startup mechanism has been refactored from a nib-based (Application.xib) approach to a code-based implementation. This change introduces a new Info.plist and a LauncherAppDelegate that explicitly handles the application lifecycle in code, replacing the previous automatic nib loading. The launcher now programmatically checks if the main Home Assistant app is already running and, if not, opens it using NSWorkspace before terminating itself. This ensures the launcher remains a background-only process (LSBackgroundOnly=true) without a menu bar, while correctly managing the transition to the main application.
Sources/Launcher · high confidence
Location History screen migrated to SwiftUI
The Location History feature in Settings has been rewritten using SwiftUI. The list view now uses a reactive database observer to display entries, and tapping an entry opens a detail view that shows the location on a map along with debug information such as accuracy source (Wi-Fi, cell tower, or GPS) and region proximity. This change also includes the migration of the underlying data models from Realm to GRDB.
Sources/App/ClientEvents · high confidence
Location settings migrated to SwiftUI with redesigned zone cards
The Location settings screen has been rebuilt using SwiftUI, replacing the previous implementation. This update introduces a new horizontal scroll view for tracked zones, where each zone is displayed as a card featuring a static map snapshot, distance from the user, and a direct link to open directions in Maps. The settings view now consolidates location permissions, history, and update source toggles (zone, background fetch, significant location change, and push notifications) into a single, organized interface. Additionally, a dedicated list view allows users to see all zones and filter them by server if multiple servers are onboarded.
Sources/App/Settings/Location · high confidence
Mac window geometry is now remembered per window type
On macOS, the app now restores the size and position of every window (main, Assist, Settings, etc.) exactly where the user left it across launches. Previously, SwiftUI's WindowGroup lifecycle did not preserve window geometry, causing windows to reopen at default or overlapping positions; the new scene delegates and WindowScenesManager now track and re-apply each window's last frame, with the main window cascading when multiple instances are open and the Assist window using its own saved frame.
Sources/App/Scenes · high confidence
Markdown support and typing indicator in Assist chat
The Assist chat interface now renders markdown-formatted text in messages, with links automatically underlined for better visibility. Additionally, a new typing indicator state has been introduced, allowing users to see when the assistant is actively generating a response.
Sources/Shared/Assist · high confidence
Migrate Settings UI components to SwiftUI
The Settings screen components have been rewritten from the legacy Eureka form library to native SwiftUI. This migration introduces a shared list row for magic item configurations (Watch, CarPlay, widgets, and app icon shortcuts), a reusable section header for enabling row reordering, and a new YAML preview section that allows users to view, copy, and share configuration data. Additionally, notification identifier input fields now use a SwiftUI text field with built-in validation for category and action identifiers, and database result observation is handled by a new GRDB-based observer to replace the previous Realm implementation.
Sources/App/Settings/Components · high confidence
Migrate Siri shortcuts to App Intents
The app's Siri and Shortcuts integration has been migrated from the deprecated SiriKit framework to the modern App Intents system. This change introduces new intent implementations for core actions—Perform action, Fire event, Get camera snapshot, Assist prompt, Render template, Update location, Update sensors, and Open app settings—ensuring that existing shortcuts continue to work while providing improved reliability and cross-platform support on iOS and watchOS. Entity queries for servers, actions, cameras, and assist pipelines have been added to support dynamic parameter selection within these intents.
Sources/Extensions/AppIntents · high confidence
Migrate app data models to GRDB database
The app has replaced the legacy Realm database with GRDB for persisting core data such as app entities, zones, calendars, location history, and notification categories. This change improves database reliability and performance, ensuring that entity names, icons, and hidden states are resolved efficiently from the entity registry and that database updates are throttled to avoid excessive writes. Users will benefit from more stable data synchronization across servers and improved responsiveness when the app refreshes entity lists or location history.
Sources/Shared/API/Models · high confidence
Migrate app lifecycle from UIKit to SwiftUI
The app now uses the SwiftUI \App\ lifecycle (\HAApp\) instead of the traditional UIKit \UIApplicationDelegate\-based scene delegate model. This introduces a new \AppDelegate\ managed via \@UIApplicationDelegateAdaptor\ to handle legacy system events, while deep links, universal links, and app shortcuts are now routed through SwiftUI's \onOpenURL\ and \onContinueUserActivity\ modifiers. The migration also includes a new \LifecycleManager\ to coordinate background tasks, database suspension, and network connectivity, and replaces the old menu bar implementation with SwiftUI's \Commands\ protocol to improve performance and consistency on macOS and iPad.
Sources/App · high confidence
Migrate local data storage from Realm to GRDB and replace Reachability with Network framework
The app now uses GRDB instead of Realm for local data persistence, including a one-time migration script that imports existing zones, notification categories, and complications from the legacy Realm store into the new database. Additionally, network reachability detection has been switched from the ReachabilitySwift library to Apple's native NWPathMonitor, improving reliability and reducing external dependencies.
Sources/Shared/Common/Extensions · high confidence
Migrate local data storage to GRDB with expanded persistence
The app's local database engine has been replaced with GRDB, introducing a new persistent schema that stores Home Assistant calendars, calendar events, device and entity registries, frontend theme variables, Siri exposure settings, and Apple Reminders sync configurations. This migration also includes a new suspension-handling mechanism to prevent background crashes and drops several obsolete database tables.
Sources/Shared/Database · high confidence
New APNS-based push notification service with rate limiting
The push server has been rewritten in Vapor to use the APNSwift library for sending Apple Push Notification Service messages, replacing the previous implementation. This change introduces a new push notification endpoint that supports both encrypted and legacy notification payloads, and adds a rate-limiting mechanism backed by Redis (or in-memory storage) to prevent abuse, exposing a separate endpoint to check current rate limit status.
Sources/PushServer/Sources · high confidence
New Fastlane lane structure with improved CI upload diagnostics
The CI build and distribution process has been reorganized into a modular Fastlane lane structure (assets, build, localization, provisioning, quality, setup, testing, version). A key behavioral change is the introduction of specific error handling for Apple's \altool\ upload failures: the system now distinguishes between 'Xcode version no longer accepted' (error 90301/90534) and 'daily upload limit reached' (error 90382), providing actionable advice for each rather than generic retries. Additionally, the macOS build lane now includes notarization with retry logic and generates both Developer ID and App Store packages, while the iOS lane handles App Store uploads. Localization management has shifted to using the Lokalise API directly via HTTP requests instead of a CLI tool.
fastlane/lanes · high confidence
New SwiftUI-based Assist window view and model
The Assist window now uses a dedicated SwiftUI view (AssistWindowView) and a shared model (AssistWindowModel) to manage configuration such as server selection, preferred pipeline, and auto-start recording. This change introduces a new architectural component for the macOS Assist window, decoupling its state management and rendering from previous implementations to support fresh session initialization via a revision counter.
Sources/App/Assist/MacWindow · high confidence
New SwiftUI-based client event log view with filtering and search
The Client Events log in Settings has been rewritten as a native SwiftUI view, replacing the previous implementation. Users can now search through event logs and filter them by specific event types using a horizontal pill selector. The view supports pull-to-refresh to reload data and allows users to clear all stored client events via a confirmation dialog. Event details are displayed in a dedicated detail view with selectable JSON payload text.
Sources/App/Settings/ClientEventsLogView · high confidence
New URL handling, tag approval UI, and webview status bar controls
The app now supports a comprehensive set of deep-link actions via IncomingURLHandler, including calling services, firing events, sending location, opening cameras, navigating dashboards, and launching the Assist voice pipeline, with explicit confirmation dialogs for destructive actions like call\_service and tag execution. A new TagApprovalBottomSheet provides a user-facing confirmation flow for NFC tag actions. Additionally, the webview status bar now features configurable navigation buttons (back, forward, refresh, open in Safari, copy, paste) and a server picker, improving in-app web interface usability.
Sources/App/Frontend · high confidence
New data models for entity display, areas, floors, and usage predictions
The app introduces new model structures to support a streamlined entity registry and enhanced home layout context. \EntityRegistryListForDisplay\ replaces the previous full registry response with a lighter payload that includes display-specific details like \decimalPlaces\ (precision), \entityCategory\, and \areaId\, enabling more efficient database storage and display logic. Additionally, \HAAreasRegistryResponse\ and \HAFloorRegistryResponse\ are added to parse area and floor metadata (including floor levels and icons), providing the necessary context for floor-based UI features. A new \HAUsagePredictionCommonControl\ model is also added to handle usage prediction entity lists.
Sources/Shared/Models · high confidence
New dedicated screen to manage sensor permissions
Users can now view and manage the status of device permissions (such as location, motion, camera, microphone, Bluetooth, and focus) required by sensors through a new dedicated settings screen. This change introduces an opt-in model where permissions are requested only when a user enables a specific sensor, and provides a centralized list to check current permission states or redirect to system settings for those already decided.
Sources/App/Settings/Sensors/Permissions · high confidence
New entitlements configuration for iOS, Catalyst, and Watch targets
The iOS app now supports HealthKit background delivery, NFC tag reading, Siri integration, time-sensitive and communication notifications, and associated domains for my.home-assistant.io. Catalyst builds are configured with sandboxing, network, location, photo library, camera, audio, and file access permissions. Watch apps and widgets share application groups and keychain access. A build script dynamically enables critical alerts, push providers, Thread network credentials, CarPlay driving tasks, CarPlay voice conversations, and user-assigned device names based on build flags.
Configuration/Entitlements · high confidence
New gesture actions and native entity search
The app now supports new gesture actions including quick search, searching entities, searching devices, searching commands, and Assist, along with page navigation (back, next, open in browser, create deeplink) and server switching. Entity lookups in the app now use a local fuzzy search index that weighs name, device name, area name, domain, floor name, and entity ID, replacing previous search methods. The Areas service has been refactored to fetch area and floor data from the local database rather than making live API calls for entity mappings, improving performance and reliability.
Sources/Shared · high confidence
New launch screen and updated permission descriptions
The app now uses a dedicated launch screen storyboard that positions the logo above the center and displays the Open Home Foundation branding at the bottom. Additionally, the app includes new localized strings for permission usage descriptions, covering location (always and when in use), motion, Siri, photo library, local network, NFC, camera, and cross-website tracking, ensuring users are informed about why these permissions are required.
Sources/App/Resources/Base.lproj · high confidence
New modular onboarding authentication steps
The onboarding authentication flow has been restructured into distinct, composable steps (Connectivity, Register, Device Naming, Sensors, Models, Notify, and Auth Config) to improve clarity and maintainability. This change introduces specific behaviors such as improved SSL certificate trust handling during connectivity checks, a new step to prompt users for a device name if it conflicts with existing registrations, and explicit registration of sensors and models after authentication.
Sources/App/Onboarding/API/Steps · high confidence
New privacy and permission configuration screens for onboarding
The onboarding flow now includes dedicated screens to configure location and sensor privacy settings when adding a new server. Users are explicitly asked to choose how much location data (exact, zone-only, or never) and sensor data (all or none) is shared with the server, ensuring these choices are made intentionally rather than relying on defaults. The flow also handles local access permissions, home network identification (SSID or hardware address), and skips local network configuration steps if an HTTPS URL is already available for the server.
Sources/App/Onboarding/Steps/Permissions · high confidence
New webhook networking layer with encrypted payloads and retry logic
The webhook networking implementation has been replaced with a new architecture that encrypts outgoing payloads using the server's webhook secret (via the Sodium library) and decrypts incoming responses, ensuring data confidentiality. The system now includes automatic retry logic for network failures (up to 3 attempts with a 2-second delay) and persists webhook requests to disk to survive app crashes or background termination. Additionally, specific response handlers have been introduced to process location updates, service calls, and Apple Watch complication data, with the latter now persisting rendered templates to the local GRDB database instead of relying on legacy ClockKit synchronization.
Sources/Shared/API/Webhook/Networking · high confidence
Notification service extension now records history and handles missing API gracefully
The NotificationService extension now records incoming remote notifications to the notification history store (excluding Live Activities) and gracefully handles cases where the Home Assistant server or API is unavailable by skipping remote decoration and returning the original content. This ensures notifications are preserved for history tracking even when offline or when the API connection is optional, while still allowing local decoration via NotificationSenderParser when remote data is not accessible.
Sources/Extensions/NotificationService · high confidence
Notification settings and configuration migrated to SwiftUI
The notification settings interface has been rebuilt using SwiftUI, replacing the previous implementation. This update introduces a new Notification History view to track past notifications, a dedicated Debug screen for managing push IDs and rate limits, and a redesigned Category and Action editor for configuring actionable notifications. Users can now manage snooze durations, customize notification sounds, and view rate-limit status directly within the app's settings.
Sources/App/Settings/Notifications · high confidence
Onboarding UI overhaul with new reusable view scaffold and certificate import
The onboarding experience has been redesigned with a new \BaseOnboardingView\ scaffold that standardizes the layout (illustration, title, descriptions, and action buttons) and includes automatic keyboard handling to prevent text fields from being obscured. A new \ClientCertificateOnboardingView\ allows users to import \.p12\ or \.pfx\ client certificates during setup, including password prompts and error handling. The \OnboardingErrorView\ has been updated to use \ShareLink\ where available and includes a more robust documentation URL generator. Additionally, several views have been reorganized from \Screens\ to \Views\ for better structural clarity, and a \MacOnboardingSheetFrame\ helper ensures proper sizing on Catalyst.
Sources/App/Onboarding/Views · high confidence
Onboarding flow rewritten in SwiftUI with improved navigation and certificate handling
The onboarding container has been migrated from UIKit to SwiftUI, introducing a \NavigationStack\-based flow that manages steps like server selection, login, device naming, and permissions. This change adds support for mTLS client certificate imports via a sheet on iOS and a dedicated page on macOS, while fixing issues with manual URL entry not presenting the webview and ensuring the onboarding window dismisses cleanly after completion without view-leakage.
Sources/App/Onboarding/Container · high confidence
Pre-commit hook auto-corrects code formatting
A new pre-commit hook has been added to automatically run \fastlane autocorrect\ on staged files before each commit. This ensures code is consistently formatted by re-staging any changes made by the autocorrect process. The hook includes logic to handle PATH issues for GUI clients like Xcode or GitHub Desktop and prevents commits if staged files have unstaged local changes, requiring developers to stage the entire file or run the correction manually first.
.githooks · high confidence
Rebuilt Apple Watch communication and sync engine
The Apple Watch integration has been rebuilt to improve reliability and performance. The new \WatchCommunicatorService\ replaces the previous dependency, implementing direct watch-to-home-assistant execution for actions and magic items with an iPhone fallback. It introduces chunked audio uploads for Assist, allowing on-device speech recognition and text-to-speech settings to be applied directly on the watch. Database synchronization is now handled via a pipelined mirror transfer system to keep watch data fresh without requiring the app to be foreground. Additionally, the engine supports receiving diagnostics archives from the watch and handles guaranteed message delivery for configuration updates even when the iPhone is not immediately reachable.
Sources/Watch · high confidence
Redesigned Assist interface with on-device speech settings
The Assist feature has been updated with a new native SwiftUI interface, including a redesigned chat view with a voice orb and input row, and a dedicated settings screen. Users can now configure an Assist start mode (auto, voice, or text) and enable a mute TTS toggle for text-only responses. Additionally, a new Labs section in settings allows enabling on-device speech-to-text and text-to-speech, with options to select the STT locale and TTS voice on iOS 17+.
Sources/App/Assist · high confidence
Redesigned Magic Item editor with split tap behaviors and icon picker
The Magic Item customization screen has been rebuilt to align with the frontend's action editor. It now features a dedicated IconPicker for selecting icons and colors, and splits widget interactions into separate 'tap behavior' (for the tile body) and 'icon tap behavior' (for the icon itself), allowing distinct actions for each. The editor also supports configuring navigation paths, URLs, server actions, Assist pipelines, and scripts, with behavior options dynamically filtered by the entity's supported features.
Sources/App/Settings/MagicItem/Edit · high confidence
Redesigned connection and authentication empty states with animated loading logo
The app now uses a unified, styled empty-state UI for connection errors, re-authentication, and client certificate issues, replacing the previous generic loading spinner. This includes a new animated SVG loading logo on the stand-by view that reliably resumes after suspension, a redesigned connection error details view with connectivity checks, and a server selection picker. The empty states now support multiple authentication styles (disconnected, unauthenticated, recovered server, client certificate required/rejected) with specific icons, messages, and action buttons, and gestures are available on the stand-by view to interact with the web frontend.
Sources/App/Frontend/WebView/Views · high confidence
Redesigned gesture configuration interface with search and confirmation
The gesture settings screen has been rebuilt in SwiftUI to provide a more structured and user-friendly configuration experience. The new interface groups gestures by direction (left, right, up, down) and includes a dedicated reset button that requires confirmation to prevent accidental changes. Additionally, the gesture action picker now supports search functionality, allowing users to quickly find specific actions within categorized lists, and displays icons and subtitles for better clarity.
Sources/App/Settings/Gestures · high confidence
Redesigned onboarding welcome and invitation screens
The onboarding flow now features completely rewritten SwiftUI views for the initial welcome and server invitation steps. The new Welcome screen presents a cleaner layout with a dedicated 'Learn More' button that opens the Home Assistant Companion documentation in a web view, replacing the previous navigation pattern. The new Invitation screen displays the server URL in a styled, privacy-protected capsule with a security warning, and includes explicit Accept/Reject actions with loading state feedback. These changes improve the visual consistency of the onboarding experience and fix previous issues with long URL display and manual URL entry presentation.
Sources/App/Onboarding/Steps/Welcome · high confidence
Redesigned sensor detail configuration with batch credential saving
The sensor detail view has been rebuilt in SwiftUI to support a richer set of configuration controls, including sliders, numeric fields, option pickers, and steppers. A key behavioral change is how credential settings are handled: instead of saving immediately, credentials are now edited in a draft buffer and committed all at once via a dedicated Save button, preventing partial or accidental saves. The view also includes a direct link to Focus name configuration for the relevant sensor type.
Sources/App/Settings/Sensors/Details · high confidence
Redesigned watch complication layouts with modern rendering and color support
The watch face complications have been updated to use a new rendering engine that fixes previous issues with blank displays, incorrect text colors, and layout errors. Circular complications now support open arcs or full capacity rings with min/max labels, while corner complications properly curve text along the edge and handle icons without blanking out. Rectangular complications now display progress bars with value tracking and support custom text colors for titles, values, and subtitles. Inline complications continue to show name and value on a single line. These changes ensure that built-in Home Assistant and Assist complications render correctly alongside user-configured ones, with improved handling of legacy layouts and color application.
Sources/WatchWidgets/Complications · high confidence
Redesigned widget gallery previews and tile interaction model
The widget gallery now displays static, localized mock data instead of attempting to load live entities, ensuring fast and consistent previews without database or network access. Widget tiles have been redesigned to support split interactions on iOS 17+, allowing the icon and the tile body to trigger different actions, and introducing a new confirmation flow for sensitive actions. The visual style has been updated to align with the Home Assistant frontend, including support for custom colors, icon backgrounds, and area labels.
Sources/Extensions/Widgets/Common · high confidence
Removal of local Xcode scheme management file
The user-specific Xcode scheme management file (xcschememanagement.plist) for the developer account has been deleted. This file previously contained local configuration for scheme ordering and buildable item suppression; its removal indicates a shift away from storing these personal IDE preferences in version control, likely to prevent conflicts when multiple developers work on the project.
HomeAssistant.xcodeproj/xcuserdata · high confidence
Removed legacy storyboard-based app initialization
The app no longer uses the default \Main.storyboard\ and \LaunchScreen.storyboard\ files for its initial UI setup. These files, which previously defined a tab bar controller with placeholder 'First' and 'Second' views, have been deleted, indicating a shift away from storyboard-based interface definition for the app's entry point.
HomeAssistant/Base.lproj · high confidence
Reorganized settings into objective-based groups with search support
The Settings interface has been restructured to group options by user intent (e.g., Customize Experience, Stay Informed, Quick Access) rather than technical categories. This change introduces a global search feature that indexes specific rows within each settings screen, allowing users to quickly find options like server switching or notification preferences. The layout also includes a new sidebar for macOS and a dedicated section for App Labs experiments.
Sources/App/Settings/Settings · high confidence
Replaces external Communicator pod with in-house WatchConnectivity layer
The app now uses a new internal \WatchConnectivityManager\ to handle all communication between the iPhone and Apple Watch, replacing the previous \Communicator\ pod. This change introduces a structured connectivity layer with specific message types (immediate, guaranteed, and large blobs), a priority-based send queue to prevent race conditions during bursts, and improved error handling for reachability and timeouts. Existing code continues to work via a compatibility alias, but the underlying implementation is now fully in-house, allowing for better control over sync reliability and state management.
Sources/Shared/Watch/Connectivity · high confidence
Rewrite NFC tag reading and writing with SwiftUI and CoreNFC
The NFC settings screens have been rebuilt using SwiftUI, replacing the previous implementation. This change introduces a new NFC reader and writer that leverage the CoreNFC framework to handle tag interactions, including reading tag identifiers and writing new tags. A key behavioral update is that writing tags now includes an Android Application Record (AAR) alongside the URI payload, ensuring better compatibility with Android devices. The UI now provides a dedicated list for managing allowed tags, supports manual entry of tag identifiers for writing, and displays a YAML example for Home Assistant integration on the tag detail view.
Sources/App/Settings/NFC · high confidence
Rewritten onboarding authentication flow with mTLS support
The onboarding API layer has been completely rewritten to use SwiftUI and a modular, step-based authentication architecture. This new flow introduces native mTLS (mutual TLS) support, automatically detecting when a server requires a client certificate and prompting the user to import it during the connection phase. The login process now uses an in-app WKWebView that intelligently handles redirects, ensuring the stored server URL reflects the actual port and scheme used after authentication. Additionally, the system now supports Bonjour (mDNS) discovery for local Home Assistant instances and implements a robust, promise-based step sequence (pre-auth, register, post-auth) that ensures privacy settings and server configuration are handled correctly, even when adding multiple servers.
Sources/App/Onboarding/API · high confidence
Sensor entities now include area, device, and floor context for Siri and App Intents
The Sensor App Entity now exposes area, device, and floor metadata alongside the sensor's name and ID. This allows Siri and other App Intents consumers to see and filter sensors by their physical location context (area, device, floor) rather than just by name or server. The entity query respects the server selection made during configuration, ensuring that suggested entities are scoped correctly to the chosen server.
Sources/Extensions/AppIntents/Sensor · high confidence
Server deletion cleanup and networking localization support
When a server is removed from the app, the system now explicitly revokes its authentication token, disconnects the network connection, and clears associated data including sensor selections, Siri exposures, and frontend theme variables. Additionally, localized display strings for connection security levels, URL types, server location/sensor privacy settings, and token/network errors are now provided for the HANetworking package, and a convenience method allows looking up a server by identifier with an optional fallback.
Sources/Shared/API/Authentication · high confidence
Spanish localization for app shortcuts and core UI components
The app now provides Spanish translations for Siri Shortcuts (App Shortcuts) and core interface elements, including component states (e.g., lights, locks, climate), frontend panel labels (e.g., Dashboard, Energy, Map), and system permission descriptions (e.g., location, camera, microphone). This ensures that users interacting with the app via Siri or viewing the main interface in Spanish see consistent and accurate terminology for device states and navigation.
Sources/App/Resources/es-ES.lproj · high confidence
Spanish localization for app shortcuts and core components
The Spanish (es.lproj) language resources have been populated with translations for app shortcuts (such as turning entities on/off, dimming lights, and opening details) and core component states (including binary sensors, covers, locks, and climate entities). This ensures that Siri shortcuts and fundamental UI states display correctly in Spanish.
Sources/App/Resources/es.lproj · high confidence
Switch and Light widgets now support input\_boolean, context details, and custom display text
The Switch and Light widget controls have been reorganized into a unified Controls directory and enhanced with several configuration options. Switch widgets now support input\_boolean entities in addition to standard switches, allowing users to control a broader range of Home Assistant entities via Siri and widgets. Both widget types now display area, device, and floor context in entity pickers to help users identify the correct device. Users can also provide a custom display text for the widget label, overriding the default entity name, and configure separate icons for the on and off states for lights. Additionally, the widgets now wait for network information to refresh before performing intents to ensure reliable connectivity.
Sources/Extensions/Widgets/Controls/Switch · high confidence
Thread credentials management UI and API integration updates
The Thread credentials management views have been refactored to use the SFSafeSymbols library for icons and the DesignSystem class for styling, replacing hardcoded values and SwiftGen usage. Additionally, the underlying API calls in the credential management and sharing view models now use optional chaining on the server API connection to prevent crashes when the connection is unavailable, and the views no longer require an explicit iOS 16.4 availability check.
Sources/Thread · high confidence
Unified MagicItem model with entity toggling and server migration
The MagicItem system has been refactored to support a unified item type across Watch, Widgets, and CarPlay, introducing new capabilities such as entity toggling (where tapping an item intelligently calls the appropriate 'on' or 'off' service based on current state), folder support for grouping items, and Assist integration. The update also includes automatic migration logic that re-points items to valid servers if a server ID becomes invalid (e.g., after a server is removed and re-added), ensuring configuration stability.
Sources/Shared/MagicItem · high confidence
Updated Xcode project schemes for new extension targets and build configurations
The Xcode project schemes have been updated to include build and launch configurations for new app extensions, specifically Matter, Intents, and Widgets, alongside existing ones like Notifications and Share. The main App scheme now explicitly enables code coverage for the Shared framework and specific test bundles, and includes command-line arguments for Firebase and DebugSwift debugging. Additionally, a new Launcher target scheme has been added, and the Shared-iOS scheme has been adjusted to exclude the app from its build actions, focusing instead on the framework and its associated tests.
HomeAssistant.xcodeproj/xcshareddata · high confidence
Watch app background reliability and diagnostics improvements
The watch app now maintains active background sessions for Assist commands and database synchronization when the wrist is down, preventing interruptions during critical operations. Additionally, the diagnostics export feature has been rewritten to build the archive eagerly on a dedicated thread rather than lazily, resolving hangs in the share sheet on watch hardware. A new state poller also ensures entity data remains fresh on-screen by polling the API at regular intervals, compensating for the lack of WebSocket support on the watch.
Sources/WatchApp/Utilities · high confidence
WebView reliability, security, and Mac interface improvements
The web view now handles client certificates (mTLS) by prompting the user to import a certificate when the server requires or rejects one, and prevents clipboard writes from ingress panels (like Music Assistant) from silently failing by bridging the write to the native pasteboard. Performance on plain HTTP LAN connections is improved by disabling WebKit's Enhanced Security heuristics, which previously forced a hardened process that slowed down dashboards. The Mac toolbar is now customizable via a dedicated settings screen, and the title bar is fully customizable. Additionally, the web view's reconnection logic has been reworked with a backoff strategy, and the app restores the last used server and path on cold launch.
Sources/App/Frontend/WebView · high confidence
Widget extension configuration and resource initialization
The widget extension now includes its foundational resource bundle and configuration. The Info.plist declares support for Live Activities and frequent updates, and enables arbitrary network loads via NSAllowsArbitraryLoads to ensure connectivity. Additionally, the asset catalog is initialized with a WidgetBackground color set that adapts to light and dark system backgrounds.
Sources/Extensions/Widgets/Resources · high confidence
Xcode project configuration updates
The Xcode project file (project.pbxproj) has been updated to reflect the ongoing migration of the Home Assistant iOS app to SwiftUI, the adoption of Swift Package Manager for dependencies, and various build configuration adjustments. These changes support the modernization of the app's architecture and user interface across iOS and watchOS platforms.
HomeAssistant.xcodeproj · medium confidence · unverified
ZoneManager refactored into modular components with improved region handling
The ZoneManager has been restructured into distinct components (Collector, Processor, RegionFilter, AccuracyFuzzer) to improve maintainability and fix stability issues. Region synchronization is now performed off the main thread to prevent UI hangs, and a new region filter prevents exceeding CoreLocation's monitoring limits by intelligently stripping distant zones. Additionally, accuracy fuzzing logic has been added to resolve edge cases involving overlapping zones and beacon region entries, ensuring more reliable zone detection.
Sources/App/ZoneManager · high confidence
iOS 18 Open Page widget now uses App Intents
The Open Page widget has been migrated from the deprecated SiriKit Intents framework to the modern App Intents system. This change enables the widget to function correctly on iOS 18 and later, ensuring that page selection and deep-linking to Home Assistant panels work as expected. The migration preserves existing widget configurations by mapping legacy intent parameters to the new \PageAppEntity\ structure, maintaining compatibility with previously created widgets while supporting the updated iOS 18 widget behavior.
Sources/Extensions/Widgets/OpenPage · high confidence
Fixes
Added script to fix Xcode 12.5 build issues for iOS and Watch App targets
A new build script has been added to resolve target platform issues encountered in Xcode 12.5. The script ensures that the necessary Info.plist files for the Home Assistant Launcher (iOS) and the Watch App (watchOS) are created in the build directory if they are missing, preventing build failures related to these specific targets.
Configuration/Scripts · high confidence
PromiseKit re-export for dynamic framework compatibility
A new Swift source file has been added to the PromiseKitDynamic product to re-export the PromiseKit and HAKit\_PromiseKit modules. This ensures that existing code using \import PromiseKit\ or \import HAKit\_PromiseKit\ continues to function correctly when the application links against this dynamic framework instead of the static PromiseKit product, maintaining module visibility and symbol resolution through a single shared binary.
Sources/PromiseKitDynamic · high confidence
SwiftUI-based dynamic notifications with text input support on Apple Watch
The Apple Watch notification interface has been rewritten in SwiftUI to support dynamic content types (images, maps, and inline movies) and, crucially, to enable text-input actions (such as replying to messages) directly on the watch. Previously, watchOS would drop text-input replies for forwarded notifications; this change implements a custom text-entry flow that captures user input and sends it to Home Assistant via the paired iPhone or the watch's local API, ensuring replies work even when the phone is not immediately reachable.
Sources/WatchApp/Notifications · high confidence
Unified watch complication rendering with consistent colors and layout fixes
The watch complication views (circular, corner, inline, and rectangular) have been refactored to use a shared, target-agnostic rendering model, ensuring that the in-app editor preview matches the on-watch display exactly. This change fixes several visual issues: legacy rectangular complications now render with correct text colors and background handling, corner complications no longer render empty when an icon is present, and the default complication tint is now consistently applied as the Home Assistant brand blue (\#009AC7) across both the app preview and the watch face, resolving previous discrepancies where the watch showed the system default instead. Additionally, the rectangular progress bar now correctly applies the user-selected text color to the value thumb, and corner complication text respects the legacy flat/large style when appropriate.
Sources/HAWatchComplications · high confidence
Test coverage
Add SharedTesting framework with snapshot and mock utilities; Expanded test coverage for Assist, Areas, and App Icons; New server fixtures for testing connection security levels; Removed obsolete placeholder test file; Stable accessibility identifiers for onboarding and privacy flows.
Dependencies
Updated build and runtime dependencies
This change updates the project's dependency manifests and lockfiles to newer versions of key libraries and tools. The Swift Package Manager dependencies now pin Alamofire to 5.12.0, GRDB.swift to 7.8.0, HAKit to 0.4.18, and PromiseKit to 8.1.1, alongside updates to Firebase, Google, and other third-party libraries. The Ruby build toolchain has been updated to fastlane 2.236.1, and the Swift build tools now use SwiftFormat 0.53.1 and SwiftGen 6.5.1.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.
Score
- CAI 61 → 38 (-22.6)
- Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.
Lenses
- Code Health 88 → 88 (-0.7)
- Architecture 96 → 94 (-2.4)
- Maturity 57 → 57 (-0.1)
- Readiness 78 → 65 (-13.0)
- Security 53 → 70 (+16.7)
- Domain Modelling 67 → 66 (-0.7)
- Event-Driven 10 (new)
- Performance 60 (new)
Resolved (50)
- Change coupling: WatchConfigurationViewModel.swift ↔ MagicItemProvider.swift (Sources/App/Settings/AppleWatch/HomeCustomization/WatchConfigurationViewModel.swift)
- Change coupling: WatchConfigurationViewModel.swift ↔ WatchCommunicatorService.swift (Sources/App/Settings/AppleWatch/HomeCustomization/WatchConfigurationViewModel.swift)
- Change coupling: WebViewController.swift ↔ OnboardingAuthLoginViewModel.swift (Sources/App/Frontend/WebView/WebViewController/WebViewController.swift)
- Change coupling: WebViewController.swift ↔ WebSocketBridge.js (Sources/App/Frontend/WebView/WebViewController/WebViewController.swift)
- Duplicated block (10 lines × 2) (Sources/Extensions/AppIntents/Control/ControllableEntityAppEntityQuery.swift)
- Duplicated block (11 lines × 2) (Sources/Shared/API/REST/HomeAssistantRESTClient.swift)
- Duplicated block (18–19 lines × 2) (Sources/App/Notifications/NotificationManager.swift)
- Duplicated block (19 lines × 2) (Sources/Extensions/AppIntents/Control/ControllableEntityAppEntityQuery.swift)
- Duplicated block (8 lines × 2) (Sources/Extensions/Widgets/CommonlyUsedEntities/WidgetCommonlyUsedEntitiesTimelineProvider.swift)
- Duplicated block (8 lines × 5) (Sources/Extensions/AppIntents/Control/ControllableEntityAppEntityQuery.swift)
- Edited copy of a member (25 corresponding lines) (Sources/Shared/HATypedRequest+App.swift)
- High: security finding (details withheld)
- Hotspot: Sources/App/Notifications/NotificationManager.swift (Sources/App/Notifications/NotificationManager.swift)
- Hotspot: Sources/Extensions/AppIntents/Widget/Gauge/WidgetGaugeAppIntentTimelineProvider.swift (Sources/Extensions/AppIntents/Widget/Gauge/WidgetGaugeAppIntentTimelineProvider.swift)
- Hotspot: Sources/Extensions/EntityProvider+Details.swift (Sources/Extensions/EntityProvider+Details.swift)
- Hotspot: Sources/HANetworking/Sources/Server.swift (Sources/HANetworking/Sources/Server.swift)
- Hotspot: Sources/PushServer/SharedPush/Sources/NotificationParserLegacy.swift (Sources/PushServer/SharedPush/Sources/NotificationParserLegacy.swift)
- Hotspot: Sources/Shared/Common/Extensions/CLKComplication+Strings.swift (Sources/Shared/Common/Extensions/CLKComplication+Strings.swift)
- Hotspot: Sources/Shared/HAEntity+CarPlay.swift (Sources/Shared/HAEntity+CarPlay.swift)
- Low cohesion: WatchCommunicatorService (LCOM4 4) (Sources/Watch/WatchCommunicatorService.swift)
- …and 30 more
New (300)
- Asymmetric naming convention for inverse operations. One uses 'for' (input is value, output is percentage) and the other uses 'at' (input is percentage, output is value). While functionally clear, the prepositions are not parallel.
- CarPlayEntitiesListViewModel.sortedEntities (cognitive 16) (Sources/CarPlay/Templates/Entities/CarPlayEntitiesListViewModel.swift)
- Change-coupling hub: WatchConfigurationViewModel.swift → CarPlayConfigurationViewModel.swift, MagicItemProvider.swift, WatchCommunicatorService.swift (Sources/App/Settings/AppleWatch/HomeCustomization/WatchConfigurationViewModel.swift)
- Change-coupling hub: WebViewController.swift → WebViewControllerProtocol.swift, WebViewJavascriptCommands.swift, OnboardingAuthLoginViewModel.swift, WebSocketBridge.js (Sources/App/Frontend/WebView/WebViewController/WebViewController.swift)
- Documentation: no project overview (README.md)
- Duplicated block (10 lines × 2) (Sources/App/Settings/AppleWatch/HomeCustomization/FolderDetailView.swift)
- Duplicated block (10 lines × 2) (Sources/App/Settings/AppleWatch/HomeCustomization/WatchConfigurationView.swift)
- Duplicated block (10 lines × 2) (Sources/App/Settings/CarPlay/CarPlayConfigurationView.swift)
- Duplicated block (10 lines × 2) (Sources/App/Settings/Components/YamlPreviewSection.swift)
- Duplicated block (10 lines × 2) (Sources/Extensions/AppIntents/Control/LockAppEntityQuery.swift)
- Duplicated block (10 lines × 2) (Sources/Extensions/Widgets/LiveActivity/HALiveActivityCompactView.swift)
- Duplicated block (10 lines × 2) (Sources/SharedTesting/SnapshotTestingHelper.swift)
- Duplicated block (10 lines × 2) (Sources/WatchApp/Home/MagicItemRow/WatchAssistItemRow.swift)
- Duplicated block (10 lines × 2) (Sources/WatchApp/Home/WatchFolderContentView.swift)
- Duplicated block (10 lines × 2) (Sources/WatchApp/Home/WatchFolderContentView.swift)
- Duplicated block (10 lines × 3) (Sources/WatchApp/Home/EntityDetails/Cover/WatchCoverControlsViewModel.swift)
- Duplicated block (10 lines × 4) (Sources/App/Utilities/AppShortcuts/HomeAssistantAppShortcuts.swift)
- Duplicated block (10 lines × 5) (Sources/WatchApp/Home/Areas/WatchAreaEntitiesView.swift)
- Duplicated block (10 lines × 5) (Sources/WatchApp/Home/EntityDetails/Cover/WatchCoverControlsView.swift)
- Duplicated block (10–11 lines × 2) (Sources/App/Settings/MagicItem/Add/AssistPromptMagicItemView.swift)
- …and 280 more
Changes since last survey
- 98 commits — 89 feature/other, 9 fixes
By area
- Sources/App — 47 commits
- Tests/App — 16 commits
- Sources/Shared — 10 commits
- Tests/Widgets — 5 commits
- .github/workflows — 4 commits
- Sources/Extensions — 3 commits
- HomeAssistant.xcodeproj/project.pbxproj — 2 commits
- Sources/WatchApp — 2 commits
- Tests/Shared — 2 commits
- Tests/WatchAppTests — 2 commits
- .github/dependabot.yml — 1 commit
- Configuration/Provisioning — 1 commit
- Configuration/Version.xcconfig — 1 commit
- Sources/HADesignSystem — 1 commit
- Sources/HAWatchCommunicationMessages — 1 commit
Notable commits
- fix: Fix Focus sensor reporting off while a Focus is on (#5850)
- fix: Fix Mac build broken by frontend theme files (#5886)
- fix: Fix Mac build broken by the force close warning manager (#5800)
- fix: Fix app icon shortcuts showing entity ids instead of names (#5907)
- fix: Fix relayed watch requests running late and being reported as failed (#5890)
- fix: Fix suspension crashes and launch performance (#5799)
- fix: Fix synced shortcuts failing with "No server provided" (#5842)
- fix: Fix text input notification actions on Apple Watch (#5778)
- fix: Revert "Add an energy complication for Apple Watch" (#5868)
- change: Add Areas widget (#5782)
- change: Add an energy complication for Apple Watch (#5857)
- change: Add force close warning notification (#5747)
- change: Add missing workflow permissions (#5863)
- change: Add relevance_score to Live Activity payloads (#5916)
- change: Add “Open entity details” to app shortcuts (#5786)
- change: Adopt the calendar and reminders App Intent schemas (#5660)
- change: Allow main app internal URL logic to perform requests for watch (#5871)
- change: Apply on-device STT and TTS settings to Apple Watch Assist (#5897)
- change: Ask before using a Wi-Fi network as a server's home network (#5864)
- change: Ask for privacy choices when adding another server (#5866)
- …and 78 more
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
home-assistant/iOS was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 1 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit bc645debf6caaae32cff3d9c70c39e0f9e802374 — the exact code this score is about.
- Scored under rubric-2026.09.18 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-e569280dd5e2.