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 rebuildChanges that need a rebuild
Colours, theme, fontsApp name
Navigation menu and its itemsApp icon
Languages and translationsSplash screen
WebView toggles, allowed/blocked domainsAndroid package name
Permissions on/off and their textsiOS bundle id
Ads on/off and unit idsVersion number
Store settings, update promptsFirebase files
Push notificationsDeep-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

SettingEffect
Splash logoShown centred while the app starts
Background colourUsed by both the native launch screen and the in-app splash
DurationMilliseconds (0–10000). 1500 feels right
AnimationNone / fade / zoom
Show app nameName 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

SettingWhere it shows
Primary colourButtons, active navigation, progress bar
Secondary colourSupporting surfaces
Accent colourHighlights and badges
Status bar colourThe strip at the top of the screen
Navigation bar colourThe Android system bar at the bottom
Theme modeLight / Dark / Follow system
FontSystem, 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

FieldExampleRule
Version name1.0.0What users see
Version code (Android)1Must increase with every Play upload
Build number (iOS)1Must 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.

  1. 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
  1. Copy android/key.properties.example to android/key.properties and fill in the four values.

That is all — no Gradle editing. Full details in android-build.md.


Admin → Applications

FieldUsed by
Support emailApp settings screen; both stores require a contact
Support URLOptional help page
Privacy Policy URLRequired by Google Play and the App Store
Terms URLOptional, 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:

FieldMeaning
Allowed DomainsAlso open inside the app. Wildcards: *.trusted.net
Blocked DomainsNavigation is cancelled entirely
External Links Open InIn-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:

FileWhere you get it
google-services.jsonFirebase → Project settings → Android app
GoogleService-Info.plistFirebase → Project settings → iOS app
Service account JSONFirebase → 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)

FieldFormat
Android / iOS App IDca-app-pub-…~… (tilde)
Banner / Interstitial unit idca-app-pub-…/… (slash)
Interstitial frequencyShow 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.


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…WhereRebuild
Website addressApplicationsno
App nameApplicationsyes
App iconAppearanceyes
SplashAppearanceyes
Colours / font / themeAppearanceno
Android package nameApplicationsyes
iOS bundle idApplicationsyes
VersionApplicationsyes
Signing keystoreandroid/key.propertiesyes
Privacy / terms / supportApplicationsno
Allowed domainsWebViewno
Navigation menuNavigationno
LanguagesLanguages / Translationsno
FirebaseFirebaseyes
AdMobAdsapp id: yes
Deep linksDeep Linksyes
PermissionsPermissionsyes

After any "yes": re-download the configuration package, unzip, run dart run tool/apply_config.dart, rebuild.