home-assistant / home-assistant/iOS
Legacy watch complications never update: update_complications no longer requests a template render
- Dominant language
- Swift
- Stars
- 2.4k
- Forks
- 520
- Avg merge
- 7h 27m
- Merged PRs (30d)
- 264
Description
**iOS device model, version and app version**
Model Name: iPhone 15 Pro (iPhone16,1), Apple Watch (Watch7,1)
Software Version: iOS 26.6.2, watchOS 26.6
App version: 2026.9.1 (2026.2985)
**Home Assistant Core Version**
2026.9.2
**Describe the bug**
After updating the app, my legacy Graphic Corner complication stopped updating. I edited its templates, saved, and tapped Reload Complications. I get the "Reload Sent" confirmation, but the watch face never changes. It still shows the values it had before the update. Re-entering the same templates, replacing them with something completely different, and reloading several times all made no difference.
The part that cost me the most time is that nothing indicates a problem. The editor accepts and saves the templates, the preview evaluates them correctly, and Reload Complications reports success every time.
I asked for help digging into why it never updates. I don't fully understand the answer, so I am quoting rather than presenting it as my own. It may save you some time:
> With debug logging enabled for mobile_app and websocket_api, an update_complications push reaches the phone and the phone calls back with get_config, but no render_template request is ever made, over the webhook or the websocket. In the app, HandlerUpdateComplications in NotificationsCommandManager.swift only calls Communicator.shared.transfer(HAWatchConnectivity.ComplicationInfo(content: [:])), and never builds the render_template request that WebhookResponseUpdateComplications.request(for:) produces. A legacy complication's face text is read from Data["rendered"], which only that request writes.
If that is right, a legacy complication can never receive new values, which matches what I am seeing.
**To Reproduce**
1. Have a legacy complication using Jinja templates on a watch face.
2. Edit one of its templates to something visibly different, and save.
3. Tap Reload Complications.
4. The face keeps showing the old value.
**Expected behavior**
Either the templates render and the face updates, or the app makes it clear that legacy complications no longer update.
**Screenshots**
**Additional context**
Contributor guide
Research direction
Start in NotificationsCommandManager.swift at HandlerUpdateComplications and trace the update_complications flow through the watch communication code. Compare it with WebhookResponseUpdateComplications.request(for:) and follow how a legacy complication reads Data["rendered"]. Done means editing a legacy complication template and reloading it causes the watch face to show the new value.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- ios, swift
- Domain
- mobile-dev
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Active
- Clarity
- Clearly specified
- Newbie friendliness
- 72/100