Search & rescue — open source
DroneDot
Your DJI drone, as a live dot on the CalTopo team map.
An Android app that runs on the DJI RC Plus 2 controller. It reads the aircraft’s GPS position through the DJI Mobile SDK V5 and reports it to a CalTopo Team as a beacon on the Shared Locations overlay — every five seconds by default.
That is the whole product. No camera, no gimbal, no flight control. Search managers see the aircraft on the same map as their ground teams, and nothing else changes about how anyone flies.
5 s
Default report interval. Selectable from 5 s to 3 minutes.
id · lat · lng
The entire payload. Nothing else is sent to CalTopo.
arm64-v8a
Single ABI, sideloaded. The RC Plus 2 has no Play Store.
01 What it does
Three jobs, done carefully. Everything the app knows how to do is on this list.
-
Reads the aircraft, not the controller
Positions come from the flight controller over the MSDK key
KeyAircraftLocation3D, so the dot on the map is where the drone is — not where the pilot is standing.Satellite count and GPS signal level are surfaced on the status screen so you can tell a weak fix from a lost link.
-
Reports to CalTopo Shared Locations
One unsigned
GETper tick to CalTopo’s connect-key position endpoint. The aircraft appears as a live coloured dot on any team map with the Realtime Data overlay enabled, alongside every ground team.Click the dot for coordinates and last-update time, or Record to Map to turn the beacon into a saved live track.
-
Survives a dimmed screen
The reporter runs inside a foreground service with an ongoing notification, so dimming the controller or switching back to another app does not stop the beacon.
Network loss never reaches the GPS listener: the report fails, the count increments, and the next tick carries on.
02 What it is not
Worth stating plainly, because the category is crowded with tools that do all of this and DroneDot deliberately does none of it. DroneDot is not a survey or mapping product.
- No photogrammetry, orthomosaics, contours, DTMs or point clouds
- No camera, gimbal or video access of any kind
- No flight control, waypoints or automated missions
- No altitude, heading or speed — CalTopo does not display them for custom devices
- No queue and no backfill — a SAR map must never show a stale position
- No account, telemetry or analytics — the app talks to CalTopo and nowhere else
03 Requirements
Built and field-tested against exactly one hardware combination. Other MSDK V5 airframes are plausible but unverified.
- Aircraft
- DJI Matrice 4TDMatrice 4D Enterprise Series — on the MSDK V5 supported-product list.
- Controller
- DJI RC Plus 2Android,
arm64-v8aonly. The RC Plus is the same platform. - SDK
- DJI Mobile SDK V5, aircraft package, pinned to
5.18.0MSDK V4 does not support this airframe. - Android
minSdk 24·targetSdk 35- CalTopo
- A Team account with access to Trackable DevicesTeam Admin → Trackable Devices → Create New Access URL.
- Install method
- Sideload the APKDJI enterprise controllers ship without Google Play Services, so there is no Play Store to install from — the same reason DroneDeploy and Dronelink hand out APKs from their own sites.
04 Setup
Five steps, once per controller. Step 2 is the one people lose an afternoon to.
-
Step 1
Sideload the APK
On a computer with the controller attached over USB and ADB enabled:
adb install -r DroneTopo-GPS-0.3.0-arm64-v8a.apkOr type
dronedot.nobrega.com.br/apkstraight into the controller’s own browser and install from Downloads. Enable install-from-unknown-sources when prompted. -
Step 2
Force-stop DJI Pilot 2 — every time
DJI Pilot 2 holds the aircraft link. While it is running, a third-party MSDK app will not connect, and the symptom is a silent failure to ever reach
READY.On the controller: Settings → Apps → DJI Pilot 2 → Force stop. Confirm it is no longer running before launching DroneDot.
-
Step 3
Create a connect key in CalTopo
Team Admin → Trackable Devices → Create New Access URL, then copy the generated connect key. A generated key is harder to spoof than one you invent, and the device auto-appears in Trackable Devices on its first report — label and colour it there.
-
Step 4
Configure DroneDot
Open Settings and set the connect key, a device ID (for example
M4TD-01), the base URLhttps://caltopo.com, a report interval, and leave Skip invalid fixes on so(0,0)and NaN never reach the map.The screen echoes the resulting call sign,
{CONNECT_KEY}-{DEVICE_ID}. Check it matches the Trackable Device before you rely on it. -
Step 5
Start streaming
Power the aircraft, wait for the SDK phase line to walk
INITIALIZING → REGISTERING → REGISTEREDand thenREADY, and tap Start streaming. A notification reads “Reporting as {call sign}” for as long as the beacon is live.On the team map, enable Map Overlays → Realtime Data → Shared Locations. The drone appears as a coloured dot.
05 How it reports
The whole integration is one GET request, which is a feature: there is very little that can break in the field, and what does break is visible on the status screen.
# one request per tick — this is the entire CalTopo integration GET {baseUrl}/api/v1/position/report/{CONNECT_KEY}?id={DEVICE_ID}&lat={LAT}&lng={LNG} # worked example GET https://caltopo.com/api/v1/position/report/SARTRUCKS?id=14&lat=36.47375&lng=-118.85302 # on-map call sign, composed by CalTopo — the app only echoes it SARTRUCKS-M4TD-01
-
Latest wins, nothing is queued
A volatile holder keeps the most recent fix; a ticker sends whatever is in it. On failure the fix is dropped — the next tick sends the current position instead of backfilling a stale one.
5–10 s is the sane band for a moving aircraft; CalTopo draws straight lines between consecutive reports, so faster reporting means a smoother track. Longer intervals suit loiter, standby or a metered link.
-
Locale-safe coordinates
latandlngare formatted withLocale.USand%.6f, so the decimal separator is always a dot.A comma-decimal controller locale would otherwise emit
lat=49,323750and silently corrupt every report. It is the most common bug class in this kind of integration, and it is covered by a unit test. -
The connect key is a shared secret
Anyone who learns it can post positions under your call sign. Treat it like a password: it lives only in the app’s Settings screen, and published builds ship with it blank.
Rotate it in CalTopo if it leaks. DroneDot never implements the signed Team API, so a leaked connect key cannot be used to read or edit your maps.
06 Download
Signed release, no toolchain and no DJI App Key required. The build is large because the DJI MSDK ships a lot of native code; almost all of it is unused here and none of it can be stripped without breaking registration.
- Version
- 0.3.0 · released 2026-08-27
- File
- DroneTopo-GPS-0.3.0-arm64-v8a.apk · 339 MiB Published before the rename, so the 0.3.0 asset filename and its launcher label still read “DroneTopo GPS”. The next release drops the old name.
- SHA-256
- 52009d49b84445f71118a28be1bed93428ebdb0c8e6c3b7661bd25aa824a89e9
- ABI
arm64-v8aonlyRC Plus 2 and RC Plus. It will not install on an armeabi-v7a device.- DJI App Key
- Bound to
br.com.nobrega.m4td.gpsReleased builds carry a working key. Build from source if you want your own key or your own signing identity — the package name must match whatever you register. - Licence
- Apache License 2.0