Mobile Config Reference
Every field of the mobile block in absolute.config.ts. Three are required; everything else has a default or is only needed for the feature it configures. After a change, run bunx absolute mobile sync to apply it to the native projects.
#Examples
Minimal. Enough to develop and run on emulators, simulators and devices.
mobile: {
appId: 'com.example.shop',
appName: 'Shop',
server: { productionOrigin: 'https://shop.example.com' }
}Ready for the stores. Branding, deep links, push, error reporting and over-the-air updates.
import { defineConfig } from '@absolutejs/absolute';
export default defineConfig({
mobile: {
appId: 'com.example.shop',
appName: 'Shop',
entry: '/home',
platforms: ['ios', 'android'],
server: { productionOrigin: 'https://shop.example.com' },
ios: { version: '1.4.0' },
branding: {
icon: 'branding/icon.png',
android: {
backgroundColor: '#0F172A',
foreground: 'branding/android-foreground.png',
monochrome: 'branding/android-monochrome.png'
},
ios: {
darkIcon: 'branding/icon-dark.png',
tintedIcon: 'branding/icon-tinted.png'
},
splash: {
backgroundColor: '#FFFFFF',
darkBackgroundColor: '#0F172A',
logoScale: 0.25
}
},
deepLinks: {
scheme: 'shop',
hosts: ['links.example.com'],
apple: { appIdPrefix: 'ABCDE12345' },
android: {
sha256CertificateFingerprints: [
'14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5'
]
}
},
pushNotifications: {
android: { googleServicesFile: 'google-services.json' }
},
observability: {
project: 'shop',
environment: 'production',
sampleRate: 0.5
},
updates: {
channel: 'production',
publicKeys: { '2026-10': 'MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE…' },
server: {
rollout: { automatic: true }
}
}
}
});#Required
| Field | Type | Default | What it does |
|---|---|---|---|
appId | string | Required | Store identifier in reverse-domain form, such as com.example.shop. Each segment starts with a letter. |
appName | string | Required | The name shown under the app icon. |
server.productionOrigin | string | Required | Your deployed server, where the app loads page data and calls your API. HTTPS only (http is allowed on localhost), with no path, query, fragment or credentials. |
#App and projects
| Field | Type | Default | What it does |
|---|---|---|---|
engine | 'capacitor' | 'expo' | 'capacitor' | Capacitor builds every app. Choose Expo to write some screens in React Native. |
entry | string | '/' | The route the app opens on. It must be one of your page routes. |
platforms | ('ios' | 'android')[] | ['ios', 'android'] | Which native projects to generate and build. At least one. |
ios.version | string | None | App Store version, one to three numbers such as 1.4.0. Needed for App Store builds; build numbers are assigned for you. |
nativeProject.directory | string | 'mobile' | Where the android and ios projects live. With Expo the generated project defaults to .absolutejs/mobile/expo. |
bundleDirectory | string | '.absolutejs/mobile/web' | Where the packaged interface is written before it is copied into the native projects. Must stay inside the project. |
compatibility.store | string | None | Module whose default export is a blob store, such as awsS3BlobStore from @absolutejs/blob/aws-s3. Builds keep their release history there, so a fresh CI checkout still serves apps already installed. Since 0.20.0-beta.134. |
compatibility.prefix | string | 'absolutejs/mobile-compatibility' | Key prefix inside the store, for several apps or environments sharing one bucket. |
#Deep links
Your server publishes the Apple and Android association files for these hosts automatically. A production server will not start while the identity for a configured platform is missing.
| Field | Type | Default | What it does |
|---|---|---|---|
deepLinks.scheme | string | appId, lowercased | Custom URL scheme such as shop://, also used for the sign-in callback. |
deepLinks.hosts | string[] | Your production host | Extra HTTPS hosts whose links open the app. Plain hostnames: no port, wildcard or path. Your production host is always included. |
deepLinks.apple.appIdPrefix | string | None | Your Apple App ID prefix, usually the ten-character Team ID. Required in production when iOS is a platform. |
deepLinks.android.sha256CertificateFingerprints | string[] | None | SHA-256 fingerprints of every certificate that signs your Android builds, including Play App Signing. Colons are optional. Required in production when Android is a platform. |
#Branding
absolute mobile assets generates every icon and splash size from these images. Colours are #RRGGBB.
| Field | Type | Default | What it does |
|---|---|---|---|
branding.icon | string | Required if branding is set | Square PNG, at least 1024×1024. Used for iOS and as the base of the Android icon. |
branding.android.backgroundColor | #RRGGBB | '#FFFFFF' | Adaptive icon background colour. |
branding.android.backgroundImage | string | None | Opaque 1024×1024 PNG used as the adaptive icon background instead of a colour. |
branding.android.foreground | string | Derived from icon | Transparent 1024×1024 PNG kept inside Android’s safe zone. |
branding.android.monochrome | string | None | Transparent single-colour 1024×1024 PNG for themed icons. |
branding.ios.darkIcon | string | None | 1024×1024 PNG for the dark appearance. |
branding.ios.tintedIcon | string | None | 1024×1024 PNG for the tinted appearance. |
branding.splash.backgroundColor | #RRGGBB | '#FFFFFF' | Launch screen background in light mode. |
branding.splash.darkBackgroundColor | #RRGGBB | '#111111' | Launch screen background in dark mode. |
branding.splash.image | string | None | A finished square launch image, at least 2732×2732. Without one, your icon is centred on the background. |
branding.splash.darkImage | string | None | The dark-mode launch image, at least 2732×2732. |
branding.splash.logoScale | number | 0.2 | Size of the centred icon relative to the screen, from 0.1 to 0.4. |
#Push notifications
iOS push needs no config. Page code uses pushNotifications from @absolutejs/devices; the server side is set up in @absolutejs/auth.
| Field | Type | Default | What it does |
|---|---|---|---|
pushNotifications.android.googleServicesFile | string | 'google-services.json' | Firebase config for Android push. It must contain a client for your appId, and is copied into the Android project when you use pushNotifications. |
#Observability
JavaScript errors and native crashes, hangs and ANRs are sent to a route on your production server.
| Field | Type | Default | What it does |
|---|---|---|---|
observability.project | string | Required if observability is set | Project name attached to every report, up to 255 characters. |
observability.environment | string | None | Environment attached to reports, such as production. 1 to 64 characters. |
observability.route | string | '/api/observability/errors' | The route on your production server that receives errors and native crash reports. Your server provides it. |
observability.sampleRate | number | 1 | Fraction of errors sent, from 0 to 1. |
#Updates
Signed over-the-air updates for your interface. Changes to native features still need a store build.
| Field | Type | Default | What it does |
|---|---|---|---|
updates.publicKeys | Record<string, string> | Required if updates is set | Base64 DER ECDSA P-256 public keys, by key ID. Keep old IDs while installed apps still trust them. |
updates.channel | string | 'production' | The release channel this build follows. |
updates.manifestUrl | string | /__absolute/mobile/updates/<channel>/update.json on your server | Where the app looks for updates. HTTPS only outside localhost. |
updates.bootTimeoutMs | number | 20000 | How long a new update has to show its first page before the app rolls back. 5000 to 120000. |
updates.expoCodeSigning | { certificatePath, keyId? } | keyId 'main' | Expo only. The certificate Expo uses to verify updates; its private key stays on your server. |
updates.server.autoMount | boolean | true | Serve updates from your AbsoluteJS server. The manifest must then be on productionOrigin and end in /update.json. |
updates.server.registry | string | 'mobile.update.ts' | The module that stores releases, created by absolute mobile update provision. |
updates.server.health | false | { failureRate?, minimumReports?, secretEnv? } | On: 0.2, 20, ABSOLUTE_MOBILE_UPDATE_HEALTH_SECRET | Installed apps report whether updates start. A release whose failure rate passes failureRate after minimumReports is paused. |
updates.server.rollout | false | { automatic?, stages? } | Off | Staged rollout. Default stages are 5%, 25% and 100%, each observed for 60 minutes with at most 5% failures. automatic moves through them on its own. Requires health. |
updates.server.expoPrivateKeyEnv | string | 'ABSOLUTE_EXPO_UPDATE_PRIVATE_KEY' | Expo only. Environment variable holding the private key that signs updates. |
updates.server.expoCodeSigningKeys | Record<string, { certificatePath, privateKeyEnv }> | None | Expo only. Previous signing keys, kept while apps signed with them are still installed. |
#Release policy
| Field | Type | Default | What it does |
|---|---|---|---|
release.certification | false | { channels?, googlePlayTracks? } | production: Android installed, iOS store | What testing a release needs before it is published to a channel or Play track. channels maps a channel to android: installed and ios: simulator, device or store. false turns the requirement off. |
#Expo only
With engine: 'expo', two more fields are available. Every shared field above works the same way.
mobile: {
engine: 'expo',
appId: 'com.example.shop',
appName: 'Shop',
server: { productionOrigin: 'https://shop.example.com' },
routes: {
native: {
'/scanner': './mobile/native/scanner.tsx',
'/products/:productId': './mobile/native/product.tsx'
}
}
}| Field | Type | Default | What it does |
|---|---|---|---|
routes.native | Record<string, string> | None | Route patterns rendered by a React Native module. :name matches one segment; a final * matches the rest. Every other route stays your AbsoluteJS page. |
routes.default | 'web' | 'web' | Routes not listed under native are your AbsoluteJS pages. |
expo.sdkVersion | 57 | 57 | The Expo SDK the generated project uses. |
/* is not allowed, and /__absolute/native is reserved. Expo covers writing these screens.