You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
File exports (CSV, JSON, GPX, KML, HTML Report) are generated entirely on the frontend (client-side) using src/lib/exportUtils.ts and src/lib/htmlReportBuilder.ts. There are no dedicated backend API endpoints for exports; the frontend requests data via GET /api/flight_data and packages the files locally.
Telemetry and Data
Method
Endpoint / Command
Description
GET
/api/flight_data?flight_id={id}&max_points={n}
Get flight details with telemetry data. Returns FlightDataResponse containing flight metadata, telemetry arrays, track coordinates, and messages. max_points limits downsampling (default ~5000).
GET
/api/overview
Get aggregate statistics across all flights. Returns OverviewStats with totals for flights, distance, time, and max values.
Get full-charge capacity history for a specific battery. Returns array of [flight_id, start_time, max_capacity] tuples across all flights using that battery.
Tauri Commands (Desktop)
Command
Parameters
Description
get_flight_data
flight_id: i64, max_points: Option<usize>
Get flight telemetry
get_overview_stats
-
Get aggregate statistics
get_battery_full_capacity_history
battery_serial: String
Get capacity history for a battery
Telemetry Data Structure
The telemetry response includes these arrays (all keyed by index):
Field
Type
Description
time
i64[]
Timestamp in milliseconds since flight start
latitude
f64[]
GPS latitude
longitude
f64[]
GPS longitude
height
f64[]
Height above takeoff (meters)
vpsHeight
f64[]
Visual Positioning System height
altitude
f64[]
Absolute altitude (GPS)
speed
f64[]
Ground speed (m/s)
velocityX/Y/Z
f64[]
Velocity components
battery
i32[]
Battery percentage
batteryVoltage
f64[]
Battery voltage (V)
batteryTemp
f64[]
Battery temperature (°C)
cellVoltages
f64[][]
Per-cell voltages (array per frame)
pitch/roll/yaw
f64[]
Aircraft attitude (degrees)
rcSignal
i32[]
Remote controller signal strength
rcUplink/rcDownlink
i32[]
Signal quality metrics
satellites
i32[]
GPS satellite count
distanceToHome
f64[]
Distance from takeoff (meters)
isPhoto
bool[]
Photo capture state per frame
isVideo
bool[]
Video recording state per frame
batteryFullCapacity
f64[]
Battery design/full capacity (mAh)
batteryRemainedCapacity
f64[]
Remaining usable capacity (mAh)
Tags
Method
Endpoint / Command
Description
POST
/api/flights/tags/add
Add a manual tag to a flight. Body: { flight_id, tag }. Returns updated tag list.
POST
/api/flights/tags/remove
Remove a tag from a flight. Body: { flight_id, tag }. Returns updated tag list.
GET
/api/tags
Get all unique tags across all flights (both auto and manual).
POST
/api/tags/remove_auto
Remove all auto-generated tags from all flights. Preserves manual tags.
POST
/api/regenerate_smart_tags
Regenerate auto tags for all flights based on current settings.
Auto tags (teal): Generated on import based on flight characteristics
Night Flight, High Speed, Cold Battery, Heavy Load, Low Battery
High Altitude, Long Distance, Long Flight, Short Flight
Aggressive Flying, No GPS, M-SDK
Location tags: city, country, continent
Manual tags (violet): User-created tags
Settings
Method
Endpoint / Command
Description
GET
/api/settings/smart_tags
Check if smart tags are enabled. Returns boolean.
POST
/api/settings/smart_tags
Set smart tags enabled. Body: { enabled: boolean }
GET
/api/settings/enabled_tag_types
Get list of enabled smart tag types.
POST
/api/settings/enabled_tag_types
Set enabled tag types. Body: { types: string[] }
GET
/api/has_api_key
Check if DJI API key is configured.
GET
/api/api_key_type
Get API key type: "None", "Default", or "Personal".
POST
/api/set_api_key
Save DJI API key. Body: { api_key: string }
DELETE
/api/remove_api_key
Remove saved API key (reverts to default).
Tauri Commands (Desktop)
Command
Parameters
Description
get_smart_tags_enabled
-
Check smart tags setting
set_smart_tags_enabled
enabled: bool
Toggle smart tags
get_enabled_tag_types
-
Get enabled tag types
set_enabled_tag_types
types: Vec<String>
Set enabled tag types
has_api_key
-
Check API key presence
get_api_key_type
-
Get API key type
set_api_key
api_key: String
Save API key
remove_api_key
-
Remove API key
get_keep_upload_settings
-
Get keep uploaded files settings
set_keep_upload_settings
enabled: bool, folder_path: Option<String>
Set keep files settings
Profiles and Authentication
All data operations use the active profile. In web/Docker mode, the active profile is determined by the X-Profile and X-Session headers. In desktop mode, profiles are managed via Tauri IPC commands.
Profile Management
Method
Endpoint / Command
Description
GET
/api/profiles
List all profiles. Returns array of ProfileInfo objects with name and hasPassword fields.
POST
/api/profiles/switch
Create or switch to a profile. Body: { name, create?, password?, new_password?, master_password? }. Returns { name, session? }.
Lock the active profile (desktop auto-logout on close)
unlock_profile
password: String
Unlock a locked profile with the correct password
is_app_locked
-
Check if the current profile is locked (returns boolean)
Authentication Flow (Web/Docker)
Client sends X-Profile: <name> header with every request
If the profile is password-protected, the client must first authenticate via POST /api/profiles/switch with the correct password
On success, the server returns a session token in { session: "<token>" }
Client stores the token using a hybrid strategy: sessionStorage for per-tab isolation, plus localStorage as a persistent fallback so sessions survive browser restarts. Each tab reads its own sessionStorage first, falling back to localStorage for freshly opened tabs.
The token is sent as X-Session: <token> with all subsequent requests
The ProfileDb extractor validates the session token and routes the request to the correct profile database
Sessions expire after 24 hours (configurable via SESSION_TTL_HOURS env var); a new login is required after expiry
On a 401 response (expired or invalid token), the client automatically clears the stored token and displays the login overlay
Lockout Policy
5 consecutive failed password attempts lock the profile for 60 seconds
During lockout, all authentication attempts are rejected with a 429 Too Many Requests status
Response Types
interfaceProfileInfo{name: string;hasPassword: boolean;}interfaceSwitchProfileResponse{name: string;session?: string;// Present when profile is password-protected}
Backup and Restore
Method
Endpoint / Command
Description
GET
/api/backup
Download database backup as .backup file (gzip-compressed tar of Parquet files).
POST
/api/backup/restore
Upload and restore a backup file (multipart/form-data). Returns status message.
Tauri Commands (Desktop)
Command
Parameters
Description
export_backup
dest_path: String
Export backup to file path
import_backup
src_path: String
Import backup from file path
Backup Contents
The backup archive includes:
flights.parquet - Flight metadata
telemetry.parquet - All telemetry data
flight_tags.parquet - Tags (auto and manual)
keychains.parquet - Cached DJI encryption keys
flight_messages.parquet - Flight tips and warnings
interfaceFlightMessage{timestampMs: number;// Milliseconds from flight startmessageType: 'tip'|'warn'|'caution';message: string;}
FlightDataResponse
Returned by GET /api/flight_data and the get_flight_data Tauri command.
interfaceFlightDataResponse{flight: Flight;telemetry: TelemetryData;// Arrays of values per telemetry field, same lengthtrack: [number,number,number][];// [longitude, latitude, altitude] tuplesmessages?: FlightMessage[];}
TelemetryData contains parallel arrays (one value per telemetry frame) for fields such as time, latitude, longitude, height, speed, battery, batteryVoltage, batteryTemp, cellVoltages, pitch, roll, yaw, rcSignal, satellites, distanceToHome, and others. All arrays share the same length as time.
Error Handling
All endpoints return errors in this format:
Tauri: Errors thrown as strings via Result<T, String>
HTTP: Status codes with JSON error body { "error": "message" }
Common error scenarios:
404 - Flight not found
400 - Invalid parameters
500 - Database or parsing error
Rate Limits
DJI API key fetch: Subject to DJI API rate limits
Local operations: No limits (all processing is local)
Authentication
The application supports optional per-profile password protection:
Desktop: Passwords are verified locally via Tauri IPC commands. No session tokens are used.
Docker/Web: Password-protected profiles require authentication via POST /api/profiles/switch. A session token is issued and must be sent as X-Session header. Unprotected profiles work without authentication.
Headers (Web/Docker)
Header
Required
Description
X-Profile
Always
The active profile name (defaults to default)
X-Session
When profile is protected
Session token from successful authentication
Data Storage
All data is stored locally:
Desktop: ~/.local/share/com.drone-logbook.app/
Docker: /data/drone-logbook/ (persistent volume)
Password hashes: Stored in profile_auth.json (argon2id)
Sessions: In-memory only (lost on server restart)
The DJI API key (for log decryption) is stored in config.json and never sent anywhere except the official DJI API.
Security Limitations
Warning
Open DroneLog does not include built-in TLS. For internet-facing deployments, always use a reverse proxy with TLS termination.
Area
Limitation
Transport
No TLS — passwords and tokens are plaintext over HTTP
Sessions
In-memory; server restart invalidates all sessions
Rate limiting
Per-profile lockout only (5 attempts / 60s); no global IP-based limiting