White-labelling: making the platform yours
Everything that carries a brand — the admin, both mobile apps, payment descriptions, push notifications — is yours to change. This page is the whole list, in two parts, because the two parts work very differently.
The one thing to understand first
| What it covers | How you change it | Rebuild? | |
|---|---|---|---|
| Runtime | Brand name, logo, accent colour — in the admin, both apps, payment pages, share text, wallet screens | Admin → Settings → Branding | No. Takes effect on next load |
| Build-time | App icon, launcher name, splash background, bundle ID, deep-link scheme | brand.config.json in each app |
Yes |
You have to rebuild the apps anyway. Every buyer publishes to their own Google Play and App Store account, under their own package name — that is not something a server can change remotely. So the build-time list is not a limitation of this platform; it is what shipping your own app means. What this platform does is make it one file and one command instead of a hunt through source.
Part 1 — Runtime (no rebuild)
Admin → Settings → Branding. Set three things:
- Brand name — appears in the admin, on the login screen, on both apps' welcome screens, in wallet and referral copy in every language, and as the merchant description your riders see on their card statement.
- Primary colour — one hex. The admin derives its whole 50–900 palette from it, and both apps derive their accent, tints and gradients from it. The Settings page previews the derived ramp live before you save.
- Logo URL — shown in the admin sidebar, on the admin login screen, and on both apps' welcome screens. The shipped mark is used when you have not set one.
That is the whole runtime story. Save, reload, done.
On languages: the brand name is injected into translations rather than baked in, so "SpeedGo Wallet" renders correctly in Tamil, Bengali, Arabic and the rest, with each language's own word order.
Part 2 — Build-time (brand.config.json)
One file per app, at mobile/rider/brand.config.json and
mobile/driver/brand.config.json:
{
"name": "SpeedGo",
"scheme": "speedgo",
"iosBundleId": "com.speedgo.rider",
"androidPackage": "com.speedgo.rider",
"brandColor": "#e11d48",
"icon": "./assets/icon.png",
"adaptiveIcon": "./assets/adaptive-icon.png",
"splash": "./assets/splash-icon.png",
"logoMark": "./assets/brand/logo-mark.png"
}
| Field | What it becomes |
|---|---|
name |
The label under the app icon. Keep it under ~12 characters or home screens truncate it |
scheme |
Deep links — payment returns and shared trip links open your app |
iosBundleId / androidPackage |
Your app's permanent identity in each store |
brandColor |
Splash background, Android adaptive-icon background, push-notification tint — the surfaces the OS paints before your JavaScript runs |
icon / adaptiveIcon / splash / logoMark |
Your artwork |
Admin → Settings → Branding will generate this file for you, pre-filled with the colour and name you chose. Drop it into the app folder.
Build it
cd mobile/rider
npm run brand:check # catches problems before the store does
npx expo prebuild --clean
npx expo run:android # or eas build
brand:check fails the build on the mistakes that are expensive to discover
late: a bundle ID that is not valid reverse-DNS, an icon that is not square or
is under 1024px, a JPEG renamed to .png (builds fine, renders black), a
missing asset, a malformed colour. It warns — without failing — if you are
still on our default bundle ID, because that one is unrecoverable after your
first publish.
The artwork you need
| File | Size | Notes |
|---|---|---|
icon.png |
1024×1024 | Square, no transparency for iOS |
adaptive-icon.png |
1024×1024 | Android foreground; keep the mark inside the middle 66% — Android masks the edges to a circle or squircle |
splash-icon.png |
1024×1024 | Centred on brandColor |
brand/logo-mark.png |
≥96px | The in-app mark on the welcome screen |
The shipped
icon.pngis a placeholder and identical in both apps. Ship distinct, real icons — stores reject two apps with the same icon, and your drivers and riders cannot tell them apart on a home screen.
Environment overrides
Every field can be overridden by an environment variable, which wins over the file — for CI and EAS build profiles that build several brands from one checkout:
APP_NAME · APP_SCHEME · IOS_BUNDLE_ID · ANDROID_PACKAGE ·
APP_ICON · APP_ADAPTIVE_ICON · APP_SPLASH · APP_ICON_BG
Resolution order is env → brand.config.json → shipped default. See each
app's ENV.md for the non-branding variables (API URLs, Maps key, EAS project).
What is deliberately not branded
The dispatch console's dark "ops" surfaces stay ink navy in every install. That is a mode, not a brand — a control room should read as a control room — and your accent colour rides on top of it. Everything else follows your brand.