ADAMaps Android companion app — Hivemapper Bee data proxy and monitor
Find a file
2026-06-28 21:18:56 -07:00
.forgejo/workflows docs: public-facing README + MIT LICENSE; genericize CI workflow comment 2026-06-28 20:14:11 -07:00
app Public-flip prep: env-driven keystore, README, hardened cleartext, leaner docs 2026-05-27 10:30:02 -07:00
blackbox Rotate AdaMaps ingest+read keys (env-required, no inline default) 2026-05-27 09:17:23 -07:00
docs Public-flip prep: env-driven keystore, README, hardened cleartext, leaner docs 2026-05-27 10:30:02 -07:00
gradle Update activityCompose to v1.13.0 (#2) 2026-06-27 17:07:19 -07:00
.gitignore Initial commit: Varroa ADAMaps Android app 2026-03-10 12:19:48 -07:00
build.gradle.kts Initial commit: Varroa ADAMaps Android app 2026-03-10 12:19:48 -07:00
gradle.properties Initial commit: Varroa ADAMaps Android app 2026-03-10 12:19:48 -07:00
gradlew Initial commit: Varroa ADAMaps Android app 2026-03-10 12:19:48 -07:00
LICENSE license: relicense to AGPL-3.0-or-later 2026-06-28 21:18:56 -07:00
README.md license: relicense to AGPL-3.0-or-later 2026-06-28 21:18:56 -07:00
settings.gradle.kts Initial commit: Varroa ADAMaps Android app 2026-03-10 12:19:48 -07:00

Varroa

Varroa is an Android companion app for the Hivemapper Bee dashcam. It pulls detection landmarks off the camera's on-device API, queues them in a local database, and forwards them to an AdaMaps ingest endpoint once the phone has a validated internet connection. The Bee exposes its API only over its own WiFi access point, so Varroa exists to bridge that gap: collect while you're connected to the camera, upload when you're back on the internet.

The repository also ships blackbox/, a small Python companion that reads an airquality sensor on a Linux singleboard computer (e.g. a Raspberry Pi), fuses the readings with GPS from the Bee, and posts them to the same AdaMaps stream.

Features

  • Storeandforward collectionBeeCollectorService polls the Bee for detection landmarks and writes them to a local Room database. Nothing is lost if the phone is offline.
  • Validatedinternet uploadsAdaMapsUploadWorker (WorkManager) drains the queue to the AdaMaps API only when real connectivity is available, not when you're merely attached to the camera's captive AP.
  • Image captureImageCollectorService pulls detection JPEGs from the Bee for landmarks that have associated crops.
  • Device pairing & status — pair with the camera, view WiFi/storage/GNSS status, and toggle device options from the inapp settings screens.
  • Optional Cardano wallet linking — attach a wallet address to detection uploads so contribution rewards can be routed to you. Entirely optional.

How it works

Hivemapper Bee  ──HTTP (AP only)──►  Varroa (Android)
   detections                          ├─ Room queue (local DB)
   landmark crops                      └─ AdaMapsUploadWorker
                                              │  (only on validated internet)
                                              ▼
                                        AdaMaps ingest API

The Bee's API is reachable only over the camera's own access point, which serves plain HTTP on a fixed deviceAP address. Varroa scopes an Android cleartext exception to just that one host (see app/src/main/res/xml/network_security_config.xml); everything else is HTTPSonly.

Build

Requirements: JDK 17, Android SDK 34. Minimum supported device is Android 8.0 (API 26).

./gradlew :app:assembleDebug

The debug APK lands in app/build/outputs/apk/debug/.

Release signing

Release builds are signed from a keystore supplied through environment variables (no secrets are stored in the repo):

export VARROA_KEYSTORE_PATH=/path/to/your-release.keystore
export VARROA_KEYSTORE_PASSWORD=export VARROA_KEY_PASSWORD=# defaults to the keystore password
./gradlew :app:assembleRelease

If the keystore variables are unset, Gradle falls back to an unsigned release build.

Configuration (set inapp)

  • Bee URL — the camera's API base URL. Defaults to http://192.168.0.10:5000, the factory accesspoint address; change it if your camera uses a different AP IP.
  • AdaMaps URL + ingest key — required before uploads will run. Both are entered in the app and stored locally; there are no bakedin defaults.
  • Cardano wallet — optional. When set, the address is attached to detection uploads for reward routing.

blackbox (airquality companion)

blackbox/air_aggregator.py reads a BME680 (I²C) and a PMS5003 particulate sensor (UART), fuses the readings with GPS pulled from the Bee, and posts them to the AdaMaps ingest endpoint on a fixed interval, buffering to disk while offline.

pip install bme680 requests smbus2 pyserial
BEE_URL=http://192.168.197.1:5000 \
ADAMAPS_URL=https://api.adamaps.org \
ADAMAPS_KEY=your-ingest-key \
python3 blackbox/air_aggregator.py

A sample systemd unit is provided at blackbox/air-aggregator.service.

Documentation

  • docs/BEE-CAMERA.md — reverseengineering notes on the Hivemapper Bee's internal camera pipeline (Intel Keem Bay / Myriad X VPU, DepthAI, the ondevice REST API). Useful background for anyone building against the camera.
  • docs/AIR-QUALITY-INTEGRATION.md — design notes for adding an airquality sensor to the Bee and ingesting the readings.

Tech stack

Kotlin · Jetpack Compose · Room · DataStore · WorkManager · OkHttp/Gson · osmdroid (map preview) · Coil (images).

Contributing

Contributions are welcome. Please open an issue to discuss substantial changes before sending a pull request, keep commits focused, and make sure ./gradlew :app:assembleDebug passes before submitting.

License

Released under the GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later). See LICENSE.