Build Release version of the App
March 12, 2026 · View on GitHub
Environment setup
Before building the app, make sure you have all the necessary tools installed. Follow the instructions in the Environment Setup document. Alternatively, you can use the Docker image as described here: (TODO!).
Firebase Analytics Setup
Optionally, you can enable Firebase Analytics for the app. To do so, follow the instructions in the Firebase Analytics Setup document.
Security Considerations
⚠️ IMPORTANT: For all production builds, be sure to follow the security practices outlined in the Build Security Advisory. Always use --enforce-lockfile and --no-pub flags when building for production.
Build for Web
Standard build
flutter pub get --enforce-lockfile
flutter build web --csp --no-web-resources-cdn --no-pub
WebAssembly build (recommended)
flutter pub get --enforce-lockfile
flutter build web --csp --no-web-resources-cdn --no-pub --wasm
The release version of the app will be located in build/web folder. Specifying the --release flag is not necessary, as it is the default behavior.
WebAssembly builds require COEP/COOP headers on the hosting layer (see WebAssembly hosting headers).
Native builds
Run flutter build {TARGET} command with one of the following targets:
apk- builds Android APK (output tobuild/app/outputs/flutter-apkfolder)appbundle- builds Android bundle (output tobuild/app/outputs/bundle/releasefolder)ios- builds for iOS (output tobuild/ios/iphoneosfolder)macos- builds for macOS (output tobuild/macos/Build/Products/Releasefolder)linux- builds for Linux (output tobuild/linux/x64/release/bundlefolder)windows- builds for Windows (output tobuild/windows/runner/Releasefolder)
Example:
flutter build apk
Docker builds
Prerequisite (ensure SDK submodule is initialized to the pinned commit):
git submodule update --init --recursive
# Recommended once per clone to auto-fetch pinned commits on branch switches
git config fetch.recurseSubmodules on-demand
Build for web
sh .docker/build.sh web release
Alternatively, you can run the docker build commands directly:
# Build the supporting images
docker build -f .docker/kdf-android.dockerfile . -t komodo/kdf-android --build-arg KDF_BRANCH=main
docker build -f .docker/android-sdk.dockerfile . -t komodo/android-sdk:34
docker build -f .docker/gleec-wallet-android.dockerfile . -t gleec/gleec-wallet
# Build the app
mkdir -p build
docker run --rm -v ./build:/app/build gleec/gleec-wallet:latest bash -c "flutter pub get --enforce-lockfile && flutter build web --no-pub --release --wasm"
Build for Android
sh .docker/build.sh android release
Alternatively, you can run the docker build commands directly:
# Build the supporting images
docker build -f .docker/kdf-android.dockerfile . -t komodo/kdf-android --build-arg KDF_BRANCH=main
docker build -f .docker/android-sdk.dockerfile . -t komodo/android-sdk:34
docker build -f .docker/gleec-wallet-android.dockerfile . -t gleec/gleec-wallet
# Build the app
mkdir -p build
docker run --rm -v ./build:/app/build gleec/gleec-wallet:latest bash -c "flutter pub get --enforce-lockfile && flutter build apk --no-pub --release"
WebAssembly hosting headers
For Flutter web --wasm builds with multi-threading, set these response headers:
Cross-Origin-Embedder-Policy: credentialless(orrequire-corp)Cross-Origin-Opener-Policy: same-origin
Project defaults already include these headers in:
firebase.json(Firebase Hosting)roles/nginx/templates/airdex.conf.j2(nginx deployment template)