Development Roadmap
Last updated: 2026-07-30 · Current version: v2.15.0 · Status: Production Ready
This roadmap tracks the evolution of DJI Drone Metadata Embedder. The original Phase 1–6 plan (standalone Windows GUI, dependency bootstrap, packaging, release automation) is complete. This document now focuses on what's been shipped and the remaining, forward-looking work.
Before starting new work, run the baseline checks documented in
ci_baseline.md so you can distinguish real regressions
from pre-existing environmental gaps.
Shipped
Packaging & distribution
- Single-source versioning driven by
src/dji_metadata_embedder/__init__.pyandtools/sync_version.py. - Tag-driven releases for PyPI and the signed Windows installer/EXE (Authenticode from v1.23.0, Sigstore build attestations); the winget catalog update is a manual per-release dispatch.
- PyInstaller spec (
dji-embed.spec) and build script (tools/build_exe.py). - PowerShell bootstrap installer (
tools/bootstrap.ps1) for Windows users. uv-managed dependency set with a hash-verifieduv.lock.
CLI & processing
- Professional subcommand CLI (
dji-embed embed|check|convert|photomap|flightmap|serve|doctor|validate|verify-sun). - Core embedding pipeline (
core/processor.py) and SRT/MP4 drift validator (core/validator.py). - Parsers for Mini 3/4/5 Pro, Air 3/3S, Avata 2/360, Neo 2, Mavic 3
Enterprise, Matrice 300, and Phantom 4 RTK SRT formats, with golden
fixtures in
samples/andtests/fixtures/(full list:SRT_FORMATS.md). - Lenient parser mode with structured warnings, unit normalisation, and sanity checks for altitude/speed.
- CLI options for time offsets, resample strategy, GPS redaction (drop /
fuzz), and machine-readable JSON logs (
--log-json). - Telemetry export to JSON, GPX, and CSV.
- DAT flight-log parsing and per-frame embedding helpers.
Desktop app
- The Avalonia desktop app (
gui/, Windows installer) is the supported interactive surface: a single-window workspace with six modes (Embed, Flight map, Photo map, Convert, Verify, Setup), curated per-mode options with a CLI-transparency strip, an inline map preview pane, and persisted recents/window state. It is a thin frontend that shells out to the bundled CLI over the--progress jsonlcontract (seedesktop-app.mdand the GUI 2.0 spec (git history)). - The Flask-based
dji-embed uilocal web UI was removed in v2.0.0 after a deprecation cycle; a legacy Tk skeleton was removed earlier, in the 2026-06 cleanup pass.
Testing & CI
- Unit test suite (
tests/) covering parsing, embedding, DAT, redaction, sync, mapping/exports, and CLI smoke, plus a headless xunit.v3 suite for the desktop app (gui/DjiEmbed.Gui.Tests/) and a durable browser suite for generated maps. - End-to-end validation suite (
validation_tests/) for release verification when FFmpeg/ExifTool and real media are available. - GitHub Actions CI matrix for Windows + Linux on Python 3.10–3.12
(
.github/workflows/ci.yml). - Auto-changelog workflow from Conventional Commits
(
auto-changelog.yml, seedocs/CHANGELOG_AUTOMATION.md). - MkDocs documentation site built and deployed via
docs.yml.
Documentation
- User-facing:
README.md,docs/installation.md,docs/user_guide.md,docs/decision-table.md,docs/recipes.md,docs/troubleshooting.md. - Technical:
docs/SRT_FORMATS.md,docs/api.md,docs/external-tool-versions.md,docs/requirements-lock-policy.md,docs/validation_tests.md. - Contributor:
CONTRIBUTING.md,AGENTS.md,docs/RELEASE.md,docs/CHANGELOG_AUTOMATION.md, and this roadmap.
In progress / near-term
- Keep the baseline honest. When you touch parsing, FFmpeg command
assembly, or the GUI, re-run
uv run pytest -qand — if you have the binaries —validation_tests/run_all_tests.py, then updatedocs/ci_baseline.mdif expectations change. - Housekeeping follow-ups. See
HOUSEKEEPING.mdfor the current recommendations (branch hygiene, root-level scripts,.gitignore).
Future direction
- Additional DJI model coverage. Tracked in
#182:
survey Mini 5 Pro, Air 3S, Mavic 4 Pro, Neo, Avata 3, Mini 4K, Inspire 3,
Matrice 4 / M30 / M350 RTK, and FPV v2 for SRT documentation and sample
availability, then spin off per-model parser issues following the "Adding
Support for New DJI Models" checklist in
AGENTS.md. - Geospatial / mapping — SHIPPED. The three-phase plan in
the 2026-06-04 flight-path-mapping design (git history)
is complete: GeoJSON/KML track export (#215/#223,
dji-embed convert geojson|kml), the standalone HTML viewer (#221,convert html, Leaflet/OSM, no API key, v1.7.0), the interactive map panel in the web UI (#222, v1.9.0), and camera-footprint polygons (#215,--footprint, v1.9.0). Every renderer consumes the same GeoJSON. Remaining follow-ups are now tracked as issues: #265 oblique-trapezoid / view-frustum footprints — shipped: frames with gimbal pitch project as ground trapezoids (clamped near the horizon), nadir rectangles remain the attitude-less fallback; #266 terrain/DEM support via an optional[terrain]extra; #267 flight playback animation in the flightmap viewer — shipped (play/ pause, speed, scrubbing; per-pointtimes_sin the flight GeoJSON); and #268 a 3D terrain view (MapLibre--3dtemplate, deliberately parked). - Linux desktop build. Community-requested ( #360, .AppImage): Avalonia makes it feasible; needs a WebView alternative to WebView2, Linux tool provisioning, and AppImage CI. Interim answer on Linux is the CLI via pipx. Related: #361 publish an AUR package for Arch-family distros.
- Performance work on large batches. Candidates include parallel per-clip embedding and streaming SRT parsing for long flights.
- Winget catalog publish — live.
CallMarcus.DJIMetadataEmbedderis published in the public winget source (winget install CallMarcus.DJIMetadataEmbedder). The first-publisher submission microsoft/winget-pkgs#391183 (v1.11.0) merged 2026-07-06; version updates are filed manually per release viagh workflow run release-winget.yml -f version=X.Y.Z. The workflow staysworkflow_dispatch-only and the three hand-maintained manifests inwinget/remain in use. Remaining follow-up: fold the winget update step into the normal release cadence so the catalog stops lagging PyPI/EXE (awinget-releaserrewrite is one option, not required).
Explicitly out of scope
- Standalone Tk/Win32 GUI and the Flask web UI. Both are gone (Tk in
the 2026-06 cleanup, Flask
dji-embed uiin v2.0.0); the Avalonia desktop app is the only interactive surface, and no in-browser UI is planned. - Re-encoding pipelines. The project's contract is "no re-encode"; any feature that forces transcoding needs an RFC first.
Milestone history
- M1 – Stabilise & Version Cohesion (Aug 2025) – single-source versioning, tag-driven release flow.
- M2 – CI/Build Reliability (Aug 2025) – Windows + Linux matrix, CLI smoke tests, locked dependency set.
- M3 – Parser Hardening & CLI UX (Aug 2025) – golden fixtures, lenient parser, professional subcommand CLI, validate command, JSON logging.
- M4 – Docs, Samples & Release Hygiene (Aug 2025) – decision table, recipes, troubleshooting expansion, auto-changelog.
- v1.2 – UI & release polish (2026) – Flask-based
dji-embed ui, winget workflow parked, README install order reshuffled, Dependabot enabled. - v1.x – Maps, privacy & supply chain (2026-06/07) – photomap, flightmap,
360° pano viewer,
--redact/--popup-fields, winget catalog live, Authenticode signing + Sigstore attestations. - v2.0 – Desktop workspace app (2026-07) – Avalonia single-window app (GUI 2.0 milestones M1–M5): six modes, curated options with CLI transparency, inline preview, persisted state; Flask web UI removed.