{"repo":"arpanghosh8453/open-dronelog","free":true,"listed":false,"github":"https://github.com/arpanghosh8453/open-dronelog","clone":"git clone https://github.com/arpanghosh8453/open-dronelog.git","description":"Drone Log analyzer: A high-performance universal dashboard application for organizing and analyzing DJI/Litchi flight logs privately in one place. Supports plugin for custom flight log formats. Built with Tauri v2, DuckDB, and React.","language":"TypeScript","stars":1508,"topics":["dashboard","data-analysis","data-visualization","database","desktop","dji","docker","drone","duckdb","flight","linux","logs","macos","react","self-hosted","statistics","tauri","uav","windows"],"license":"AGPL-3.0","category":"health_data_visualization","readme_excerpt":"<p align=\"center\">\n    <img src=\"src-tauri/icons/icon.png\" alt=\"Open DroneLog\" width=\"96\" />\n</p>\n\n<H1 align=\"center\"> OPEN DRONELOG </H1>\n\n<p align=\"center\">\n    <a href=\"https://github.com/arpanghosh8453/open-dronelog/releases\">\n        <img src=\"https://img.shields.io/badge/Download-Latest%20Release-1a7f37?style=for-the-badge&logo=github\" alt=\"Download Latest Release\" height=\"48\"/>\n    </a>\n    &nbsp;&nbsp;\n    <a href=\"https://opendronelog.com\">\n        <img src=\"https://img.shields.io/badge/opendronelog.com-blue?style=for-the-badge&logo=globe\" alt=\"Visit Website\" height=\"48\"/>\n    </a>\n    &nbsp;&nbsp;\n    <a href=\"https://app.opendronelog.com\">\n        <img src=\"https://img.shields.io/badge/Launch-Webapp-red?style=for-the-badge&logo=globe\" alt=\"Launch Webapp\" height=\"48\"/>\n    </a>\n    &nbsp;&nbsp;\n    <a href=\"https://play.google.com/store/apps/details?id=com.opendronelog\">\n        <img src=\"https://img.shields.io/badge/Get%20it%20on-Google%20Play-34A853?style=for-the-badge&logo=googleplay&logoColor=white\" alt=\"Get it on Google Play\" height=\"48\"/>\n    </a>\n</p>\n\n\n<p align=\"center\">A high-performance application for analyzing drone flight logs (DJI and Litchi CSV formats). Available as a Tauri v2 desktop app or a Docker-deployable web app. Built with DuckDB and React.</p>\n\n<video src=\"https://github.com/user-attachments/assets/50e9f58b-5e91-44c3-a053-2224a52dab76\" width=\"100%\" autoplay loop muted playsinline controls></video>\n\n> [!IMPORTANT]\n> *DJI is a registered trademark of SZ DJI Technology Co., Ltd. DroneLogbook® is a registered trademark of DroneAnalytics Inc. Litchi is a trademark of VC Technology Ltd. Airdata or Airdata UAV is a trademark of Airdata UAV, Inc. This project is independent and is not affiliated with, sponsored by, authorized by, or endorsed by SZ DJI Technology Co., Ltd., DroneAnalytics Inc., VC Technology Ltd., Airdata UAV, Inc., or their affiliates.*\n\n> [!NOTE]\n> This project repository is dynamically mirrored in [Codeberg](https://codeberg.org/arpanghosh8453/open-dronelog) as a backup. An alternative docker image is available at [codeberg.org/arpanghosh8453/open-dronelog](https://codeberg.org/arpanghosh8453/-/packages/container/open-dronelog).\n\n## Contents\n\n- [Features](#features)\n- [Accessing flight log files](#accessing-flight-log-files)\n  - [Automated Sync Bridge](#automated-sync-windowsmac)\n  - [Manual Log Collection](#manual-log-collection)\n  - [Airdata Exports](#airdata-exports)\n- [Setup and installation (Windows/MacOS/Android)](#setup-and-installation-windowsmacos)\n  - [Try the Webapp First](#try-the-webapp-first-no-installation-required)\n  - [Hosting Open Drone Log for Teams](#hosting-open-drone-log-for-teams)\n  - [macOS Users: \"Damaged File\" Error Fix](#macos-users-damaged-file-error-fix)\n- [Usage](#usage)\n- [Building from source (Linux users)](#building-from-source-linux-users)\n- [Docker deployment (Self-hosted Web)](#docker-deployment-self-hosted-web)\n- [Profiles and Password Protection](#profiles-and-password-protection)\n- [Security Warning (Web/Docker)](#security-warning-webdocker)\n- [Configuration](#configuration)\n- [Context Management](#context-management)\n- [Tech Stack](#tech-stack)\n- [Project Structure](#project-structure)\n- [How to obtain your own DJI Developer API key](#how-to-obtain-your-own-dji-developer-api-key)\n- [Contribution Guidelines](#contribution-guidelines)\n- [Socials and Support](#socials-and-support)\n- [Love this project?](#love-this-project)\n- [License](#license)\n- [Acknowledgments](#acknowledgments)\n\n<p align=\"center\">\n    <img src=\"screenshots/Comparison.png\" alt=\"Comparison chart\" width=\"900\" />\n</p>\n<p align=\"center\">\n    <img src=\"screenshots/interface_dark.png\" alt=\"Interface (dark)\" width=\"900\" />\n</p>\n<p align=\"center\">\n    <img src=\"screenshots/individual_stats.png\" alt=\"Individual stats\" width=\"900\" />\n</p>\n<p align=\"center\">\n    <img src=\"screenshots/weather_preview.png\" alt=\"Weather preview\" width=\"900\" />\n</p>\n<p align=\"center\">\n    <img src=\"screenshots/map_dark.png\" alt=\"Flight map replay (dark)\" width=\"900\" />\n</p>\n<p align=\"center\">\n    <img src=\"screenshots/mobile-interface.png\" alt=\"Mobile app interface\" width=\"900\" />\n</p>\n<p align=\"center\">\n    <img src=\"screenshots/flight_report.png\" alt=\"Flight report\" width=\"900\" />\n</p>\n\n## Features\n\n- **High-Performance Analytics**: DuckDB-powered queries with automatic downsampling for large datasets. Free, open source, no subscription required.\n- **Multi-Format Support**: Import DJI logs (.txt), Litchi CSV, and Airdata CSV exports with automatic unit detection. Third-party apps (Dronelink, DroneDeploy) supported. Optional external parser plugins can be configured via `parsers.json`.\n- **Smart Deduplication**: Prevents duplicate imports based on drone serial, battery serial, and start time.\n- **Interactive Flight Maps**: 3D terrain, map-type selection (Satellite, Topographic, OpenStreetMap), flight replay with speed control (0.5x-16x), live telemetry overlay, and RC joystick visualization.\n- **Telemetry Charts**: Height, speed, battery, cell voltages, attitude, RC signal, GPS, distance-to-home, velocity, battery full capacity, and battery remaining capacity with synchronized drag-to-zoom, per-profile telemetry color customization, and collapsible panel controls.\n- **Local-First Storage**: All data in a local DuckDB database. No cloud upload required (except DJI key fetch during first import).\n- **Smart Tags**: Auto-tagging (Night Flight, High Speed, Low Battery, etc.) and offline reverse geocoding for location tags. Manual tags and bulk operations supported.on.\n- **Filters & Search**: Date range (calendar + typed `YYYY-MM-DD` start/end quick entry), drone/battery/controller/color filters, duration/altitude/distance sliders, tag filter, map area filter, and filter inversion.\n- **Overview Dashboard**: Aggregate stats, activity heatmap, pie charts by drone/battery/duration, time-of-day radial chart, cluster map with optional heatmap layer, and top-flight highlights.\n- **Battery Health**: Per-battery health bars with cycle count tracking, serial renaming, per-minute usage history with zoom, and battery capacity history chart with multi-select battery dropdown showing full-charge capacity trends over time.\n- **Maintenance Tracking**: Configurable thresholds with color-coded progress bars and date-based maintenance recording.\n- **Exports**: CSV, JSON, GPX, KML, and Summary CSV export. FlyCard generator for shareable 1080x1080 social media images.\n- **HTML Report**: Generate a configurable, print-ready flight regulation report (A4 layout) with selectable field groups, weather data, and day-by-day grouping. Can be printed as PDF via Ctrl+P. Pilot name and field preferences can be customized and will persist across sessions.\n- **Manual Flight Entry**: Record flights without log files with optional coordinates and metadata.\n- **Multi-Language Support**: Full internationalization with 11 language locales (English, German, Spanish, French, Italian, Japanese, Korean, Dutch, Polish, Portuguese, Chinese) and locale-aware number and date formatting.\n- **Progressive Web App (PWA)**: Optionally install the application directly from the browser for a native-like experience on desktop and mobile.\n- **Backup & Restore**: Export/import full database across desktop and Docker instances.\n- **Profile System**: Create multiple profiles to separate flight data by pilot, drone fleet, or purpose. Each profile has its own database, config, uploads, and sync folder.Optionally lock any profile (including the default) with a password.\n\n## Accessing flight log files\n\nYou first need to collect the supported flight log files that you can import to this application.\n\n### Automated Sync (Windows/Mac)\n\nYou can sync your DJI flight logs directly from the mobile (Android/iPhone) or RC/RC-2/RC-Pro directly and seamlessly using the `Litchi Hub Bridge` companion app on your Windows/Mac desktop or laptop. This is a free application that lets you sync your flight logs from the phone's DJI Fly app or the RC devices directly to a local folder. \n\n<a href=\"https://flylitchi.com/hub-bridge\" target=\"_blank\" rel=\"noopener noreferrer\">\n    <img width=\"200\" height=\"68\" alt=\"image\" src=\"https://github.com/user-attachments/assets/1e1d9235-881a-434a-86b1-03a437c7d8ed\" />\n</a>\n\n#### Download Here - [Windows](https://apps.microsoft.com/detail/9mz7gp4zqlhj) | [MacOS](https://litchi-apks.s3.us-east-1.amazonaws.com/Litchi-Hub-Bridge-mac.dmg)\n\nAfter installation, run it and check the tray menu (it usually gets minimizedto tray after start) - Right click on tray icon and pick settings - Check the `Start with Windows` in `General` tab and go to `Flight Logs Sync` tab to pick a local folder where the logs will be synced. Select the `Auto-sync when a device connects` for a seamless experience. After this setup, as soon as you plug in your RC or Android/iPhone (should be unlocked and mounted to your desktop/laptop) which you use to fly your drones, it will automatically search for the relevant folders and copy the .txt logs from there to your selected local folder. \n\n<img width=\"915\" height=\"396\" alt=\"image\" src=\"https://github.com/user-attachments/assets/3d080d15-8a87-4126-b85e-a4de09ff688f\" />\n\n> [!TIP]\n> After you set up Open Drone Log, you will have an option to pick a Sync folder from where the application (Open Drone Log) syncs files on startup for new log files. If you select the same log folder for both application, you will not have to find or copy new logs manually anymore - it syncs automatically with your Oopen Drone Log application!\n\n### Manual Log collection\n\nThis project supports modern DJI log files in the `.txt` format. For DJI fly apps on Android or RC remotes, they are usually in `Internal Storage > Android > data > dji.go.v5 > files > FlightRecord`. For iOS, Connect your iPhone/iPad to a computer, open iTunes/Finder, select the device, go to the \"File Sharing\" tab, select the DJI app, and copy the \"Logs\" folder. If you are already usi","default_branch":"main","files":204,"tree":[".dockerignore",".github/FUNDING.yml",".github/ISSUE_TEMPLATE/bug_report.md",".github/ISSUE_TEMPLATE/feature_request.md",".github/workflows/android.yml",".github/workflows/build.yml",".github/workflows/codeberg-sync.yml",".github/workflows/docker.yml",".github/workflows/nightly-build.yml",".github/workflows/nightly-docker.yml",".github/workflows/publish-play-store.yml",".gitignore",".woodpecker/docker.yml","CONTRIBUTING.md","Dockerfile","LICENSE","README.md","context/README.md","context/domains/architecture.json","context/domains/project.json","context/domains/runtime.json","context/generated/api-routes.json","context/generated/db-schema.json","context/generated/deps-frontend.json","context/generated/deps-rust.json","context/generated/env-vars.json","context/generated/openapi.json","context/generated/tauri-commands.json","context/links/graph.json","context/manifest.json","context/schema/context-doc.schema.json","context/schema/domain-architecture.schema.json","context/schema/domain-project.schema.json","context/schema/domain-runtime.schema.json","deps/_metadata.json","deps/package.json","docker-compose-build.yml","docker-compose.yml","docker/entrypoint.sh","docker/nginx.conf","docs/api-guide.md","docs/context-management.md","docs/custom_parsers.md","docs/manual.md","index.html","package-lock.json","package.json","postcss.config.js","public/apple-touch-icon.png","public/favicon.png","public/manifest.json","requirements.txt","screenshots/Airdata_Export_Guide.png","screenshots/Comparison.png","screenshots/ODL-sync-interface-dark.png","screenshots/flight_map.png","screenshots/flight_map_2.png","screenshots/flight_report.png","screenshots/individual_stats.png","screenshots/individual_stats_light.png","screenshots/interface_dark.png","screenshots/interface_light.png","screenshots/map_dark.png","screenshots/map_light.png","screenshots/mobile-interface.png","screenshots/overall_stats.png","screenshots/overall_stats_dark.png","screenshots/telemetry_1.png","screenshots/telemetry_2.png","screenshots/weather_preview.png","scripts/context/build.mjs","scripts/context/check.mjs","scripts/context/extract.mjs","scripts/context/install-hooks.mjs","scripts/context/validate.mjs","scripts/mobile/build-android.sh","scripts/mobile/doctor.sh","scripts/mobile/run-android-dev.sh","scripts/mobile/sync-android-icons.sh","src-tauri/.cargo/config.toml","src-tauri/Cargo.lock","src-tauri/Cargo.toml","src-tauri/build.rs","src-tauri/capabilities/default.json","src-tauri/gen/schemas/acl-manifests.json","src-tauri/gen/schemas/capabilities.json","src-tauri/gen/schemas/desktop-schema.json","src-tauri/gen/schemas/linux-schema.json","src-tauri/gen/schemas/windows-schema.json","src-tauri/icons/128x128.png","src-tauri/icons/128x128@2x.png","src-tauri/icons/32x32.png","src-tauri/icons/64x64.png","src-tauri/icons/Square107x107Logo.png","src-tauri/icons/Square142x142Logo.png","src-tauri/icons/Square150x150Logo.png","src-tauri/icons/Square284x284Logo.png","src-tauri/icons/Square30x30Logo.png","src-tauri/icons/Square310x310Logo.png","src-tauri/icons/Square44x44Logo.png","src-tauri/icons/Square71x71Logo.png","src-tauri/icons/Square89x89Logo.png","src-tauri/icons/StoreLogo.png","src-tauri/icons/icon.icns","src-tauri/icons/icon.ico","src-tauri/icons/icon.png","src-tauri/icons/icon.svg","src-tauri/icons/ios/AppIcon-20x20@1x.png","src-tauri/icons/ios/AppIcon-20x20@2x-1.png","src-tauri/icons/ios/AppIcon-20x20@2x.png","src-tauri/icons/ios/AppIcon-20x20@3x.png","src-tauri/icons/ios/AppIcon-29x29@1x.png","src-tauri/icons/ios/AppIcon-29x29@2x-1.png","src-tauri/icons/ios/AppIcon-29x29@2x.png","src-tauri/icons/ios/AppIcon-29x29@3x.png","src-tauri/icons/ios/AppIcon-40x40@1x.png","src-tauri/icons/ios/AppIcon-40x40@2x-1.png","src-tauri/icons/ios/AppIcon-40x40@2x.png","src-tauri/icons/ios/AppIcon-40x40@3x.png","src-tauri/icons/ios/AppIcon-512@2x.png","src-tauri/icons/ios/AppIcon-60x60@2x.png","src-tauri/icons/ios/AppIcon-60x60@3x.png","src-tauri/icons/ios/AppIcon-76x76@1x.png","src-tauri/icons/ios/AppIcon-76x76@2x.png","src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png","src-tauri/src/airdata_parser.rs","src-tauri/src/api.rs","src-tauri/src/battery_pairs.rs","src-tauri/src/database.rs","src-tauri/src/dronelogbook_parser.rs","src-tauri/src/lib.rs","src-tauri/src/litchi_parser.rs","src-tauri/src/main.rs","src-tauri/src/models.rs","src-tauri/src/parser.rs","src-tauri/src/plugins.rs","src-tauri/src/profile_auth.rs","src-tauri/src/server.rs","src-tauri/src/session_store.rs","src-tauri/src/tauri_app.rs","src-tauri/tauri.android.conf.json","src-tauri/tauri.conf.json","src/App.tsx","src/assets/icon.png","src/assets/weather-icon.svg","src/components/charts/TelemetryCharts.tsx","src/components/charts/index.ts","src/components/dashboard/ColorPickerModal.tsx","src/components/dashboard/Dashboard.tsx","src/components/dashboard/EmailSignatureModal.tsx","src/components/dashboard/FlightClusterMap.tsx","src/components/dashboard/FlightImporter.tsx","src/components/dashboard/FlightList.tsx","src/components/dashboard/FlightMessagesModal.tsx","src/components/dashboard/FlightStats.tsx","src/components/dashboard/FlyCardGenerator.tsx","src/components/dashboard/HtmlReportModal.tsx","src/components/dashboard/ManualEntryModal.tsx","src/components/dashboard/Overview.tsx","src/components/dashboard/ProfileSelector.tsx","src/components/dashboard/SettingsModal.tsx","src/components/dashboard/WeatherModal.tsx","src/components/dashboard/index.ts","src/components/map/FlightMap.tsx","src/components/map/index.ts","src/components/ui/DatePickerPopover.tsx","src/components/ui/PasswordInput.tsx","src/components/ui/Select.tsx","src/hooks/platform/useIsMobileRuntime.ts","src/hooks/platform/useSafeAreaInsets.ts","src/i18n/index.ts","src/i18n/locales/de.json","src/i18n/locales/en.json","src/i18n/locales/es.json","src/i18n/locales/fr.json","src/i18n/locales/hu.json","src/i18n/locales/it.json","src/i18n/locales/ja.json","src/i18n/locales/ko.json","src/i18n/locales/nl.json","src/i18n/locales/pl.json","src/i18n/locales/pt.json","src/i18n/locales/tr.json","src/i18n/locales/zh.json","src/index.css","src/lib/api.ts","src/lib/batteryPairs.ts","src/lib/exportUtils.ts","src/lib/htmlReportBuilder.ts","src/lib/mapStyles.ts","src/lib/mobile/deviceInfo.ts","src/lib/mobile/fileAccess.ts","src/lib/mobile/permissions.ts","src/lib/utils.ts","src/lib/weather.ts","src/main.tsx","src/stores/flightStore.ts","src/styles/mobile.css","src/types/index.ts","src/vite-env.d.ts","tailwind.config.js","tsconfig.json","tsconfig.node.json","vite.config.ts"],"storefront":"/r/arpanghosh8453","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/arpanghosh8453/open-dronelog/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}