Stream → R2 Budget Failover (MVP)

One URL forever — the player auto-swaps backend when the Stream budget threshold is hit. No frontend changes.
Stream minutes delivered (MTD)
%
Delivery backend
Budget: min · Failover at: % · Last check:
Zone redirect rule (demo.pongpisit.com) — manual control
Demo player — same video, backend switches automatically
Stream HLS URL (Stream mode, proxied transparently): /07d60aabc533bce884922a330c66ca09/manifest/video.m3u8
Stable MP4 URL (R2 mode, 302 to R2): /video/07d60aabc533bce884922a330c66ca09.mp4 — hls.js plays HLS while Stream budget is available; native player takes over with the R2 MP4 copy.
Simulate: curl -X POST <worker>/admin/simulate -H "Authorization: Bearer $ADMIN_TOKEN" -d '{"percent":85}' · /status · /probe