home-assistant / home-assistant/iOS
Pull-to-refresh leaves a fixed gap at top of dashboard
- Dominant language
- Swift
- Stars
- 2.4k
- Forks
- 520
- Avg merge
- 7h 27m
- Merged PRs (30d)
- 264
Description
Model: iPhone 16
iOS: 26.6
App: 2026.7.4
Core: 2026.8.2
Describe the bug
Pull-to-refresh on any dashboard leaves a fixed empty gap at the very top
of the view. The UIRefreshControl / WKWebView contentInset does not reset
after the refresh completes. The offset region intercepts touches, so the
tiles/entities below it become unclickable until the app is force-quit.
100% reproducible on every pull-to-refresh.
To Reproduce
1. Open any dashboard (also reproduced on a fresh vanilla "Sections"
dashboard, core tile cards only, default "Home Assistant" theme).
2. Pull down to refresh.
3. A blank gap remains at the top.
https://github.com/user-attachments/assets/e1e03bed-9631-4f0f-89ae-70e6f998f899
Isolation already performed
- Reproducible on EVERY pull-to-refresh (not intermittent).
- Only in the Companion App; NOT reproducible in mobile Safari.
- Reproducible when connecting directly to HA over plain HTTP, with NO
reverse proxy in path (no NPM, no Cloudflare Tunnel, no mTLS) -> rules
out any network/proxy/TLS cause.
- Persists after: reinstall, Reset frontend cache, other themes,
Kiosk mode disabled, and on brand-new vanilla dashboards.
Related but separate: #3879 (stuck "Reconnecting", client-side) — pull-to-
refresh is the only recovery for that, which makes THIS gap bug worse.
Screen recording attached.
Contributor guide
Research direction
Start by reproducing the issue in the Companion App on an iPhone 16, then inspect the pull-to-refresh handling around UIRefreshControl and the WKWebView contentInset. The fix is complete when the top gap is removed after refresh and dashboard tiles remain clickable; verify this on a vanilla dashboard and the reported dashboard variants.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- swift
- Domain
- mobile-dev
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 55/100