- Kotlin 99.6%
- CMake 0.4%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Shorten the README to a quick start and a deploy summary. In CLAUDE.md add the verified build commands, the dev machine environment, the Forgejo deployment description, local emulator testing, and gotchas 32-36. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> |
||
| .forgejo/workflows | ||
| app | ||
| externals | ||
| gradle | ||
| logcatter | ||
| networkmonitor | ||
| pinger | ||
| ztcore | ||
| .gitignore | ||
| .gitmodules | ||
| build.gradle.kts | ||
| CLAUDE.md | ||
| FABLE_AUDIT.md | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| README.md | ||
| settings.gradle.kts | ||
ZeroTierTunnel
An Android VPN client for ZeroTier, built around keeping the tunnel honest rather than merely bringing it up.
Existing clients lose the tunnel when the phone changes network and take DNS down with them, so the VPN says "connected" while nothing resolves. This app adds three things on top of the data plane:
- Health monitoring that checks whether traffic actually crosses the tunnel.
- A recovery ladder that escalates from the cheapest fix to the most disruptive, and stops as soon as the tunnel works again.
- DNS fail-open, so a broken tunnel costs you local name resolution and nothing else.
A personal project in daily use on one device (Android 16). Not on any store, not a general-purpose ZeroTier client.
Quick start
Requirements: Android SDK with NDK 27.3.13750724 and CMake 3.31.6, a JDK 25 (Gradle fetches one automatically if it is missing), and Android 8.0+ (API 26) on the device.
git clone --recurse-submodules <this repo>
export ANDROID_HOME=/path/to/android-sdk
./gradlew :app:assembleDebug # APK in app/build/outputs/apk/debug/
./gradlew test # unit tests, JVM only
./gradlew :app:lintDebug
Then in the app: add your network by its 16-character ID, authorise the device on your controller, and set probe targets on the network screen. Nothing about any network is compiled in.
Build and deploy
A push to main builds the release APK in Forgejo Actions (.forgejo/workflows/android.yml),
signs it and publishes it as an android-v* release, which Obtainium installs on the phone.
More
CLAUDE.md holds the architecture, conventions, pitfalls and what has been verified on a device. Licence: not yet chosen; the code links the ZeroTier core, which is MPL 2.0.