Skyglide for Android
The Skyglide app for Android phones and tablets. Skyglide is secure Wi-Fi at cafés, event venues and similar places, and a private network that connects a member's devices wherever they are. At a Skyglide location a phone joins its member's network through the skyglide.com Wi-Fi and needs no app. Everywhere else this app connects it to the same network through the Skyglide cloud over WireGuard.
Status
First cut, not released and not on Google Play.
Built and tested:
- the tunnel on WireGuard's tunnel library for Android (
GoBackendand itsVpnService), with Android's always-on VPN; - the device key, created on the phone and stored encrypted under an Android Keystore key;
- location detection, the connection state and the coordinator that drives the tunnel;
- the sign-in flow with PKCE (RFC 8252);
- the Status, Devices, Settings and sign-in screens in light and dark, phone and tablet.
Not built yet: the connection to the Skyglide controller. The cloud service, its contract and a Kotlin client for api.global's TypedRequest and TypedSocket don't exist yet. Until they do, the app runs against UnavailableController, and Sign in explains that sign-in isn't available.
How it works
- The app enrolls the phone with its WireGuard public key. The cloud answers with the phone's address in the member's away subnet, the cloud's WireGuard endpoint and the member network's routes.
- By default only the member's private network goes through the tunnel. Internet through Skyglide routes all traffic, IPv6 included, so the cloud inspects it.
- After every network change the app asks the controller where the phone is, outside the tunnel. Only an answer naming the phone's own member network keeps the tunnel idle; a Wi-Fi called
skyglide.comelsewhere does not. - On a captive network (hotel, train, airport) the app waits until the network's sign-in is done.
Build
Everything builds in Docker on Linux; nothing of the Android SDK is installed on the host:
ci/in-docker.sh ./gradlew :core:test :app:testDebugUnitTest :app:assembleDebug :app:lintDebug
Screenshots of every screen (light and dark, phone and tablet), rendered on the JVM with Robolectric and Roborazzi:
ci/in-docker.sh ./gradlew :app:recordRoborazziDebug
The images land in app/build/outputs/roborazzi/.
Layout
core/: plain Kotlin, no Android. It holds the model, the IP prefixes, the tunnel routes, location detection, the connection state machine and the coordinator, the device key store, PKCE sign-in, and the controller interface.app/: the Android app. It holds the WireGuard backend, the Keystore key wrapper, the network watcher, the view model and the Compose screens.ci/: the build image (android.Dockerfile) andin-docker.sh.
License
MIT, see license.md. Issues and security reports: community.foss.global.
Legal
Skyglide is a project of Task Venture Capital GmbH. The operating company of the Skyglide service is not decided yet.