The settings main page exists from startup inside the closed dialog and
its IP timer always ran: networkInfo() spawns nmcli twice synchronously on
the GUI thread (~200 ms), stalling every animation. Poll only while the
page is visible. Also write the qt.alive heartbeat without QSaveFile's
fsync (bt-update only checks its mtime).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Splash: resources/splash/splash.gif built into the binary, played once by
SplashOverlay over a black cover present from the first frame (no UI
flash), then fades into the UI; hides icons loading. GIF, so no
QtMultimedia/gstreamer. Toggle: splash.enabled.
Banner (InfoBanner): metro-style band that fades/slides in with a hold
pictogram; text that does not fit runs as a seamless ticker for two
rounds. Never takes touches; hidden during splash and settings. Config
section banner (enabled, text, intervalSec, showSec, position,
accentColor), editable in the web UI and on-device settings; shown once
after saving.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>