{ "schema": { "type":"object", "properties":{ "name":{ "description":"The name of your app as it appears both within Exponent and on your home screen as a standalone app.", "type":"string" }, "description":{ "description":"A short description of what your app is and why it is great.", "type":"string" }, "slug":{ "description":"The friendly url name for publishing. eg: `expo.o/@your-username/slug`.", "type":"string", "pattern":"^[a-zA-Z0-9\\-]+$" }, "privacy":{ "description":"Either `public` or `unlisted`. If not provided, defaults to `unlisted`. In the future `private` will be supported. `unlisted` hides the experience from search results.", "enum":[ "public", "unlisted" ], "type":[ "array", "boolean", "number", "object", "string", "null" ] }, "sdkVersion":{ "description":"The Exponent sdkVersion to run the project on. This should line up with the version specified in your package.json.", "type":"string", "pattern":"^(\\d+\\.\\d+\\.\\d+)|(UNVERSIONED)$" }, "version":{ "description":"Your app version, use whatever versioning scheme that you like.", "type":"string" }, "orientation":{ "description":"Lock your app to a specific orientation with `portrait` or `landscape`. Defaults to no lock.", "enum":[ "default", "portrait", "landscape" ], "type":[ "array", "boolean", "number", "object", "string", "null" ] }, "primaryColor":{ "description":"On Android, this will determine the color of your app in the multitasker. Currently this is not used on iOS, but it may be used for other purposes in the future.", "type":"string", "pattern":"^#|(#)\\d{6}$", "meta": { "regexHuman": "6 character long hex color string, eg: `'#000000'`" } }, "icon":{ "description":"Local path or remote url to an image to use for your app's icon. We recommend that you use a 512x512 png file with transparency. This icon will appear on the home screen and within the Exponent app.", "type":"string", "meta":{ "asset":true, "contentTypePattern":"^image/png$", "contentTypeHuman":".png image" } }, "notification":{ "description":"Configuration for remote (push) notifications.", "type":"object", "properties":{ "icon":{ "description":"Local path or remote url to an image to use as the icon for push notifications. 48x48 png grayscale with transparency.", "type":"string", "meta":{ "asset":true, "contentTypePattern":"^image/png$", "contentTypeHuman":".png image" } }, "color":{ "description":"Tint color for the push notification image when it appears in the notification tray.", "type":"string", "pattern":"^#|(#)\\d{6}$", "meta": { "regexHuman": "6 character long hex color string, eg: `'#000000'`" } }, "androidMode":{ "description":"Show each push notification individually (`default`) or collapse into one (`collapse`).", "enum":[ "default", "collapse" ], "type":[ "array", "boolean", "number", "object", "string", "null" ] }, "androidCollapsedTitle":{ "description":"If `androidMode` is set to `collapse`, this title is used for the collapsed notification message. eg: `'#{unread_notifications} new interactions'`.", "type":"string" } }, "additionalProperties":false }, "loading":{ "description":"Configuration for the loading screen that users see when opening your app, while fetching & caching bundle and assets.", "type":"object", "properties":{ "icon":{ "description":"Local path or remote url to an image to display while starting up the app. Image size and aspect ratio are up to you. Must be a .png.", "type":"string", "meta":{ "asset":true, "contentTypePattern":"^image/png$", "contentTypeHuman":".png image" } }, "exponentIconColor":{ "description":"If no icon is provided, we will show the Exponent logo. You can choose between `white` and `blue`.", "enum":[ "white", "blue" ], "type":[ "array", "boolean", "number", "object", "string", "null" ] }, "exponentIconGrayscale":{ "description":"Similar to `exponentIconColor` but instead indicate if it should be grayscale (`1`) or not (`0`).", "type":"number", "minimum":0, "maximum":1 }, "backgroundImage":{ "description":"Local path or remote url to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.", "type":"string", "meta":{ "asset":true, "contentTypePattern":"^image/png$", "contentTypeHuman":".png image" } }, "backgroundColor":{ "description":"Color to fill the loading screen background", "type":"string", "pattern":"^#|(#)\\d{6}$", "meta": { "regexHuman": "6 character long hex color string, eg: `'#000000'`" } }, "hideExponentText":{ "description":"By default, Exponent shows some text at the bottom of the loading screen. Set this to `true` to disable.", "type":"boolean" }, "loadingIndicatorStyleExperimental": { "description": "DEPRECATED: was used in the past for changing the style of the iOS loading indicator.", "type": "string", "pattern": "^light$", "meta": { "autogenerated": true } } }, "additionalProperties":false }, "appKey":{ "description":"By default, Exponent looks for the application registered with the AppRegistry as `main`. If you would like to change this, you can specify the name in this property.", "type":"string" }, "androidStatusBarColor":{ "type":"string", "pattern":"^#|(#)\\d{6}$", "meta": { "deprecated": true, "regexHuman": "6 character long hex color string, eg: `'#000000'`" } }, "androidStatusBar":{ "description":"Configuration for android statusbar.", "type":"object", "properties": { "barStyle": { "description":"Configure the statusbar icons to have light or dark color.", "type":"string", "enum":[ "light-content", "dark-content" ] }, "backgroundColor": { "description":"Configuration for android statusbar.", "type":"string", "pattern":"^#|(#)\\d{6}$", "meta": { "regexHuman": "6 character long hex color string, eg: `'#000000'`" } } } }, "androidShowExponentNotificationInShellApp":{ "description":"Adds a notification to your standalone app with refresh button and debug info.", "type":"boolean" }, "scheme":{ "description":"Url scheme to link into your app. For example, if we set this to `'rnplay'`, then rnplay:// urls would open your app when tapped.", "type":"string", "meta": { "standaloneOnly": true } }, "entryPoint":{ "description":"The relative path to your main JavaScript file.", "type":"string" }, "extra":{ "description":"Any extra fields you want to pass to your experience.", "type":"object", "properties":{ }, "additionalProperties":true }, "rnCliPath":{ "type":"string" }, "packagerOpts":{ "type":"object", "properties":{ }, "additionalProperties":true }, "ignoreNodeModulesValidation":{ "type":"boolean" }, "nodeModulesPath":{ "type":"string" }, "ios":{ "description":"iOS standalone app specific configuration", "type":"object", "meta": { "standaloneOnly": true }, "properties":{ "bundleIdentifier":{ "description":"The bundle identifier for your iOS standalone app. You make it up, but it needs to be unique on the App Store. See [this StackOverflow question](http://stackoverflow.com/questions/11347470/what-does-bundle-identifier-mean-in-the-ios-project).", "type":"string", "pattern":"^[a-zA-Z][a-zA-Z0-9\\-\\.]+$", "meta": { "regexHuman": "iOS bundle identifier notation unique name for your app. For example, host.exp.exponent, where exp.host is our domain and Exponent is our app." } }, "buildNumber": { "description": "Build number for your iOS standalone app. Must be a string that matches Apple's [format for CFBundleVersion](https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-102364).", "type": "string", "pattern": "^[A-Za-z0-9\\.]+$" }, "config":{ "type":"object", "properties":{ "usesNonExemptEncryption":{ "description":"Sets `ITSAppUsesNonExemptEncryption` in the standalone ipa's Info.plist to the given boolean value.", "type":"boolean" }, "googleMapsApiKey":{ "description":"[Google Maps iOS SDK](https://developers.google.com/maps/documentation/ios-sdk/start) key for your standalone app.", "type":"string" }, "googleSignIn":{ "description":"[Google Sign-In iOS SDK](https://developers.google.com/identity/sign-in/ios/start-integrating) keys for your standalone app.", "type":"object", "properties":{ "reservedClientId":{ "description":"The reserved client id url scheme. Can be found in `GoogeService-Info.plist`.", "type":"string" } }, "additionalProperties":false } }, "additionalProperties":false }, "isRemoteJSEnabled":{ "description":"If set to false, your standalone app will never download any code, and will only use code bundled locally on the device. In that case, all updates to your app must be submitted through Apple review. Defaults to true.", "type":"boolean" }, "supportsTablet":{ "description":"Whether your standalone iOS app supports tablet screen sizes.", "type":"boolean" }, "infoPlist":{ "description":"Arbitrary configuration to add to your standalone app's native Info.plist. Applied prior to all other Exponent-specific configuration. No other validation is performed, so use this at your own risk of rejection from the App Store.", "type":"object", "properties":{}, "additionalProperties": true } }, "additionalProperties":false }, "android":{ "description":"Android standalone app specific configuration", "type":"object", "meta": { "standaloneOnly": true }, "properties":{ "package":{ "description":"The package name for your Android standalone app. You make it up, but it needs to be unique on the Play Store. See [this StackOverflow question](http://stackoverflow.com/questions/6273892/android-package-name-convention).", "type":"string", "pattern":"^[a-zA-Z][a-zA-Z0-9\\_\\.]+$", "meta": { "regexHuman": "Reverse DNS notation unique name for your app. For example, host.exp.exponent, where exp.host is our domain and Exponent is our app." } }, "versionCode":{ "description":"Version number required by Google Play. Increment by one for each release. https://developer.android.com/studio/publish/versioning.html.", "type":"integer" }, "config":{ "type":"object", "properties":{ "fabric":{ "description":"[Twitter Fabric](https://get.fabric.io/) keys to hook up Crashlytics and other services.", "type":"object", "properties":{ "apiKey":{ "description":"Your Fabric API key", "type":"string" }, "buildSecret":{ "description":"Your Fabric build secret", "type":"string" } }, "additionalProperties":false }, "googleMaps":{ "description":"[Google Maps Android SDK](https://developers.google.com/maps/documentation/android-api/signup) key for your standalone app.", "type":"object", "properties":{ "apiKey":{ "description":"Your Google Maps Android SDK API key", "type":"string" } }, "additionalProperties":false }, "googleSignIn":{ "description":"[Google Sign-In Android SDK](https://developers.google.com/identity/sign-in/android/start-integrating) keys for your standalone app.", "type":"object", "properties":{ "apiKey":{ "description":"The Android API key. Can be found in the credentials section of the developer console or in `google-services.json`.", "type":"string" }, "certificateHash":{ "description":"The SHA-1 hash of the signing certificate used to build the apk without any separator `:`. Can be found in `google-services.json`. https://developers.google.com/android/guides/client-auth", "type":"string" } }, "additionalProperties":false } }, "additionalProperties":false } }, "additionalProperties":false }, "facebookScheme":{ "description":"Used for Facebook native login. Starts with 'fb' and followed by a string of digits, like 'fb1234567890'. You can find your scheme at https://developers.facebook.com/docs/facebook-login/ios in the 'Configuring Your info.plist' section.", "type":"string", "pattern": "^fb[0-9]+$" }, "isDetached": { "description": "Is app detached", "type": "boolean", "meta": { "autogenerated": true } }, "detach":{ "description":"Extra fields needed by detached apps", "type":"object", "properties":{ }, "meta": { "autogenerated": true }, "additionalProperties":true } }, "additionalProperties":false, "required":[ "name", "slug", "sdkVersion" ] } }