⎇
app
docs
gradle
.gitignore55 B
.hearthforge-ci.toml2.5 KB
build.gradle.kts149 B
gradle.properties73 B
gradlew8.4 KB
gradlew.bat2.8 KB
LICENSE33.2 KB
PLAN.md4.5 KB
README.md2.3 KB
settings.gradle.kts323 B
READMERaw

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 and 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

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.

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).