Splash screens and app icons are two pictures and a few config keys, and both need a new build.
In a React Native and Expo project, the splash screen and the app icon are not components. They are two PNG files and a handful of keys in the app config, compiled into the app when it is built. That is the whole answer, and it explains the three things that confuse people who inherited a project: you cannot change either one from your code, an over the air update will not carry them, and the splash screen you see in Expo Go is not the splash screen your users get. Every key and size below comes from Expo's own documentation and Apple's own guidelines, read on 17 October 2026.
What follows is where the two images live, what each platform wants, and the part nobody mentions. Apple does not think your launch screen should look like a splash screen at all, and the default you were handed is exactly what it tells you not to draw.
Start hereThe short version
Two PNG files, a few config keys, and a build each time.
The splash screen comes from a config plugin called expo-splash-screen, which you list in the plugins array of the app config with an image, a background colour and a width. The app icon comes from a single top level icon key. Android then adds a second icon shape of its own, built from two layers, and iOS adds optional variants for dark and tinted home screens. Expo's defaults are a file called splash-icon.png and a file called icon.png, both in the assets folder.
Nothing here is a styling decision you can make at runtime. These properties go into the native project, which is why Expo tells you to look at a splash screen in a preview or production build rather than in Expo Go, and why a new icon needs a build and a fresh upload. If your app feels slow to open, the splash screen is not the cause and not the cure. That is app startup time, a different problem with different fixes.
Where do the splash screen and the app icon live in the project?
In the app config file, usually app.json, and in two image files. Expo documents the splash screen as a config plugin: you add expo-splash-screen to the plugins array and give it an image, a backgroundColor, an imageWidth and, if you want one, a dark object with its own image and background colour. The plugin also takes ios and android objects, so one platform can have a different picture, a different colour or a different width from the other. The guide's example sets a dark grey background with black in dark mode and an imageWidth of 200.
The icon is simpler and less forgiving. One top level icon key points at a PNG, by default assets/images/icon.png, and that single file covers both platforms. Android can override it through android.adaptiveIcon, which is a foreground image plus either a background colour, white if you do not set one, or a background image with the same dimensions as the foreground. There is also an android.icon key for older devices that do not support adaptive icons, which Expo describes as a single combination of your foreground and background layers. On iOS, ios.icon takes either an object with light, dark and tinted paths, or, from Expo SDK 54, a directory produced by Apple's Icon Composer app. Both override the top level key.
One sentence in that guide matters more than the rest if you did not set the project up yourself. If your app does not use Expo Prebuild to generate the native android and ios directories, changes in the app config have no effect. So before you edit anything, look for those two directories in the repository. If they are committed and nothing regenerates them, the images inside them are what ships, and the config keys above are decoration. Expo links to manual instructions for that case.
Expo, splash screen and app icon, read 17 October 2026, page last updated 26 June 2026
Find the key
What are you actually changing?
Tick what you want to be different. The names shown are the keys Expo documents in the app config, read on 17 October 2026.
Nothing ticked. Every one of these is a config key plus a PNG, and every one of them needs a new build of the app before anybody sees it.
What size does each image have to be, and what does each platform do with it?
For the splash screen, Expo recommends a 1024x1024 image, as a PNG, with a transparent background, saved in assets/images. The default file name is splash-icon.png. Only PNG files are supported, and Expo is blunt about the consequence: use another image format and making a production build of your app will fail. The imageWidth key decides how wide that picture is drawn, and resizeMode decides how it is scaled inside that width, with three accepted values of contain, cover and native. The expo-splash-screen reference lists the default imageWidth as 100, which is small, so most projects set it.
For the iOS icon, 1024x1024 is the size Expo names, and the two constraints around it are the ones people break. The icon must be exactly square, and Expo gives 1023x1024 as an example of a file that is not valid. It also has to fill the whole square with no rounded corners and no transparent pixels, because the operating system masks the icon itself. Round your own corners and you get a rounded icon inside a rounded mask, with a pale border where your transparency used to be. For a project created with create-expo-app, EAS Build generates the smaller sizes from that one file, and the largest it generates is 1024x1024. An older React Native project has to generate them itself.
Android is not one picture at all. The adaptive icon is a foreground layer over a background colour or image, which is what lets the system mask it into whatever shape the phone maker chose and apply motion effects to it. Expo asks for an icon of at least 512x512 pixels and points you at Google's guidelines for the design. Those guidelines, read on 17 October 2026, size every layer at 108x108 dp and reserve the outer 18 dp on each side for masking and effects, which leaves an inner 66x66 dp safe zone that a device mask never clips. Google asks for a logo of at least 48x48 dp that does not exceed that 66x66 dp box. In plain terms: keep your artwork inside the middle 61 percent of the canvas and nothing important gets cut off, whatever shape the launcher uses.
Then there are the variants, which are optional in a way that is easy to miss. Android 13 and later can tint an icon from the person's wallpaper, using the monochromeImage layer, and it only appears if they have turned themed icons on and their launcher supports the feature. On iOS, people can set home screen icons to default, dark, clear or tinted appearances, and Apple's app icons guidelines say the system generates the variants you do not provide. Expo exposes three of those as light, dark and tinted keys, or hands the whole job to Icon Composer. You are allowed to draw none of them.
Expo, splash screen and app icon, sizes and per platform keys, read 17 October 2026
Why does Apple call it a launch screen, and does that change what you draw?
Expo opens its guide by saying a splash screen is also known as a launch screen. Apple keeps the two apart, and the difference decides what belongs on the picture. In Apple's Human Interface Guidelines, the system shows your launch screen the moment the app starts and replaces it quickly with your first screen, and its sole function is to make the app feel quick to open and ready to use. Apple says a launch screen is not part of onboarding, is not a splash screen, and is not an opportunity for artistic expression. A splash screen in Apple's sense, the branded graphic, belongs at the start of an onboarding flow or after launching finishes.
Three specific instructions follow from that, and a generated project usually breaks all three. Design a launch screen nearly identical to the first screen of your app, because elements that change produce a flash between the two. Avoid text, even if your first screen has text, because the content of a launch screen does not change and so anything written on it is not localised. And do not advertise: Apple writes that the launch screen is not a branding opportunity and that logos do not belong there unless they are a fixed part of your first screen. A centred logo on a brand colour, which is what the default config gives you, is the exact shape Apple describes and tells you to avoid.
Nobody is going to reject your app over this. It is guidance, not a review rule. The phrase launch screen does not appear anywhere in the App Store Review Guidelines, read on 17 October 2026, and the only mention of a splash screen there is guideline 2.3.3, which says your screenshots should show the app in use and not merely the title art, the login page or a splash screen. So what a logo card costs you is not a rejection. It is the one thing the screen exists to buy. A launch screen that matches your first screen makes the app feel instant, because the swap is invisible. A logo card makes every launch feel like a wait, and it is still on screen while your JavaScript loads, so the slower your start up is, the longer people stare at your logo. Apple also notes that on macOS, visionOS and watchOS a launch screen is not required at all, and that on iOS the launch screen should match the device's current orientation and appearance mode.
Apple, Human Interface Guidelines, Launching, read 17 October 2026
Do you have to rebuild the app to change them?
Yes, for both, every time. Expo's expo-splash-screen reference describes the config plugin as a way to set properties that cannot be set at runtime and that require building a new app binary to take effect. The same is true of the icon, which is compiled into the app bundle. An over the air update sends JavaScript and assets your code loads, so it cannot replace either of these. That is worth knowing before you promise a client a new icon this afternoon, and it is part of what it costs to publish an app rather than a free change.
Testing is where most of the wasted time goes. Expo states plainly that you should not use Expo Go or a development build to check a splash screen. Expo Go renders your app icon while the splash screen is visible, so you are looking at the wrong image entirely, and a development build carries expo-dev-client, which has a splash screen of its own that can conflict with yours. The documented way to see the real thing is a preview build or a production build. From SDK 52, Expo adds that neither Expo Go nor a development build can fully reproduce what a standalone app shows, because of the Android splash screen API it now builds on.
One more trap, specific to iOS. For SDK 52 and earlier, launch screens can stay cached between development builds, so a new image does not appear and you start doubting the config instead of the cache. Expo's fix is to clear derived data, which its CLI does with a run command carrying the no build cache flag. If you have edited the config, confirmed the file paths, built again and still see the old picture, suspect a cache before you rewrite anything.
The same two images, wanted differently by each platform
| The app icon | iOS | Android | Same on both |
|---|---|---|---|
| What you hand it | One square PNG, or a .icon directory from Icon Composer | Two layers, a foreground PNG plus a background colour or image | No |
| Size Expo documents | 1024x1024, and exactly square | At least 512x512 pixels | No |
| The system applies the mask, so ship it unmasked | Yes | Yes | Yes |
| Where the artwork has to sit | Fill the whole square, no transparent pixels | Logo inside the inner 66 of 108 dp, roughly the middle 61 percent | No |
| A variant for a dark or themed home screen | light, dark and tinted keys, or Icon Composer | A monochrome layer, Android 13 and later | Yes |
| Changing it without a new build | No | No | Yes |
The splash screen splits the same way. Expo gives you one plugin with per platform overrides, while the platforms underneath disagree about what the screen is for. Apple wants a launch screen that disappears without being noticed. Android draws your splash picture on a background colour through its own splash screen API. The practical consequence is that one picture and one colour can satisfy both, and the more design you put into that picture, the further you drift from what Apple asks for.
Apple, Human Interface Guidelines, Launching, launch screen best practices, read 17 October 2026
Where this lands if a builder generated your app
Two files and a config key is a low bar, and it is the bar a handover should clear. Newly generates a real React Native and Expo project the customer owns, with two way GitHub sync, so the splash image, the icon and the app config are files in your repository. You can replace them in an editor, or ask the agent to, and either way the next build carries them. That is the useful half of owning the code, and it is the same reason who owns AI generated code is worth settling before you pick a tool.
The honest limit is the build. A new icon is not a content change, so it travels the same route as any other native change: Newly uploads iOS builds to TestFlight and publishes to Google Play internal testing, and it builds a standalone Android APK. It does not submit to the App Store for you, because Apple requires the owner of the content to submit the app. So the loop for an icon is edit, build, upload, install, look at it on a home screen. Newly is $25 a month with no free tier, and an icon change costs you a build rather than a design project.
The thing worth deciding early is how much of this you want to do at all. The defaults are legal, buildable and dull. A square logo and a matching background colour will pass every mechanical requirement on both stores, and the Android safe zone is the only measurement you genuinely cannot ignore. Everything beyond that is taste, and taste is the part a generator cannot have for you. That is the honest shape of building React Native apps without coding: the mechanics get handled, the judgement stays yours.
Questions people ask about splash screens and app icons
In the app config, not in your components. The splash screen comes from the expo-splash-screen config plugin, listed in the plugins array with an image, a backgroundColor, an imageWidth and an optional dark object. The icon comes from the top level icon key. Expo's defaults are assets/images/splash-icon.png and assets/images/icon.png. Android then has android.adaptiveIcon for its two layer icon, and iOS has ios.icon for appearance variants or an Icon Composer directory. Read on 17 October 2026, when the guide carried a last updated date of 26 June 2026.
Draw two pictures, then build once
A square icon that fills its canvas, a splash picture that matches the first screen, one background colour used in both places. Set them at the start and this never becomes a task again.
Start building