# upApp Android app for the VW e-up! and its siblings (Škoda Citigo e iV, SEAT Mii electric). It reads battery, range, car info and the charging manager over Bluetooth, like the discontinued maps+more app. This is a Kotlin port of [upXlink](https://github.com/hahnworks/upXlink) and [MIBBridge](https://github.com/hahnworks/MIBBridge) by Alexander Hahn. Those projects are licensed under EUPL-1.2. This port was created in October 2026 and is licensed under AGPL-3.0-or-later, an EUPL-compatible licence. It is not associated with VWAG or its sub-brands. ![Overview screen in demo mode](docs/screenshot.png) ## Status - Tested in a 2020 e-up! with a Pixel 8a: registration, reads, live events, timer edits, off-peak days, adding and deleting locations. - Edits of location fields and of the options are implemented but not yet tested in a car. - `WRITES_ENABLED` in `MainActivity.kt` turns all writes off. ## How it talks to the car 1. Bluetooth RFCOMM to the car service `3728ED40-E416-11E4-80A0-0002A5D5C51B`. The MIBBridge protocol multiplexes virtual TCP connections over it. 2. `GET /car/info/vin` on port 80 without TLS. 3. First connection only: `POST /auth/registration` on port 80, then a TLS GET on port 443. The app checks the car certificate against the VW ViWi root CA. Phone and car show the same PIN. The user confirms it on the car. The car returns `user,password`. 4. All other requests: TLS 1.2 with `TLS_PSK_WITH_AES_128_CBC_SHA256` on port 443. Android's own TLS lacks this cipher, so the app uses BouncyCastle. The car stores timer and off-peak times in UTC. The app shows them in local time. Details from the maps+more app: [docs/maps-and-more.md](docs/maps-and-more.md). ## Demo mode Pick "Demo car" in the device list. The app then talks to a simulated car inside the app (`Demo.kt`). The demo car charges slowly and sends live events. Writes are enabled in demo mode. The unit tests use the same simulated car. ## Build ``` ./gradlew testDebugUnitTest assembleDebug adb install -r app/build/outputs/apk/debug/app-debug.apk ``` Requires Android 12 (API 31) or newer. A signed release needs `ANDROID_KEYSTORE` (PKCS12 file), `ANDROID_KEYSTORE_PASSWORD` and `ANDROID_KEY_ALIAS` in the environment. Without them, `assembleRelease` builds an unsigned APK. The CI builds the signed release on tags (`.hearthforge-ci.toml`).