KESTREL docs
v1.0.0
Get help
● Set up · Your brand

White label
your name, your colours, your icon.

Most of the brand is set in the operator console and reaches the apps at once: name, logo, accent, announcement, maintenance and disclaimer. The store identity (bundle ID, launcher name, icons) lives in the app files, listed here.

App nameBundle IDIconsColoursEN · SK

01Two places for the brand

PlaceWhat it changes
Operator console: Brand, Legal and AccessWhat the running apps show. The server publishes these values at GET /api/config; the app reads them at start and again every minute, and keeps the last answer so the next start already shows your brand. No new build is needed.
The app source (app/)What the stores and the home screen show before the app runs: the launcher name, the bundle ID and the icons. Change these files before you publish the apps.

Every value saved in the console applies at once and wins over .env; values not saved yet start from BRAND_NAME, BRAND_ACCENT, BRAND_LOGO_URL, LEGAL_TERMS_URL and LEGAL_PRIVACY_URL (Operator console). The demo build (KESTREL_DEMO=true) always shows KESTREL.

02Set in the console

Console fieldWhere the app shows it
Brand: product nameWindow and browser tab title, the wordmark on the sign-in screen and in the side bar, and every text that mentions KESTREL (onboarding, safety, two-factor and server screens), the PnL share card and its file name. The web build also uses the last name it saw as the tab title before it starts (app/web/brand-title.js). The server uses the same name in the two-factor issuer, the verification email, Telegram and test messages, the AI assistant's prompts and the CSV export file names.
Brand: logoThe mark on the sign-in screen and in the side bar, from an https:// (or http://) image URL. The console's browser tab icon (/favicon.ico) uses it too. Without a logo the app draws the first letter of your name on your accent; the bundled KESTREL logo is shown only while the name is KESTREL, so a renamed app never shows it.
Brand: accent colourA #RRGGBB colour that replaces the ember accent in both themes (selected state, primary buttons and their gradient). The text on it switches between white and near-black for contrast by itself. An invalid value keeps the ember.
Brand: tagline, support email, websiteSettings, About.
Legal: terms, privacy, disclaimerSettings, About (links that open in the browser); the disclaimer also under the sign-in form.
Access: announcementA banner at the top of the app. Each user can dismiss it; a new text shows again.
Access: maintenance mode and messageA banner with your message, and every change action is paused. Reads, running bots and Smart Trades continue; panic, the kill switch, closing positions, cancelling orders and pausing or stopping bots stay open.

03App name in the store and on the home screen

These names are read before the app can reach your server, so they live in the app files.

Where it showsFileWhat to change
Android launcherapp/android/app/src/main/AndroidManifest.xmlandroid:label
iOS home screenapp/ios/Runner/Info.plistCFBundleDisplayName (and CFBundleName)
macOSapp/macos/Runner/Configs/AppInfo.xcconfigPRODUCT_NAME, PRODUCT_COPYRIGHT
Web install name and first tab titleapp/web/index.html, app/web/manifest.json<title>, apple-mobile-web-app-title, description; name, short_name, description
Fallback before the first config arrivesapp/lib/core/brand.dartBrand.kestrel and the bundled logo assets/brand/kestrel-mark.png

04Application ID and bundle ID

The package ships with com.mikodes.kestrel. Use your own reverse domain, for example com.yourcompany.trade. It must be unique in each store and cannot change after the first release.

PlatformFileSetting
Androidapp/android/app/build.gradle.ktsapplicationId (the namespace can stay)
iOSXcode, Runner target, Signing & Capabilities (writes app/ios/Runner.xcodeproj/project.pbxproj)PRODUCT_BUNDLE_IDENTIFIER of Runner (and …RunnerTests)
macOSapp/macos/Runner/Configs/AppInfo.xcconfigPRODUCT_BUNDLE_IDENTIFIER

If you use push, register the new IDs in your Firebase project and run flutterfire configure again (Push notifications).

05Icons

The package ships with the KESTREL logo as the app icon on every platform. Replace it with your own artwork before you publish.

PlatformFiles
Androidapp/android/app/src/main/res/mipmap-*/ic_launcher.png (mdpi 48, hdpi 72, xhdpi 96, xxhdpi 144, xxxhdpi 192 pixels)
iOSapp/ios/Runner/Assets.xcassets/AppIcon.appiconset/ (every size listed in its Contents.json, including the 1024 × 1024 store icon). Easiest: drag a 1024 × 1024 PNG into the AppIcon set in Xcode.
macOSapp/macos/Runner/Assets.xcassets/AppIcon.appiconset/
Webapp/web/favicon.png, app/web/icons/ (192, 512 and the maskable versions)

Easiest: replace the images in app/assets/icon/ (a 1024 × 1024 icon, the Android adaptive background and foreground, and the maskable web icon) and run dart run flutter_launcher_icons in app/. It writes every size above from the settings in app/pubspec.yaml; the comment there lists the two steps it does not do for you (the maskable web icons and an Xcode setting it rewrites). Also replace app/assets/brand/kestrel-mark.png, the logo shown before the first config arrives.

06Colours and theme

The app has two themes, Obsidian Ember (dark) and Porcelain (light), defined in app/lib/core/theme/tokens.dart. Users switch them under Settings, Appearance.

TokenDarkLightUsed for
accent#FF6B35#E8531CBrand colour: selected state, primary buttons. Never a price direction.
accentDeep#C2410C#C2410CEnd of the gradient on primary buttons
up / down#3FD2A0 / #E5484D#0E9F6E / #D93A40Price up and down, profit and loss
base, surface, raised#0A0A0B, #121214, #17171A#FAF8F5, #FFFFFF, #FFFFFFPage background and cards

The quickest way to your brand colour is the console's accent (above): no new build. To change the colours in the source instead, edit accent and accentDeep in both themes. Keep up and down clearly green and red, and check text contrast after any change. Also update background_color and theme_color in app/web/manifest.json. Fonts are set in app/lib/core/theme/typography.dart.

07Languages

The app ships in English and Slovak (app/lib/core/l10n/). The English text is the key; each other language is a map from the English text to the translation, and a missing translation falls back to English. Users pick the language under Settings, Language.

  1. Create a map like skStrings in sk.dart, for example de.dart with const Map<String, String> deStrings = {…}.
  2. Register it in l10n.dart: add it to _tables and its Locale to supportedLocales.

Layouts use start and end insets, so a right-to-left language can be added the same way.