Poll every second. While a widget is live, read it once a second and redraw: the widget’s own route, such as GET /polls/{poll_id}, or the whole experience when several widgets are on screen. Reads from your app are cached for one second, so polling faster returns the same answer.
Watch the status. Each read carries the widget’s status. Redraw when it changes: a widget can open, be hidden or close at any moment, on the producer’s cue.
Stop once it’s final. After a widget closes, read it until final is true, which means its votes have been recounted and the result is official. Then stop.
Results follow results_visibility. Your app gets results while the widget is live only when it is live. Otherwise they arrive once votes have stopped. Your servers always get them.
We don’t push updates to apps. Polling is how live updates work today.