Configure app.json
First step — replace EasyStarter's template identifiers with your own app info
Configure app.json
apps/native/app.json is the core configuration file for your Expo app. The very first thing you should do after cloning the template is replace all the EasyStarter-specific identifiers with your own.
For a full list of supported fields, see the Expo app.json reference
Step 1: Choose and register your app identifiers
Before editing app.json, decide on your identifiers and register them in the Apple Developer Portal.
Identifier format
Both iOS and Android use reverse domain notation:
com.yourcompany.yourappIt's recommended to keep the iOS bundleIdentifier and Android package in sync — same value, easier to manage.
Create an App ID in Apple Developer Portal
The iOS bundleIdentifier is not just a string you pick freely — it must be registered as an App ID in the Apple Developer Portal before you can use App Store distribution or native capabilities like Sign In with Apple.
- Log in to Apple Developer Portal → Identifiers
- Click
+→ selectApp IDs→ typeApp→ Continue - Enter a Description (your app name)
- Enter your Bundle ID (e.g.
com.yourcompany.yourapp), selectExplicit - Under Capabilities, check Sign In with Apple
- Click Continue → Register
Once registered, fill in this Bundle ID in two places:
{
"expo": {
"ios": {
"bundleIdentifier": "com.yourcompany.yourapp"
}
}
}APPLE_APP_BUNDLE_IDENTIFIER=com.yourcompany.yourappAndroid package name
Android doesn't require pre-registration. Just pick a package name in the correct format in app.json. You'll register it in Google Play Console when you publish.
Fields you must replace
The following fields directly affect your app's identity, deep links, and App Store / Google Play submission. Replace them before you start development.
name
The display name shown on the home screen and in system settings.
"name": "My App"slug
The URL-safe identifier used in Expo's services. Must be globally unique and can only contain letters, numbers, and hyphens.
"slug": "my-app"scheme
The deep link URL scheme used for OAuth callbacks and app-to-app navigation. Keep it consistent with your slug to avoid conflicts with other apps.
"scheme": "my-app"Better Auth's mobile OAuth callback (Google Sign-In) depends on this scheme.
ios.bundleIdentifier
The unique iOS app identifier. Must exactly match the App ID you created in the Apple Developer Portal.
"ios": {
"bundleIdentifier": "com.yourcompany.yourapp"
}This is also the value used for
APPLE_APP_BUNDLE_IDENTIFIER.
ios.appleTeamId
Your Apple Developer Team ID. Find it in Apple Developer Portal → Membership.
"ios": {
"appleTeamId": "XXXXXXXXXX"
}android.package
The Android app package name. Must match the package name registered in Google Play Console. Use reverse domain format.
"android": {
"package": "com.yourcompany.yourapp"
}extra.eas.projectId and updates.url
These are auto-generated when you run eas init and bind the app to your EAS project. If you cloned the template directly, run:
cd apps/native
eas initEAS will automatically update projectId and updates.url in app.json.
Icons and splash screen
Replace the image assets at the following paths with your own brand assets:
| Field | Path | Description |
|---|---|---|
icon | ./assets/images/icon.png | Universal icon (1024×1024 PNG) |
ios.icon.light | ./assets/images/icon.png | iOS light mode icon |
ios.icon.dark | ./assets/images/icon.png | iOS dark mode icon |
android.adaptiveIcon.foregroundImage | ./assets/images/android-icon-foreground.png | Android adaptive icon foreground |
android.adaptiveIcon.backgroundImage | ./assets/images/android-icon-background.png | Android adaptive icon background |
android.adaptiveIcon.monochromeImage | ./assets/images/android-icon-monochrome.png | Android monochrome icon |
plugins[expo-splash-screen].image | ./assets/images/icon.png | Splash screen image |
Full configuration reference
{
"expo": {
"name": "My App",
"slug": "my-app",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/images/icon.png",
"scheme": "my-app",
"userInterfaceStyle": "automatic",
"ios": {
"appleTeamId": "YOUR_TEAM_ID",
"buildNumber": "1.0.0",
"bundleIdentifier": "com.yourcompany.yourapp",
"usesAppleSignIn": true,
"icon": {
"dark": "./assets/images/icon.png",
"light": "./assets/images/icon.png"
},
"infoPlist": {
"ITSAppUsesNonExemptEncryption": false
}
},
"android": {
"adaptiveIcon": {
"backgroundColor": "#E6F4FE",
"foregroundImage": "./assets/images/android-icon-foreground.png",
"backgroundImage": "./assets/images/android-icon-background.png",
"monochromeImage": "./assets/images/android-icon-monochrome.png"
},
"predictiveBackGestureEnabled": false,
"permissions": ["android.permission.RECORD_AUDIO"],
"package": "com.yourcompany.yourapp"
},
"extra": {
"router": {},
"eas": {
"projectId": "your-eas-project-id"
}
},
"runtimeVersion": {
"policy": "appVersion"
},
"updates": {
"url": "https://u.expo.dev/your-eas-project-id"
}
}
}