NFC Crypto Kit docs
v1.0.0
Live demo Get help
● Set up · Your brand

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.

brand_config.dartwhite_label.dartstudio.config.json

01One file per app

AppBrand fileChecked by
NFC Cryptoapps/nfc_crypto/lib/brand/brand_config.darttest/brand_config_test.dart
CryptoCard Walletapps/cryptocard_wallet/lib/brand/brand_config.darttest/brand_test.dart
NFC Recoveryapps/nfc_recovery/lib/white_label.darttest/ (card hosts)
Card Studioa copy of apps/card_studio/studio.config.example.json saved without .example in its name or Settingstests/test_simulator.py
The card format does not change

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:

SettingWhat it changes
appName, taglineName in the app, on the drawn card and in the NFC sheets; the line on the welcome screen
defaultCardHostDomain written on new cards (NFC_CARD_HOST in .env overrides it per build)
androidPackageAndroid package written on each card, so a tap opens your app. Must equal applicationId.
background … warningAll colours (black surfaces and white primary by default)
evmChainIds, evmNetworks, Solana and Bitcoin URLsNetworks and endpoints. See Networks.
evmSwapFeeBps … swapMaxSlippagePctSwap fee and slippage. See Swap fee.

Then change the same values in the native files:

FileChange
android/app/build.gradle.ktsapplicationId = your Android package (keep namespace as it is, or move the Kotlin package too)
android/app/src/main/AndroidManifest.xmlandroid:label (home-screen name) and android:host in both card intent filters
ios/Runner/Info.plistCFBundleDisplayName and CFBundleName; the NFCReaderUsageDescription text
ios/Runner/Runner.entitlements and Runner.debug.entitlementsapplinks: 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
.envAPP_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). Change applicationId there together with androidPackage.
  • iOS reads BRAND_APP_NAME and CARD_HOST from ios/Flutter/Common.xcconfig. Keep those two lines equal to the brand file; test/brand_test.dart fails when they differ. Change the bundle ID in Xcode (PRODUCT_BUNDLE_IDENTIFIER).
  • Card host per build: --dart-define=CARD_HOST=cards.example.com changes the host for the app and the Android manifest. On iOS, change the CARD_HOST line.

04NFC Recovery

In lib/white_label.dart:

SettingWhat it changes
appName, cardBrand, cardCaption, supportedCardsLabelNames on screen and on the drawn card
walletName, walletRestoreUri, walletRestorePathThe wallet that "Restore in …" opens (default nfccrypto://restore) and the steps shown
cardHostsCard 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.
acceptCardsWithoutLinkWhether a card that has a backup but no link is opened (default true)
ColoursBackground, 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.

Android package on studio cards

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

AppShipped ID (iOS and Android)Replace with, for example
NFC Cryptocom.mikodes.nfccryptocom.yourbrand.wallet
CryptoCard Walletcom.mikodes.cryptocardcom.yourbrand.card
NFC Recoverycom.mikodes.nfccrypto.recoverycom.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).

  1. Replace the images in assets/images/ with yours, same names and sizes.
  2. Generate the platform icons: dart run flutter_launcher_icons. This writes ios/Runner/Assets.xcassets/AppIcon.appiconset and the Android mipmap-* and drawable-* icons. Warnings that the windows and macos folders are missing are expected: the kit has no desktop targets for this app, so those platforms are skipped.
  3. Build the app. Xcode compiles the icon and the launch image from ios/Runner/Assets.xcassets on every build; there is no extra step. Replace LaunchImage.imageset there 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.