Quick Start

Start using cloud-push in two parts: the server and the expo client.

📡 Server Setup

1️⃣ Create server project

pnpm create next-app --yes

2️⃣ Install the packages

pnpm add @cloud-push/next @cloud-push/cloud @cloud-push/utils @tanstack/react-query semver @types/semver

3️⃣ Initialize server apis

npx @cloud-push/cli next-init

4️⃣ Provide environment variables

Set variables in .env

SUPABASE_URL=...
SUPABASE_KEY=...
SUPABASE_BUCKET_NAME=...

✅ Provide appropriate values for AWS, Supabase, or Firebase depending on your storage backend.

5️⃣ Run server

pnpm dev

📱 Expo Client Setup

Recommended: Use Node.js v18+ and Expo SDK 52+ for best compatibility.

1️⃣ Install the packages

pnpm add @cloud-push/expo @cloud-push/cloud @cloud-push/cli

2️⃣ Initialize config

pnpm cloud-push expo-init

3️⃣ Modify your app.json or app.config.ts

If you're not using EAS Build, set the update URL and headers manually:

updates: {
-    url: "https://u.expo.dev/"
+    url: "https://your-server-domain/api/updates/manifest",
+    requestHeaders: {
+      "expo-channel-name": process.env.APP_VARIANT,
+    },
  },
🛠️ If you're using EAS Build

You don't need to manually set requestHeaders. Instead, configure the channel in eas.json:

{
  "build": {
    "production": {
      "channel": "stable"
    },
    "preview": {
      "channel": "beta"
    }
  }
}

In this example, builds triggered with the --profile preview option will use the beta channel, while --profile production uses stable.

4️⃣ Provide environment variables

Set variables in .env or use EAS Secrets:

SUPABASE_URL=...
SUPABASE_KEY=...
SUPABASE_BUCKET_NAME=...

✅ Provide appropriate values for AWS, Supabase, or Firebase depending on your storage backend.

5️⃣ Deploy the update

pnpm cloud-push deploy

💡 OTA updates will only apply to builds with the same runtimeVersion

🔧 Local Environment Testing Notes

⚠️ Android Cleartext Warning

To allow HTTP requests on Android, you need to set usesCleartextTraffic.

export default {
  expo: {
    name: "your-app-name",
    slug: "your-app-slug",
    plugins: [
      [
        "expo-build-properties",
        {
          android: {
            usesCleartextTraffic: true,
          },
          ios: {},
        },
      ],
    ],
  },
};