Android companion app for DroneOpsCommand — syncs DJI flight logs from smart controllers directly into the DroneOpsCommand Flight Management System.
Part of the DroneOps platform. No separate server required — DroneOpsCommand IS the backend.
DroneOpsSync runs on your DJI smart controller (sideloaded APK). It scans the controller's local storage for flight log files and uploads them in a single batch to your DroneOpsCommand instance over plain HTTP — either directly on your local network, or remotely via WireGuard VPN. Once confirmed on the server, logs can be deleted from the controller with a single tap.
- DroneOpsCommand deployed and running (see DroneOpsCommand)
- Device API key generated in DroneOpsCommand → Settings → Device Access
- Network access to the server — LAN (direct IP) or WireGuard VPN for remote
The controller connects directly to the server's local IP over HTTP. No tunnel, no TLS, no extra config. Just make sure both devices are on the same network and the server port is reachable.
DJI Controller → http://192.168.1.50:8080
Connect the controller to your WireGuard VPN before uploading. The app then talks to the server's VPN IP exactly like LAN — plain HTTP, no certificate issues.
DJI Controller → WireGuard VPN → http://10.8.0.1:8080
WireGuard has an official Android APK that runs on Android 8+, compatible with all DJI smart controllers.
In your DroneOpsCommand web UI:
- Go to Settings → Device Access
- Copy the auto-generated
Device API Key
cd android
./gradlew assembleRelease
# APK at: app/build/outputs/apk/release/app-release.apkSideload the APK onto each DJI smart controller via ADB or a file manager.
Open DroneOpsSync on the controller, tap the Settings (gear) icon, and enter:
| Field | Value |
|---|---|
| DroneOpsCommand URL | Local IP (e.g. http://192.168.1.50:8080) or WireGuard VPN IP |
| Device API Key | The key copied from DroneOpsCommand Settings |
Tap Save. The status indicator will turn green when the server is reachable.
- SCAN FOR LOGS — finds
.txt/.logfiles in all configured paths - SYNC ALL — uploads all pending logs to DroneOpsCommand in a single batch. The server parses them, deduplicates by hash, and imports into the Flight Library.
- DELETE — after confirmation, removes synced files from the controller only
Files are never deleted automatically — explicit confirmation is always required.
Pre-configured in the app; additional paths can be added in Settings.
| Controller / Device | DJI App | Path |
|---|---|---|
| RC Plus 2 (4TD), RC Plus (M30T) | DJI Pilot 2 | /storage/emulated/0/DJI/com.dji.industry.pilot/FlightRecord |
| RC Pro (M3P), RC 2 (M5P) | DJI GO 5 | /storage/emulated/0/Android/data/dji.go.v5/files/FlightRecord |
| Phone (DJI GO 5) | DJI GO 5 | /storage/emulated/0/Android/data/dji.go.v5/files/FlightRecord |
| Phone (DJI Fly) | DJI Fly | /storage/emulated/0/Android/data/com.dji.fly/files/FlightRecord |
| Badge | Meaning |
|---|---|
| PENDING | Found locally, not yet uploaded |
| SYNCING | Upload in progress |
| SYNCED | Confirmed in DroneOpsCommand Flight Library |
| ON SERVER | Already existed on server (deduplicated) |
| ERROR | Upload or parse failed — check connection/key |
| DELETED | Removed from controller after sync |
DroneOpsSync talks directly to DroneOpsCommand's /api/flight-library/device-upload endpoint over plain HTTP. There is no middleware, relay server, or tunnel required.
The DroneOpsCommand stack includes:
flight-parser— Rust service that parses DJI.txtlog format- PostgreSQL — persistent flight record storage
Place your logo PNG at:
android/app/src/main/res/drawable/droneops_sync_logo.png
Recommended size: 1024 × 410 px on a transparent background.
MIT