or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

index.md
tile.json

index.mddocs/

Expo Config Types

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.

Package Information

  • Package Name: @expo/config-types
  • Package Type: npm
  • Language: TypeScript
  • Installation: npm install @expo/config-types

Core Imports

import { ExpoConfig } from "@expo/config-types";

For CommonJS environments:

const { ExpoConfig } = require("@expo/config-types");

Basic Usage

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"
    }
  };
};

Architecture

Expo Config Types is built around a hierarchical type system:

  • ExpoConfig: Main interface defining all configuration options for Expo applications
  • Platform-Specific Types: Specialized interfaces for iOS, Android, and Web platforms
  • Feature-Specific Types: Specialized interfaces for splash screens, notifications, and other features
  • Schema Generation: Types are automatically generated from Expo's versioned JSON schemas
  • Version Synchronization: Types stay synchronized with the latest Expo SDK capabilities

Capabilities

Main Configuration Interface

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;
  };
}

Splash Screen Configuration

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;
}

iOS Platform Configuration

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 Adaptive Icons

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;
}

Android Platform Configuration

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;
}

Android Intent Filter Data

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;
}

Web Platform Configuration

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;
}

Type Unions and Constants

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";