What this app does
The frontend is a static Next.js export. The OTA API lives in Cloudflare Pages Functions at /api/manifest and /api/assets.
Cloudflare Pages OTA
This repo is an isolated Cloudflare-native OTA experiment. It keeps the current updater untouched while giving us a safe place to serve Expo manifests and assets from either Cloudflare R2 or an S3-compatible bucket.
The frontend is a static Next.js export. The OTA API lives in Cloudflare Pages Functions at /api/manifest and /api/assets.
Update bundles live in object storage instead of local disk. The function looks up the latest numeric timestamp folder for a runtime version and optional package name, then builds asset URLs from the active request domain.
updates/{packageName}/{runtimeVersion}/{timestamp}/
metadata.json
expoConfig.json
rollback
assets/...
bundles/...This Pages project uses Wrangler config as the source of truth. Keep Variables in wrangler.jsonc, then store only Secrets in Cloudflare Pages under Settings > Variables and Secrets.
Variables in wrangler.jsonc
STORAGE_PROVIDER UPDATES_PREFIX DEFAULT_PACKAGE_NAME S3_COMPAT_BUCKET_URL S3_COMPAT_REGION
Secrets in Cloudflare Pages
S3_COMPAT_ACCESS_KEY_ID S3_COMPAT_SECRET_ACCESS_KEY S3_COMPAT_SESSION_TOKEN PRIVATE_KEY_PEM
Install dependencies, bind OTA_BUCKET only if you use r2_cloudflare, set Variables in wrangler.jsonc, add Secrets in Cloudflare Pages, copy .dev.vars.example to .dev.vars for local work, upload an update tree, and deploy.