Download uses fetch() with streaming progress on 100MB test file. Upload sends 25MB to /api/upload on mtr-backend which reads the full body before responding, giving accurate client-side timing. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>