Branding
Veldriq Field always has a visual identity. That identity is not one logo file. Three layers apply at different times. Changing Settings → Branding in Veldriq Web does not change the home-screen icon, the native splash, or the compiled fallback PNG.
This page assumes you already have PNG files. It does not describe how to design artwork. Paths are from the Flutter root mobile/ (ZIP: veldriq-field-1.0.0/mobile).
Three layers
Section titled “Three layers”| Layer | What it is | When you see it |
|---|---|---|
| Mobile package identity | applicationId / bundle id, launcher label, store icons, native splash |
Home screen and OS splash — always this binary |
| Native fallback branding | branding/fallback_logo.png, AppTheme.fallbackPrimary / fallbackAccent |
First launch, no workspace yet, missing or invalid remote logo, or empty branding fields |
| Backend / workspace branding | Veldriq Settings → Branding → logo URL + primary + accent | After a Field session for that workspace. Cached offline until the next successful refresh |
Precedence for dynamic in-app elements: workspace value → last cached workspace value (SharedPreferences shell) → native fallback.
A remote logo must be an http:// or https:// URL. If the image 404s, the network is down, or the file is invalid, the in-app widget shows the fallback PNG. Native Field does not fall back to the Veldriq platform logo used by the CMS, portal, mail, and Field PWA. Workspace A branding does not stay on screen after you Switch workspace to B.
The API may send logo_icon_url. Native Field does not paint it. Only logo_url is shown.
App name (three places)
Section titled “App name (three places)”APP_DISPLAY_NAME is the in-app title (MaterialApp, Welcome back, Flutter boot). It is not the home-screen label.
| Place | File / flag | Default |
|---|---|---|
| Dart | --dart-define=APP_DISPLAY_NAME |
Veldriq Field |
| Android launcher | android/buyer.properties → app_name |
Veldriq Field |
| iOS launcher | ios/Runner/Info.plist → CFBundleDisplayName |
Veldriq Field |
Set all three to the same customer-facing name, then rebuild. See Android and iOS.
Change the fallback logo
Section titled “Change the fallback logo”Have a PNG ready (RGBA, transparent background recommended, at least 512×512). This PNG is the in-app mark on login, two-factor, workspace picker, password reset, and the Flutter boot screen when no workspace logo URL is usable. It is declared in pubspec.yaml as branding/fallback_logo.png.
- Replace
mobile/branding/fallback_logo.pngwith your PNG. Keep that exact path and filename unless you also change theassets:list inpubspec.yamlandBrandLogo.assetPath. - From the Flutter root:
flutter pub get, then rebuild the binary. - Verify on a fresh install or after clearing the app: Welcome back shows your PNG before any workspace is selected.
If it fails: you changed only the launcher icon — that does not replace this file. After login, a workspace logo_url still wins when it loads.
Loopback URLs (localhost, 127.0.0.1) in a workspace logo are rewritten toward API_BASE_URL when possible. If rewrite cannot produce a reachable HTTPS origin, the widget falls back to the compiled PNG.
Android launcher icon
Section titled “Android launcher icon”There is no flutter_launcher_icons package. Overwrite the files already in the tree. Manifest: android:icon="@mipmap/ic_launcher".
Paths under android/app/src/main/res/:
| Put your PNG here | Pixels |
|---|---|
mipmap-mdpi/ic_launcher.png |
48×48 |
mipmap-hdpi/ic_launcher.png |
72×72 |
mipmap-xhdpi/ic_launcher.png |
96×96 |
mipmap-xxhdpi/ic_launcher.png |
144×144 |
mipmap-xxxhdpi/ic_launcher.png |
192×192 |
drawable-xxxhdpi/ic_launcher_foreground.png |
432×432 (transparent; mark inside the inner ~66%) |
Keep those filenames. Full-bleed launcher PNGs should be opaque (no pre-rounded iOS-style mask). Adaptive icon XML is already in place: mipmap-anydpi-v26/ic_launcher.xml and ic_launcher_round.xml use @color/ic_launcher_background (template #2563EB in res/values/colors.xml) plus the foreground PNG.
- Overwrite the PNGs. Do not rename them.
- Rebuild the APK/AAB. Uninstall the previous build so the launcher cache drops.
- Verify the home-screen icon. It will not change when the office uploads a workspace logo.
iOS app icon
Section titled “iOS app icon”Authority: ios/Runner/Assets.xcassets/AppIcon.appiconset/ + Contents.json. Replacing Android mipmaps does not update iOS. Keep the filenames in Contents.json.
The App Store 1024 file must be opaque (no alpha). Apple applies the rounded mask. Do not pre-round the corners.
| Put your PNG here | Pixels |
|---|---|
Icon-App-20x20@1x.png |
20×20 |
Icon-App-20x20@2x.png |
40×40 |
Icon-App-20x20@3x.png |
60×60 |
Icon-App-29x29@1x.png |
29×29 |
Icon-App-29x29@2x.png |
58×58 |
Icon-App-29x29@3x.png |
87×87 |
Icon-App-40x40@1x.png |
40×40 |
Icon-App-40x40@2x.png |
80×80 |
Icon-App-40x40@3x.png |
120×120 |
Icon-App-60x60@2x.png |
120×120 |
Icon-App-60x60@3x.png |
180×180 |
Icon-App-76x76@1x.png |
76×76 |
Icon-App-76x76@2x.png |
152×152 |
Icon-App-83.5x83.5@2x.png |
167×167 |
Icon-App-1024x1024@1x.png |
1024×1024 (opaque) |
- Overwrite every PNG named in
Contents.json. - Rebuild / archive on macOS + Xcode. See iOS.
- Verify Springboard and the App Store Connect 1024 asset.
Splash / launch screen
Section titled “Splash / launch screen”Native splash is build-time only. Flutter’s later boot screen uses BrandLogo (fallback or workspace URL) and is not this native layer.
| Platform | Put your PNG here | This template |
|---|---|---|
| Android | android/app/src/main/res/drawable/launch_logo.png |
512×512 recommended; transparent mark. Background @color/launch_background in res/values/colors.xml (template #2563EB). Layout: res/drawable/launch_background.xml (and drawable-v21/) |
| iOS | ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png, LaunchImage@2x.png, LaunchImage@3x.png |
768×768, 1536×1536, 2304×2304. Keep those filenames. |
- Overwrite the Android and/or iOS PNGs. Optionally change
launch_backgroundincolors.xml. - Rebuild.
- Verify: cold start shows your native splash, then Flutter Checking server… / Welcome back.
Fallback colors
Section titled “Fallback colors”In-app Material theme when workspace primary/accent are absent or malformed:
| Value | |
|---|---|
| File | mobile/lib/app/theme/app_theme.dart |
| Primary | AppTheme.fallbackPrimary → const Color(0xFF0F172A) |
| Accent | AppTheme.fallbackAccent → const Color(0xFF334155) |
Replace with 8-digit ARGB. Native splash #2563EB comes from the product mark fill, not from AppTheme. Changing Dart fallback colors does not change the launcher icon. Rebuild after editing this file.
Change Field branding from Veldriq Web
Section titled “Change Field branding from Veldriq Web”Veldriq → Settings → Branding (/app/w/{workspace}/settings/branding). Permission workspace.update. Full field list: Web branding.
Native Field consumes only:
- Logo →
logo_urlon the mobile session (BrandLogo) - Primary → theme primary
- Accent → theme secondary
Not consumed by native Field: collapsed icon, sidebar, top bar, canvas, fonts, corner radius, density. Those stay CMS / portal / PWA.
No mobile rebuild is required for those three workspace fields. Field picks them up on login, workspace selection, or the next successful session fetch. Push does not deliver a new logo.
Offline: last cached logo URL and colors remain until a successful refresh. If nothing was ever cached, fallback PNG and slate colors apply.
Verify: upload a workspace logo, sign in on Field (or switch workspace), confirm login header and boot plate. Kill the app: cached branding should still show. Switch workspace: that workspace’s branding, not the previous one.
Which changes need a rebuild
Section titled “Which changes need a rebuild”| Change | Where | Rebuild Field? |
|---|---|---|
| Workspace logo | Web Branding | No |
| Workspace primary / accent | Web Branding | No |
| Fallback logo PNG | mobile/branding/fallback_logo.png |
Yes |
| Launcher / adaptive / AppIcon | native resources | Yes |
| Native splash | launch XML / LaunchImage | Yes |
| In-app fallback colors | app_theme.dart |
Yes |
| In-app title | APP_DISPLAY_NAME dart-define |
Yes |
| Home-screen label | app_name / CFBundleDisplayName |
Yes |
| applicationId / bundle id | buyer.properties / Xcode |
Yes |
Related: Android, iOS, API Base URL, Profile.