RORK LABJP
TOOLING — Rork's developer repos keep moving: rork-xcode was updated on July 16, rork-device on July 15, and rork-plist on July 13OPUS46 — Claude Opus 4.6 is live in Rork, and Rork Max is built to assemble apps on top of Claude CodeSIM — A cloud iOS simulator runs in the browser, with one click to install on a device and two clicks to publish to the App StoreMAX — Rork Max emits pure Swift rather than React Native, reaching iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and even iMessageNATIVE — That opens up HealthKit, ARKit and LiDAR, NFC, Dynamic Island, Live Activities, 3D through Metal, and on-device inference with Core MLSEED — Rork raised a $15M seed led by Left Lane Capital, with Peak XV and a16z Speedrun joining the roundTOOLING — Rork's developer repos keep moving: rork-xcode was updated on July 16, rork-device on July 15, and rork-plist on July 13OPUS46 — Claude Opus 4.6 is live in Rork, and Rork Max is built to assemble apps on top of Claude CodeSIM — A cloud iOS simulator runs in the browser, with one click to install on a device and two clicks to publish to the App StoreMAX — Rork Max emits pure Swift rather than React Native, reaching iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and even iMessageNATIVE — That opens up HealthKit, ARKit and LiDAR, NFC, Dynamic Island, Live Activities, 3D through Metal, and on-device inference with Core MLSEED — Rork raised a $15M seed led by Left Lane Capital, with Peak XV and a16z Speedrun joining the round
Articles/Dev Tools
Dev Tools/2026-04-25Advanced

Getting a 1GB Video Out of a Rork App Without Losing It — TUS, S3 Multipart, and Background Transfers

A production-ready implementation guide for uploading 1GB+ videos and high-resolution photos from Rork apps. Covers the TUS protocol, S3/R2 Multipart Upload, iOS background transfers, and a resumable progress UI — all with working code.

Rork515file uploadTUSS3 MultipartCloudflare R2background transfer

Premium Article

"I'm uploading my video and the progress bar jumps back to zero the moment I step into an elevator." A user who hits that twice is done with your app.

I ran into this firsthand on a photo-sharing app I used to operate. A 200MB video that uploaded cleanly in testing had a 30–40% failure rate in production, specifically among users who "put their phone in a bag and boarded a train." The cause was simple: a naive fetch + FormData single-shot upload clashes head-on with the realities of mobile networks. This guide walks you through the implementation patterns that solve the problem from the root — with code you can ship.

Why "just fetch + FormData" breaks in production

If you design mobile file uploads the same way you'd design a browser upload, you'll walk straight into four walls.

① Network interruptions are the default, not the exception. Train gaps, underground malls, elevators, and handoffs between Wi-Fi and cellular all kill the TCP connection. A single-shot upload has to restart from zero every time. If you're 95% through a 1GB file when it drops, you just wasted 950MB.

② iOS will kill your background process without mercy. Even if the user doesn't force-quit the app, a standard URLSession stops sending after roughly 30 seconds in the background. Unless you reach for BGTaskScheduler or NSURLSession.background, the notion that your upload "keeps going in the background" is a fantasy.

③ Memory constraints are tight. readAsDataURL on a 1GB file will crash. In React Native / Expo, usable foreground memory sits somewhere between 800MB and 1.5GB depending on the device. Loading the full file into memory is an instant loss.

④ Servers have limits too. Most PaaS platforms cap request bodies: Cloudflare Workers at 100MB, Vercel Serverless at 4.5MB by default, Lambda behind API Gateway at 10MB. A single POST isn't going to clear those gates.

The design that addresses all four simultaneously is a resumable + chunked + background-capable upload foundation.

Three options to compare — which one to pick

There are three practical ways to do resumable, chunked transfers. Each has its sweet spot.

  • TUS protocol (tus.io): An open, HTTP-based standard. Client libraries exist in most languages, and the server side runs as either OSS (tusd) or Supabase Storage / Uppy Companion. Arbitrary chunk sizes, resume, and parallelism are all handled by the spec. The generalist choice.
  • S3 / R2 Multipart Upload: AWS's official protocol, supported by Cloudflare R2, MinIO, and other S3-compatible storage. Parts range from 5MB to 5GB, can be uploaded in parallel, and the combined object can be up to 5TB. The right call when you're writing directly to cloud storage.
  • Supabase Storage Resumable Upload: Supabase's storage layer speaks TUS under the hood, so you get resumable upload in a few lines from the JS client. The fastest path if you're already on Supabase.

My personal decision tree is straightforward: Cloudflare R2 as storage → Multipart Upload, Supabase backend → Supabase Storage Resumable, own API server handling files → TUS. When in doubt, work down that list.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
You'll gain a resumable upload foundation that handles 1GB videos across network drops and app terminations — the failure mode that breaks user trust
You'll learn when to pick TUS vs S3 Multipart Upload vs Cloudflare R2, with production-ready client code for each path
You'll be able to ship background uploads with a progress UI that completes even when users leave the app
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

Related Articles

Dev Tools2026-07-17
Shipping Notifications Without Asking First — Provisional Authorization in Rork Apps, and the Expo Snippet That Quietly Undoes It
iOS lets you start delivering notifications with no permission dialog at all, via provisional authorization. The catch: expo-notifications reports granted as false for provisional devices, so the registration snippet in Expo's own docs re-requests permission and fires the very dialog you were avoiding. Here's why granted lies, a hook that models authorization as five states, how to write notifications for quiet delivery, when to ask for the upgrade, and how to keep provisional out of your CTR.
Dev Tools2026-07-17
The Update That Failed Because a Profile Expired Three Months Ago
Apple signing assets expire quietly and nothing tells you. Here is how to count the days left with the App Store Connect API and put the audit on a weekly Cloudflare Workers cron.
Dev Tools2026-07-17
Killing the Export Compliance Prompt in Rork Builds for Good
Every Rork and Rork Max build lands in App Store Connect with a Missing Compliance warning. Here is how to decide whether you qualify for the exemption, and how to set it once in app.json or Info.plist so the question never returns.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →