Skip to content

Releases: plastikman/DragonBreath

v1.1.5

Choose a tag to compare

@github-actions github-actions released this 10 Aug 19:07

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 (the off command 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

Choose a tag to compare

@github-actions github-actions released this 10 Aug 18:27
227c79c

Firmware-update UX restored on the shared setup surface, from dragon-core v0.7.0.

Added

  • On-board firmware update, rebuilt. Uploading a .bin from /setup now 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

  • /fw and 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-core v0.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

Choose a tag to compare

@github-actions github-actions released this 10 Aug 15:37
53cab49

Shared-UI polish for the /setup and /console pages, from dragon-core v0.6.1.

Changed

  • /setup shows 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 configured ctl_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_ui honors it — dragon-core #13.)
  • Re-pinned dragon-core v0.6.0 → v0.6.1.

Fixed

  • /console no 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

Choose a tag to compare

@github-actions github-actions released this 10 Aug 14:50
5546496

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 /diag page (regressed in 1.1.1). The portal
    extraction dropped it; it's re-registered by the db_portal adapter — 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 /console via shared core. The generic firmware-log page now comes from
    dragon-core dc_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-core v0.5.4 → v0.6.0. Brings the core /console page, plus
    dc_ui setup-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 /diag page instead of the USB tools/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

Choose a tag to compare

@github-actions github-actions released this 09 Aug 17:08

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
    local db_portal is 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 unchanged app_nvs namespace.
    /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 through GET/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 in dc_ui.
  • Inactive source configuration remains intact in shared setup. dragon-core
    v0.5.4 makes 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.sh preflights 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

Choose a tag to compare

@github-actions github-actions released this 09 Aug 14:00

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 the dragonbreath-klipper extra. The device is commanded
    by printer.cfg macros over the printer's own Moonraker MQTT: a retained-aware
    arming
    contract (heat engages only on a fresh coherent seq and a live
    heartbeat; 3×5 s missed heartbeats force heat off + latch comms_lost; never arms
    from retained state), an M141 shim (non-blocking M191 alias), and a /setup
    group. GET /km-config generates the exact moonraker.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.sh now refuses to package when
    main/dev_config.h is present, preventing a developer's Wi-Fi/Moonraker credentials
    from being compiled into a locally-built release image.

Docs

  • /setup now 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 pinned dragon-core dependency 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 pinned dc_ui component — a capability-aware, shared
    Dragon-family SPA served as a reproducible embedded gzip — instead of a local
    pb_portal/www/app.html gzipped at build time. The portal owns only the HTTP
    response and routes; /setup, /fw, OTA/recovery, auth, and favicon stay
    product-local. Adds an additive GET /api/v2/infoui descriptor
    (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

v1.1.0-rc1 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 09 Aug 00:40

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 the dragonbreath-klipper extra. The device is commanded
    by printer.cfg macros over the printer's own Moonraker MQTT: a retained-aware
    arming
    contract (heat engages only on a fresh coherent seq and a live
    heartbeat; 3×5 s missed heartbeats force heat off + latch comms_lost; never arms
    from retained state), an M141 shim (non-blocking M191 alias), and a /setup
    group. GET /km-config generates the exact moonraker.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 pinned dragon-core dependency 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 pinned dc_ui component — a capability-aware, shared
    Dragon-family SPA served as a reproducible embedded gzip — instead of a local
    pb_portal/www/app.html gzipped at build time. The portal owns only the HTTP
    response and routes; /setup, /fw, OTA/recovery, auth, and favicon stay
    product-local. Adds an additive GET /api/v2/infoui descriptor
    (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

v1.0.3-rc3 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 03 Aug 19:42

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

v1.0.3-rc2 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 03 Aug 18:59

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

v1.0.3-rc1 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 03 Aug 16:35

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