Customizing Your App — the complete reference
Every setting, where it lives, and whether it needs a rebuild.
The short version: you change things in the admin panel, download the configuration package, and run one command. You never edit Dart, Kotlin, Swift, Gradle or XML.
Admin panel → Applications → Download configuration package
→ unzip into the Flutter project
→ dart run tool/apply_config.dart
→ flutter build appbundle --release
That single command applies your app name, package name, bundle id, version, launcher icons, native splash, permissions, deep links, AdMob ids and Firebase files — all of it.
Do I need to rebuild?
| Changes that apply instantly, no rebuild | Changes that need a rebuild |
|---|---|
| Colours, theme, fonts | App name |
| Navigation menu and its items | App icon |
| Languages and translations | Splash screen |
| WebView toggles, allowed/blocked domains | Android package name |
| Permissions on/off and their texts | iOS bundle id |
| Ads on/off and unit ids | Version number |
| Store settings, update prompts | Firebase files |
| Push notifications | Deep-link domains |
| Website URL* | AdMob app id |
* The app reads it from your backend on launch. Users see the new site the next time they open the app — but set it correctly before publishing, because it is also compiled in as the offline fallback.
1. Website URL
Admin → Applications → Website URL
https://example.com
The address the app opens. Use https:// — Android and iOS both refuse plain HTTP by default, and the stores expect HTTPS.
Subdomains of this address open inside the app automatically. To allow other domains, see §11.
Rebuild: not required (but set it before your first build).
2. App name
Admin → Applications → Application Name
This becomes the label under the icon on the home screen (Android android:label, iOS CFBundleDisplayName).
Keep it under ~12 characters or the launcher truncates it. Short Name is used where space is tight.
Rebuild: yes.
3. App icon
Admin → Appearance → App Icon
Upload one 1024×1024 PNG. Square, no transparency, no rounded corners — both platforms round it themselves.
apply_config.dart generates every Android density (mdpi → xxxhdpi, plus adaptive icons) and the complete iOS AppIcon set. You never resize anything.
To regenerate on their own:
dart run flutter_launcher_icons
Rebuild: yes.
4. Splash screen
Admin → Appearance → Splash
| Setting | Effect |
|---|---|
| Splash logo | Shown centred while the app starts |
| Background colour | Used by both the native launch screen and the in-app splash |
| Duration | Milliseconds (0–10000). 1500 feels right |
| Animation | None / fade / zoom |
| Show app name | Name under the logo |
The background colour is written into the native launch screen too, so there is no white flash before your branding appears.
Rebuild: yes.
5. Colours, theme and font
Admin → Appearance
| Setting | Where it shows |
|---|---|
| Primary colour | Buttons, active navigation, progress bar |
| Secondary colour | Supporting surfaces |
| Accent colour | Highlights and badges |
| Status bar colour | The strip at the top of the screen |
| Navigation bar colour | The Android system bar at the bottom |
| Theme mode | Light / Dark / Follow system |
| Font | System, Roboto, Open Sans, Lato, Montserrat, Poppins |
These style the app's own chrome. Your website keeps its own CSS.
Rebuild: no — the app fetches them on launch.
6. Android package name
Admin → Applications → Android Package Name
com.yourcompany.yourapp
Lowercase letters, digits and dots; at least two segments. apply_config.dart writes it into applicationId.
Choose carefully. Google Play ties your listing to this string forever. It cannot be changed after your first release — a different package name is a different app. If you already published with Firebase or deep links configured, changing it means a new Firebase Android app and a new google-services.json.
The panel refuses to change it once your licence is activated, because the licence is bound to your project identity. Contact support if you genuinely need to change it before publishing.
Rebuild: yes.
7. iOS bundle id
Admin → Applications → iOS Bundle ID
com.yourcompany.yourapp
Usually identical to the Android package name. apply_config.dart writes it into project.pbxproj.
It must match the App ID you created in the Apple Developer portal, and the iOS app in your Firebase project. Same permanence warning as §6.
Rebuild: yes.
8. Version number
Admin → Applications → Version Name / Version Code / Build Number
| Field | Example | Rule |
|---|---|---|
| Version name | 1.0.0 | What users see |
| Version code (Android) | 1 | Must increase with every Play upload |
| Build number (iOS) | 1 | Must increase with every App Store upload |
Forgetting to raise these is the most common upload rejection on both stores.
Rebuild: yes.
9. Signing (Android)
The only file you ever edit by hand.
- Create your keystore once — keep it and its passwords forever; losing them means you can never update your app on Google Play again:
keytool -genkey -v -keystore appforge-release.keystore \
-keyalg RSA -keysize 2048 -validity 10000 -alias appforge
- Copy
android/key.properties.exampletoandroid/key.propertiesand fill in the four values.
That is all — no Gradle editing. Full details in android-build.md.
10. Support, privacy and terms links
Admin → Applications
| Field | Used by |
|---|---|
| Support email | App settings screen; both stores require a contact |
| Support URL | Optional help page |
| Privacy Policy URL | Required by Google Play and the App Store |
| Terms URL | Optional, shown in app settings |
Without a privacy policy URL your submission is rejected. The Compliance page flags it.
Rebuild: no.
11. WebView behaviour and allowed domains
Admin → WebView
Toggles for JavaScript, cookies, cache, pinch zoom, pull-to-refresh, file upload, downloads, camera, microphone and location, plus a custom user agent.
Domain security:
| Field | Meaning |
|---|---|
| Allowed Domains | Also open inside the app. Wildcards: *.trusted.net |
| Blocked Domains | Navigation is cancelled entirely |
| External Links Open In | In-app browser, or the system browser |
Your own domain and its subdomains are always allowed. Anything else is external unless listed. Add payment providers and your CDN here, or checkout breaks.
Rebuild: no.
12. Navigation
Admin → Navigation
Pick a style — Bottom Bar (max 5), Drawer (20), Top Tabs (20), Floating Button (1) — then add items. Drag to reorder. Each item can open a URL, go home, or open the settings/notifications screen.
Rebuild: no.
13. Languages and translations
Admin → Languages and Admin → Translations
Enable languages, set the default, edit any label inline. RTL is handled automatically for Arabic, Hebrew, Persian and Urdu. Import/export as JSON for bulk edits.
Rebuild: no.
14. Firebase and push notifications
Admin → Firebase — upload three files from your Firebase project:
| File | Where you get it |
|---|---|
google-services.json | Firebase → Project settings → Android app |
GoogleService-Info.plist | Firebase → Project settings → iOS app |
| Service account JSON | Firebase → Project settings → Service accounts → Generate key |
The package name / bundle id you register in Firebase must exactly match §6 and §7, or notifications silently never arrive.
apply_config.dart copies the first two into the project and enables the Google Services Gradle plugin. The service account never leaves your server.
Step by step: firebase.md, then push-notifications.md.
Rebuild: yes (the two client files are compiled in).
15. AdMob
Admin → Ads (AdMob)
| Field | Format |
|---|---|
| Android / iOS App ID | ca-app-pub-…~… (tilde) |
| Banner / Interstitial unit id | ca-app-pub-…/… (slash) |
| Interstitial frequency | Show one every N page loads |
Disabled by default. The panel validates the format, so a mistyped id is caught before you build.
Use your own ids for release. Google's test ids in production earn nothing and clicking your own real ads gets your AdMob account banned.
Rebuild: yes for the app id (it goes into the manifest/plist); unit ids are fetched at runtime.
16. Deep links
Admin → Deep Links
Rules like example.com/product/* open in your app instead of the browser. apply_config.dart writes the Android intent filters and iOS URL scheme.
You must also host two verification files on your website — deep-links.md has them.
Rebuild: yes.
17. Permissions
Admin → Permissions
Enable only what your site actually uses. Each enabled permission needs an iOS usage description — write an honest, specific sentence; App Store review rejects generic ones.
Only enabled permissions are compiled in, on both platforms. This matters on iOS: shipping unused permission handlers gets the upload rejected with ITMS-90683: Missing Purpose String.
Rebuild: yes.
18. Calling native features from your website
Your site can use the share sheet, read the push token, toggle notifications and more through window.AppForge. See javascript-bridge.md.
Rebuild: no.
Quick lookup
| I want to change… | Where | Rebuild |
|---|---|---|
| Website address | Applications | no |
| App name | Applications | yes |
| App icon | Appearance | yes |
| Splash | Appearance | yes |
| Colours / font / theme | Appearance | no |
| Android package name | Applications | yes |
| iOS bundle id | Applications | yes |
| Version | Applications | yes |
| Signing keystore | android/key.properties | yes |
| Privacy / terms / support | Applications | no |
| Allowed domains | WebView | no |
| Navigation menu | Navigation | no |
| Languages | Languages / Translations | no |
| Firebase | Firebase | yes |
| AdMob | Ads | app id: yes |
| Deep links | Deep Links | yes |
| Permissions | Permissions | yes |
After any "yes": re-download the configuration package, unzip, run dart run tool/apply_config.dart, rebuild.