[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-74978":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":25,"hasPages":23,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":46,"readmeContent":47,"aiSummary":48,"trendingCount":16,"starSnapshotCount":16,"syncStatus":49,"lastSyncTime":50,"discoverSource":51},74978,"open-dronelog","arpanghosh8453\u002Fopen-dronelog","arpanghosh8453","Drone Log analyzer: A high-performance universal dashboard application for organizing and analyzing DJI\u002FLitchi flight logs privately in one place. Supports plugin for custom flight log formats. Built with Tauri v2, DuckDB, and React.","https:\u002F\u002Fwww.opendronelog.com",null,"TypeScript",1417,187,11,26,0,3,7,35,9,67.82,"GNU Affero General Public License v3.0",false,"main",true,[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],"dashboard","data-analysis","data-visualization","database","desktop","dji","docker","drone","duckdb","flight","linux","logs","macos","react","self-hosted","statistics","tauri","uav","windows","2026-06-12 04:01:16","\u003Cp align=\"center\">\n    \u003Cimg src=\"src-tauri\u002Ficons\u002Ficon.png\" alt=\"Open DroneLog\" width=\"96\" \u002F>\n\u003C\u002Fp>\n\n\u003CH1 align=\"center\"> OPEN DRONELOG \u003C\u002FH1>\n\n\u003Cp align=\"center\">\n    \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Farpanghosh8453\u002Fopen-dronelog\u002Freleases\">\n        \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FDownload-Latest%20Release-1a7f37?style=for-the-badge&logo=github\" alt=\"Download Latest Release\" height=\"48\"\u002F>\n    \u003C\u002Fa>\n    &nbsp;&nbsp;\n    \u003Ca href=\"https:\u002F\u002Fopendronelog.com\">\n        \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fopendronelog.com-blue?style=for-the-badge&logo=globe\" alt=\"Visit Website\" height=\"48\"\u002F>\n    \u003C\u002Fa>\n    &nbsp;&nbsp;\n    \u003Ca href=\"https:\u002F\u002Fapp.opendronelog.com\">\n        \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLaunch-Webapp-red?style=for-the-badge&logo=globe\" alt=\"Launch Webapp\" height=\"48\"\u002F>\n    \u003C\u002Fa>\n    &nbsp;&nbsp;\n    \u003Ca href=\"https:\u002F\u002Fplay.google.com\u002Fstore\u002Fapps\u002Fdetails?id=com.opendronelog\">\n        \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGet%20it%20on-Google%20Play-34A853?style=for-the-badge&logo=googleplay&logoColor=white\" alt=\"Get it on Google Play\" height=\"48\"\u002F>\n    \u003C\u002Fa>\n\u003C\u002Fp>\n\n\n\u003Cp 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.\u003C\u002Fp>\n\n\u003Cvideo src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F50e9f58b-5e91-44c3-a053-2224a52dab76\" width=\"100%\" autoplay loop muted playsinline controls>\u003C\u002Fvideo>\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:\u002F\u002Fcodeberg.org\u002Farpanghosh8453\u002Fopen-dronelog) as a backup. An alternative docker image is available at [codeberg.org\u002Farpanghosh8453\u002Fopen-dronelog](https:\u002F\u002Fcodeberg.org\u002Farpanghosh8453\u002F-\u002Fpackages\u002Fcontainer\u002Fopen-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\u002FMacOS\u002FAndroid)](#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\u002FDocker)](#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\u003Cp align=\"center\">\n    \u003Cimg src=\"screenshots\u002FComparison.png\" alt=\"Comparison chart\" width=\"900\" \u002F>\n\u003C\u002Fp>\n\u003Cp align=\"center\">\n    \u003Cimg src=\"screenshots\u002Finterface_dark.png\" alt=\"Interface (dark)\" width=\"900\" \u002F>\n\u003C\u002Fp>\n\u003Cp align=\"center\">\n    \u003Cimg src=\"screenshots\u002Findividual_stats.png\" alt=\"Individual stats\" width=\"900\" \u002F>\n\u003C\u002Fp>\n\u003Cp align=\"center\">\n    \u003Cimg src=\"screenshots\u002Fweather_preview.png\" alt=\"Weather preview\" width=\"900\" \u002F>\n\u003C\u002Fp>\n\u003Cp align=\"center\">\n    \u003Cimg src=\"screenshots\u002Fmap_dark.png\" alt=\"Flight map replay (dark)\" width=\"900\" \u002F>\n\u003C\u002Fp>\n\u003Cp align=\"center\">\n    \u003Cimg src=\"screenshots\u002Fmobile-interface.png\" alt=\"Mobile app interface\" width=\"900\" \u002F>\n\u003C\u002Fp>\n\u003Cp align=\"center\">\n    \u003Cimg src=\"screenshots\u002Fflight_report.png\" alt=\"Flight report\" width=\"900\" \u002F>\n\u003C\u002Fp>\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\u002Fend quick entry), drone\u002Fbattery\u002Fcontroller\u002Fcolor filters, duration\u002Faltitude\u002Fdistance sliders, tag filter, map area filter, and filter inversion.\n- **Overview Dashboard**: Aggregate stats, activity heatmap, pie charts by drone\u002Fbattery\u002Fduration, 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\u002Fimport 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\u002FMac)\n\nYou can sync your DJI flight logs directly from the mobile (Android\u002FiPhone) or RC\u002FRC-2\u002FRC-Pro directly and seamlessly using the `Litchi Hub Bridge` companion app on your Windows\u002FMac 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\u003Ca href=\"https:\u002F\u002Fflylitchi.com\u002Fhub-bridge\" target=\"_blank\" rel=\"noopener noreferrer\">\n    \u003Cimg width=\"200\" height=\"68\" alt=\"image\" src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F1e1d9235-881a-434a-86b1-03a437c7d8ed\" \u002F>\n\u003C\u002Fa>\n\n#### Download Here - [Windows](https:\u002F\u002Fapps.microsoft.com\u002Fdetail\u002F9mz7gp4zqlhj) | [MacOS](https:\u002F\u002Flitchi-apks.s3.us-east-1.amazonaws.com\u002FLitchi-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\u002FiPhone (should be unlocked and mounted to your desktop\u002Flaptop) 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\u003Cimg width=\"915\" height=\"396\" alt=\"image\" src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F3d080d15-8a87-4126-b85e-a4de09ff688f\" \u002F>\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\u002FiPad to a computer, open iTunes\u002FFinder, select the device, go to the \"File Sharing\" tab, select the DJI app, and copy the \"Logs\" folder. If you are already using other online sync applications, you can download the original logs files directly from there too. \n\nYou can find more details resources from this simple [google search](https:\u002F\u002Fwww.google.com\u002Fsearch?q=where+can+i+find+the+DJI+log+files&oq=where+can+i+find+the+DJI+log+files)\n\nLitchi flight logs can be exported as CSV files from the Litchi app.  Litchi-imported flights are automatically tagged with \"Litchi\" for easy filtering.\n\n### Airdata Exports\n\nIf you use Airdata to sync your flight logs, you can export the original DJI log files directly from the Airdata website:\n\n1. Go to your [Airdata flight logs](https:\u002F\u002Fapp.airdata.com\u002F) and click on `my account`\n2. In the left sidebar, under `My Data` secction, pick `Download my data`\n3. Click **Request Export** and wait for their email with zip containing the `.txt` files\n\n![Airdata Export Guide](screenshots\u002FAirdata_Export_Guide.png)\n\nThese exported log files can then be imported directly into Open DroneLog.\n## Setup and installation (Windows\u002FMacOS)\n\nThere is no installation step if you want to use the standalone binary builds, just visit the latest [release page](https:\u002F\u002Fgithub.com\u002Farpanghosh8453\u002Fopen-dronelog\u002Freleases), and download the appropriate binary for Windows or MacOS and run them.\n\n> [!WARNING]\n> For macOS, there are [additional steps](#macos-users-damaged-file-error-fix) required before you can use the application.\n\n> [!IMPORTANT]\n> When you are copying from RC or mobile device, you can NOT directly drag and drop the files to the interface. This is because these external devices are mounted differently and only accessible to the file manager. Please copy the files to a local folder or the device sync folder before trying to upload or sync. \n\n> [!TIP]\n> Explore the [full manual](\u002Fdocs\u002Fmanual.md) if you want to have a comprehensive overview of all the available options and features inside the app.\n\n###  Windows (64-bit)\n* **`Open.DroneLog_(version)_x64-setup.exe`**: Standard installer. **Best for most users.**\n* **`Open.DroneLog_(version)_x64_en-US.msi`**: Enterprise installer. For IT admins deploying to multiple PCs.\n\n###  macOS\n*(Files available for both `aarch64` \u002F Apple Silicon and `x64` \u002F Intel)*\n* **`...dmg`**: Standard disk image. **Best for most users** (drag and drop to Applications).\n* **`...app.tar.gz`**: Compressed app bundle. A quick, alternative way to download the app without mounting a drive.\n* **`open-dronelog_darwin_...`**: Command-line binary. For advanced terminal users only.\n\n###  Linux (64-bit)\n* **`Open.DroneLog_(version)_amd64.deb`**: Package for **Ubuntu, Mint, and Debian** systems.\n* **`Open.DroneLog-(version).x86_64.rpm`**: Package for **Fedora, CentOS, and Red Hat** systems.\n* **`Open.DroneLog_(version)_amd64.AppImage`**: Universal portable app. Runs on any Linux distro without installing.\n* **`open-dronelog_linux_x86_64`**: Command-line binary. For advanced terminal users only.\n\n### Android APK Releases\n\nRecommended for most users:\n* **`open-dronelog_(version)_android-universal.apk`**: Universal APK that works on most Android devices.\n\nAdvanced \u002F smaller download option:\n* **`open-dronelog_(version)_arm64-v8a_android.apk`**: Modern 64-bit ARM phones\u002Ftablets (most current Android devices).\n* **`open-dronelog_(version)_armeabi-v7a_android.apk`**: Older 32-bit ARM devices.\n* **`open-dronelog_(version)_x86_64_android.apk`**: 64-bit x86 devices\u002Femulators.\n* **`open-dronelog_(version)_x86_android.apk`**: 32-bit x86 devices\u002Femulators.\n\nIf you are unsure which one to use, install the **universal APK**.\n\n###  General \u002F Verification\n* **`checksums.txt`**: Security file. Use to verify your downloaded files aren't corrupted or tampered with.\n\n### Try the Webapp First (No Installation Required)\n\nWant to quickly test the tool before committing to a full installation? Try the hosted webapp. Please only use it for evaluation and temporary visit. \n\n\u003Ca href=\"https:\u002F\u002Fapp.opendronelog.com\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLaunch-Webapp-red?style=for-the-badge&logo=globe\" alt=\"Launch Webapp\" height=\"48\"\u002F>\n\u003C\u002Fa>\n\u003Cbr>\u003Cbr>\n\n- **Zero setup** – just open the link in your browser\n- **Perfect for evaluation** – see if the tool fits your needs before installing\n- **Single flight visualization** – upload and analyze one flight log at a time\n- **All core features** – view telemetry charts, 3D flight path replay, and flight statistics\n- **No data persistence** – your data is processed locally in the browser and not stored on any server\n\n> **Note:** For the full experience with multi-flight management, database persistence, filtering, overview analytics, and backup\u002Frestore capabilities, use the desktop app or self-hosted Docker deployment. \n\n### Hosting Open Drone Log for Teams\n\nIf you are using Open Drone Log for a team with multiple drone operators, and want a common hosted instance where everyone can import their logs from their own machine to the server, without managing your own self-hosted server, an easy option is [PikaPods](https:\u002F\u002Fwww.pikapods.com\u002Fpods?run=opendronelog). They host and manage the application in a container, and you get a unique URL for your own hosted instance of Open Drone Log for a monthly fee **less than $2 USD!**\n\n\u003Cp align=\"center\">\n    \u003Ca href=\"https:\u002F\u002Fwww.pikapods.com\u002Fpods?run=opendronelog\">\n        \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FDeploy%20with-PikaPods-0A7A46?style=for-the-badge&logo=pikapods&logoColor=white\" alt=\"Deploy with PikaPods\" height=\"48\"\u002F>\n    \u003C\u002Fa>\n\u003C\u002Fp>\n\n### macOS Users: \"Damaged File\" Error Fix\n\n\u003Cimg width=\"320\" height=\"311\" alt=\"image\" src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F2787ffff-9961-433c-898a-b548c738f1a2\" \u002F>\n\n> [!IMPORTANT]\n> If you see **\"Open DroneLog is damaged and can't be opened\"** on macOS, this is a Gatekeeper security warning for unsigned apps, **not a corrupted file**. Apple charges $99\u002Fyear for developer signing, so we provide these free workarounds instead.\n\n#### Method 1: Right-Click to Open\n\nThis is the simplest method and works for most users:\n\n1. **Locate the app** in your Applications folder (or wherever you placed it after downloading)\n2. **Right-click** (or Control+click) on \"Open Dronelog.app\"\n3. **Select \"Open\"** from the context menu\n4. **Click \"Open\"** in the dialog that appears\n\n#### Method 2: Terminal Command\n\nOpen **Terminal** (search for \"Terminal\" in Spotlight) and run:\n\nSimply type `xattr -cr ` (with a space at the end), then **drag and drop** the app onto the Terminal window - it will auto-fill the file path:\n\n```bash\nxattr -cr \u003Cdelete-this-part-after-cr-and-drag-and-drop-the-app-here>\n```\n\nThen press Enter and try opening the app again.\n\n## Usage\n\n1. **Import a Flight Log**: Click \"Browse Files\" or drag-and-drop a drone log file\n2. **Select a Flight**: Click on a flight in the sidebar\n3. **Analyze Data**: View telemetry charts and the 3D flight path on the map\n4. **Filter\u002FSearch\u002FSort**: Use date range (calendar or typed `YYYY-MM-DD` start\u002Fend + Go), drone\u002Fdevice, battery serial filters, search, and sorting\n5. **Overview Analytics**: Sidebar filters (date, drone, battery, duration) automatically apply to overview statistics\n5. **Export**: Use the Export dropdown in the stats bar (CSV\u002FJSON\u002FGPX\u002FKML)\n6. **Backup & Restore**: Use Settings → Backup Database to export, or Import Backup to restore\n7. **Configure Settings**: Set API key, theme, units, and view app data\u002Flog directories\n\n\n## Building from source (Linux users)\n\n### Prerequisites\n\n- [Rust](https:\u002F\u002Frustup.rs\u002F) (1.70+)\n- [Node.js](https:\u002F\u002Fnodejs.org\u002F) (18+)\n- [pnpm](https:\u002F\u002Fpnpm.io\u002F) or npm\n\n\n```bash\n# Clone the repository\ngit clone https:\u002F\u002Fgithub.com\u002Farpanghosh8453\u002Fopen-dronelog\ncd open-dronelog\n\n# Install frontend dependencies\nnpm install\n\n# Run in development mode\nnpm run tauri\n```\n\n## Docker deployment (Self-hosted Web)\n\nThe app can also be deployed as a self-hosted web application using Docker. This uses an Axum REST backend instead of Tauri IPC, with Nginx serving the frontend and proxying API requests.\n\n> [!TIP]\n> For hosted\u002Fserver deployments where you want a dedicated desktop\u002Fmobile uploader that watches a local folder and syncs logs to your hosted ODL server automatically, use the companion utility: [opendronelog-sync](https:\u002F\u002Fgithub.com\u002Farpanghosh8453\u002Fopendronelog-sync).\n\n\u003Cp align=\"center\">\n    \u003Cimg src=\"screenshots\u002FODL-sync-interface-dark.png\" alt=\"ODL Sync utility\" width=\"900\" \u002F>\n\u003C\u002Fp>\n\n> [!IMPORTANT]\n> This Web interface is primarily designed for Desktop or larger screen viewing. Basic mobile responsiveness is available but the full experience is best on larger screens.\n\n### Quick start (recommended)\n\nPull the pre-built image from GitHub Container Registry:\n\n```bash\ndocker pull ghcr.io\u002Farpanghosh8453\u002Fopen-dronelog:latest\n\ndocker run -d \\\n  -p 8080:80 \\\n  -v drone-data:\u002Fdata\u002Fdrone-logbook \\\n  --name open-dronelog \\\n  ghcr.io\u002Farpanghosh8453\u002Fopen-dronelog:latest\n```\n\nOr use docker-compose (uses the same pre-built image):\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Farpanghosh8453\u002Fopen-dronelog\ncd open-dronelog\ndocker compose up -d\n```\n\nThen open http:\u002F\u002Flocalhost:8080 in your browser.\n\n### Building locally from source\n\nIf you want to build the Docker image from source instead of pulling the pre-built one:\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Farpanghosh8453\u002Fopen-dronelog\ncd open-dronelog\ndocker compose -f docker-compose-build.yml up -d\n```\n\n> **Note:** The initial build takes ~10–15 minutes (Rust compilation). Subsequent rebuilds are much faster thanks to Docker layer caching.\n\n### Data persistence\n\nAll flight data (DuckDB database, cached decryption keys, and optionally uploaded log files) is stored in a Docker named volume (`drone-data`) mapped to `\u002Fdata\u002Fdrone-logbook` internally inside the container. Data persists across container restarts, image updates, and rebuilds. It is only removed if you explicitly delete the volume with `docker compose down -v`.\n\nWhen `KEEP_UPLOADED_FILES=true` is set, original log files are preserved in an `uploaded` subfolder using their SHA256 hash as filename for deduplication.\n\n### Environment variables\n\n| Variable        | Default                | Description                                                                 |\n|-----------------|------------------------|-----------------------------------------------------------------------------|\n| `DATA_DIR`      | `\u002Fdata\u002Fdrone-logbook`  | Database and config storage                                                 |\n| `RUST_LOG`      | `info`                 | Log level (debug, info, warn)                                               |\n| `DJI_API_KEY`   | (bundled default)      | Set your own for better rate limits. See [How to obtain your own DJI Developer API key](#how-to-obtain-your-own-dji-developer-api-key). |\n| `SYNC_LOGS_PATH`| (not set)              | Path to internal folder for automatic log import (e.g., `\u002Fsync-logs`)       |\n| `SYNC_INTERVAL` | (not set)              | Cron expression for scheduled sync (e.g., `0 0 *\u002F8 * * *` for every 8 hours)|\n| `KEEP_UPLOADED_FILES` | `true`      | When `true`, keeps copies of uploaded log files in the `uploaded` folder    |\n| `PROFILE_CREATION_PASS` | (not set) | Master password required for creating or deleting profiles in web\u002FDocker mode. When unset, anyone can create and delete profiles. |\n| `DEFAULT_PROFILE_PASSWORD` | (not set) | Optional one-time initializer for the `default` profile password at startup. If a default password already exists, it is not overwritten and startup logs that initialization was skipped. If unset or empty (and no existing password), the default profile remains unprotected. |\n| `SESSION_TTL_HOURS` | `24`           | Session token lifetime in hours. After expiry the user must re-authenticate. |\n\n### Automatic log sync (Docker)\n\nYou can mount a folder containing your drone flight logs and have the app automatically import new files:\n\n1. Uncomment the volume mount in `docker-compose.yml` and set the path to your logs folder:\n   ```yaml\n   - \u002Fpath\u002Fto\u002Fyour\u002Fdrone\u002Flogs:\u002Fsync-logs:ro\n   ```\n2. Uncomment the `SYNC_LOGS_PATH` environment variable:\n   ```yaml\n   - SYNC_LOGS_PATH=\u002Fsync-logs\n   ```\n3. (Optional) Enable scheduled automatic sync by setting a cron expression:\n   ```yaml\n   - SYNC_INTERVAL=0 0 *\u002F8 * * *\n   ```\n4. Restart the container.\n\n**Sync behavior:**\n- Without `SYNC_INTERVAL`: Manual sync only - use the \"Sync\" button in the web interface to import new files\n- With `SYNC_INTERVAL`: The server automatically syncs at the scheduled times, plus manual sync via the button\n\n**Common cron expressions:**\n| Expression | Schedule |\n|------------|----------|\n| `0 0 *\u002F8 * * *` | Every 8 hours |\n| `0 0 0 * * *` | Daily at midnight |\n| `0 0 *\u002F2 * * *` | Every 2 hours |\n| `0 30 6 * * *` | Daily at 6:30 AM |\n| `0 0 0 * * 0` | Weekly on Sunday at midnight |\n\nThe sync status and a manual \"Sync\" button will appear in the Import section when configured. During sync, the app shows file-by-file progress (current filename, X of Y counter) matching the desktop app experience.\n\n### Keep uploaded files (Docker)\n\nTo retain copies of uploaded log files in Docker, enable the `KEEP_UPLOADED_FILES` environment variable (`true` by default):\n\nUploaded files are stored in `\u002Fdata\u002Fdrone-logbook\u002Fuploaded` inside the container (part of the `drone-data` volume). You can adjust the external mount volume to have direct access.\n\n> [!TIP]\n> You can set the external host path same for both `\u002Fsync-logs` and `\u002Fdata\u002Fdrone-logbook\u002Fuploaded` to unify the log file collection. Make sure to remove the `:ro` part from the `\u002Fsync-logs` mount. I do it myself for convinience, but we recommend our users to keep them separate to make sure you accidentally don't lose any log files from the sync folder due to overwrite or any issue with the application. \n\n\n## Profiles and Password Protection\n\nOpen DroneLog supports multiple named profiles. Each profile is a fully isolated environment with its own database, config, uploads, and sync folder. Profiles are managed from the **profile selector** dropdown in the header.\n\n### Creating and switching profiles\n\n- Click the profile selector (top-left, next to the logo) and choose **New Profile**\n- Enter a name and, optionally, a password to protect it\n- Switch between profiles by selecting them from the dropdown\n- Each browser tab can be on a different profile (uses `sessionStorage` for isolation)\n\n### Password protection\n\n- Set, change, or remove a profile password from **Settings → Profile Password**\n- Protected profiles display a lock icon and prompt for a password when switching to them\n- Passwords are hashed with **argon2id** and verified server-side\n- In web\u002FDocker mode, a session token is issued after successful authentication and sent via the `X-Session` header\n- **Lockout policy**: 5 consecutive failed attempts lock the profile for 60 seconds\n\n### Master password (web\u002FDocker only)\n\nSet the `PROFILE_CREATION_PASS` environment variable to require a master password for creating and deleting profiles. This is useful for shared or publicly exposed instances.\n\n```yaml\nenvironment:\n  - PROFILE_CREATION_PASS=your-secret-master-password\n```\n\nWhen set, any create or delete operation must include the matching master password.\n\n## Security Warning (Web\u002FDocker)\n\n> [!WARNING]\n> **Open DroneLog is designed as a local-first application and does NOT include TLS\u002FHTTPS.** If you expose your instance to the internet, passwords and session tokens are transmitted in **plaintext** over HTTP.\n\n**Strongly recommended for internet-facing deployments:**\n\n1. **Use a reverse proxy** (e.g., Nginx, Caddy, Traefik) with TLS termination in front of the container\n2. **Do not expose port 80 directly** to the public internet without encryption\n3. Set `PROFILE_CREATION_PASS` to prevent unauthorized profile creation\n\n### Security limitations\n\n| Area | Limitation |\n|------|------------|\n| **Transport** | No built-in TLS - passwords and tokens sent in plaintext over HTTP |\n| **Session storage** | Sessions are in-memory only; a server restart invalidates all sessions |\n| **CSRF** | No CSRF token; relies on same-origin policy and the `X-Session` \u002F `X-Profile` custom headers |\n| **Brute force** | Argon2id provides strong hashing, but without TLS an attacker on the network can intercept tokens via MITM|\n\nFor production deployments, a reverse proxy with TLS is essential.\n\n## Configuration\n\n- **DJI API Key**: Stored locally in `config.json`. You can also provide it via `.env` or via the `settings` menu inside the application. The standalone app ships with a default key, but users should enter their own to avoid rate limits for log file decryption key fetching.\n- **External Parsers**: Optional parser plugins can be configured in `parsers.json` (app-data directory on desktop, and fixed path `\u002Fapp\u002Fplugins\u002Fparsers.json` in Docker\u002Fweb).\n- **Sync folder**: Set and use the `sync folder` (application interface for Desktop and ENV variable for docker) for seamless log file import and re-import with de-duplication. The files uploaded through drag and drop or browse are also collected by default in the `Uploaded` folder of application storage (customizable via settings options for Desktop and ENV variable for docker). You can use a common folder (essentially unifying the raw log files storage location), but that is not generally recommended to prevent any mishaps or file overwrites.  \n- **Database Location**: Stored in the platform-specific app data directory (e.g., AppData on Windows, Application Support on macOS, and local share on Linux). In Docker mode, data is stored in `\u002Fdata\u002Fdrone-logbook` (persisted via a Docker volume).\n- **API Guide**: Available API request paths and response structure is provided in the [API documentation](\u002Fdocs\u002Fapi-guide.md) page. \n- **Log Files**: App logs are written to the platform-specific log directory and surfaced in Settings. In Docker mode, logs are written to stdout.\n\n## Context Management\n\nThis project uses a modular, machine-parsable context system under `context\u002F` for agentic development.\n\n- Setup and workflow guide: [`docs\u002Fcontext-management.md`](docs\u002Fcontext-management.md)\n- Context root documentation: [`context\u002FREADME.md`](context\u002FREADME.md)\n\nCore commands:\n\n```bash\nnpm run context:build\nnpm run context:check\n```\n\n## Tech Stack\n\n### Backend (Rust)\n- **Tauri v2**: Desktop application framework (feature-gated behind `tauri-app`)\n- **Axum 0.7**: Web REST API server for Docker\u002Fweb deployment (feature-gated behind `web`)\n- **DuckDB**: Embedded analytical database (bundled, no installation required)\n- **dji-log-parser**: DJI flight log parsing library\n- **reverse_geocoder**: Offline city\u002Fcountry\u002Fcontinent geocoding (bundled GeoNames dataset)\n\n### Frontend (React)\n- **React 18 + TypeScript**: UI framework\n- **Vite**: Build tool\n- **Tailwind CSS**: Styling\n- **Zustand**: State management\n- **ECharts**: Telemetry charting\n- **react-map-gl + MapLibre**: Map visualization\n- **deck.gl**: 3D flight path overlay\n\n## Project Structure\n\n```\n├── src-tauri\u002F               # RUST BACKEND\n│   ├── src\u002F\n│   │   ├── main.rs          # Entry point (feature-gated: Tauri or Axum)\n│   │   ├── server.rs        # Axum REST API (web feature only)\n│   │   ├── database.rs      # DuckDB connection & schema\n│   │   ├── parser.rs        # dji-log-parser wrapper\n│   │   ├── models.rs        # Data structures\n│   │   ├── api.rs           # DJI API key fetching (if present)\n│   │   ├── profile_auth.rs  # Per-profile password hashing (argon2id)\n│   │   └── session_store.rs # Session token management (web only)\n│   ├── Cargo.toml           # Rust dependencies + feature flags\n│   └── tauri.conf.json      # App configuration\n│\n├── src\u002F                     # REACT FRONTEND\n│   ├── components\u002F\n│   │   ├── dashboard\u002F       # Layout components\n│   │   ├── charts\u002F          # ECharts components\n│   │   ├── map\u002F             # MapLibre components\n│   │   └── ui\u002F              # Reusable UI components (Select)\n│   ├── stores\u002F              # Zustand state\n│   ├── types\u002F               # TypeScript interfaces\n│   └── lib\u002F\n│       ├── utils.ts         # Utilities\n│       └── api.ts           # Backend adapter (invoke\u002Ffetch)\n│\n├── docker\u002F                  # DOCKER CONFIG\n│   ├── nginx.conf           # Nginx reverse proxy config\n│   └── entrypoint.sh        # Container startup script\n│\n├── Dockerfile               # Multi-stage build\n├── docker-compose.yml       # Deploy with pre-built GHCR image\n├── docker-compose-build.yml # Build from source locally\n│\n└── [App Data Directory]     # RUNTIME DATA\n    ├── flights.db           # DuckDB database (flights, telemetry, flight_tags, keychains)\n    ├── config.json          # API key and smart tags settings\n    └── keychains\u002F           # Cached decryption keys\n```\n\n## How to obtain your own DJI Developer API key\n\n> [!NOTE]\n> Unless you set up your own API key, the import process will be rate limited because you are using a shared key (provided by me) for the project alongside other users. You may see a 5 second `cooling down...` message during each new log file import when the default key is in use. \n\nI have shipped this project with my own API key to save you from some extra painful steps. If you are tech savvy please read the following guide to generate and use your own API key for this project. To acquire an apiKey, follow these steps:\n\n1. Visit [DJI Developer Technologies](https:\u002F\u002Fdeveloper.dji.com\u002Fuser) and log in. Create an account if you don't have one, this is different registration than your existing DJI account, but you can login with your existing account as well. \n2. Fill out personal info (for those who value privacy, I’m not sure if it needs to be real info)\n3. Click `CREATE APP`, choose `Open API` as the App Type, and provide the necessary details like `App Name`, `Category`, and `Description`.\n4. After creating the app, activate it through the link sent to your email.\n6. On your developer user page, find your app's details to retrieve the 31 character long alphanumeric ApiKey (labeled as the SDK key or APP key). Do not use the APP ID number, that is not your API key. \n\n\n## Contribution Guidelines\n\nWe welcome meaningful contributions to Open DroneLog! \n\n> [!IMPORTANT]\n>\n> Before implementing a new feature or fixing an existing bug, please **open an issue first** to discuss your idea with the maintainer to ensure it aligns with the project's scope and avoid any wasted effort on both ends.\n>\n> If you are using AI to help with your contribution, please disclose this in your PR and make sure you understand the code you are submitting. Please test the desired features throughly to ensure they work as expected and no existing features are broken.\n\nFor more details, see [CONTRIBUTING.md](CONTRIBUTING.md).\n\n### User Scripts\n\nLooking to extend functionality without waiting for official features? Check out the **[Discussions](https:\u002F\u002Fgithub.com\u002Farpanghosh8453\u002Fopen-dronelog\u002Fdiscussions)** channel with the `User-Script` tag, where community members share custom scripts, collaborate with developers, and find useful enhancements for custom workflow.\n\n### Custom Parsers\n\nOpen DroneLog supports optional external parser plugins for bringing in logs from additional formats beyond the built-in DJI\u002FLitchi\u002FAirdata support. You can configure parser definitions, map fields, and control how imported data is normalized.\n\nSee the guide: [custom parser documentation](\u002Fdocs\u002Fcustom_parsers.md).\n\n### Telemetry video overlay\n\nCheck out the [Open Drone Log telemetry overlay poject](https:\u002F\u002Fgithub.com\u002Farpanghosh8453\u002Fopendronelog-overlay) for details on how to export overlay telemetry data on your videos.\n\n\n## Socials and Support\n\n\u003Cp align=\"center\">\n    \u003Ca href=\"https:\u002F\u002Fdiscord.gg\u002FYKgKTmSm7B\">\n        \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FDiscord-Join%20Server-5865F2?style=for-the-badge&logo=discord\" alt=\"Discord\" height=\"48\"\u002F>\n    \u003C\u002Fa>\n    &nbsp;&nbsp;\n    \u003Ca href=\"https:\u002F\u002Fopendronelog.com\u002F#about\">\n        \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FContact-Get%20in%20Touch-0EA5E9?style=for-the-badge\" alt=\"Contact\" height=\"48\"\u002F>\n    \u003C\u002Fa>\n\u003C\u002Fp>\n\n## Love this project?\n\nI'm thrilled that you're using this dashboard. Your interest and engagement mean a lot to me! You can view and analyze more detailed DJI flight statistics with this setup than paying for any commertial solution.\n\n> [!NOTE]\n> I am a big drone enthusiast myself, and currently fundraising for a DJI Neo 2 drone for myself to test the new features of this budget friendly drone. If you'd like to support this goal, please consider [donating here](https:\u002F\u002Fko-fi.com\u002Farpandesign\u002Fgoal).\n\nMaintaining and improving this project takes a significant amount of my free time. Your support helps keep me motivated to add new features and work on similar projects that benefit the community.\n\nIf you find this project helpful, please consider:\n\n⭐ Starring this repository to show your support and spread the news!\n\n☕ Buying me a coffee if you'd like to contribute to its maintenance and future development.\n\n[![ko-fi](https:\u002F\u002Fko-fi.com\u002Fimg\u002Fgithubbutton_sm.svg)](https:\u002F\u002Fko-fi.com\u002Farpandesign)\n\n## License\n\nAGPL-3.0 - see [LICENSE](LICENSE) for details.\n\n## Declaration\n\nWhile some parts of this codebase were written with AI assistance (Claude Opus 4.6 and GPT-5.3-Codex) for convinience, the entirety of OpenDroneLog is thoughtfully architected, manually tested before every release, and managed by me in my free time. Long-term maintenance remain my priority with this project as it grows. See [`docs\u002Fcontext-management.md`](docs\u002Fcontext-management.md) for more details on how the context management works for this project. This schema is given for people interested in building on top of this project with agentic workflow.  \n\n## Acknowledgments\n\n- [dji-log-parser](https:\u002F\u002Fgithub.com\u002Flvauvillier\u002Fdji-log-parser) - DJI log parsing\n- [DuckDB](https:\u002F\u002Fduckdb.org\u002F) - Analytical database\n- [Tauri](https:\u002F\u002Ftauri.app\u002F) - Desktop app framework\n- [Esri World Imagery](https:\u002F\u002Fwww.esri.com\u002Fen-us\u002Farcgis\u002Fproducts\u002Farcgis-online\u002Fbasemaps) - Satellite map tiles\n- [OpenStreetMap](https:\u002F\u002Fwww.openstreetmap.org\u002Fcopyright) - Base map data and contributors\n- [OpenTopoMap](https:\u002F\u002Fopentopomap.org\u002Fabout) - Topographic map tiles and style (CC-BY-SA)\n\n## Sponsors\n\n\u003Ctable width=\"100%\" style=\"table-layout: fixed;\">\n    \u003Ctr>\n        \u003Cth width=\"33.33%\">\u003Cdiv align=\"center\">Platinum Supporters\u003C\u002Fdiv>\u003C\u002Fth>\n        \u003Cth width=\"33.33%\">\u003Cdiv align=\"center\">Gold Supporters\u003C\u002Fdiv>\u003C\u002Fth>\n        \u003Cth width=\"33.33%\">\u003Cdiv align=\"center\">Silver Supporters\u003C\u002Fdiv>\u003C\u002Fth>\n    \u003C\u002Ftr>\n    \u003Ctr>\n        \u003Ctd align=\"center\">\n            \u003Ca href=\"https:\u002F\u002Fopendronelog.zenithdronesolutions.com\u002F\">\n                \u003Cimg src=\"https:\u002F\u002Fopendronelog.com\u002Fsponsors\u002Fzenithdronesolutions_dark.png\" alt=\"Zenith Drone Solutions\" style=\"width: 160px; max-width: 100%; height: auto; margin: 8px 12px;\" \u002F>\n            \u003C\u002Fa>\n        \u003C\u002Ftd>\n        \u003Ctd align=\"center\">\u003Cem>-\u003C\u002Fem>\u003C\u002Ftd>\n        \u003Ctd align=\"center\">\u003Cem>-\u003C\u002Fem>\u003C\u002Ftd>\n    \u003C\u002Ftr>\n\u003C\u002Ftable>\n\n#### *Want to feature your logo and sponsor this project? [Get in touch](https:\u002F\u002Fopendronelog.com\u002F#sponsors).*\n\u003Cbr>\n\u003Ctable width=\"100%\" style=\"table-layout: fixed;\">\n    \u003Ctr>\n        \u003Ctd align=\"center\" width=\"64\">\n            \u003Ca href=\"https:\u002F\u002Fsignpath.io\">\n                \u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F34448643\" alt=\"SignPath\" width=\"40\" height=\"40\" \u002F>\n            \u003C\u002Fa>\n        \u003C\u002Ftd>\n        \u003Ctd>\n            Free code signing on Windows provided by \u003Ca href=\"https:\u002F\u002Fsignpath.io\">SignPath.io\u003C\u002Fa>, certificate by \u003Ca href=\"https:\u002F\u002Fsignpath.org\">SignPath Foundation\u003C\u002Fa>\n        \u003C\u002Ftd>\n    \u003C\u002Ftr>\n\u003C\u002Ftable>\n\n\n## Star History\n\n[![Star History Chart](https:\u002F\u002Fapi.star-history.com\u002Fsvg?repos=arpanghosh8453\u002Fopen-dronelog&type=date&legend=top-left)](https:\u002F\u002Fwww.star-history.com\u002F#arpanghosh8453\u002Fopen-dronelog&type=date&legend=top-left)\n","Open DroneLog 是一个高性能的无人机飞行日志分析工具，专为组织和分析DJI及Litchi格式的飞行记录而设计。该应用支持自定义飞行日志格式插件，并基于Tauri v2、DuckDB和React构建，确保了数据处理速度与界面响应性。用户可以选择将其作为桌面应用程序或通过Docker部署为Web应用来使用。此项目适用于需要对无人机飞行数据进行深度解析和可视化展示的专业场景，如航拍摄影、农业监测等，同时也适合个人爱好者进行自我分析。",2,"2026-06-11 03:51:49","high_star"]