en un clic
en un clic
Audit repo dependencies by default and only apply library upgrades when explicitly requested.
How to run, write, and debug local UI tests for Android, iOS, and browser builds.
How to list, pick, and boot Android emulators and iOS simulators for local app runs.
Guidance on where to place different types of code in this Kotlin Multiplatform project.
Guidelines for where to place different types of code in a Kotlin Multiplatform project.
How to create plans and follow roadmaps
| name | gradle-build |
| description | Use Gradle commands to build and run the app by platform. |
Use these commands to build and run the app by platform.
./gradlew check./gradlew :sharedLib:test./gradlew :cliApp:test./gradlew :composeApp:testcliApp)Native CLI executables for desktop platforms:
| Platform | Build Debug | Build Release | Output Location |
|---|---|---|---|
| macOS (Apple Silicon) | ./gradlew :cliApp:linkDebugExecutableMacosArm64 | ./gradlew :cliApp:linkReleaseExecutableMacosArm64 | cliApp/build/bin/macosArm64/ |
| Linux | ./gradlew :cliApp:linkDebugExecutableLinuxX64 | ./gradlew :cliApp:linkReleaseExecutableLinuxX64 | cliApp/build/bin/linuxX64/ |
| Windows | ./gradlew :cliApp:linkDebugExecutableMingwX64 | ./gradlew :cliApp:linkReleaseExecutableMingwX64 | cliApp/build/bin/mingwX64/ |
Run the CLI: ./cliApp/build/bin/<target>/debugExecutable/twofac.kexe
composeApp - Desktop)| Action | Command |
|---|---|
| Run dev build | ./gradlew :composeApp:run |
| Run release build | ./gradlew :composeApp:runRelease |
| Create distributable | ./gradlew :composeApp:createDistributable |
| Package for current OS | ./gradlew :composeApp:packageDistributionForCurrentOS |
| Package release for current OS | ./gradlew :composeApp:packageReleaseDistributionForCurrentOS |
Platform-specific packages (run on respective OS):
| Platform | Package Commands |
|---|---|
| macOS | :composeApp:packageDmg, :composeApp:packageReleaseDmg |
| Linux | :composeApp:packageDeb, :composeApp:packageReleaseDeb |
| Windows | :composeApp:packageMsi, :composeApp:packageReleaseMsi |
Uber JAR (cross-platform):
| Action | Command |
|---|---|
| Debug uber JAR | ./gradlew :composeApp:packageUberJarForCurrentOS |
| Release uber JAR | ./gradlew :composeApp:packageReleaseUberJarForCurrentOS |
Output: composeApp/build/compose/binaries/main/
androidApp)| Action | Command |
|---|---|
| Build debug APK | ./gradlew :androidApp:assembleDebug |
| Build release APK | ./gradlew :androidApp:assembleRelease |
| Install debug | ./gradlew :androidApp:installDebug |
| Uninstall | ./gradlew :androidApp:uninstallDebug |
| Build bundle (AAB) | ./gradlew :androidApp:bundle |
Output: androidApp/build/outputs/apk/ or androidApp/build/outputs/bundle/
Run/install on a specific emulator and launch the app explicitly:
ANDROID_SERIAL=emulator-5554 ./gradlew :androidApp:installDebug
adb -s emulator-5554 shell am start -n tech.arnav.twofac.app/.MainActivity
adb -s emulator-5554 shell dumpsys activity activities | rg 'Resumed: ActivityRecord|mCurrentFocus|mFocusedApp'
When multiple Android devices are connected, always set ANDROID_SERIAL for Gradle and use adb -s <serial> for launch/verification commands.
watchApp)| Action | Command |
|---|---|
| Build debug APK | ./gradlew :watchApp:assembleDebug |
| Build release APK | ./gradlew :watchApp:assembleRelease |
| Install debug | ./gradlew :watchApp:installDebug |
| Uninstall | ./gradlew :watchApp:uninstallDebug |
| Build bundle (AAB) | ./gradlew :watchApp:bundle |
Output: watchApp/build/outputs/apk/ or watchApp/build/outputs/bundle/
composeApp + iosApp)Framework linking (for Xcode integration):
| Action | Command |
|---|---|
| Debug framework (device) | ./gradlew :composeApp:linkDebugFrameworkIosArm64 |
| Debug framework (simulator) | ./gradlew :composeApp:linkDebugFrameworkIosSimulatorArm64 |
| Release framework (device) | ./gradlew :composeApp:linkReleaseFrameworkIosArm64 |
| Release framework (simulator) | ./gradlew :composeApp:linkReleaseFrameworkIosSimulatorArm64 |
Output: composeApp/build/bin/<target>/debugFramework/ or releaseFramework/
Running the iOS app: Open iosApp/iosApp.xcworkspace in Xcode and run from there. Xcode triggers embedAndSignAppleFrameworkForXcode automatically.
Xcode integration: The task embedAndSignAppleFrameworkForXcode is called by Xcode's build phase.
Not yet implemented. See .agents/plans/02-watchos-companion-app.md for planned architecture.
composeApp - Wasm)| Action | Command |
|---|---|
| Dev server | ./gradlew :composeApp:wasmJsBrowserDevelopmentRun |
| Production build | ./gradlew :composeApp:wasmJsBrowserProductionWebpack |
| Combined distribution | ./gradlew :composeApp:composeCompatibilityBrowserDistribution |
Output: composeApp/build/dist/wasmJs/