{"id":49104790,"url":"https://github.com/birdovpn/mobile-client","last_synced_at":"2026-05-04T23:03:42.462Z","repository":{"id":346167856,"uuid":"1183711335","full_name":"BirdoVPN/Mobile-Client","owner":"BirdoVPN","description":"Birdo VPN Mobile Client -- Android \u0026 iOS (Kotlin Multiplatform + SwiftUI)","archived":false,"fork":false,"pushed_at":"2026-04-20T23:54:00.000Z","size":2013,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-21T01:37:34.647Z","etag":null,"topics":["android","ios","kotlin-multiplatform","privacy","swiftui","vpn","wireguard"],"latest_commit_sha":null,"homepage":"https://birdo.app/clients","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/BirdoVPN.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-16T22:04:14.000Z","updated_at":"2026-04-20T23:53:51.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/BirdoVPN/Mobile-Client","commit_stats":null,"previous_names":["birdovpn/android-client"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/BirdoVPN/Mobile-Client","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BirdoVPN%2FMobile-Client","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BirdoVPN%2FMobile-Client/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BirdoVPN%2FMobile-Client/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BirdoVPN%2FMobile-Client/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BirdoVPN","download_url":"https://codeload.github.com/BirdoVPN/Mobile-Client/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BirdoVPN%2FMobile-Client/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32245151,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-24T13:21:15.438Z","status":"ssl_error","status_checked_at":"2026-04-24T13:21:15.005Z","response_time":64,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","ios","kotlin-multiplatform","privacy","swiftui","vpn","wireguard"],"created_at":"2026-04-21T01:05:48.195Z","updated_at":"2026-04-25T00:01:44.269Z","avatar_url":"https://github.com/BirdoVPN.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Birdo VPN Mobile Client\n\nThe universal mobile client for [Birdo VPN](https://birdo.app) -- built once with **Kotlin Multiplatform**, running natively on **Android** and **iOS**.\n\n| Platform | Min Version | Framework | Store |\n|----------|-------------|-----------|-------|\n| Android  | 10 (API 29) | Kotlin + Jetpack Compose | [Google Play](https://play.google.com/store/apps/details?id=app.birdo.vpn) |\n| iOS      | 17.0        | KMP + SwiftUI            | App Store |\n\n\u003e **Looking for Windows, macOS, or Linux?** See the [Desktop Client](https://github.com/BirdoVPN/Desktop-Client).\n\n---\n\n## Architecture\n\n```\nbirdo-client-mobile/\n  shared/            Kotlin Multiplatform shared module (Android + iOS)\n  app/               Android app (Jetpack Compose UI)\n  iosApp/            iOS app (SwiftUI + PacketTunnel Network Extension)\n  store-assets/      Play Store and App Store screenshots\n```\n\n### Shared Module (`shared/`)\n\nThe KMP shared module contains all platform-agnostic logic:\n\n- WireGuard tunnel management and key exchange\n- API client (authentication, server list, session management)\n- Connection state machine\n- Certificate pinning and transport security\n- Encryption utilities (ChaCha20-Poly1305 via WireGuard)\n\nCompiled to:\n- **Android:** Kotlin/JVM library linked directly into the app module\n- **iOS:** Native `BirdoShared.framework` (arm64) consumed by the SwiftUI app\n\n### Android App (`app/`)\n\n- **UI:** Jetpack Compose with Material 3\n- **DI:** Dagger Hilt\n- **VPN:** Android `VpnService` API with kernel WireGuard\n- **Security:** Android Keystore for credential storage, biometric authentication\n- **Distribution:** Google Play (AAB) + direct APK from GitHub Releases\n\n### iOS App (`iosApp/`)\n\n- **UI:** SwiftUI (Swift 6.0)\n- **VPN:** Network Extension PacketTunnel provider\n- **Security:** iOS Keychain for credential storage, Face ID / Touch ID\n- **Build:** XcodeGen (`project.yml`) generates the Xcode project\n- **Distribution:** App Store + TestFlight\n\n---\n\n## Features\n\n- **WireGuard Protocol** -- ChaCha20-Poly1305 encryption with Curve25519 + Post-Quantum key exchange\n- **Kill Switch** -- Blocks all traffic if the tunnel drops\n- **Split Tunneling** -- Per-app VPN routing (Android)\n- **Always-On VPN** -- System-level persistent connection with auto-reconnect\n- **Biometric Lock** -- Fingerprint / Face ID app lock\n- **Quick Settings Tile** -- Toggle VPN from the notification shade (Android)\n- **Home Screen Widgets** -- Glanceable status with one-tap connect (iOS)\n- **On-Demand Connect** -- Rules-based activation on specific networks (iOS)\n- **iCloud Sync** -- Sync settings across Apple devices (iOS)\n- **Stealth Mode** -- XRAY Reality obfuscation to bypass DPI\n- **Multi-Hop** -- Route through multiple servers for extra anonymity\n\n---\n\n## Building\n\n### Prerequisites\n\n- JDK 17 (Temurin recommended)\n- Android Studio Ladybug or later\n- Xcode 16+ (for iOS builds)\n- [XcodeGen](https://github.com/yonaskolb/XcodeGen) (`brew install xcodegen`)\n\n### Android\n\n```bash\n# Debug build\n./gradlew assembleDebug\n\n# Release build (requires signing config)\n./gradlew assembleRelease\n\n# Run tests\n./gradlew testDebugUnitTest\n```\n\n### iOS\n\n```bash\n# Build KMP shared framework for iOS\n./gradlew :shared:linkReleaseFrameworkIosArm64\n\n# Generate Xcode project\ncd iosApp \u0026\u0026 xcodegen generate\n\n# Build (unsigned)\nxcodebuild build \\\n  -project BirdoVPN.xcodeproj \\\n  -scheme BirdoVPN \\\n  -destination 'generic/platform=iOS' \\\n  -configuration Release \\\n  CODE_SIGN_IDENTITY=\"-\" \\\n  CODE_SIGNING_REQUIRED=NO \\\n  CODE_SIGNING_ALLOWED=NO\n```\n\n### Environment Setup\n\n```bash\ncp local.properties.example local.properties\n# Edit local.properties with your Android SDK path\n```\n\n---\n\n## Verifying Downloads\n\nEvery release APK and AAB is signed with [Sigstore](https://www.sigstore.dev/) using keyless signing from GitHub Actions. See [docs/VERIFICATION.md](docs/VERIFICATION.md) for instructions.\n\n```bash\ncosign verify-blob \\\n  --bundle BirdoVPN-release.apk.sigstore \\\n  --certificate-oidc-issuer https://token.actions.githubusercontent.com \\\n  --certificate-identity-regexp \"github.com/BirdoVPN/\" \\\n  BirdoVPN-release.apk\n```\n\n---\n\n## CI/CD\n\n| Workflow | Trigger | Platforms |\n|----------|---------|-----------|\n| [Android CI](.github/workflows/android.yml) | Push to main/develop, PRs | Lint, test, build APK + AAB, Sigstore sign |\n| [iOS CI](.github/workflows/ios.yml) | Push to main/develop, PRs | Build KMP shared framework, build iOS app, simulator tests |\n\nAll workflows use pinned action SHAs, minimal permissions, and Sigstore cosign for artifact signing.\n\n---\n\n## Tech Stack\n\n| Component | Technology |\n|-----------|------------|\n| Shared Logic | Kotlin Multiplatform 2.1 |\n| Android UI | Jetpack Compose + Material 3 |\n| iOS UI | SwiftUI (Swift 6.0) |\n| VPN Protocol | WireGuard (kernel on Android, Network Extension on iOS) |\n| Encryption | ChaCha20-Poly1305 |\n| Key Exchange | Curve25519 + Post-Quantum (Rosenpass) |\n| DI (Android) | Dagger Hilt 2.53 |\n| Build (Android) | Gradle 8.7 + AGP 8.7.3 |\n| Build (iOS) | XcodeGen + Xcode 16 |\n| Serialization | kotlinx.serialization |\n| Code Signing | Sigstore (keyless) + Android Keystore |\n\n---\n\n## Project Structure\n\n```\n.github/workflows/\n  android.yml          Android CI: lint, test, build, sign\n  ios.yml              iOS CI: shared framework, build, test\napp/\n  src/main/            Android app source (Kotlin + Compose)\n  build.gradle.kts     Android app build config\nshared/\n  src/commonMain/      KMP shared code (both platforms)\n  src/androidMain/     Android-specific implementations\n  src/iosMain/         iOS-specific implementations\n  build.gradle.kts     KMP module build config\niosApp/\n  iosApp/              SwiftUI app source\n  PacketTunnel/        WireGuard Network Extension\n  project.yml          XcodeGen project spec\nstore-assets/          Store screenshots and graphics\ndocs/\n  CODE_SIGNING.md      How artifacts are signed\n  VERIFICATION.md      How to verify downloads\n  store-listing.md     Google Play / App Store listing\nbuild.gradle.kts       Root Gradle config\nsettings.gradle.kts    Module declarations\nversion.properties     Centralized version (1.1.0)\n```\n\n---\n\n## Security\n\n- All network traffic encrypted with WireGuard (ChaCha20-Poly1305)\n- Certificate pinning on all API connections\n- Credentials stored in Android Keystore / iOS Keychain\n- No activity logs, no DNS logs, no traffic inspection\n- Release artifacts signed with Sigstore for provenance verification\n- CI uses pinned action SHAs and minimal permissions\n- ProGuard/R8 obfuscation on release builds (Android)\n\nFor vulnerability reports, email **security@birdo.app**.\n\n---\n\n## License\n\nThis project is licensed under the [GNU General Public License v3.0](LICENSE).\n\n---\n\n**[birdo.app](https://birdo.app)** -- A secure and independent VPN\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbirdovpn%2Fmobile-client","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbirdovpn%2Fmobile-client","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbirdovpn%2Fmobile-client/lists"}