Backend: _sse() wraps each widget as 'data: <json>\n\n', ends with [DONE] Frontend: XHR.onprogress splits on 'data: ', extracts json before \n\n