MAY 27, 2025
By Phil Pluckthun
EAS Hosting's updates ship incrementally without versioning and are backwards compatible. Runtime changes will require you to re-deploy with eas deploy while network and CDN changes apply automatically.
We've received several requests to add support for subdomains on EAS Hosting's custom domains, and support for www subdomains specifically. We're happy to report that this has now been implemented.
Once you've clicked "Refresh" in the EAS Hosting settings' "Custom domains" section, you'll now be able to set up subdomain records for your custom domain, for example:
CNAME <alias>.<yourdomain> origin.expo.app sets up a subdomain for a named alias, so you can for example link staging.yourdomain.com directly into EAS HostingCNAME www.<yourdomain> origin.expo.app sets up a redirect to your custom domain automatically (as long as no alias named www exists)CNAME *.<yourdomain> origin.expo.app sets up a wildcard for all aliases in your projectNote that we still only support one custom domain per project. But we hope that the support for wildcard subdomains on this custom domain will alleviate the need to set up multiple custom domains per project.
Learn more about how to set up the new DNS records in our docs: https://docs.expo.dev/eas/hosting/custom-domain/#alias-and-wildcard-subdomains
Instead of fallback.expo.app we now recommend you to set up CNAMEs for your custom domains with the origin.expo.app value instead.
origin.expo.app itself is a CNAME that links to fallback.expo.app. This is mainly an internal change that allows us to change what origin.expo.app points to in case we need to make changes to our internal CDN configuration.
No changes are required immediately if you've already set up a custom domain. fallback.expo.app will continue to work for the foreseeable future, and we recommend you to switch over this value within the next 6 months.
If we decide to shut down fallback.expo.app as a valid value, we'll send out repeated notices before doing so, but we don't have any immediate plans to force a switchover yet.
The dashboard's worker deployments details page now displays file trees both for your deployments' server code and client assets. We felt that having a file browser to quickly see what past deployments contain is crucial and we'll be adding more details and information to this page in the future.
Previously, our request logging didn't record both pathnames and Expo Router route names. Instead, it could only record and display one at a time.
This was especially obvious with React Server Component requests always displaying /_flight/[...rsc] for many requests and entries.
Instead, our logging now records route parameters as well, when we've detected that a request is being made to an Expo Router API route, which means that the dashboard now displays both the full original path as well as the Expo Router route.
Here we see a request to the exported RSC route, /_flight/[...rsc], is being expanded to show the request's deep route parameter, /web/ACTION_./actions/render-info.tsx/default.txt.
An improved at-a-glance dashboard for how your project is doing.
This also enables new request filters: by platform and country.
When a complex app is deployed with many different aliases, a custom domain, and environments, it was previously tricky to write code that reacts to these changing request origins.
For example, previously, when a request is made to a worker deployment https://myapp--staging.expo.app/api/route, the API route would mostly only see its own URL even if the client made a request to an alias URL or a custom domain:
GET https://myapp--id.expo.app/api/route
Host: myapp--id.expo.app
Forwarded: for=1.2.3.4;proto=https
X-Forwarded-For: 1.2.3.4
X-Forwarded-Proto: https
X-Real-IP: 1.2.3.4
In the previous request headers, no headers or hints were available for the incoming request's URL and only the outgoing one. Hence, it was impossible to write conditional logic for requests being made to custom domains, for instance.
We've updated these headers and they now reflect both the incoming origin URL and the target URL separately:
GET https://myapp--id.expo.app/api/route
Host: myapp--id.expo.app
Origin: https://myapp--staging.expo.app
Forwarded: for=1.2.3.4;host="myapp--staging.expo.app";proto=https
X-Forwarded-Host: myapp--staging.expo.app
X-Forwarded-For: 1.2.3.4
X-Forwarded-Proto: https
X-Real-IP: 1.2.3.4
As seen above, although the request to myapp--staging.expo.app resolves to myapp--id.expo.app, the Origin, Forwarded, and X-Forwarded-Host headers now reflect the incoming URL's hostname instead.
To complement this change, the origin global was updated to output the current request URL's Origin per request. Previously, this property would always be set to "null".
export async function GET(request) {
console.log(origin); // 'https://myapp--staging.expo.app'
}
It now outputs the current request URL's origin, depending on the ongoing request, dynamically, and should always be identical to request.headers.get('Origin').
⚠️ This global is only available in EAS Hosting worker deployments.
expo startandexpo servecurrently stick to a plain Node.js environment and won't emulate it.
Not all static site generators follow the same output conventions. While Expo Router's static output generates +not-found.html files for "404 Not Found" pages, other static-site generators prefers to output 404.html files.
To help with making EAS Hosting useful for static sites that aren't generated with Expo Router, we now support the 404.html output variants as well.
A static deployment is only expected to either use +not-found.html pages or 404.html pages for not-found pages, but not both at the same time. While deploying, EAS Hosting will detect and decide which one it'll use ahead of time.
We've noticed that HEAD requests made to assets weren't resolving correctly, and would instead result in 404 responses, even if the path matches an asset's path.
This is now fixed and working as intended.
Previously, due to options: AgentOptions; not being present on node:http's Agent class, the agentkeepalive package wasn't functional and would throw a runtime error.
This has now been fixed and the missing internal property has been added to our layer of Node polyfills.
The size limit for worker deployments is generally 10MiB (gzip compressed) for all server files combined. When this size is exceeded by your upload, the worker deployment cannot be created and an error will be displayed by eas-cli.
However, this wasn't always the case:
This has now been addressed by rewriting our upload API to be streamed. Instead of unpacking and handling your worker deployments in memory, it will now stream each part of the upload where it needs to go and prevent itself from running out of memory.
This has also made uploads more reliable and a little quicker.
All caching in EAS Hosting is namespaced per worker deployment. However, we also have layers of caching that apply to routing. For example, EAS Hosting will cache where a request to an alias (e.g. myapp--staging → myapp--id) needs to go.
This meant that changing aliases, deleting aliases, deleting worker deployments, and promoting worker deployments to production was taking longer than expected.
We're now proactively purging caches to prevent this, which should speed up all mentioned operations to complete much sooner. Often in a few seconds, and at most in a few minutes.
In EAS Hosting, any library that writes to process.stdout and process.stderr is supported and their output will be redirected to the Console API. This means that common debugging packages outputs' (such as debug's output) isn't lost.
However, previously we weren't splitting this terminal output into separate lines and ANSI escape codes weren't removed. This could result in confusing logs being displayed in the EAS Hosting dashboard.
We're now normalizing this output and it should be more readable now.
The Cloudflare team has been hard at work to update their Node compatibility and to add more features to their runtime:
WeakRef shim has now been replaced with native support for WeakRef and FinalizationRegistrynode:tls support has been added (for client requests only) and replaces the previous, non-functional EAS Hosting shimURLPattern web standard global is now supportedFor more information on the latest runtime changes, check out Cloudflare's workerd repository's release notes.
MAY 7, 2025
This week, we rolled out updates to the website including a reorganized project sidebar, support for custom account avatars and project icons, and improvements to build comparison suggestions, projects list sorting, the hosting metrics timespan selector, and hosting request crash details.
We refreshed the sidebar for the project view. It was reorganized to better align with how our services are used rather than being modeled after our database. We know that no one likes to have their essential links moved around, so we took the time to test the changes internally for a while to ensure it was the right call. If you have any feedback about the refreshed sidebar, please reach out to us at website@expo.dev.
You can now upload custom avatars for your user profile and organizations. You can also upload project icons on your project's settings page.
We now show more relevant identifying information to the suggested builds in the comparison list. This should make finding the build you want to compare to easier.
The controls for sorting your project list by name or recent activity have been moved into the table header.
Customers on a paid plan can now quickly view the metrics for the last month.
The hosting crashes UI now displays the type of crash that occurred and provides guidance on how to resolve the situation, if possible.
APR 30, 2025 by Brent Vatne
Today we're announcing the release of Expo SDK 53. SDK 53 includes React Native 0.79.
In SDK 53, the New Architecture is enabled by default in all projects. You can opt out if you aren't yet ready to adopt it. As of April 2025, the New Architecture was enabled in 74.6% of the SDK 52 projects built on EAS Build.
Android 16 (due in June) will no longer allow apps to opt out of edge-to-edge display. In SDK 53, edge-to-edge on Android is now:
In SDK 54, edge-to-edge will be the default for new and existing projects.
The new module expo-background-task uses the latest APIs on Android and iOS and deprecates the expo-background-fetch module. It uses the WorkManager API on Android and the BGTaskScheduler API on iOS.
Example usage:
import * as TaskManager from 'expo-task-manager';
import * as BackgroundTask from 'expo-background-task';
import * as Updates from 'expo-updates';
const BACKGROUND_TASK_NAME = 'task-run-expo-update';
TaskManager.defineTask(BACKGROUND_TASK_NAME, async () => {
const update = await Updates.checkForUpdateAsync();
if (update.isAvailable) {
await Updates.fetchUpdateAsync();
await Updates.reloadAsync();
}
});
async function registerTask() {
const isRegistered = TaskManager.isTaskRegisteredAsync(BACKGROUND_TASK_NAME);
if (!isRegistered) {
await BackgroundTask.registerTaskAsync(BACKGROUND_TASK_NAME, {
minimumInterval: 30,
});
}
}
registerTask();
In React Native 0.79, the Metro team switched the package.json exports field support to enabled by default. You can opt out by specifying unstable_enablePackageExports: false if you run into related issues.
If libraries that you depend on are incompatible with this change, report them to this discussion.
React Native 0.79 with React 19 and React Native Web 0.20.0. Refer to the React Native 0.79 and React 19 release notes for detailed information.
Development builds can now be deployed to TestFlight. Try it out with the new npx testflight package if you use EAS — set "distribution": "store" on your development profile and add "development": {} as a submit profile in eas.json, then run npx testflight --profile development.
Stable release of new expo-audio library. We recommend migrating to it from expo-av now. It is more reliable, easier to use, more performant, and more powerful.
New expo-maps package alpha release. This library aims to provide wrappers for the platform standard APIs for maps — Google Maps on Android and Apple Maps for iOS. The minimum iOS version required to use the library is currently iOS 17.
Improve Android build times with prebuilt Expo Modules. Up to 25% reduction in build time locally depending on hardware.
expo-updates now allows you to override headers at runtime with Updates.setUpdateURLAndRequestHeadersOverride().
expo-updates for Android no longer copies embedded assets on launch, reducing startup time from ~300ms to ~100ms.
React Server Functions support is now in beta. Deploy React Server Functions to production with EAS Hosting.
Expo Modules for TV and macOS improvements: Added support for macOS AppDelegate subscribers and users can now extend directly from ExpoAppDelegate.
expo-file-system/next now integrates with expo/fetch for file uploads with file.blob().
expo-sqlite now includes experimental support for web using WebAssembly.
expo-sqlite now supports libsql, with support for Turso's Offline Sync Public Beta.
expo-notifications improvements: Custom images and icons are now supported in Expo Push Service for Android. The iOS implementation has been converted to Swift.
Add import.meta transform plugin (experimental, opt-in feature).
AppDelegate has moved from Objective-C to Swift. Config Plugins that modify the AppDelegate source code will need to be updated.
Bumped the recommend TypeScript version to ~5.8.3.
Experimental opt-in React 19.1 support with improved errors available via experiments.reactCanary.
Flat config support in eslint-config-expo. npx expo lint now supports flat config.
Expo Atlas has been promoted from experimental to stable. Enable with EXPO_ATLAS=1 npx expo.
Added experimental support for web workers on web, used in expo-sqlite for multi-threaded support.
Added experimental EAS Update support to Expo DOM components.
Improved error messages. React errors will now be human-readable in Expo CLI.
Added build-time redirects and rewrites for customizing the URL and routing.
Guarded Groups. Client side routes can be grouped together and protected by a guard function.
Prefetching Routes. Prefetching allows a route to be fetched and loaded in the background.
Make authentication and other flows using an initial redirect easier to build. Apps are now wrapped in a virtual root navigator.
Improved documentation with new "Router 101" section.
Expo UI aims to give developers easy access to native UI components from Jetpack Compose and SwiftUI. It will include essential platform primitives like toggles, sliders, context menus, pickers, and lists.
This library is currently an early prototype — it's experimental, and it's changing quickly. APIs may change. You will find issues and limitations. We don't recommend using this in production yet.
The new experiments.remoteBuildCache config will enable remote caching for your local builds, so you never have to re-compile a project if you or any of your teammates have already created a build with a matching fingerprint.
You can implement your own cache provider, or use a prebuilt provider like GitHub or EAS. During this initial experiment period, we've limited the number of cached builds with the EAS provider to 10 on the free and on demand plans, 50 with the production plan, and 100 with the enterprise plan (per billing cycle).
expo-av: The Video component was replaced by expo-video in SDK 52 and the Audio API is replaced by expo-audio in SDK 53. The package will no longer be maintained and we will not publish any new versions for SDK 54 and beyond.
expo-background-fetch: This library has been replaced by expo-background-task, which uses modern platform APIs.
jsEngine field in app config has been deprecated: JavaScriptCore support in React Native core has been deprecated in react-native@0.79 and will be removed in the near future. It will still be possible to use JavaScriptCore through the @react-native-community/javascriptcore package.
Push notifications are no longer supported in Expo Go for Android, after being deprecated in SDK 52.
React DevTools has been removed from Expo CLI: now that it is available through React Native DevTools, it's no longer listed in the plugins.
Node 18 reached End-Of-Life (EOL) on April 30, 2025. Use at least Node 20 for SDK 53 projects.
React 19 comes with some breaking changes. See the React 19 upgrade guide.
Internal imports in React Native were updated to export syntax. If importing from within the React Native package with require a nested path (react-native/x/y), you may need to update your imports.
package.json exports and imports now enabled by default as of React Native 0.79.
Updated default AppTheme. New native Android projects now use the DayNight theme.
Edge-to-edge is enabled by default in new projects and in Expo Go for Android.
Deprecated setImmediate polyfill has been removed from the runtime.
Android package name is no longer automatically added as a linking scheme in prebuild.
EAS Build now uses frozen lockfiles by default for SDK 53+ projects. You can opt out by setting EAS_NO_FROZEN_LOCKFILE=1.
Added upload and download commands for remote build cache. Run eas upload to share builds by URL and eas build:download to download a build.
"Build comparison" and "Fingerprint comparison" views help you understand your project and troubleshoot issues. Fingerprints are stored for each build and update and can be compared with a diff view.
React 18 peer dependencies can lead to multiple react installations. Many libraries have peer dependencies on React 18 — even though they are likely compatible with React 19. You may need to add overrides to your package.json to ensure every library uses the same single version of React.
Some libraries are incompatible with Metro ES Module resolution. For example, there are known issues with @supabase/supabase-js and @firebase/* packages. You can work around this by opting out of this feature.
Snack does not yet support SDK 53. This is coming soon.
To upgrade your app to Expo SDK 53 from 52:
Update to the latest version of EAS CLI (if you use it):
npm i -g eas-cli
Upgrade all dependencies to match SDK 53:
npx expo install expo@^53.0.0 --fix
If you have any resolutions/overrides in your package.json, verify that they are still needed.
Check for any possible known issues:
npx expo-doctor@latest
Refer to the Deprecations & removals section above for breaking changes.
Make sure to check the changelog for all other breaking changes.
Upgrade Xcode if needed: Xcode 16 is needed to compile. We recommend Xcode 16.2+ for SDK 53.
If you use Continuous Native Generation:
If you don't use Continuous Native Generation:
npx pod-install if you have an ios directory.If you use development builds with expo-dev-client: Create a new development build after upgrading.
If you use Expo Go: Consider migrating to development builds.
APR 29, 2025
Author: Juwan Wheatley
We've launched a new tool on our website to enhance your build debugging experience, allowing you to compare two builds side by side and easily parse the changes using the new log diffing UI. Visit a valid, finished build and click the "Compare" button in the top right of the page to try it out!
Learn more about the most powerful file-based React framework at expo.dev/router.
Organization owners and admins can now see who has two-factor authentication (2FA) enabled on their team by visiting the members page:
The EAS Workflows UI continues to improve by providing more feedback when canceling a run. The cancelation button now responds immediately to interaction. The UI indicates that the cancelation is pending, and the workflow run details page updates to reflect its new cancelation state.
We've made some changes to the invitation page to help you understand how to accept an invite when you receive an invitation link in one of your email inboxes, but the Expo account you're currently logged into is connected to a different email address. For example, this is common when you are invited to an organization under a separate Expo user account associated with your organization, and you are still logged in to your personal or hobby Expo user account.
Thanks to Kadi, Tomek, Jon, Simek, and others for working on some of the changes mentioned in this post!
Learn about the changes, how to try it out, and how to give feedback.
APR 1, 2025
We have released patches for four modules to address a breaking change in Xcode 16.3, which was released March 31st. The breaking change is the removal of a specific base template type in C++ in LLVM 19 (the Xcode compiler) and introduces errors when building Expo apps.
You may encounter an error like this:
298 | static_assert(is_standard_layout<value_type>::value, "Character type of basic_string_view must be standard-layout");
299 | static_assert(is_trivial<value_type>::value, "Character type of basic_string_view must be trivial");
> 300 | static_assert(is_same<_CharT, typename traits_type::char_type>::value,
| ^ implicit instantiation of undefined template 'std::char_traits<unsigned char>'
301 | "traits_type::char_type must be the same type as CharT");
302 |
303 | // [string.view.cons], construct/copy
The following packages have been patched:
expo-device@7.0.3expo-gl@15.0.5expo-dev-client@5.0.18expo-dev-menu@6.0.23 (installed by expo-dev-client)expo-dev-launcher@5.0.33 (installed by expo-dev-client)To upgrade these packages, run:
npx expo install --fix
React Native versions older than 0.77 have the same issues. This was fixed in react-native@0.77.0 with an upgrade to the native dependency, Folly. You will need to use React Native 0.77 or newer if you are using Xcode 16.3.
A fix for React Native 0.76 is in progress: facebook/react-native#50431.
For more information on using React Native 0.77 in SDK 52, see the React Native 0.77 release notes.
MAR 25, 2025
By James Ide
EAS is introducing M4 Pro-powered workers for iOS build jobs and other CI/CD workflow jobs that run on macOS. They are enabled by default and build times are over 1.85x faster on average.
Each job differs but to give a general sense of the performance improvement you can expect, the average build job runs about 1.85x faster — a 45-50% reduction in build time — with the new workers. This is due to more CPU cores, more memory, and the newer chip architecture.
The new M4 Pro-based workers finish builds in about half the time as the old workers (lower is better)
M4 Pro-based workers are enabled by default. You do not need to do anything to use them. Customers running paid build jobs will receive priority to run their jobs on a new, faster worker. We have provisioned enough capacity to cover EAS's customers.
Developers on the Free plan also may be assigned M4 Pro-based workers but do not receive priority access. We will make M4 Pro-based workers the default for the Free plan over the next couple of weeks.
There is no change in pricing for these upgraded workers. Developers will enjoy faster iteration speed without needing to spend more or think about pricing changes.
Let us know on X and Bluesky how your EAS build times have improved compared to a few weeks ago. You can also contact us through our website if you encounter compatibility problems with the new workers. So far, we have observed only performance improvements and think this change will give you even more iteration speed as app developers.
MAR 8, 2025
You will soon be able to set an icon for your project and your account profile on the EAS website, and the legacy system is being phased out.
This is an advance announcement about project icons and account profile icons on the EAS website.
The first change you may notice is that your project icons may have been replaced with a placeholder icon with your project name's initial letter:
The background behind this change is that older projects specified their icons using the Classic Updates service, which was sunset last February. Icons were part of these older updates, and they are removed with inactive updates when the updates expire.
For clarity, this change does not impact the home screen icons of any end user apps. It affects what developers see on the EAS website and we will be adding a new way to upload icons.
Over the coming weeks, we will be adding options to upload project icons and account profile icons. You will be able to specify the icon you want to see for each project on the EAS website. In addition, you will also be able to specify the profile icon for your account, which we've been wanting to add for a long time.
Organization accounts will be able to have profile icons
We will share more when this feature is generally available.
FEB 18, 2025 by Brent Vatne
React Native 0.78 is supported in a canary release of the Expo SDK, instructions available in this post. Expo SDK 53 will be released in the spring and will likely support React Native 0.79.
Note: as of March 20, 2025,
canaryuses React Native 0.79. Depending on when you are reading this post,canarymay even point to another version - it will always use the latest version that is on the expo/expo main branch. The last canary version to use React Native 0.78 is:53.0.0-canary-20250306-d9d3e02. Use this in place of thecanarytag when creating a project or installing theexpopackage to install that specific version; however, we recommend using the latest.
Expo SDK 52 currently supports React Native 0.76 (default), released October 23, 2024, and 0.77 (opt-in), released January 21, 2025.
React Native 0.78 support is available in a canary release of the Expo SDK, to allow early adopters to use it right away. This is not intended to be a stable release, but if you are particularly adventurous and have a good motivation to use it today, you certainly can (provided that other non-Expo libraries you depend on are also compatible).
Canary releases represent a snapshot of the state of the main branch at the time they are published. Canary package versions include -canary in the name, along with the date and commit hash, such as 51.0.0-canary-20240418-8d74597.
Getting started:
npx create-expo-app my-app --template blank@canarynpx expo install expo@canary --fixWhen using a canary release, you should be aware that:
React Native 0.78 includes a number of changes that would make supporting it in Expo SDK 52 unfeasible. The most significant of these is the React version: React Native 0.78 bumps React to 19, while 0.76 and 0.77 use 18.
New Expo SDK versions are released three times each year. Between these releases, we publish pre-release versions of the expo package and all of the Expo SDK packages. Pre-releases are not considered stable and should only be used if you are comfortable with the risk of encountering bugs or other issues.
At Expo, we have found that releasing three major versions provides a good balance of stability and innovation for developers depending on our open source tools. Following this schedule, the timing that works out better for releasing SDK 53 coincides with the time when React Native 0.79 is likely to be released.
Expo and Meta work closely together on releases, and we will keep improving our processes to get the latest Expo and React Native features to you as quickly as possible. With the current release cadences, ideally there will be a dedicated Expo SDK release for each second React Native release, with the in between version being supported by the previous Expo SDK release.
Expo SDK 53 is intended for release this spring, in advance of App.js Conf. It is intended to support React Native 0.79. Keep an eye out for a beta release in late March or April.
JAN 21, 2025
Today, React Native 0.77 was released, and Expo SDK 52 now supports both React Native 0.76 and 0.77. Typically, an Expo SDK version is tied to a specific React Native version. For example, Expo SDK 50 was only tested against and expected to be compatible with React Native 0.73, and tools such as Expo CLI and Doctor will validate that you are using the expected version. We've decided that this isn't necessary for React Native 0.77. As a result, this should be an even quicker upgrade than usual – if you choose to upgrade.
The 0.77 release includes a number of bug fixes and improvements, but React Native engineers at Meta consider it to be a relatively small release.
To minimize the disruption of SDK releases, we opted for adding support for both 0.76 and 0.77 to the same SDK release. Previously, we have taken this approach with React Native 0.74 and 0.75 with SDK 51.
Expo Go stays on React Native 0.76, and it does not support React Native 0.77. Create a development build if you want to use React Native 0.77.
The default React Native version for Expo SDK 52 will continue to be 0.76. You can opt in to use version 0.77 by following these steps:
All Expo packages will work with both 0.76 and 0.77 versions. However, some other popular libraries that we include in the Expo SDK and validate against do not have releases that are compatible with both versions simultaneously. For example, react-native-reanimated@3.16.1 does not support React Native 0.77, you will need to use react-native-reanimated@~3.16.7.
To avoid warnings about incompatible versions, you can exclude packages from version validations. This is done by adding the expo.install.exclude property to your package.json file. For example:
{
"expo": {
"install": {
"exclude": [
"react-native@~0.76.6",
"react-native-reanimated@~3.16.1",
"react-native-gesture-handler@~2.20.0",
"react-native-screens@~4.4.0",
"react-native-safe-area-context@~4.12.0",
"react-native-webview@~13.12.5"
]
}
}
}
This will ensure that Expo tools will not warn you about incompatible versions of react-native and react-native-reanimated, as long as the Expo SDK that you are using is recommending the specified versions. So, when you update to SDK 52, these exclusions will no longer apply because the recommended versions will have changed.
Firstly, update expo to at least version 52.0.27. Then, install dependencies compatible with React Native 0.77:
npx expo install react-native@~0.77.1 react-native-reanimated@~3.16.7 react-native-gesture-handler@~2.22.0 react-native-screens@~4.8.0 react-native-safe-area-context@~5.1.0 react-native-webview@~13.13.1
npx expo prebuild --clean again to re-generate the native projects to pull in changes that make the app compatible with React Native 0.77.We'll continue working on improving Expo and bringing in support for React Native 0.78 later this year. If you run into any issues with React Native 0.77 and Expo SDK 52, please file an issue.
DEC 19, 2024
By Philippe Loulidi
Get ready to see more data about your projects: we just added resource usage data at the project level on the Expo dashboard.
Every project on expo.dev now has detailed information about how many builds you've made and how many updates you've delivered. This adds a layer of granularity to your usage data, allowing you to see the breakdown of builds and updates for each project, instead of just seeing the total for your account.
You'll see information like a breakdown of builds you and your team have made, filterable by platform and resource class. You'll also find data on your Monthly Active Users (MAU) and global edge bandwidth consumption.
To find these new usage metrics, navigate to the usage page on your project.
DEC 17, 2024 by Keith Kurak
We recently updated our privacy policy to reflect changes in data protection laws and our adherence to them.
Since the replacement of Privacy Shield in 2020, Expo has complied with the EU-U.S. Data Privacy Framework, the UK Extension to the EU-U.S. Data Privacy Framework, and the Swiss-U.S. Data Privacy Framework as set forth by the U.S. Department of Commerce regarding the collection, use, and retention of personal information transferred from the European Union, United Kingdom, and Switzerland to the United States.
At the time, we self-certified to the U.S. Department of Commerce that we adhere to the EU-U.S. Data Privacy Framework Principles, the UK Extension to the EU-U.S. Data Privacy Framework Principles, and the Swiss-U.S. Data Privacy Framework Principles; however, the privacy policy hosted on our website has only now been updated accordingly. We regret the oversight, and our privacy policy now reflects our compliance with these Data Privacy frameworks.
You can read the updated privacy policy here.
NOV 14, 2024
By Juwan Wheatley
Channel pausing for EAS Update is now available. With channel pausing, you can disable sending updates to specific deployments, which allows you to better control update distribution and prevent runaway EAS Update usage.
Developers can pause and resume updates directly on the channel details page on expo.dev or via EAS CLI with the following commands:
eas channel:pause <channel-name>
eas channel:resume <channel-name>
Check it out and let us know what you think!
Release Date: November 12, 2024
Expo SDK 52 includes React Native 0.76 and marks the rollout of React Native's New Architecture by default for all newly created projects.
After a year of collaboration with Meta, Software Mansion, and community developers, the New Architecture is now enabled by default for all new projects from SDK 52 onward.
npx create-expo-app will have newArchEnabled set to true in app.json.newArchEnabled to false and creating a development build.npx expo-doctor@latest to find incompatibilities with the New ArchitectureminSdkVersion and compileSdkVersion bumped from 23 to 24 and 34 to 35 respectivelyexpo-video - Now stable. Migrated from beta with improvements based on community feedback. More reliable, easier to use, more performant, and more powerful than the Video component from expo-av. Includes lock screen controls and Picture-in-Picture support on both Android and iOS, plus a utility for generating video thumbnails.
expo-audio - New beta library providing a modern, stable, and easy-to-use API for adding audio to apps. Not yet included in Expo Go.
expo-file-system/next - Beta release of a rebuilt library with a new API designed for ease of use. Enables synchronous read/write operations using SharedObjects and advanced features like stateful file handles. Fully backwards compatible.
expo-camera - Many improvements after being promoted from expo-camera/next in SDK 51. Now more robust with Swift Concurrency for improved reliability.
expo-live-photo - New iOS-only library for playing back iOS Live Photos. Added support to expo-image-picker for picking live photos.
expo-image v2 - Introduces the useImage hook for preloading images with size and metadata before rendering. Returns a shared reference to a native image instance that can be passed directly to the Image component. Added onDisplay event when images are displayed on screen.
expo-image-manipulator - New object-oriented, contextual API that is more performant and provides better developer experience.
expo-sqlite improvements:
expo-sqlite/kv-store API provides convenient key/value storage, implementing the same API as @react-native-async-storage/async-storage with synchronous APIsexpo-notifications improvements - Many bug fixes and improvements including better FCMv1 support and improved background task support that now runs even when app is terminated.
Other improvements:
Uint8ArrayexpoConfig in expo-constantsexpo-calendarreact-native-edge-to-edge library supportSplashScreen.setOptions({ fade: true, duration: 1000 })splash field in favor of the config plugin for developers using Continuous Native GenerationpreventAutoHideAsync() (doesn't impact release builds; appears to be an Android OS issue)DOM Components make it easier to incrementally migrate from web to native and provide an escape hatch for integrating any web library into native apps.
Create a React DOM component file (using <div>, <span>, etc.) and add the "use dom" directive to the top. You can then import and use it like a normal component from React Native code. The DOM component renders inside a webview but works through props. Any web library can be used within DOM components.
"experiments": { "reactCompiler": true } in app confignpx expo run:ios --binary /path/to/binEXPO_USE_METRO_REQUIRE=1resolver.requireCycleIgnorePatterns in server bundlesEXPO_USE_METRO_WORKSPACE_ROOT - Now enabled by default for better monorepo supportios.appleTeamId to set DEVELOPMENT_TEAM in PBX projectsexpo-modules-autolinking instead)npx expo run --eager bundles JavaScript before native compilationCMTime (iOS) and Duration (Android) now supported as convertible typescustomizeRootView to ExpoAppDelegateSubscriberProtocolOnUserLeavesActivity event to lifecycle listenersuseEvent and useEventListener APIs for simpler event handlingandroid.gradleAarProjectsregisterWebModule<Tabs /> component with Radix-like API for un-styled tab layouts/_sitemap route with sitemap: falsenpx expo export:embed --eager improves error detection speed (can be disabled with EAS_BUILD_DISABLE_BUNDLE_JAVASCRIPT_STEP=1)expo-video insteadexpo-cameraexpo-sqliteexpo-camera insteadprivacy field from app.json removednpx create-expo-app insteadHref type and navigation hooks/APIsHrefsset functions no longer execute synchronouslyexpo-splash-screenexpo to ^52.0.0 in package.json and run yarn, then yarn expo install --fixnpm i -g eas-clinpx expo install expo@^52.0.0 --fixresolutions/overrides from package.jsonnpx expo-doctor@latestnpx pod-install or use Native project upgrade helperFor more help, see the Troubleshooting SDK upgrade guide or join office hours on Wednesdays at 12:00PM Pacific on Discord.
Learn about the changes, how to try it out, and how to give feedback.
OCT 14, 2024
By Josh McFarlin
A new feature – the security activity record – is now available to all EAS users. It aims to give users insight into modification actions on their EAS user profile and helps them investigate any suspicious activity should it be necessary.
Users can use the security activity record to see a history of modifications their EAS user profile and the IP address of the device that made each change. It provides a detailed log of changes made to your user profile, which can be helpful when checking for unauthorized activity.
At the time of this blog post, the security activity record covers changes to:
The security activity record is available immediately to everyone through the EAS dashboard user profile settings with no additional setup required.
It is worth mentioning that, in addition to the security activity record, we also offer Audit Logs for enterprise customers which gives deeper insights into operations on the organization level.
AUG 29, 2024
Users who enabled this during the beta period saw their Android builds complete 40% faster on average. Since this change is fully on EAS's infrastructure, no migrations in your project are necessary. You'll now enjoy faster Android builds at no extra cost, giving you more time to develop your app.
We are excited to announce that we've improved our Android build infrastructure, making the new infrastructure the default going forward for every EAS user.
Due to the new infrastructure changes, those of you who use nested virtualization, such as an Android emulator for jobs like end-to-end tests, will need to opt out of using the new infrastructure. To use the previous infrastructure, visit your project settings to switch back.
A benefit of using EAS is that we're always trying to improve our build infrastructure to be on the latest and greatest hardware. When we roll out changes like this, you get better performance, and we're able to run more builds with less queue time.
If you have issues with the new build infrastructure or any feedback, please contact us. We value your input and are here to help.
AUG 21, 2024
As of recently, enterprise plan users can access audit logs through the Expo website. Audit logs are a chronological record of important actions taken by members of your organization. This includes things like permission grants, credential modifications, and actions taken on apps.
Audit logs have been enabled for several objects that will offer the highest level of action tracking. While we will be adding new ones to audit logs in the future, at the time of this blog post, we have enabled them for:
Audit logs are available on the enterprise plan and can be exported for 18 months.
In the near future we will also roll out security activity, which will provide details about security-related activities in your user profile. We believe that security is a baseline of any good product and because of that security activity will be available for all users. Stay tuned for more information.
August 14, 2024 by Gabriel Donadel
React Native 0.75 was released, and Expo SDK 51 now supports both React Native 0.74 and 0.75. Typically, an Expo SDK version is tied to a specific React Native version. For example, Expo SDK 50 is only tested against and expected to be compatible with React Native 0.73. We've decided that this isn't necessary for React Native 0.75, making this an even quicker upgrade than usual.
The 0.75 release includes bug fixes and improvements, but React Native engineers at Meta consider it a relatively small release compared to the upcoming 0.76 release in the fall. To minimize the frequency of SDK releases and continue rolling out the New Architecture, we opted to add support for both 0.74 and 0.75 to the same SDK release.
The default React Native version for Expo SDK 51 will continue to be 0.74. You can opt in to using 0.75 with the following steps:
All Expo packages work with both 0.74 and 0.75 versions. However, some libraries in the Expo SDK do not have releases compatible with both versions simultaneously. For example, react-native-reanimated@~3.10.0 does not support React Native 0.75; you will need react-native-reanimated@~3.15.0.
Add the expo.install.exclude property to your package.json file:
{
"expo": {
"install": {
"exclude": [
"react-native@~0.74.0",
"react-native-reanimated@~3.10.0",
"react-native-gesture-handler@~2.16.1",
"react-native-screens@~3.31.1"
]
}
}
}
npx expo install react-native@~0.75.0 react-native-reanimated@~3.15.0 react-native-gesture-handler@~2.18.1 react-native-screens@~3.34.0
npx expo prebuild --clean -p android to re-generate the native projects.expo-camera.With Expo SDK 51 and React Native 0.75, the autolinking step for React Native libraries is now faster — up to ~6.5x faster on Android and ~1.5x faster on iOS.
When installing CocoaPods or running an Android build, autolinking speed improvements may not be immediately noticeable. However, for quick tasks like generating a project fingerprint with @expo/fingerprint, autolinking can represent significant execution time.
In an upcoming version of React Native, the React Native Community CLI and autolinking packages will be removed from React Native, and our new implementation will become the default. Set EXPO_UNSTABLE_CORE_AUTOLINKING=1 to try it with the latest version of Expo SDK 51 and React Native 0.75.
We'll continue working on SDK 52 and React Native 0.76, with plans to have them ready early in the fall. If you encounter any issues with React Native 0.75 and Expo SDK 51, please file an issue on GitHub.
JUL 12, 2024
The EAS Build team is continuing image-related maintenance efforts to ensure that the builder VM images are up-to-date and secure. Recently, a new ubuntu-22.04-jdk-17-ndk-26b image was added to better support builds using SDK 51.
Additionally, we are dropping support for old Android images running Ubuntu 20.04 or using Java 8. Starting September 1st, 2024, these will no longer be available:
ubuntu-20.04-jdk-8-ndk-r19cubuntu-20.04-jdk-11-ndk-r19cubuntu-20.04-jdk-8-ndk-r21eubuntu-20.04-jdk-11-ndk-r21eubuntu-20.04-jdk-11-ndk-r23bubuntu-22.04-jdk-8-ndk-r21eIf you are using one of the images listed above in your eas.json configuration file, we recommend updating your configuration to use latest and auto tags or some of the images with newer JDK and Ubuntu versions as soon as possible to avoid any disruptions in your build process.
The ubuntu-20.04-jdk-8-ndk-r19c and ubuntu-20.04-jdk-11-ndk-r19c images were used by our default auto image resolution logic for Expo SDKs below version 46. The ubuntu-20.04-jdk-11-ndk-r21e and ubuntu-20.04-jdk-8-ndk-r21e were used for SDKs 46 and 47. All of these resolutions will be updated to use the ubuntu-22.04-jdk-11-ndk-r21e image. The resolution logic for newer SDKs will remain unchanged.