Summary
I’m requesting first-class Expo support for multiple environment configuration files such as:
app.json (default)
app.dev.json
app.staging.json
app.production.json
Expo should automatically load the appropriate file based on the selected build profile (e.g., EAS --profile staging) and fall back to app.json when a key is not overridden. This would eliminate the need for custom logic in app.config.ts and create a clean, scalable configuration system for multi-environment apps.
Problem
Many Expo apps require different settings across environments:
App name & slug
Bundle identifiers / package names
API endpoints
Feature flags
Deep link configs
Runtime and update settings
Right now, developers must manually implement these differences using JavaScript logic inside app.config.ts. A typical setup looks like this:
Conditional names
Conditional icons
Conditional bundle IDs
Conditional package names
Conditional schemes
Conditional runtime settings
This results in large, complex, and repetitive configuration logic, and Cannot automatically write to dynamic config at: app.config.ts
Current Workaround (TypeScript Example)
Here is the kind of environment-switching logic developers currently need to maintain:
name: process.env.APP_ENV === "production" ? "The App" :
The App - (${process.env.APP_ENV})
,
slug: process.env.APP_ENV === "production" ? "theapp" :
theapp-(${process.env.APP_ENV})
,
ios: {
bundleIdentifier:
process.env.APP_ENV === "production"
? "com.theappt"
:
com.theappt-${process.env.APP_ENV}
,
},
android: {
package:
process.env.APP_ENV === "production"
? "com.theappt"
:
com.theappt_${process.env.APP_ENV}
,
},
This manual branching works, but it leads to config sprawl and is easy to break over time.
Proposal: Native Environment-Based Config Files
Expo should support the following behaviour:
  1. Config Files per Environment
app.json // Base config for all environments
app.dev.json // Overrides for development
app.staging.json // Overrides for staging
app.production.json // Overrides for production
  1. Selection by EAS Profile or Env Variable
Examples:
eas build --profile staging → loads app.staging.json
EXPO_ENV=dev expo start → loads app.dev.json
  1. Automatic Deep Fallback to app.json
If a field is missing in app.staging.json, Expo should automatically use the value from app.json before failing.
Example:
Plugins defined once in app.json
Only environment-specific values go into the env file
Reduces duplication dramatically
  1. Clear Precedence Rules
Expo should apply:
app.{env}.json overrides app.json
Unspecified keys fall back to app.json.
Benefits
Much cleaner configuration
Significantly reduced duplication
Eliminates the need for large JS/TS conditionals
Easier onboarding for new team members
Works naturally with EAS profiles
Less risk of breaking bundle IDs or package names
More aligned with how other platforms handle env-based config files
Why This Matters
Environment-based configuration is a core requirement for most production apps. Many Expo developers already simulate this manually using code, but the ecosystem would benefit greatly from a first-class, fully supported system.
This feature would modernise Expo’s config experience and simplify builds across all environments.