Expo Config Types provides comprehensive TypeScript type definitions for Expo application configuration objects used in app.config.ts files. These types ensure compile-time type safety and IDE autocompletion for all Expo configuration options, automatically generated from versioned JSON schemas maintained by the Expo server.
npm install @expo/config-typesimport { ExpoConfig } from "@expo/config-types";For CommonJS environments:
const { ExpoConfig } = require("@expo/config-types");import { ExpoConfig } from "@expo/config-types";
export default (): ExpoConfig => {
return {
name: "My Expo App",
slug: "my-expo-app",
version: "1.0.0",
orientation: "portrait",
icon: "./assets/icon.png",
userInterfaceStyle: "light",
splash: {
image: "./assets/splash.png",
resizeMode: "contain",
backgroundColor: "#ffffff"
},
platforms: ["ios", "android"],
ios: {
bundleIdentifier: "com.example.myapp"
},
android: {
package: "com.example.myapp"
}
};
};Expo Config Types is built around a hierarchical type system:
The primary ExpoConfig interface that defines all possible configuration options for Expo applications.
/**
* The standard Expo config object defined in `app.config.js` files.
*/
interface ExpoConfig {
/** The name of your app as it appears both within Expo Go and on your home screen as a standalone app */
name: string;
/** A URL-friendly name for your project that is unique across your account */
slug: string;
/** A short description of what your app is and why it is great */
description?: string;
/** The name of the Expo account that owns the project */
owner?: string;
/** Auto generated Expo account name and slug used for display purposes (@username/slug) */
currentFullName?: string;
/** Auto generated Expo account name and slug used for services (@username/slug) */
originalFullName?: string;
/** The Expo sdkVersion to run the project on */
sdkVersion?: string;
/** Property indicating compatibility between a build's native code and an OTA update */
runtimeVersion?: string | {
policy: "nativeVersion" | "sdkVersion" | "appVersion" | "fingerprint";
};
/** Your app version */
version?: string;
/** Platforms that your project explicitly supports. Defaults to ["ios", "android"] */
platforms?: ("android" | "ios" | "web")[];
/** GitHub repository URL */
githubUrl?: string;
/** Screen orientation lock */
orientation?: "default" | "portrait" | "landscape";
/** UI appearance mode */
userInterfaceStyle?: "light" | "dark" | "automatic";
/** Root view background color */
backgroundColor?: string;
/** App primary color (Android multitasker) */
primaryColor?: string;
/** App icon path/URL (1024x1024 recommended) */
icon?: string;
/** Legacy push notifications config (deprecated) */
notification?: {
icon?: string;
color?: string;
iosDisplayInForeground?: boolean;
androidMode?: "default" | "collapse";
androidCollapsedTitle?: string;
};
/** Android status bar configuration */
androidStatusBar?: {
barStyle?: "light-content" | "dark-content";
backgroundColor?: string;
hidden?: boolean;
translucent?: boolean;
};
/** Android navigation bar configuration */
androidNavigationBar?: {
visible?: "leanback" | "immersive" | "sticky-immersive";
barStyle?: "light-content" | "dark-content";
backgroundColor?: string;
enforceContrast?: boolean;
};
/** Development client settings */
developmentClient?: {
silentLaunch?: boolean;
};
/** URL scheme(s) to link into your app */
scheme?: string | string[];
/** Extra fields accessible via Constants.expoConfig.extra */
extra?: {
[k: string]: any;
};
/** EAS Updates configuration */
updates?: {
enabled?: boolean;
checkAutomatically?: "ON_ERROR_RECOVERY" | "ON_LOAD" | "WIFI_ONLY" | "NEVER";
useEmbeddedUpdate?: boolean;
fallbackToCacheTimeout?: number;
url?: string;
codeSigningCertificate?: string;
codeSigningMetadata?: {
alg?: "rsa-v1_5-sha256";
keyid?: string;
};
requestHeaders?: {
[k: string]: any;
};
assetPatternsToBeBundled?: string[];
disableAntiBrickingMeasures?: boolean;
useNativeDebug?: boolean;
};
/** App metadata localization */
locales?: {
[k: string]: string | {
[k: string]: any;
};
};
/** Asset bundle patterns (deprecated) */
assetBundlePatterns?: string[];
/** Config plugins for adding extra functionality */
plugins?: (string | [] | [string] | [string, any])[];
/** Splash screen configuration */
splash?: Splash;
/** JavaScript engine selection (deprecated) */
jsEngine?: "hermes" | "jsc";
/** React Native new architecture flag */
newArchEnabled?: boolean;
/** Remote build caching provider */
buildCacheProvider?: "eas" | {
plugin: string;
options?: {
[k: string]: any;
};
};
/** iOS-specific configuration */
ios?: IOS;
/** Android-specific configuration */
android?: Android;
/** Web-specific configuration */
web?: Web;
/** Experimental feature flags */
experiments?: {
autolinkingModuleResolution?: boolean;
baseUrl?: string;
buildCacheProvider?: "eas" | {
plugin: string;
options?: {
[k: string]: any;
};
};
supportsTVOnly?: boolean;
tsconfigPaths?: boolean;
typedRoutes?: boolean;
turboModules?: boolean;
reactCanary?: boolean;
reactCompiler?: boolean;
reactServerComponentRoutes?: boolean;
reactServerFunctions?: boolean;
};
/** Internal developer tools configuration */
_internal?: {
pluginHistory?: {
[k: string]: any;
};
[k: string]: any;
};
}Base splash screen configuration used across platforms.
/**
* Configuration for loading and splash screen for standalone apps.
*/
interface Splash {
/** Color to fill the loading screen background */
backgroundColor?: string;
/** How the image will be displayed in the splash loading screen */
resizeMode?: "cover" | "contain";
/** Local path or remote URL to an image to fill the background of the loading screen */
image?: string;
[k: string]: any;
}Configuration specific to the iOS platform including App Store deployment, certificates, and iOS-specific features.
/**
* Configuration that is specific to the iOS platform.
*/
interface IOS {
/** Apple development team ID */
appleTeamId?: string;
/** Manifest path for iOS version during publish */
publishManifestPath?: string;
/** Bundle path for iOS version during publish */
publishBundlePath?: string;
/** Bundle identifier for iOS standalone app */
bundleIdentifier?: string;
/** Build number for iOS standalone app */
buildNumber?: string;
/** Background color for iOS app */
backgroundColor?: string;
/** URL scheme(s) to link into iOS app */
scheme?: string | string[];
/** App icon for iOS */
icon?: string | IOSIcons;
/** App Store URL */
appStoreUrl?: string;
/** iOS Bitcode optimizations */
bitcode?: boolean | string;
/** Private configuration with API keys */
config?: {
branch?: {
apiKey?: string;
};
usesNonExemptEncryption?: boolean;
googleMapsApiKey?: string;
googleMobileAdsAppId?: string;
googleMobileAdsAutoInit?: boolean;
};
/** Firebase Configuration File location */
googleServicesFile?: string;
/** Tablet screen size support */
supportsTablet?: boolean;
/** Tablet-only support flag */
isTabletOnly?: boolean;
/** Disable Slide Over and Split View on iPad */
requireFullScreen?: boolean;
/** UI appearance mode */
userInterfaceStyle?: "light" | "dark" | "automatic";
/** Info.plist configuration */
infoPlist?: {
[k: string]: any;
};
/** Entitlements configuration */
entitlements?: {
[k: string]: any;
};
/** Privacy manifests configuration */
privacyManifests?: {
NSPrivacyAccessedAPITypes?: {
NSPrivacyAccessedAPIType: string;
NSPrivacyAccessedAPITypeReasons: string[];
}[];
NSPrivacyTrackingDomains?: string[];
NSPrivacyTracking?: boolean;
NSPrivacyCollectedDataTypes?: {
NSPrivacyCollectedDataType: string;
NSPrivacyCollectedDataTypeLinked: boolean;
NSPrivacyCollectedDataTypeTracking: boolean;
NSPrivacyCollectedDataTypePurposes: string[];
}[];
};
/** Associated Domains */
associatedDomains?: string[];
/** iCloud Storage usage flag */
usesIcloudStorage?: boolean;
/** Apple Sign-In usage flag */
usesAppleSignIn?: boolean;
/** Push Notifications Broadcast capability */
usesBroadcastPushNotifications?: boolean;
/** Contact notes access permission */
accessesContactNotes?: boolean;
/** iOS splash screen configuration */
splash?: {
backgroundColor?: string;
resizeMode?: "cover" | "contain";
image?: string;
tabletImage?: string;
dark?: {
backgroundColor?: string;
resizeMode?: "cover" | "contain";
image?: string;
tabletImage?: string;
[k: string]: any;
};
[k: string]: any;
};
/** JavaScript engine for iOS (deprecated) */
jsEngine?: "hermes" | "jsc";
/** New architecture flag for iOS */
newArchEnabled?: boolean;
/** Runtime version for iOS platform */
runtimeVersion?: string | {
policy: "nativeVersion" | "sdkVersion" | "appVersion" | "fingerprint";
};
/** iOS app version */
version?: string;
}iOS platform icons supporting system appearance variations.
/**
* Configuration that is specific to the iOS platform icons.
*/
interface IOSIcons {
/** Light appearance icon */
light?: string;
/** Dark appearance icon */
dark?: string;
/** Tinted appearance icon */
tinted?: string;
}Configuration specific to the Android platform including Play Store deployment and Android-specific features.
/**
* Configuration that is specific to the Android platform.
*/
interface Android {
/** Manifest path for Android version during publish */
publishManifestPath?: string;
/** Bundle path for Android version during publish */
publishBundlePath?: string;
/** Package name for Android standalone app */
package?: string;
/** Version code required by Google Play */
versionCode?: number;
/** Background color for Android app */
backgroundColor?: string;
/** UI appearance mode */
userInterfaceStyle?: "light" | "dark" | "automatic";
/** URL scheme(s) to link into Android app */
scheme?: string | string[];
/** App icon for Android */
icon?: string;
/** Adaptive Launcher Icon settings */
adaptiveIcon?: {
foregroundImage?: string;
monochromeImage?: string;
backgroundImage?: string;
backgroundColor?: string;
};
/** Google Play Store URL */
playStoreUrl?: string;
/** List of permissions to add to AndroidManifest.xml */
permissions?: string[];
/** List of permissions to block in AndroidManifest.xml */
blockedPermissions?: string[];
/** Firebase Configuration File location */
googleServicesFile?: string;
/** Private configuration with API keys */
config?: {
branch?: {
apiKey?: string;
};
googleMaps?: {
apiKey?: string;
};
googleMobileAdsAppId?: string;
googleMobileAdsAutoInit?: boolean;
};
/** Android splash screen configuration */
splash?: {
backgroundColor?: string;
resizeMode?: "cover" | "contain" | "native";
image?: string;
mdpi?: string;
hdpi?: string;
xhdpi?: string;
xxhdpi?: string;
xxxhdpi?: string;
dark?: {
backgroundColor?: string;
resizeMode?: "cover" | "contain" | "native";
image?: string;
mdpi?: string;
hdpi?: string;
xhdpi?: string;
xxhdpi?: string;
xxxhdpi?: string;
[k: string]: any;
};
[k: string]: any;
};
/** Custom intent filters configuration */
intentFilters?: {
autoVerify?: boolean;
action: string;
data?: AndroidIntentFiltersData | AndroidIntentFiltersData[];
category?: string | string[];
}[];
/** App data backup configuration */
allowBackup?: boolean;
/** Software keyboard layout mode */
softwareKeyboardLayoutMode?: "resize" | "pan";
/** JavaScript engine for Android (deprecated) */
jsEngine?: "hermes" | "jsc";
/** New architecture flag for Android */
newArchEnabled?: boolean;
/** Runtime version for Android platform */
runtimeVersion?: string | {
policy: "nativeVersion" | "sdkVersion" | "appVersion" | "fingerprint";
};
/** Android app version */
version?: string;
/** Edge-to-edge mode support */
edgeToEdgeEnabled?: boolean;
/** Predictive back gesture support */
predictiveBackGestureEnabled?: boolean;
}Data structure for Android intent filters used in deep linking configuration.
/**
* Data structure for Android intent filters
*/
interface AndroidIntentFiltersData {
/** URL scheme */
scheme?: string;
/** Hostname */
host?: string;
/** Port number */
port?: string;
/** Exact path for URLs */
path?: string;
/** Pattern for paths with wildcards */
pathPattern?: string;
/** Prefix for paths */
pathPrefix?: string;
/** Suffix for paths */
pathSuffix?: string;
/** Advanced pattern for paths (API 31+) */
pathAdvancedPattern?: string;
/** MIME type for URLs */
mimeType?: string;
}Configuration specific to the web platform including Progressive Web App (PWA) settings.
/**
* Configuration that is specific to the web platform.
*/
interface Web {
/** Web app build output mode */
output?: "single" | "static" | "server";
/** Web app favicon */
favicon?: string;
/** Web app name */
name?: string;
/** Web app short name */
shortName?: string;
/** Primary language for the app */
lang?: string;
/** Navigation scope of the website */
scope?: string;
/** Android toolbar color */
themeColor?: string;
/** General description of the website */
description?: string;
/** Text direction for name and description */
dir?: "auto" | "ltr" | "rtl";
/** Display mode for the website */
display?: "fullscreen" | "standalone" | "minimal-ui" | "browser";
/** URL that loads when user launches the application */
startUrl?: string;
/** Default orientation for browsing contexts */
orientation?: "any" | "natural" | "landscape" | "landscape-primary" | "landscape-secondary" | "portrait" | "portrait-primary" | "portrait-secondary";
/** Background color for the website */
backgroundColor?: string;
/** Status bar style */
barStyle?: "default" | "black" | "black-translucent";
/** Prefer native applications over website */
preferRelatedApplications?: boolean;
/** Experimental features */
dangerous?: {
[k: string]: any;
};
/** PWA splash screen configuration */
splash?: {
backgroundColor?: string;
resizeMode?: "cover" | "contain";
image?: string;
[k: string]: any;
};
/** Firebase web configuration */
config?: {
firebase?: {
apiKey?: string;
authDomain?: string;
databaseURL?: string;
projectId?: string;
storageBucket?: string;
messagingSenderId?: string;
appId?: string;
measurementId?: string;
[k: string]: any;
};
[k: string]: any;
};
/** Web bundler selection */
bundler?: "webpack" | "metro";
[k: string]: any;
}The package defines several union types used throughout the configuration interfaces:
/** Screen orientation options */
type Orientation = "default" | "portrait" | "landscape";
/** User interface style options */
type UserInterfaceStyle = "light" | "dark" | "automatic";
/** Platform identifiers */
type Platform = "android" | "ios" | "web";
/** JavaScript engine options (deprecated) */
type JSEngine = "hermes" | "jsc";
/** Update check modes */
type UpdateCheckMode = "ON_ERROR_RECOVERY" | "ON_LOAD" | "WIFI_ONLY" | "NEVER";
/** Web output modes */
type WebOutput = "single" | "static" | "server";
/** Runtime version policy options */
type RuntimeVersionPolicy = "nativeVersion" | "sdkVersion" | "appVersion" | "fingerprint";
/** Splash image resize modes */
type ResizeMode = "contain" | "cover" | "native";
/** Android keyboard layout modes */
type KeyboardLayoutMode = "pan" | "resize";
/** Web display modes */
type WebDisplayMode = "fullscreen" | "standalone" | "minimal-ui" | "browser";
/** Status bar styles */
type StatusBarStyle = "light-content" | "dark-content";
/** Navigation bar visibility modes */
type NavigationBarVisibility = "leanback" | "immersive" | "sticky-immersive";
/** Notification modes */
type NotificationMode = "default" | "collapse";
/** Web text direction */
type TextDirection = "auto" | "ltr" | "rtl";
/** Web status bar styles */
type WebStatusBarStyle = "default" | "black" | "black-translucent";