Cloudflare Pages OTA

DKPG OTA Sandbox

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.

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.

Storage model

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/...

Cloudflare setup

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

Next steps

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.