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 withThe 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:
| Field | Value |
|---|---|
displayName | Mall Rats |
bundleId | com.awaken.mall-rats |
packageName | same as bundleId, so the two stores agree |
orientation | landscape (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 --deviceDevice 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
WKWebViewhas 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
- Export to game.html - the single-file export the mobile project wraps
- Export to a folder - the multi-file web export
- The Player - what actually runs inside the WebView
- Projects & Saving - where the app's name comes from