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
📱 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
💡 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: {},
},
],
],
},
};