Truthbeam docs
v1.0.0
Get help
● Start

Rename guide
your name, ids and icons.

The download uses placeholder ids that start with com.example. Before the first store build, give the app your own name, Android application id, iOS bundle id, App Group and icons. Do it once, in this order.

applicationIdbundle idRC_HOST_BUNDLE_IDApp Groups

01Pick your ids first

Choose one id in reverse-domain form for your app, for example com.yourcompany.checks. You use it in four places, and they must agree:

WhereWhat to enter
Android applicationIdYour id. This is the app's id on Google Play and cannot change after the first upload.
iOS bundle id of the Runner targetYour id. This is the app's id on the App Store.
iOS build setting RC_HOST_BUNDLE_IDThe same id as the bundle id.
Console, StoreAndroid package name = your applicationId; iOS bundle id = your bundle id. The server refuses purchases made for any other app.

02App name, tagline and colours

  1. Name in the app: app/lib/brand.dart, the constant kBrandName.
  2. Tagline: the key brandTagline in each language file app/lib/l10n/app_en.arb, app_sk.arb and app_cs.arb. The app regenerates its language code on the next flutter pub get or flutter run.
  3. Colours: app/lib/src/ui/theme/style.dart.
  4. Name under the icon, Android: android:label in app/android/app/src/main/AndroidManifest.xml.
  5. Name under the icon, iOS: CFBundleDisplayName in app/ios/Runner/Info.plist, and the same key in app/ios/ShareExtension/Info.plist (the name shown in the share sheet).
  6. iOS permission texts: app/ios/Runner/Info.plist and the three app/ios/Runner/*.lproj/InfoPlist.strings files hold the Face ID, camera and photo prompts. The Face ID prompt names the app: change it to your name in all three languages.

Search the app folder for the old display name once you are done, so no screen or prompt keeps it.

03Android application id

  1. Open app/android/app/build.gradle.kts.
  2. Set applicationId in defaultConfig to your id.
  3. Leave namespace as it is unless you also move the Kotlin files: it is the package of the code in app/android/app/src/main/kotlin/… (MainActivity.kt and ShareInbox.kt), not the store id. If you change it, move those two files to the matching folder and change their package line to the same value.
  4. Set up release signing: the shipped release build type signs with the debug key, which Google Play does not accept. Follow Flutter's guide Build and release an Android app to create an upload key and a key.properties file. Keep the key out of any shared folder.

04iOS bundle id and RC_HOST_BUNDLE_ID

The iOS app has two targets: Runner (the app) and ShareExtension (the entry in the share sheet). The extension hands what was shared to the app through a shared folder, an App Group. All of its ids are built from one build setting, RC_HOST_BUNDLE_ID:

WhatValue
Share Extension bundle id$(RC_HOST_BUNDLE_ID).ShareExtension
App Group of both targetsgroup.$(RC_HOST_BUNDLE_ID) (entitlements and the RCAppGroup key of both Info.plist files)
URL scheme that opens the app after a share$(RC_HOST_BUNDLE_ID).share
  1. Open the workspace: app/ios/Runner.xcworkspace in Xcode (not the .xcodeproj).
  2. Bundle id of the app: select the Runner target, tab Signing & Capabilities, and enter your id as Bundle Identifier for every configuration (Debug, Release, Profile).
  3. RC_HOST_BUNDLE_ID: select the Runner project (the blue icon at the top, not a target), tab Build Settings, find RC_HOST_BUNDLE_ID under User-Defined and set it to the same id for Debug, Release and Profile. Do not edit the Share Extension's bundle id by hand: it follows this setting.
  4. Optional: the RunnerTests target has its own placeholder bundle id; change it to <your id>.RunnerTests if you keep the tests.
The two must match

When the Runner bundle id and RC_HOST_BUNDLE_ID differ, the Share Extension writes into an App Group the app does not read and opens a URL scheme the app does not answer: sharing into the app then does nothing.

05Signing and the App Groups capability

  1. Team: in Signing & Capabilities, choose your Apple Developer team for both the Runner and the ShareExtension target. The download has no team set.
  2. App Groups: both targets already have an entitlements file (Runner/Runner.entitlements, ShareExtension/ShareExtension.entitlements) with the App Group group.$(RC_HOST_BUNDLE_ID). If Xcode does not list App Groups under a target's capabilities, add it with + Capability. Check that Xcode shows your group, for example group.com.yourcompany.checks, ticked on both targets. With automatic signing Xcode registers the group in your developer account; with manual signing, create it under Certificates, Identifiers & Profiles and enable it for both app ids. Apple's guide: Configuring app groups.
  3. Build once on a device and share a link from Safari into the app to confirm the extension and the group work.

06Icons and launch screen

  • Android: replace the ic_launcher images in app/android/app/src/main/res/mipmap-mdpi to mipmap-xxxhdpi.
  • iOS: replace the images in app/ios/Runner/Assets.xcassets/AppIcon.appiconset (Xcode shows the sizes it needs). The launch image is in LaunchImage.imageset next to it.

No icon generator package is included; any tool that writes these sizes works.

07Server and console

  • Console, Brand: product name, tagline, accent colour, logo, support e-mail and website. The server uses them, for example on shared verdict pages.
  • Console, Legal: the links to your privacy policy and terms.
  • Console, Store: your Android package name and iOS bundle id (see Pick your ids).
  • PUBLIC_BASE_URL in server/.env: your server's own address (see Configuration).