A free, open-source mission planner for DJI drones. Plan waypoint missions on an interactive map, tweak flight parameters, and export KMZ files ready to fly.
Try the live demo | Read the guide
- Interactive map — Click to place waypoints and Points of Interest on OpenStreetMap
- Waypoint configuration — Set altitude, speed, gimbal pitch, heading mode, and turn mode per waypoint
- Points of Interest — Define POIs and auto-point the camera toward them
- Smart gimbal pitch — Automatically calculates the optimal gimbal angle based on distance and height to a POI
- Waypoint actions — Add photo, video, gimbal rotate, yaw, hover, zoom, and focus actions
- KMZ export & import — Generates DJI WPML-compliant KMZ files, or load existing ones
- Upload to controller — Push KMZ files directly to USB-connected DJI RC controllers with
npx droneroute - Save & load — Persist missions to a local database with user accounts
- Share missions — Generate a read-only link to share any saved route; recipients can preview stats, open in the editor, clone to their account, or export the KMZ directly
- Mission templates — Orbit, grid survey, facade scan, and pencil path presets to get you flying faster
- Animated flight path — Dashed lines animate in flight direction, proportional to each waypoint's speed
- Drag-and-drop reordering — Reorder waypoints by dragging in the sidebar
- Keyboard shortcuts —
Wadd waypoint,Padd POI,Zpencil path,Escdeselect,Deleteremove selected - Self-hosted — Run it on your own machine or server with Docker
DJI M300 RTK, M350 RTK, M30/M30T, Mavic 3E/3T/3M/3D/3TD, Mini 4 Pro.
You'll need Node.js 22+ and npm 10+.
# Clone the repo
git clone https://github.com/fcsonline/droneroute.git
cd droneroute
# Install dependencies
npm install
# Build the shared types package (required before first run)
npm run build -w packages/shared
# Start both backend and frontend in dev mode
npm run devThat's it! Open http://localhost:5173 and start planning missions.
Prefer Docker? One command:
docker run -d -p 3001:3001 -v droneroute-data:/app/data fcsonline/droneroute:latest
# Open http://localhost:3001A docker-compose.yml with Traefik reverse proxy is also available in the repo.
The self-hosted version is designed as a single-account, personal instance. Mission sharing is hidden since share links require your instance to be publicly reachable.
After exporting a KMZ file, push it directly to a USB-connected DJI RC controller:
npx droneroute mission.kmzThe CLI detects connected controllers (via adb or mounted SD cards), creates a new mission slot, and places the file. See the droneroute CLI docs for details and prerequisites.
| Layer | Technology |
|---|---|
| Frontend | React 19, TypeScript, Vite 6, Tailwind CSS v4, shadcn/ui, Zustand, Leaflet |
| Backend | Node.js, Express 5, better-sqlite3, JWT auth |
| Shared | TypeScript types package shared between frontend and backend |
| Infrastructure | Docker, Traefik, SQLite |
The project is organized as an npm monorepo with four packages: shared, backend, frontend, and cli.
Contributions are welcome! Whether it's a bug fix, a new feature, or improving the docs — every bit helps.
- Fork the repo
- Create a branch (
git checkout -b my-feature) - Make your changes
- Run the dev server and make sure things work (
npm run dev) - Open a Pull Request
If you find a bug or have an idea, feel free to open an issue. We'd love to hear from you.
DroneRoute is built and maintained in my spare time. If it saves you time planning your flights, consider buying me a coffee — it helps keep the project going.
This software is under active development. DroneRoute is provided "as is" without warranty of any kind. The authors are not responsible for any damage to your drones, equipment, or property resulting from the use of this software. Always verify your mission parameters before flying.
DroneRoute is an independent, community-driven project. It is not affiliated with, endorsed by, or sponsored by DJI. "DJI" and related product names are trademarks of SZ DJI Technology Co., Ltd.
MIT


