Hi Satoer,
I found a reproducible performance issue in Dashboard Studio V2.0.11 when returning to the Viewer after the browser/window has been minimized or hidden.
Symptoms:
-
First load: about 15–18 seconds
-
After that the dashboard is fast
-
Minimize the browser/window and restore it
-
The Viewer freezes again for about 14–15 seconds
-
Same behaviour in Chrome and Edge
-
Browser cache on/off makes no difference
I captured both a Chrome Performance Trace and a HAR.
The trace shows two dominant main-thread blocks:
-
17.984 s during initial state processing
-
14.642 s immediately after visibility changes back to visible
The second block starts about 199 ms after the page becomes visible again.
The dominant call path is:
→ drivers/homey.js
→ _applyStateSnapshot
→ applyLocalTopicPayloadBatch
→ dispatchForMap
→ _widgetIdsForTopic
→ TextWidget.get config
→ WidgetBase.get config
→ typography/config processing
In the trace, _widgetIdsForTopic accounts for roughly 32.79 seconds of the 36 second profile.
The main issue seems to be dynamic Text widgets. During the state snapshot, Dashboard Studio repeatedly checks dynamic topic interests and ends up resolving this.config over and over again for every topic × dynamic Text widget.
In my dashboard there are:
-
702 widgets total
-
323 widgets with bindings
-
125 Text widgets with a dynamic text binding
-
142 different binding topics
The hot path appears to include:
_markdownTemplateSources(this.config)
inside the Text widget topic-interest lookup.
This causes a very large number of temporary allocations as well; the trace contains 8,633 MinorGC events.
I prepared a small patch that keeps the current behaviour but caches the dynamic topic interests for the duration of one state-snapshot batch, so each Text widget resolves its topic interests once instead of once per incoming topic.
The dashboard itself does not need to be simplified and the Homey Flows are not involved in the freeze.
I can provide:
-
Chrome Performance Trace
-
HAR
-
the small proposed patch for V2.0.11
The important reproducer is simply:
open Viewer → wait until loaded → minimize/hide browser → restore browser → ~14–15 s main-thread freeze.
Would you like me to attach the trace/HAR and patch here?










