Installation.
Make it your app.
Change the identity, sign it, and build for the stores.
01App id, name and icon
- Android application id. In
app/android/app/build.gradle.ktschangeapplicationId = "com.example.pocketmind", andnamespaceplus the Kotlin package folderapp/android/app/src/main/kotlin/com/example/pocketmind/to match. - iOS bundle id and team. Open
app/ios/Runner.xcworkspacein Xcode, select Runner > Signing & Capabilities, set your Team and bundle identifier. The source ships with an empty team. - Display name.
android:labelinAndroidManifest.xmlandCFBundleDisplayNameinios/Runner/Info.plist. The name inside the app comes from the config (Configuration). - Icon. Replace
app/assets/brand/logo-1024.png(1024×1024, no transparency) and runbash tool/gen_icons.shfromapp/.
02Android signing
The commands below are for a macOS or Linux terminal. On Windows use PowerShell or Git Bash (WSL also works); flutter, npm and keytool work the same. iOS builds need a Mac.
Create a keystore outside the project and a key.properties file that points to it (never commit either). Put key.properties in app/android/, or anywhere and set the environment variable ANDROID_KEY_PROPERTIES to its path (handy on a build server):
keytool -genkeypair -v -keystore release.jks -alias release -keyalg RSA -keysize 2048 -validity 10000
storeFile=<full path to release.jks>
storePassword=…
keyAlias=release
keyPassword=…
Without a key.properties a release build is signed with the debug key, which the Play Store refuses.
03The AI engine build
llama.cpp and whisper.cpp ship as source in app/packages/pocket_llm/third_party/. Android compiles them through Gradle and CMake automatically. iOS compiles them into packages/pocket_llm/ios/Frameworks/pocket_llm_native.xcframework with packages/pocket_llm/tool/build_ios.sh, which the Podfile runs before pod install when the framework is missing. To rebuild it after changing the C++ code: FORCE=1 packages/pocket_llm/tool/build_ios.sh.
04Checks before a release
cd app
flutter analyze
flutter test
bash tool/check_ad_ids.sh --release # fails until your own AdMob app id replaces Google's test id (only if you use ads)
bash tool/check_network.sh # only the allowlisted client talks to the network