### Describe the bug
<blockquote style="caret-color: rgb(0, 0, 0); color: rgb(0β¦, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><p><strong>Builds on:</strong><span class="Apple-converted-space"> </span>#24806 (Firmware builds manifest) and #25414 (tools: create firmware manifest)</p></blockquote><h2 style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">Summary</h2><p style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">This RFC extends the firmware manifest work from #24806 to support<span class="Apple-converted-space"> </span><strong>vehicle-type split builds</strong><span class="Apple-converted-space"> </span>and introduces a<span class="Apple-converted-space"> </span><strong>tiered stability classification system</strong>. With flash constraints forcing us to split builds by vehicle type, we need the infrastructure to deliver multiple firmware variants per board while maintaining backwards compatibility with existing QGC installations.</p><h2 style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">Motivation</h2><p style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">PX4 builds currently include support for all vehicle types (Multicopter, Fixed Wing, VTOL, Rover, Boat, Spacecraft, etc.) in a single binary. We have reached the limits of this approach:</p><ul style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><li><strong>Flash constraints</strong>: Many boards are constantly running out of flash, requiring creative workarounds to disable code just to make things fit</li><li><strong>Scaling issues</strong>: As we add more vehicle types (rovers, spacecraft), the "everything in one binary" approach is unsustainable</li><li><strong>Wasted space</strong>: Users flying a quadcopter don't need rover or spacecraft code in their firmware</li><li><strong>Rover situation</strong>: Users already need to download rover binaries manually since they're not in the default builds</li></ul><p style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">The solution is straightforward: split builds by vehicle type. We already have the capability to do this. The hard problem is<span class="Apple-converted-space"> </span><strong>artifact delivery and backwards compatibility</strong><span class="Apple-converted-space"> </span>with QGroundControl and other firmware consumers.</p><p style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">This RFC proposes building on top of the manifest work in #24806 and the<span class="Apple-converted-space"> </span><code>.px4</code><span class="Apple-converted-space"> </span>metadata extensions from #25414 to solve the delivery problem.</p><h2 style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">Current State</h2><h3 style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">.px4 File Format</h3><p style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">The<span class="Apple-converted-space"> </span><code>.px4</code><span class="Apple-converted-space"> </span>file is a JSON container with base64-encoded firmware:</p><pre style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><code class="language-json">{
"board_id": 9,
"magic": "PX4FWv1",
"description": "Firmware for the PX4FMUv2 board",
"image": "<base64-encoded-binary>",
"build_time": 1234567890,
"summary": "PX4FMUv2",
"version": "1.16.0",
"image_size": 1234567,
"git_identity": "abc123def",
"board_revision": 0
}
</code></pre><h3 style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">S3 Bucket Structure</h3><pre style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><code>px4-travis.s3.amazonaws.com/
βββ Firmware/
β βββ stable/
β β βββ <board>_default.px4
β βββ beta/
β β βββ <board>_default.px4
β βββ master/
β βββ <board>_default.px4
</code></pre><h3 style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">QGroundControl Integration</h3><p style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">QGC has hardcoded URLs to the S3 bucket and offers only:</p><ul style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><li>Latest stable</li><li>Latest beta</li><li>Daily/master builds</li></ul><p style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">QGC identifies the board via bootloader, then downloads the matching<span class="Apple-converted-space"> </span><code><board>_default.px4</code><span class="Apple-converted-space"> </span>file.</p><h2 style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">Proposed Changes</h2><h3 style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">1. Extended .px4 Metadata</h3><p style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">Building on #25414 which added<span class="Apple-converted-space"> </span><code>sha256sum</code>,<span class="Apple-converted-space"> </span><code>manifest</code>, and<span class="Apple-converted-space"> </span><code>manifest_version</code><span class="Apple-converted-space"> </span>to the<span class="Apple-converted-space"> </span><code>.px4</code><span class="Apple-converted-space"> </span>file, we extend the manifest object to support vehicle-type builds and stability tiers.</p><p style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><strong>Current state from #25414:</strong></p><pre style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><code class="language-json">{
"board_id": 9,
"magic": "PX4FWv1",
"description": "Firmware for the PX4FMUv2 board",
"image": "<base64-encoded-binary>",
"build_time": 1234567890,
"summary": "PX4FMUv2",
"version": "1.16.0",
"image_size": 1234567,
"git_identity": "abc123def",
"board_revision": 0,
"sha256sum": "abc123...",
"manifest_version": 1,
"manifest": {
"name": "PX4_FMU_V6X",
"target": "px4_fmu-v6x_default",
"manufacturer": "Auterion",
"hardware": {
"architecture": "arm",
"vendor_id": "0x3185",
"product_id": "0x0035",
"chip": "stm32h7",
"productstr": "PX4 FMU v6X.x"
}
}
}
</code></pre><p style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><strong>Proposed extensions (manifest_version: 2):</strong></p><pre style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><code class="language-json">{
"board_id": 50,
"magic": "PX4FWv1",
"description": "Firmware for the Pixhawk 6X - Multicopter",
"image": "<base64-encoded-binary>",
"build_time": 1234567890,
"summary": "Pixhawk 6X",
"version": "1.17.0",
"image_size": 1234567,
"git_identity": "abc123def456",
"board_revision": 0,
"sha256sum": "abc123...",
"manifest_version": 2,
"manifest": {
"name": "PX4_FMU_V6X",
"target": "px4_fmu-v6x_multicopter",
"manufacturer": "Holybro",
"manufacturer_url": "https://holybro.com/products/pixhawk-6x",
"hardware": {
"architecture": "arm",
"vendor_id": "0x3185",
"product_id": "0x0035",
"chip": "stm32h7",
"productstr": "PX4 FMU v6X.x"
},
"vehicle": {
"type": "multicopter",
"type_id": 2,
"variant": "default"
},
"stability": {
"tier": 1,
"tier_name": "production"
},
"release_notes_url": "https://docs.px4.io/main/en/releases/1.17",
"min_qgc_version": "4.4.0",
"deprecation_notice": null,
"user_message": null
}
}
</code></pre><h4 style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">New Manifest Fields</h4>
Field | Type | Description
-- | -- | --
manifest.vehicle.type | string | Human-readable vehicle type: multicopter, fixedwing, vtol, rover, boat, spacecraft, airship, balloon
manifest.vehicle.type_id | int | MAV_TYPE enum value for programmatic use
manifest.vehicle.variant | string | Build variant name (e.g., default, bootloader, debug)
manifest.stability.tier | int | 1 = Production, 2 = Beta/Testing, 3 = Experimental
manifest.stability.tier_name | string | Human-readable tier name
manifest.manufacturer_url | string | Link to product page
manifest.release_notes_url | string | Link to release notes
manifest.min_qgc_version | string | Minimum QGC version required
manifest.deprecation_notice | string/null | Message if board/variant is deprecated
manifest.user_message | string/null | Important info to display to user (e.g., "Experimental - test thoroughly before flight")
<p style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><strong>Examples:</strong></p><ul style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><li>Pixhawk 6X + Multicopter = Tier 1</li><li>Pixhawk 6X + Spacecraft = Tier 3</li><li>SomeCommunityBoard + Multicopter = Tier 3</li><li>ARK FPV + Rover = Tier 2 (assuming some testing but not production-ready)</li></ul><h3 style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">3. Firmware Manifest</h3><p style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">Introduce a manifest file that indexes all available firmware. This addresses the limitations of the current "flat S3 bucket" approach.</p><p style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><strong>Location:</strong><span class="Apple-converted-space"> </span><code>px4-travis.s3.amazonaws.com/firmware/manifest.json</code></p><pre style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><code class="language-json">{
"manifest_version": 1,
"generated_at": "2025-01-15T12:00:00Z",
"releases": {
"stable": {
"version": "1.17.0",
"release_date": "2025-01-10",
"release_notes": "https://docs.px4.io/main/en/releases/1.17",
"firmware": [
{
"board_id": 50,
"board_name": "holybro_pixhawk6x",
"vehicle_type": "multicopter",
"vehicle_type_id": 2,
"stability_tier": 1,
"url": "https://px4-travis.s3.amazonaws.com/firmware/stable/1.17.0/holybro_pixhawk6x_multicopter.px4",
"sha256": "abc123...",
"size_bytes": 1234567
},
{
"board_id": 50,
"board_name": "holybro_pixhawk6x",
"vehicle_type": "fixedwing",
"vehicle_type_id": 1,
"stability_tier": 1,
"url": "https://px4-travis.s3.amazonaws.com/firmware/stable/1.17.0/holybro_pixhawk6x_fixedwing.px4",
"sha256": "def456...",
"size_bytes": 1234000
},
{
"board_id": 50,
"board_name": "holybro_pixhawk6x",
"vehicle_type": "spacecraft",
"vehicle_type_id": 15,
"stability_tier": 3,
"url": "https://px4-travis.s3.amazonaws.com/firmware/stable/1.17.0/holybro_pixhawk6x_spacecraft.px4",
"sha256": "789ghi...",
"size_bytes": 1100000,
"user_message": "Experimental spacecraft support - not for crewed vehicles"
}
]
},
"beta": {
"version": "1.18.0-rc1",
"release_date": "2025-01-14",
"firmware": [...]
},
"main": {
"version": "1.18.0-dev",
"build_date": "2025-01-15",
"git_sha": "abc123def",
"firmware": [...]
}
},
"archive": {
"1.16.0": {
"release_date": "2024-06-15",
"firmware_base_url": "https://px4-travis.s3.amazonaws.com/firmware/archive/1.16.0/"
},
"1.15.4": {
"release_date": "2024-03-01",
"firmware_base_url": "https://px4-travis.s3.amazonaws.com/firmware/archive/1.15.4/"
}
}
}
</code></pre><h3 style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">4. Updated S3 Structure</h3><pre style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><code>px4-travis.s3.amazonaws.com/
βββ firmware/
β βββ manifest.json
β βββ stable/
β β βββ 1.17.0/
β β βββ holybro_pixhawk6x_multicopter.px4
β β βββ holybro_pixhawk6x_fixedwing.px4
β β βββ holybro_pixhawk6x_vtol.px4
β β βββ holybro_pixhawk6x_rover.px4
β β βββ holybro_pixhawk6x_spacecraft.px4
β β βββ ...
β βββ beta/
β β βββ 1.18.0-rc1/
β β βββ ...
β βββ main/
β β βββ 2025-01-15/
β β βββ ...
β βββ archive/
β βββ 1.16.0/
β β βββ ...
β βββ 1.15.4/
β βββ ...
βββ Firmware/ # Legacy location - maintain for backwards compatibility
βββ stable/
β βββ <board>_default.px4 # Symlinks or copies for legacy QGC
βββ beta/
βββ master/
</code></pre><h3 style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">5. Backwards Compatibility</h3><p style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><strong>Critical requirement:</strong><span class="Apple-converted-space"> </span>Existing QGC versions must continue to work.</p><p style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">Strategy:</p><ol style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><li>Maintain the legacy S3 structure with<span class="Apple-converted-space"> </span><code>_default</code><span class="Apple-converted-space"> </span>builds</li><li>The<span class="Apple-converted-space"> </span><code>_default</code><span class="Apple-converted-space"> </span>variant becomes the "most common" vehicle type for that board (typically multicopter)</li><li>Legacy QGC continues to work exactly as before</li><li>New QGC versions fetch the manifest and present vehicle type selection</li></ol><h3 style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">6. QGC Integration Flow</h3><h4 style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">Legacy Flow (existing QGC)</h4><ol style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><li>User connects board</li><li>QGC identifies board_id via bootloader</li><li>QGC downloads<span class="Apple-converted-space"> </span><code><board>_default.px4</code><span class="Apple-converted-space"> </span>from legacy S3 path</li><li>Flash firmware</li></ol><h4 style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">New Flow (updated QGC)</h4><ol style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><li>User connects board</li><li>QGC fetches<span class="Apple-converted-space"> </span><code>manifest.json</code></li><li>QGC identifies board_id via bootloader</li><li>QGC presents firmware options filtered by:<ul><li>Board ID match</li><li>Stability tier (default: show only Tier 1, with option to show others)</li></ul></li><li>User selects vehicle type</li><li>QGC shows warning for Tier 2/3 firmware</li><li>QGC downloads selected<span class="Apple-converted-space"> </span><code>.px4</code><span class="Apple-converted-space"> </span>file</li><li>QGC verifies sha256 checksum</li><li>Flash firmware</li></ol><h2 style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">Implementation Plan</h2><p style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">Building on the work from #25414, we can revive and extend that PR.</p><h3 style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">Phase 1: Metadata and Tooling</h3><ul style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><li>[ ] Revive #25414 and extend the manifest schema with vehicle/stability fields</li><li>[ ] Define JSON Schema for<span class="Apple-converted-space"> </span><code>.px4</code><span class="Apple-converted-space"> </span>manifest_version 2</li><li>[ ] Update<span class="Apple-converted-space"> </span><code>Tools/ci/generate_manifest_json.py</code><span class="Apple-converted-space"> </span>with vehicle type support</li><li>[ ] Define board/vehicle-type tier assignments in a config file (YAML or JSON)</li><li>[ ] Update<span class="Apple-converted-space"> </span><code>firmware.prototype</code><span class="Apple-converted-space"> </span>files with new fields</li><li>[ ] Local testing and validation</li></ul><h3 style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">Phase 2: Infrastructure</h3><ul style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><li>[ ] Set up new S3 directory structure alongside legacy paths</li><li>[ ] Update GitHub Actions release workflow to:<ul><li>Generate vehicle-type specific builds</li><li>Create manifest.json</li><li>Upload to new structure while maintaining legacy paths</li></ul></li><li>[ ] Add sha256 checksum verification to upload process</li></ul><h3 style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">Phase 3: Consumer Integration</h3><ul style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><li>[ ] Document manifest schema for consumers (publish JSON Schema)</li><li>[ ] File QGC issue for manifest support (reference QGC #2797)</li><li>[ ] Work with MAVSDK team on integration</li><li>[ ] Beta testing with development builds of QGC</li></ul><h3 style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">Phase 4: Rollout</h3><ul style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><li>[ ] Ship updated QGC with manifest support</li><li>[ ] Documentation updates (docs.px4.io)</li><li>[ ] Communication to hardware manufacturers (Holybro, ARK, CUAV, etc.)</li><li>[ ] Announce at dev call / Discord</li><li>[ ] Monitor for issues, iterate</li></ul><h2 style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">Open Questions</h2><ol style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><li><p><strong>Tier assignment process</strong>: Who decides tier assignments? Suggestion: maintainers for boards, vehicle-type leads for vehicle types, with defaults being Tier 3 until promoted.</p></li><li><p><strong>Tier naming</strong>: The names "Production/Beta/Experimental" are placeholders. Alternatives:</p><ul><li>Certified / Validated / Experimental</li><li>Green / Yellow / Red</li><li>A / B / C</li></ul></li><li><p><strong>Archive retention</strong>: How many old releases do we keep in the archive? Suggestion: last 3-4 stable releases.</p></li><li><p><strong>Board-level vs variant-level tiers</strong>: Should tiers be at the board level, vehicle-type level, or board+vehicle-type combination? Current proposal is board+vehicle-type.</p></li><li><p><strong>Manifest caching</strong>: Should QGC cache the manifest? For how long? Suggestion: 24-hour cache with manual refresh option.</p></li></ol><h2 style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">Related Issues / References</h2><ul style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><li>#24806 - Firmware builds manifest (original proposal)</li><li>#25414 - tools: create firmware manifest (initial implementation, closed by stale bot)</li><li><a href="https://github.com/mavlink/qgroundcontrol/issues/2797">QGC #2797</a><span class="Apple-converted-space"> </span>- Downloadable JSON file for firmware listings</li><li><a href="https://firmware.ap.ardupilot.org/manifest.json.gz">ArduPilot firmware manifest</a><span class="Apple-converted-space"> </span>- Prior art, already supported by QGC</li><li><a href="https://github.com/PX4/PX4-Autopilot/pull/19848">Generate Board Information metadata in CI #19848</a><span class="Apple-converted-space"> </span>by @junwoo091400</li></ul>