Backend: stream_response with NDJSON (restored) Frontend: XMLHttpRequest.onprogress replaces fetch.getReader() - more compatible, no ReadableStream API dependency - incrementally parses NDJSON lines as they arrive