Development
Prerequisites
- mise — tool version manager
- Git
mise will install the correct versions of Go, Node, and other tools automatically.
Setup
git clone https://github.com/yuler/airvoice.git
cd airvoice
mise trust
mise install
Project Structure
airvoice/
├── VERSION # Canonical product version (semver)
├── cli/ # Go CLI — WebSocket server + keystroke injection
├── android/ # Android Kotlin/Compose app
├── ios/ # iOS SwiftUI app
├── www/ # Documentation site (Astro)
├── scripts/ # Build and dev scripts
├── mise.toml # Task runner + tool versions
└── go.mod
Common Tasks
| Task | Command |
|---|---|
| Build CLI | mise run cli:build |
| Run server | mise run cli:dev |
| Run tests | mise run cli:test |
| Build Android (debug APK) | mise run android:build |
| Install Android (USB) | mise run android:install |
| Build iOS (simulator) | mise run ios:dev |
| Build iOS (device) | mise run ios:build |
| Docs dev server | mise run www:dev |
| Build docs | mise run www:build |
| Bump version | mise bump |
Android Development
Requires JDK (Android Studio JBR works). Build a debug APK:
mise run android:build
The APK is at android/app/build/outputs/apk/debug/app-debug.apk. Release builds are published on GitHub Releases as airvoice-android-*.apk.
iOS Development
Open the project in Xcode:
open ios/Airvoice.xcodeproj
The project uses XcodeGen to generate project.yml. If you modify project settings, edit ios/project.yml and regenerate with ./scripts/ios-xcodegen.sh (exports APP_VERSION / APP_BUILD from VERSION). Do not run xcodegen alone.
./scripts/ios-xcodegen.sh
Signing
For device builds, create your signing config:
cp ios/Signing.xcconfig.example ios/Signing.xcconfig
Edit ios/Signing.xcconfig and set DEVELOPMENT_TEAM to your Apple Team ID (find it in Xcode → Settings → Accounts).
Version
The product version lives only in the repo-root VERSION file. Apps and CI read it at build time — do not copy it into package.json or other source files. Release with mise bump.
iOS CFBundleVersion and Android versionCode are derived as major * 10000 + minor * 100 + patch. Releasing another binary with the same marketing version requires bumping VERSION.