Stop a dead upload spinning forever, and say what 100% means

Fixkamo-internal
Shipped
August 8, 2026 at 4:08 AM UTC
Author
kamo
Commit
620a49a

A stalled upload sat at 100% with the bar full and no way out. Three separate reasons, all of them mine. XMLHttpRequest has no useful read timeout: when bytes stop arriving it waits indefinitely. A watchdog now aborts after two minutes of complete silence and reports it as a failure the member can retry — routed apart from Cancel, which goes through the same abort path but is not a fault. Reaching 100% does not mean finished: the server still has to hash and store the file, which for gigabytes is a long silence with nothing left to measure. The panel now says so, and drops the speed and time-left figures rather than freezing them at their last values, which is precisely what made a working upload look hung. That silence is also why the post-upload wait gets its own generous timeout instead of the stall watchdog, which would otherwise abort a perfectly healthy transfer. Also fixes the sheen that was meant to mark a live transfer: @keyframes kc-sheen was referenced but never defined, so it has never animated since I added it. Both rails now stand down under prefers-reduced-motion.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing