How MAVSDK Drone Show manages versions and releases
For most developers: The versioning is now fully automated! Just follow these simple steps:
Use Conventional Commits:
feat: add new trajectory smoother # Bumps minor version
fix: resolve modal centering issue # Bumps minor version
docs: update installation guide # No version bump
chore: cleanup deprecated files # No version bump
feat!: breaking API change # Bumps major version
Thatβs it! When you merge:
v3.8)Go to Actions β Automated Release β Run workflow:
3.9major / minorβββββββββββββββ
β Commits β Use conventional commit messages
ββββββββ¬βββββββ
β
β
βββββββββββββββ
β PR Created β Bot validates commits & predicts version
ββββββββ¬βββββββ
β
β
βββββββββββββββ
β Merge to β Triggers automated release workflow
β main β
ββββββββ¬βββββββ
β
β
βββββββββββββββ
β Automated β β’ Analyzes commits
β Release β β’ Bumps version (major/minor)
β Workflow β β’ Updates CHANGELOG.md
ββββββββ¬βββββββ β’ Syncs all files
β β’ Creates git tag
β β’ Creates GitHub Release
βββββββββββββββ
β Released β Version v3.8 is live!
βββββββββββββββ
GitHub Actions Workflows:
.github/workflows/release.yml - Automated release on merge to main.github/workflows/pr-validation.yml - PR validation and version predictionAutomation Scripts:
tools/bump_version.py - Smart version bumper (analyzes commits)tools/generate_release_notes.py - Auto-generates release notestools/validate_commits.py - Validates commit message formattools/version_sync.py - Synchronizes version across all filesAutomatically: When you push/merge to main branch
Manually: Actions β Automated Release β Run workflow (for manual override)
Note: Only runs if commits are found (skips doc-only changes)
<type>[optional scope][optional !]: <description>
[optional body]
[optional footer]
| Type | Version Impact | Example |
|---|---|---|
feat: |
β Minor (3.7 β 3.8) | feat: add trajectory editor |
fix: |
β Minor (3.7 β 3.8) | fix: resolve GPS timeout |
feat!: |
β Major (3.7 β 4.0) | feat!: breaking API change |
fix!: |
β Major (3.7 β 4.0) | fix!: breaking config format |
docs: |
β No change | docs: update README |
chore: |
β No change | chore: cleanup code |
refactor: |
β No change | refactor: restructure code |
test: |
β No change | test: add unit tests |
style: |
β No change | style: fix formatting |
perf: |
β No change | perf: optimize rendering |
feat(dashboard): add dark mode toggle
fix(api): resolve timeout issue
docs(install): update Docker instructions
Use ! suffix or BREAKING CHANGE: in commit body:
feat!: remove deprecated API endpoints
BREAKING CHANGE: The /v1/legacy endpoint has been removed.
Users must migrate to /v2/api.
β
feat: add swarm trajectory smoother
β
fix: resolve modal centering UX issue
β
docs: update installation guide with Docker
β
chore: cleanup deprecated files
β
feat(dashboard): implement real-time telemetry
β
fix(gcs): resolve connection timeout bug
β
refactor: restructure component hierarchy
β Updated files # Too vague, no type
β Fixed bug # No description
β feat added new feature # Missing colon
β FIX: Bug in code # Uppercase type
β feature: new thing # Wrong type name
PR validation automatically checks commit messages. Invalid commits will be flagged with suggestions.
Learn more: Conventional Commits
MDS uses simple two-part versioning: X.Y
X.YWe chose simple X.Y versioning because:
The project uses a VERSION file as the single source of truth:
/root/mavsdk_drone_show/VERSION
Contents: Just the version number (e.g., 3.6)
Why a VERSION file?
The version number must be synchronized across multiple locations:
Use the version_sync.py script to automatically update all locations:
python tools/version_sync.py
What it updates:
src/__init__.py): __version__ = "3.6"app/dashboard/drone-dashboard/package.json): "version": "3.6"app/dashboard/drone-dashboard/src/version.js): Auto-generated with version + git hashWhat it includes:
v3.6 (b4afd70)Note: With the new automated workflow, manual versioning is rarely needed. Use this only for:
Edit /root/mavsdk_drone_show/VERSION and change the version number:
echo "3.7" > VERSION
or edit manually in your text editor.
python tools/version_sync.py
Expected output:
============================================================
MAVSDK Drone Show - Version Synchronization
============================================================
π Current version: 3.7
π Updating src/__init__.py...
β
Updated to version 3.7
π Updating app/dashboard/drone-dashboard/package.json...
β
Updated to version 3.7
π Generating app/dashboard/drone-dashboard/src/version.js...
β
Generated: v3.7 (a1b2c3d) on main-candidate
============================================================
β
Version synchronization complete!
============================================================
Add a new section at the top of CHANGELOG.md:
## [3.7] - 2025-XX-XX
### Added
- New feature description
### Changed
- What changed
### Fixed
- Bug fixes
cd app/dashboard/drone-dashboard
npm run build
cd ../../..
This ensures the new version.js is bundled into the production build.
git add -A
git commit -m "chore: bump version to 3.7"
MDS uses a two-branch release workflow:
main-candidate β Development & testing
β
main β Stable releases only
Branches:
main-candidate branch3.7)python tools/version_sync.pygit commit -m "chore: prepare release 3.7"git checkout main
git merge main-candidate
git push origin main
v3.7main branchVersion 3.7v3.7) locks the version| Location | Format | Example | How Updated |
|---|---|---|---|
| Dashboard Sidebar | vX.Y (hash) |
v3.6 (b4afd70) |
Auto (from version.js) |
| README.md | X.Y |
3.6 |
Manual |
| CHANGELOG.md | [X.Y] |
[3.6] |
Manual |
| GitHub Releases | vX.Y |
v3.6 |
Manual (tag) |
| Location | Format | How Updated |
|---|---|---|
| VERSION file | X.Y |
Manual |
| src/__init__.py | __version__ = "X.Y" |
Auto (version_sync.py) |
| package.json | "version": "X.Y" |
Auto (version_sync.py) |
| version.js | Multiple formats | Auto (version_sync.py) |
The versioning system supports manual overrides when needed.
Simply edit the VERSION file and run the sync script:
echo "3.6-hotfix1" > VERSION
python tools/version_sync.py
Note: Non-standard version formats (with suffixes) work but may affect auto-detection in some tools.
β Always run version_sync.py after changing VERSION
β Update CHANGELOG.md with every version bump
β Test after version bump
β Use meaningful commit messages
chore: bump version to 3.7β Rebuild frontend after version changes
β Donβt edit version.js manually
β Donβt skip version_sync.py
β Donβt bump version for every commit
β Donβt merge to main without testing
β Donβt create GitHub releases from main-candidate
# Starting from version 3.6
# 1. Update VERSION file
echo "3.7" > VERSION
# 2. Sync versions
python tools/version_sync.py
# 3. Update CHANGELOG.md (manually edit)
# Add section for [3.7] with changes
# 4. Rebuild frontend
cd app/dashboard/drone-dashboard && npm run build && cd ../../..
# 5. Commit
git add -A
git commit -m "chore: bump version to 3.7 with new trajectory features"
# 6. Merge to main (when ready)
git checkout main
git merge main-candidate
git push origin main
# 7. Create GitHub release v3.7
# Starting from version 3.9
# 1. Major architectural change warrants 4.0
echo "4.0" > VERSION
# 2. Sync versions
python tools/version_sync.py
# 3. Update CHANGELOG.md
# Add [4.0] section with breaking changes
# 4. Rebuild frontend
cd app/dashboard/drone-dashboard && npm run build && cd ../../..
# 5. Commit
git add -A
git commit -m "chore: bump version to 4.0 - major architecture overhaul"
# 6. Follow release workflow
# Emergency fix on main branch
# 1. Create hotfix version
echo "3.6" > VERSION # Keep same version for hotfix
# 2. Make fix in code
# 3. Commit with fix
git add -A
git commit -m "fix: critical safety issue in failsafe module"
# 4. Can optionally create patch release
echo "3.7" > VERSION
python tools/version_sync.py
git add -A
git commit -m "chore: bump to 3.7 for hotfix release"
# 5. Create GitHub release v3.7
Run version_sync.py in validate-only mode:
python tools/version_sync.py --validate-only
Output:
β
Version format valid: 3.6
Would update:
- src/__init__.py
- app/dashboard/drone-dashboard/package.json
- app/dashboard/drone-dashboard/src/version.js
Run without --validate-only to apply changes
app/dashboard/drone-dashboard/src/version.jscd app/dashboard/drone-dashboard && npm run buildRun version_sync.py again:
python tools/version_sync.py
Ensure youβre in a git repository:
git status
Quick Reference:
python tools/version_sync.pyX.Y (simple two-part)Version Bump Checklist:
python tools/version_sync.pynpm run build)If you have questions about versioning or the release process:
Document Version: 1.0 (November 2025)
| Β© 2025 Alireza Ghaderi | Licensed under CC BY-NC-SA 4.0 |