Releases: plastikman/DragonBreath
Release list
v1.1.5
Added
- Restore AUTO after a one-off manual override (#72). When the heater is in
AUTO and you do a one-off manual run, the device now returns to AUTO
"waiting" when that run ends — either a local timed run completing or the
on-device On button stopping it — instead of dropping to idle. An explicit
OFF (theoffcommand or the front-panel Power button) still stays off,
and any safety-driven off (fault, comms/lease timeout, panic) latches off and
never reverts. Only AUTO is resumed (not drying); the memory is RAM-only and
never persists across a reboot.
Install (no USB — recommended): on the stock Panda web UI ("Firmware Update"), upload dragonbreath-v1.1.5.bin. It installs as an app through the stock firmware's own OTA — the stock bootloader/partitions stay in place, so you can revert to Panda later over WiFi.
Update / revert (already on DragonBreath): upload dragonbreath-v1.1.5.bin via /fw; to return to Panda, upload your stock backup's app image via /fw.
Recovery only (USB): from a source checkout, python3 tools/flash.py (backs up stock first). The full/factory image is not published — build it locally if you need it.
Alpha/beta testers: if your unit was USB-flashed, restore your stock backup first, then install this via the stock updater — a stock-layout install can't be reached by OTA from a native-layout one.
| asset | purpose |
|---|---|
dragonbreath-v1.1.5.bin |
application image — install via stock's OTA, or update/revert via /fw |
manifest.json |
provenance (source SHA, ESP-IDF, vendored-core) + per-artifact SHA-256 |
SHA256SUMS.txt |
sha256sum -c SHA256SUMS.txt |
v1.1.4
Firmware-update UX restored on the shared setup surface, from dragon-core v0.7.0.
Added
- On-board firmware update, rebuilt. Uploading a
.binfrom/setupnow shows a live
progress % (was a static message); on success it polls the rebooting device and
returns to the dashboard. A dropped connection after upload reports "device rebooting,
verifying…" (the dashboard version is the real confirmation), and a configured control
token is re-prompted and retried. - Update check. DragonBreath advertises its release repo via
GET /api/v2/info, so the
UI can check GitHub for a newer stable release and show the version + expected SHA-256 +
download link (notify-then-manual-upload; never auto-flashes). Runs one request per load
on installed builds only — local/dev (-dirty/-g<hash>) builds skip it. - Setup password reveal. Show/Hide toggle on every setup password field (Wi-Fi,
fallback AP, product secrets) to catch a mistyped Wi-Fi password.
Changed
/fwand the Settings "Firmware update" button open setup and scroll to the
firmware/maintenance card (was buried at the bottom); the button is now the prominent
primary action.- Re-pinned
dragon-corev0.6.1 → v0.7.0.
Install (no USB — recommended): on the stock Panda web UI ("Firmware Update"), upload dragonbreath-v1.1.4.bin. It installs as an app through the stock firmware's own OTA — the stock bootloader/partitions stay in place, so you can revert to Panda later over WiFi.
Update / revert (already on DragonBreath): upload dragonbreath-v1.1.4.bin via /fw; to return to Panda, upload your stock backup's app image via /fw.
Recovery only (USB): from a source checkout, python3 tools/flash.py (backs up stock first). The full/factory image is not published — build it locally if you need it.
Alpha/beta testers: if your unit was USB-flashed, restore your stock backup first, then install this via the stock updater — a stock-layout install can't be reached by OTA from a native-layout one.
| asset | purpose |
|---|---|
dragonbreath-v1.1.4.bin |
application image — install via stock's OTA, or update/revert via /fw |
manifest.json |
provenance (source SHA, ESP-IDF, vendored-core) + per-artifact SHA-256 |
SHA256SUMS.txt |
sha256sum -c SHA256SUMS.txt |
v1.1.3
Shared-UI polish for the /setup and /console pages, from dragon-core v0.6.1.
Changed
/setupshows only the selected control source. Instead of listing every source
(Klipper/Moonraker, Bambu, HA, Klipper-MQTT) at once, the setup surface now reveals
only the section for the configuredctl_src— changing the selector reveals the
chosen source live. Home Assistant stays always-visible, since it carries over as
read-only telemetry alongside any control source. (Product sections tagged with
visible_when;dc_uihonors it — dragon-core #13.)- Re-pinned
dragon-corev0.6.0 → v0.6.1.
Fixed
/consoleno longer prompts for a control token on presence-only devices. The
page now sends a non-empty auth header by default, so a device with no control token
configured loads the log without a spurious prompt; only a real 403 prompts. (Core
dc_portal, dragon-core #13.)
Install (no USB — recommended): on the stock Panda web UI ("Firmware Update"), upload dragonbreath-v1.1.3.bin. It installs as an app through the stock firmware's own OTA — the stock bootloader/partitions stay in place, so you can revert to Panda later over WiFi.
Update / revert (already on DragonBreath): upload dragonbreath-v1.1.3.bin via /fw; to return to Panda, upload your stock backup's app image via /fw.
Recovery only (USB): from a source checkout, python3 tools/flash.py (backs up stock first). The full/factory image is not published — build it locally if you need it.
Alpha/beta testers: if your unit was USB-flashed, restore your stock backup first, then install this via the stock updater — a stock-layout install can't be reached by OTA from a native-layout one.
| asset | purpose |
|---|---|
dragonbreath-v1.1.3.bin |
application image — install via stock's OTA, or update/revert via /fw |
manifest.json |
provenance (source SHA, ESP-IDF, vendored-core) + per-artifact SHA-256 |
SHA256SUMS.txt |
sha256sum -c SHA256SUMS.txt |
v1.1.2
Restores the /diag and /console pages dropped in 1.1.1, now split by where they
belong. Diagnostics are device-specific, so /diag is product-local; the firmware
console is generic, so it moves to shared core.
Fixed
- Restored the device-specific
/diagpage (regressed in 1.1.1). The portal
extraction dropped it; it's re-registered by thedb_portaladapter — a browser-side
chamber/element(PTC)/SSR/fault logger with a live trend and CSV export over the
read-only SSE stream (/api/v2/events), no USB needed. - Restored
/consolevia shared core. The generic firmware-log page now comes from
dragon-coredc_portal(GET /console+GET /api/v1/system/console), picked up
by the re-pin below, instead of a product-local copy.
Changed
- Re-pinned
dragon-corev0.5.4 → v0.6.0. Brings the core/consolepage, plus
dc_uisetup-note fixes: the Custom profiles card states profiles apply only in AUTO
during a Bambu print, and the advanced max-temp "experts only" note points to the
built-in/diagpage instead of the USBtools/diag.py.
Install (no USB — recommended): on the stock Panda web UI ("Firmware Update"), upload dragonbreath-v1.1.2.bin. It installs as an app through the stock firmware's own OTA — the stock bootloader/partitions stay in place, so you can revert to Panda later over WiFi.
Update / revert (already on DragonBreath): upload dragonbreath-v1.1.2.bin via /fw; to return to Panda, upload your stock backup's app image via /fw.
Recovery only (USB): from a source checkout, python3 tools/flash.py (backs up stock first). The full/factory image is not published — build it locally if you need it.
Alpha/beta testers: if your unit was USB-flashed, restore your stock backup first, then install this via the stock updater — a stock-layout install can't be reached by OTA from a native-layout one.
| asset | purpose |
|---|---|
dragonbreath-v1.1.2.bin |
application image — install via stock's OTA, or update/revert via /fw |
manifest.json |
provenance (source SHA, ESP-IDF, vendored-core) + per-artifact SHA-256 |
SHA256SUMS.txt |
sha256sum -c SHA256SUMS.txt |
v1.1.1
Provisioning, recovery, and the setup surface move into dragon-core; DragonBreath
keeps a thin product adapter. No changes to NVS keys, API v2 routes, or OTA/recovery
behavior — an in-place OTA from 1.1.0.
Changed
- Provisioning and recovery moved to
dragon-core(dc_portal). The shared
component now owns the HTTP server, captive DNS, AP/STA setup SPA, Wi-Fi scan and
fallback-AP routes, logs, OTA upload, and factory-reset transport. DragonBreath's
localdb_portalis only a product adapter: it registers API v2, describes the
printer/controller fields, preserves configured secrets on blank submissions,
enforces the existing heater-off maintenance guard, restricts OTA images to
DragonBreath or stock Panda Breath, and erases the unchangedapp_nvsnamespace.
/setup,/fw,/console,/update, and the API v2 routes remain compatible. - Filament chamber zones are edited from the dashboard, not
/setup. The shared
setup surface describes the Bambu connection only (host, serial, access code); the
built-in and custom zone editors live in the dashboard's Filament zones and
Custom profiles cards, applying live throughGET/POST /api/v2/zones. The
1.1.0 note that zones apply only in AUTO during an active Bambu print now travels
with those cards indc_ui. - Inactive source configuration remains intact in shared setup.
dragon-core
v0.5.4makes Bambu and Moonraker configuration readable and editable before
their clients start, so the shared portal preserves every saved field when a
different control source is active. Product-local HA and Klipper-MQTT adapters
provide the same cold-boot behavior. - Shared setup UI reliability. Provisioning reads now use the same control-token
authentication and retry flow as mutations, so Wi-Fi scan results and saved setup
fields load correctly. The setup surface is fully opaque, product-defined setup
cards carry the same spacing as the built-in ones, and maintenance identity is
populated before optional product/capability handling. - Guarded ESP-IDF build entrypoint.
tools/idf-build.shpreflights the target
compiler and quarantines stale component-manager lock/cache state before build.
Install (no USB — recommended): on the stock Panda web UI ("Firmware Update"), upload dragonbreath-v1.1.1.bin. It installs as an app through the stock firmware's own OTA — the stock bootloader/partitions stay in place, so you can revert to Panda later over WiFi.
Update / revert (already on DragonBreath): upload dragonbreath-v1.1.1.bin via /fw; to return to Panda, upload your stock backup's app image via /fw.
Recovery only (USB): from a source checkout, python3 tools/flash.py (backs up stock first). The full/factory image is not published — build it locally if you need it.
Alpha/beta testers: if your unit was USB-flashed, restore your stock backup first, then install this via the stock updater — a stock-layout install can't be reached by OTA from a native-layout one.
| asset | purpose |
|---|---|
dragonbreath-v1.1.1.bin |
application image — install via stock's OTA, or update/revert via /fw |
manifest.json |
provenance (source SHA, ESP-IDF, vendored-core) + per-artifact SHA-256 |
SHA256SUMS.txt |
sha256sum -c SHA256SUMS.txt |
v1.1.0
Dragon-family shared-core split, plus two new Klipper/HA integration paths.
DragonBreath is now a thin product layer over the shared
dragon-core foundation (network,
control-source selector, Bambu client, the dashboard SPA, and the MQTT client),
keeping the board, sensors, heater, safety policy, and product UI local. Existing
NVS keys, API routes, and OTA/recovery behavior are unchanged. The MQTT-Klipper and
read-only-HA paths below are new in this release.
Added
- MQTT-only Klipper control source (RFC #66) — for locked/managed Klipper
installs that can't add thedragonbreath-klipperextra. The device is commanded
byprinter.cfgmacros over the printer's own Moonraker MQTT: a retained-aware
arming contract (heat engages only on a fresh coherentseqand a live
heartbeat; 3×5 s missed heartbeats force heat off + latchcomms_lost; never arms
from retained state), anM141shim (non-blockingM191alias), and a/setup
group.GET /km-configgenerates the exactmoonraker.conf+printer.cfg+
Mosquitto ACL from your settings. Mutually exclusive with the other control
sources. - Read-only Home Assistant telemetry alongside a control source. HA can now run
as a passive monitor concurrently with Bambu/Klipper — it auto-starts when an
HA broker is configured but HA isn't the selected source, publishing MQTT-Discovery
sensors (chamber/element temp, target, mode) without subscribing commands or taking
a control lease.
Fixed
- Release hygiene:
tools/package_release.shnow refuses to package when
main/dev_config.his present, preventing a developer's Wi-Fi/Moonraker credentials
from being compiled into a locally-built release image.
Docs
/setupnow notes that filament heating zones apply only in AUTO mode (Bambu,
during an active print).
Changed
- Shared core extracted to
dragon-core. The board-neutral event log,
control-source selector, Bambu client, Wi-Fi/provisioning service, and Moonraker
client now come from the pinneddragon-coredependency under the product-neutral
dc_*namespace. Existing NVS namespaces and keys are preserved across the move. - Dashboard UI extracted to
dragon-core(dc_ui). The STA-mode single-page
dashboard now comes from the pinneddc_uicomponent — a capability-aware, shared
Dragon-family SPA served as a reproducible embedded gzip — instead of a local
pb_portal/www/app.htmlgzipped at build time. The portal owns only the HTTP
response and routes;/setup,/fw, OTA/recovery, auth, and favicon stay
product-local. Adds an additiveGET /api/v2/info→uidescriptor
(schema/product/display_name) so the shared SPA adapts per product;
older firmware without it is handled by the SPA's compatibility fallback. - MQTT clients unified on a shared, hardened
dc_mqtt. The Bambu, Home
Assistant, and Klipper-MQTT clients now share one dragon-core MQTT client with
consistent locking and reconnect, replacing per-component esp-mqtt usage.
Install (no USB — recommended): on the stock Panda web UI ("Firmware Update"), upload dragonbreath-v1.1.0.bin. It installs as an app through the stock firmware's own OTA — the stock bootloader/partitions stay in place, so you can revert to Panda later over WiFi.
Update / revert (already on DragonBreath): upload dragonbreath-v1.1.0.bin via /fw; to return to Panda, upload your stock backup's app image via /fw.
Recovery only (USB): from a source checkout, python3 tools/flash.py (backs up stock first). The full/factory image is not published — build it locally if you need it.
Alpha/beta testers: if your unit was USB-flashed, restore your stock backup first, then install this via the stock updater — a stock-layout install can't be reached by OTA from a native-layout one.
| asset | purpose |
|---|---|
dragonbreath-v1.1.0.bin |
application image — install via stock's OTA, or update/revert via /fw |
manifest.json |
provenance (source SHA, ESP-IDF, vendored-core) + per-artifact SHA-256 |
SHA256SUMS.txt |
sha256sum -c SHA256SUMS.txt |
v1.1.0-rc1
Dragon-family shared-core split, plus two new Klipper/HA integration paths.
DragonBreath is now a thin product layer over the shared
dragon-core foundation (network,
control-source selector, Bambu client, the dashboard SPA, and the MQTT client),
keeping the board, sensors, heater, safety policy, and product UI local. Existing
NVS keys, API routes, and OTA/recovery behavior are unchanged. Pre-release for
community + hardware validation — the MQTT-Klipper and read-only-HA paths below are
new and not yet hardware-validated end-to-end.
Added
- MQTT-only Klipper control source (RFC #66) — for locked/managed Klipper
installs that can't add thedragonbreath-klipperextra. The device is commanded
byprinter.cfgmacros over the printer's own Moonraker MQTT: a retained-aware
arming contract (heat engages only on a fresh coherentseqand a live
heartbeat; 3×5 s missed heartbeats force heat off + latchcomms_lost; never arms
from retained state), anM141shim (non-blockingM191alias), and a/setup
group.GET /km-configgenerates the exactmoonraker.conf+printer.cfg+
Mosquitto ACL from your settings. Mutually exclusive with the other control
sources. New — pending validation on a real locked Klipper install. - Read-only Home Assistant telemetry alongside a control source. HA can now run
as a passive monitor concurrently with Bambu/Klipper — it auto-starts when an
HA broker is configured but HA isn't the selected source, publishing MQTT-Discovery
sensors (chamber/element temp, target, mode) without subscribing commands or taking
a control lease. New — pending concurrent HA + source hardware validation.
Changed
- Shared core extracted to
dragon-core. The board-neutral event log,
control-source selector, Bambu client, Wi-Fi/provisioning service, and Moonraker
client now come from the pinneddragon-coredependency under the product-neutral
dc_*namespace. Existing NVS namespaces and keys are preserved across the move. - Dashboard UI extracted to
dragon-core(dc_ui). The STA-mode single-page
dashboard now comes from the pinneddc_uicomponent — a capability-aware, shared
Dragon-family SPA served as a reproducible embedded gzip — instead of a local
pb_portal/www/app.htmlgzipped at build time. The portal owns only the HTTP
response and routes;/setup,/fw, OTA/recovery, auth, and favicon stay
product-local. Adds an additiveGET /api/v2/info→uidescriptor
(schema/product/display_name) so the shared SPA adapts per product;
older firmware without it is handled by the SPA's compatibility fallback. - MQTT clients unified on a shared, hardened
dc_mqtt. The Bambu, Home
Assistant, and Klipper-MQTT clients now share one dragon-core MQTT client with
consistent locking and reconnect, replacing per-component esp-mqtt usage.
Install (no USB — recommended): on the stock Panda web UI ("Firmware Update"), upload dragonbreath-v1.1.0-rc1.bin. It installs as an app through the stock firmware's own OTA — the stock bootloader/partitions stay in place, so you can revert to Panda later over WiFi.
Update / revert (already on DragonBreath): upload dragonbreath-v1.1.0-rc1.bin via /fw; to return to Panda, upload your stock backup's app image via /fw.
Recovery only (USB): from a source checkout, python3 tools/flash.py (backs up stock first). The full/factory image is not published — build it locally if you need it.
Alpha/beta testers: if your unit was USB-flashed, restore your stock backup first, then install this via the stock updater — a stock-layout install can't be reached by OTA from a native-layout one.
| asset | purpose |
|---|---|
dragonbreath-v1.1.0-rc1.bin |
application image — install via stock's OTA, or update/revert via /fw |
manifest.json |
provenance (source SHA, ESP-IDF, vendored-core) + per-artifact SHA-256 |
SHA256SUMS.txt |
sha256sum -c SHA256SUMS.txt |
v1.0.3-rc3
Install (no USB — recommended): on the stock Panda web UI ("Firmware Update"), upload dragonbreath-v1.0.3-rc3.bin. It installs as an app through the stock firmware's own OTA — the stock bootloader/partitions stay in place, so you can revert to Panda later over WiFi.
Update / revert (already on DragonBreath): upload dragonbreath-v1.0.3-rc3.bin via /fw; to return to Panda, upload your stock backup's app image via /fw.
Recovery only (USB): from a source checkout, python3 tools/flash.py (backs up stock first). The full/factory image is not published — build it locally if you need it.
Alpha/beta testers: if your unit was USB-flashed, restore your stock backup first, then install this via the stock updater — a stock-layout install can't be reached by OTA from a native-layout one.
| asset | purpose |
|---|---|
dragonbreath-v1.0.3-rc3.bin |
application image — install via stock's OTA, or update/revert via /fw |
manifest.json |
provenance (source SHA, ESP-IDF, vendored-core) + per-artifact SHA-256 |
SHA256SUMS.txt |
sha256sum -c SHA256SUMS.txt |
v1.0.3-rc2
Install (no USB — recommended): on the stock Panda web UI ("Firmware Update"), upload dragonbreath-v1.0.3-rc2.bin. It installs as an app through the stock firmware's own OTA — the stock bootloader/partitions stay in place, so you can revert to Panda later over WiFi.
Update / revert (already on DragonBreath): upload dragonbreath-v1.0.3-rc2.bin via /fw; to return to Panda, upload your stock backup's app image via /fw.
Recovery only (USB): from a source checkout, python3 tools/flash.py (backs up stock first). The full/factory image is not published — build it locally if you need it.
Alpha/beta testers: if your unit was USB-flashed, restore your stock backup first, then install this via the stock updater — a stock-layout install can't be reached by OTA from a native-layout one.
| asset | purpose |
|---|---|
dragonbreath-v1.0.3-rc2.bin |
application image — install via stock's OTA, or update/revert via /fw |
manifest.json |
provenance (source SHA, ESP-IDF, vendored-core) + per-artifact SHA-256 |
SHA256SUMS.txt |
sha256sum -c SHA256SUMS.txt |
v1.0.3-rc1
Install (no USB — recommended): on the stock Panda web UI ("Firmware Update"), upload dragonbreath-v1.0.3-rc1.bin. It installs as an app through the stock firmware's own OTA — the stock bootloader/partitions stay in place, so you can revert to Panda later over WiFi.
Update / revert (already on DragonBreath): upload dragonbreath-v1.0.3-rc1.bin via /fw; to return to Panda, upload your stock backup's app image via /fw.
Recovery only (USB): from a source checkout, python3 tools/flash.py (backs up stock first). The full/factory image is not published — build it locally if you need it.
Alpha/beta testers: if your unit was USB-flashed, restore your stock backup first, then install this via the stock updater — a stock-layout install can't be reached by OTA from a native-layout one.
| asset | purpose |
|---|---|
dragonbreath-v1.0.3-rc1.bin |
application image — install via stock's OTA, or update/revert via /fw |
manifest.json |
provenance (source SHA, ESP-IDF, vendored-core) + per-artifact SHA-256 |
SHA256SUMS.txt |
sha256sum -c SHA256SUMS.txt |