EasyStarter logoEasyStarter

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

It'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.

  1. Log in to Apple Developer Portal → Identifiers
  2. Click + → select App IDs → type App → Continue
  3. Enter a Description (your app name)
  4. Enter your Bundle ID (e.g. com.yourcompany.yourapp), select Explicit
  5. Under Capabilities, check Sign In with Apple
  6. Click Continue → Register

Once registered, fill in this Bundle ID in two places:

apps/native/app.json
{
  "expo": {
    "ios": {
      "bundleIdentifier": "com.yourcompany.yourapp"
    }
  }
}
apps/server/wrangler.jsonc → vars
APPLE_APP_BUNDLE_IDENTIFIER=com.yourcompany.yourapp

Android 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 init

EAS 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:

FieldPathDescription
icon./assets/images/icon.pngUniversal icon (1024×1024 PNG)
ios.icon.light./assets/images/icon.pngiOS light mode icon
ios.icon.dark./assets/images/icon.pngiOS dark mode icon
android.adaptiveIcon.foregroundImage./assets/images/android-icon-foreground.pngAndroid adaptive icon foreground
android.adaptiveIcon.backgroundImage./assets/images/android-icon-background.pngAndroid adaptive icon background
android.adaptiveIcon.monochromeImage./assets/images/android-icon-monochrome.pngAndroid monochrome icon
plugins[expo-splash-screen].image./assets/images/icon.pngSplash screen image

Full configuration reference

apps/native/app.json
{
  "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"
    }
  }
}