White label
your name, colours, IDs and icons.
Each app keeps its brand in one Dart file. A few native files must agree with it, and tests tell you when they do not. Do this before you build for a store: a bundle ID cannot change after the app is published.
01One file per app
| App | Brand file | Checked by |
|---|---|---|
| NFC Crypto | apps/nfc_crypto/lib/brand/brand_config.dart | test/brand_config_test.dart |
| CryptoCard Wallet | apps/cryptocard_wallet/lib/brand/brand_config.dart | test/brand_test.dart |
| NFC Recovery | apps/nfc_recovery/lib/white_label.dart | test/ (card hosts) |
| Card Studio | a copy of apps/card_studio/studio.config.example.json saved without .example in its name or Settings | tests/test_simulator.py |
No brand setting changes the bytes on a card, except the card host and the Android package written into the card link records. Those must be the same in every app and in Card Studio. See Card host setup.
02NFC Crypto
In lib/brand/brand_config.dart:
| Setting | What it changes |
|---|---|
appName, tagline | Name in the app, on the drawn card and in the NFC sheets; the line on the welcome screen |
defaultCardHost | Domain written on new cards (NFC_CARD_HOST in .env overrides it per build) |
androidPackage | Android package written on each card, so a tap opens your app. Must equal applicationId. |
background … warning | All colours (black surfaces and white primary by default) |
evmChainIds, evmNetworks, Solana and Bitcoin URLs | Networks and endpoints. See Networks. |
evmSwapFeeBps … swapMaxSlippagePct | Swap fee and slippage. See Swap fee. |
Then change the same values in the native files:
| File | Change |
|---|---|
android/app/build.gradle.kts | applicationId = your Android package (keep namespace as it is, or move the Kotlin package too) |
android/app/src/main/AndroidManifest.xml | android:label (home-screen name) and android:host in both card intent filters |
ios/Runner/Info.plist | CFBundleDisplayName and CFBundleName; the NFCReaderUsageDescription text |
ios/Runner/Runner.entitlements and Runner.debug.entitlements | applinks: your card host, and the keychain group $(AppIdentifierPrefix) + your bundle ID |
ios/Runner.xcodeproj/project.pbxproj (or Xcode → Runner → General) | PRODUCT_BUNDLE_IDENTIFIER for Runner and RunnerTests |
.env | APP_PACKAGE (About screen) |
Check your work: flutter test test/brand_config_test.dart. It fails when the app name, card host or Android package in the native files differ from the brand file.
03CryptoCard Wallet
In lib/brand/brand_config.dart: appName, tagline, defaultCardHost, androidPackage, defaultNetworkId (a test network by default), networkIds (order and which networks are offered) and the colours.
- Android reads the app name and card host from that file during the build (
android/app/build.gradle.kts). ChangeapplicationIdthere together withandroidPackage. - iOS reads
BRAND_APP_NAMEandCARD_HOSTfromios/Flutter/Common.xcconfig. Keep those two lines equal to the brand file;test/brand_test.dartfails when they differ. Change the bundle ID in Xcode (PRODUCT_BUNDLE_IDENTIFIER). - Card host per build:
--dart-define=CARD_HOST=cards.example.comchanges the host for the app and the Android manifest. On iOS, change theCARD_HOSTline.
04NFC Recovery
In lib/white_label.dart:
| Setting | What it changes |
|---|---|
appName, cardBrand, cardCaption, supportedCardsLabel | Names on screen and on the drawn card |
walletName, walletRestoreUri, walletRestorePath | The wallet that "Restore in …" opens (default nfccrypto://restore) and the steps shown |
cardHosts | Card link hosts the app accepts. Cards from any other host are refused before a PIN is asked. Must list the hosts of your wallet apps and Card Studio. |
acceptCardsWithoutLink | Whether a card that has a backup but no link is opened (default true) |
| Colours | Background, surfaces, text, buttons, status colours, card metal |
Outside Dart: CFBundleDisplayName in ios/Runner/Info.plist and android:label in AndroidManifest.xml; the wallet's URL scheme in LSApplicationQueriesSchemes (Info.plist) if you change walletRestoreUri; the app ID in project.pbxproj and android/app/build.gradle.kts.
If you change NFC Crypto's URL scheme (nfccrypto in its AndroidManifest.xml and Info.plist), change walletRestoreUri here to match.
05Card Studio
Studio name and card hosts: see Card Studio white label.
Card Studio writes the Android package of each card format from apps/card_studio/studio/nfc_core.py (the NFCCRYPTO and CRYPTOCARD profiles: com.mikodes.nfccrypto and com.mikodes.cryptocard). It is not in the config file. If you change your apps' Android package, change it there too, or Android phones will look for the old app when a studio-programmed card is tapped. The desk tool apps/nfc_crypto/tool/nfc/nfccard.py has the same value in ANDROID_PACKAGE. Update the matching tests after the change.
06Bundle IDs at a glance
| App | Shipped ID (iOS and Android) | Replace with, for example |
|---|---|---|
| NFC Crypto | com.mikodes.nfccrypto | com.yourbrand.wallet |
| CryptoCard Wallet | com.mikodes.cryptocard | com.yourbrand.card |
| NFC Recovery | com.mikodes.nfccrypto.recovery | com.yourbrand.recovery |
Use your own IDs for anything you publish. The app-link files on your card domain must name the same IDs (Card host setup).
07App icons
NFC Crypto uses flutter_launcher_icons with assets/images/app_icon_1024.png (pubspec.yaml). The same image set (app_icon_64 … app_icon_1024.png) is also shown inside the app (splash, welcome, About).
- Replace the images in
assets/images/with yours, same names and sizes. - Generate the platform icons:
dart run flutter_launcher_icons. This writesios/Runner/Assets.xcassets/AppIcon.appiconsetand the Androidmipmap-*anddrawable-*icons. Warnings that thewindowsandmacosfolders are missing are expected: the kit has no desktop targets for this app, so those platforms are skipped. - Build the app. Xcode compiles the icon and the launch image from
ios/Runner/Assets.xcassetson every build; there is no extra step. ReplaceLaunchImage.imagesetthere if you want your own launch image.
CryptoCard Wallet and NFC Recovery: replace ios/Runner/Assets.xcassets/AppIcon.appiconset and android/app/src/main/res/mipmap-* with your icon set.