Skip to content

Export for Mobile

File ▸ Export for Mobile (React Native)… writes a bare React Native project with your game already inside it, which you then build and submit to the App Store or Play Store yourself. No Expo, no Awaken service in the loop: the output is an ordinary RN project and it is yours to change.

What you get

The export writes a directory, not a zip:

game/           your exported game (game.html + scene.fg). Both platforms read this one directory.
App.tsx         a full-screen WebView pointed at game/game.html
android/        Android project. build.gradle folds game/ into the app's assets.
ios/            iOS project. The Podfile copies game/ into the app bundle during the build.
awaken.config.json   the identity this export was stamped with

The template ships landscape lock, keep-awake, and Android back-button handling already wired.

App identity

Identity is derived from the saved project name, so a project saved as Mall Rats.awaken becomes:

FieldValue
displayNameMall Rats
bundleIdcom.awaken.mall-rats
packageNamesame as bundleId, so the two stores agree
orientationlandscape (default)

A project with no usable name falls back to Awaken Game. Rename the app in Xcode or Android Studio afterwards if you want something else; re-exporting will not revert it (see below).

Display names are escaped per platform, and the two rules deliberately differ. Info.plist takes standard XML entities. Android's values/strings.xml looks like XML but is not plain XML text: aapt2 resolves entities first and then applies its own rules, so ' resolves to a bare ' that aapt2 rejects, and " resolves to a bare " that aapt2 silently treats as Android quote syntax and strips - shipping the name without its quotes. Android strings therefore get backslash escapes instead. This is verified against the real aapt2 binary rather than against something that merely looks like valid XML.

Re-exporting into the same directory

Awaken remembers the directory you exported to, so the second export does not ask again. What it writes depends on what it finds there:

An update writes only the two game payload files. Native config is left alone, so a rename or any other change you made in Xcode or Android Studio survives every future export.

"This project" is checked on bundleId and packageName in awaken.config.json, not on the display name - precisely so that renaming the app natively does not make a legitimate re-export start refusing itself. A config that cannot be read or parsed counts as a mismatch: a directory the exporter cannot positively confirm as home for the current project is never treated as home for it.

Building

Node 22.11 or newer.

The exporter cannot set the executable bit on android/gradlew, because the File System Access API it writes through has no call for that. Set it once by hand:

sh
chmod +x android/gradlew
npm install
cd ios && pod install && cd ..

npx react-native run-android
npx react-native run-ios --device

Device support, stated plainly

  • iOS needs a Mac with Xcode, and iOS 26 or newer on the device. Earlier iOS has no WebGPU and the game will not run. This has been built and run on the iOS 26 simulator. WebGPU in WKWebView has not been confirmed on a physical device.
  • Android needs Android Studio and Android 12 or newer (minSdkVersion). That is the install floor, not a rendering guarantee. Android WebGPU support is unverified: Chromium's WebGPU rollout for Android has excluded Android System WebView, so the game may not render on Android even on a recent OS and WebView version.

Treat mobile as the least-proven target of the three. Export to game.html on a desktop browser is the path with the most mileage on it.

See also

Awaken — browser-native WebGPU game engine.