From 4de6add3fea967e0daf4541ffc2c75861770be5a Mon Sep 17 00:00:00 2001 From: Matt Webb Date: Wed, 2 Sep 2026 15:25:55 +0100 Subject: [PATCH 1/3] build(examples): pin courier to the PR #26 branch to build-verify MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit courier#26 reworks MqttTransport (binary publish, topic-scoped binary receive, a client-lifetime lock) and bumps courier to 0.7.0-dev. Resident does not call any of that surface yet, so the question this pin answers is narrow: does the existing example matrix still compile and run against it. Every example that pulls courier is repointed at the PR head. This is deliberately temporary — the bare URL (or a 0.7.0 tag once courier publishes) goes back in when the PR lands, along with the `^0.7.0` constraint bump in library.json and idf_component.yml that the new courier minor will require. Co-Authored-By: Claude Opus 5 (1M context) --- .../device-minimal-resident/platformio.ini | 5 ++++- examples/adafruit-esp32-s2-feather/device/platformio.ini | 5 ++++- examples/espidf-basic/main/idf_component.yml | 7 ++++++- examples/m5stick-demo/device/platformio.ini | 5 ++++- examples/m5stick-voice/device/platformio.ini | 5 ++++- 5 files changed, 22 insertions(+), 5 deletions(-) diff --git a/examples/adafruit-esp32-s2-feather/device-minimal-resident/platformio.ini b/examples/adafruit-esp32-s2-feather/device-minimal-resident/platformio.ini index 2d2ed80..d992693 100644 --- a/examples/adafruit-esp32-s2-feather/device-minimal-resident/platformio.ini +++ b/examples/adafruit-esp32-s2-feather/device-minimal-resident/platformio.ini @@ -33,7 +33,10 @@ lib_ldf_mode = deep lib_deps = ; Resident: symlink to in-tree source. CI has no SSH key for this private repo. symlink://../../.. - git+https://github.com/inanimate-tech/courier.git + ; TEMPORARY: pinned to courier PR #26 (MQTT binary publish + topic-scoped + ; binary receive) to build-verify Resident against it ahead of the merge. + ; Revert to the bare URL (or a released tag) once that PR lands. + git+https://github.com/inanimate-tech/courier.git#genmon/mqtt-broker-hardening tzapu/WiFiManager@^2.0.17 bblanchon/ArduinoJson@^7.4.2 ropg/ezTime@^0.8.3 diff --git a/examples/adafruit-esp32-s2-feather/device/platformio.ini b/examples/adafruit-esp32-s2-feather/device/platformio.ini index 1d3830a..b6fdbec 100644 --- a/examples/adafruit-esp32-s2-feather/device/platformio.ini +++ b/examples/adafruit-esp32-s2-feather/device/platformio.ini @@ -35,7 +35,10 @@ lib_deps = ; PIO's auto-scan of our own lib/, so lib/drivers/FeatherTFTDrivers ; vanishes. Re-add it explicitly. symlink://lib/drivers - git+https://github.com/inanimate-tech/courier.git + ; TEMPORARY: pinned to courier PR #26 (MQTT binary publish + topic-scoped + ; binary receive) to build-verify Resident against it ahead of the merge. + ; Revert to the bare URL (or a released tag) once that PR lands. + git+https://github.com/inanimate-tech/courier.git#genmon/mqtt-broker-hardening tzapu/WiFiManager@^2.0.17 bblanchon/ArduinoJson@^7.4.2 ropg/ezTime@^0.8.3 diff --git a/examples/espidf-basic/main/idf_component.yml b/examples/espidf-basic/main/idf_component.yml index d14df3d..942fa67 100644 --- a/examples/espidf-basic/main/idf_component.yml +++ b/examples/espidf-basic/main/idf_component.yml @@ -14,8 +14,13 @@ dependencies: # Courier 0.6.0+ (receive parallels send: Client::onMessage delivers the # default transport only — required by resident's channel routing). + # + # TEMPORARY: pinned to courier PR #26 (MQTT binary publish + topic-scoped + # binary receive) to build-verify Resident against it ahead of the merge. + # Revert to `version: "^0.6.0"` (or a released tag) once that PR lands. inanimate/courier: - version: "^0.6.0" + git: https://github.com/inanimate-tech/courier.git + version: genmon/mqtt-broker-hardening bblanchon/arduinojson: version: "^7.0.0" diff --git a/examples/m5stick-demo/device/platformio.ini b/examples/m5stick-demo/device/platformio.ini index e07da25..1ad784b 100644 --- a/examples/m5stick-demo/device/platformio.ini +++ b/examples/m5stick-demo/device/platformio.ini @@ -10,7 +10,10 @@ lib_deps = ; PIO quirk: symlinking a parent that contains this project suppresses PIO's ; auto-scan of our own lib/, so lib/drivers/M5StickDrivers vanishes. Re-add it. symlink://lib/drivers - git+https://github.com/inanimate-tech/courier.git + ; TEMPORARY: pinned to courier PR #26 (MQTT binary publish + topic-scoped + ; binary receive) to build-verify Resident against it ahead of the merge. + ; Revert to the bare URL (or a released tag) once that PR lands. + git+https://github.com/inanimate-tech/courier.git#genmon/mqtt-broker-hardening tzapu/WiFiManager@^2.0.17 bblanchon/ArduinoJson@^7.4.2 ropg/ezTime@^0.8.3 diff --git a/examples/m5stick-voice/device/platformio.ini b/examples/m5stick-voice/device/platformio.ini index 14b5911..79c3276 100644 --- a/examples/m5stick-voice/device/platformio.ini +++ b/examples/m5stick-voice/device/platformio.ini @@ -10,7 +10,10 @@ lib_deps = ; Shared drivers live in the m5stick-demo example — reuse them here rather ; than keeping a second copy. symlink://../../m5stick-demo/device/lib/drivers - git+https://github.com/inanimate-tech/courier.git + ; TEMPORARY: pinned to courier PR #26 (MQTT binary publish + topic-scoped + ; binary receive) to build-verify Resident against it ahead of the merge. + ; Revert to the bare URL (or a released tag) once that PR lands. + git+https://github.com/inanimate-tech/courier.git#genmon/mqtt-broker-hardening tzapu/WiFiManager@^2.0.17 bblanchon/ArduinoJson@^7.4.2 ropg/ezTime@^0.8.3 From 4346c1c10a6f34e3aaa5b5bb6a204765a44835f3 Mon Sep 17 00:00:00 2001 From: Matt Webb Date: Wed, 2 Sep 2026 15:32:54 +0100 Subject: [PATCH 2/3] build(espidf-basic): route the courier pin through fetch-deps.sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A `git:` source on `inanimate/courier` in main/idf_component.yml is a trap: resident's own manifest also requires inanimate/courier, the solver resolves that to the registry 0.6.0, and the build goes green against a courier that is not the one under test. Verified by reading `source.type: service` out of dependencies.lock after a passing build. A local component under components/inanimate__courier overrides both the managed dependency and resident's transitive constraint, so fetch-deps.sh clones the PR branch there instead. courier ships a root CMakeLists.txt, so it drops in unmodified — no shim, unlike Esp32Lua. Co-Authored-By: Claude Opus 5 (1M context) --- examples/espidf-basic/main/idf_component.yml | 13 ++++---- examples/espidf-basic/tools/fetch-deps.sh | 31 ++++++++++++++++++++ 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/examples/espidf-basic/main/idf_component.yml b/examples/espidf-basic/main/idf_component.yml index 942fa67..6449fab 100644 --- a/examples/espidf-basic/main/idf_component.yml +++ b/examples/espidf-basic/main/idf_component.yml @@ -15,12 +15,15 @@ dependencies: # Courier 0.6.0+ (receive parallels send: Client::onMessage delivers the # default transport only — required by resident's channel routing). # - # TEMPORARY: pinned to courier PR #26 (MQTT binary publish + topic-scoped - # binary receive) to build-verify Resident against it ahead of the merge. - # Revert to `version: "^0.6.0"` (or a released tag) once that PR lands. + # TEMPORARY: tools/fetch-deps.sh currently clones courier PR #26 into + # components/inanimate__courier, which overrides this registry pin (a local + # component wins over a managed one, and over resident's own transitive + # `^0.6.0`). Putting `git:` here instead does NOT work — resident also + # requires inanimate/courier, and the solver picks the registry 0.6.0 while + # the build still goes green. Drop the override from fetch-deps.sh, and bump + # this to `^0.7.0`, once courier publishes. inanimate/courier: - git: https://github.com/inanimate-tech/courier.git - version: genmon/mqtt-broker-hardening + version: "^0.6.0" bblanchon/arduinojson: version: "^7.0.0" diff --git a/examples/espidf-basic/tools/fetch-deps.sh b/examples/espidf-basic/tools/fetch-deps.sh index a44ac6e..3a56c44 100755 --- a/examples/espidf-basic/tools/fetch-deps.sh +++ b/examples/espidf-basic/tools/fetch-deps.sh @@ -3,6 +3,9 @@ # examples/espidf-basic/components/. Esp32Lua is not on the ESP Component # Registry, so a pure `idf.py build` can't resolve it. # +# It also currently places courier there — see the COURIER block at the foot +# of this file. That part is temporary and goes away when courier 0.7.0 ships. +# # The upstream repo (https://github.com/Fischer-Simon/Esp32Lua) has no git # tags, only a main branch — so we pin by commit SHA via clone-then-checkout. # Bump the SHA below intentionally when picking up upstream changes. @@ -15,6 +18,9 @@ DIR="$(cd "$(dirname "$0")/.." && pwd)" COMPONENTS="$DIR/components" mkdir -p "$COMPONENTS" +COURIER_URL="https://github.com/inanimate-tech/courier.git" +COURIER_REF="genmon/mqtt-broker-hardening" + ESP32LUA_URL="https://github.com/Fischer-Simon/Esp32Lua.git" ESP32LUA_SHA="53c7d504ee266532e625145dc141d76692063145" @@ -43,4 +49,29 @@ list(FILTER LUA_SRCS EXCLUDE REGEX "lua\\.c$|luac\\.c$") idf_component_register(SRCS ${LUA_SRCS} INCLUDE_DIRS "src") EOF +# --- TEMPORARY: courier PR #26 ------------------------------------------- +# Build-verify this example against courier's unreleased MQTT work (binary +# publish, topic-scoped binary receive, client-lifetime lock) before it +# merges. courier ships a root CMakeLists.txt, so its checkout drops in as a +# component unmodified — no shim needed, unlike Esp32Lua above. +# +# It has to arrive as a LOCAL component, under the registry's `namespace__name` +# directory convention. A `git:` source in main/idf_component.yml does not +# work: resident's own manifest also requires inanimate/courier, and the +# solver resolves that to the registry 0.6.0 and builds green against the +# wrong courier. A local component overrides both. +# +# Delete this whole block, and bump main/idf_component.yml to `^0.7.0`, once +# courier publishes. +echo "Fetching courier @ $COURIER_REF into $COMPONENTS" +if [[ -d "$COMPONENTS/inanimate__courier" ]]; then + echo " inanimate__courier already present — skipping" +else + echo " fetching courier @ $COURIER_REF" + git clone --quiet --branch "$COURIER_REF" --depth 1 \ + "$COURIER_URL" "$COMPONENTS/inanimate__courier" + rm -rf "$COMPONENTS/inanimate__courier/.git" +fi +# --- end TEMPORARY ------------------------------------------------------- + echo "Done." From d80798113fce21aebcd5c369d6f01a9ae3ab344e Mon Sep 17 00:00:00 2001 From: Matt Webb Date: Wed, 2 Sep 2026 15:49:14 +0100 Subject: [PATCH 3/3] release: v0.8.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Courier 0.7.0 is on both registries, so the temporary PR-branch pins from the two preceding commits come out and the floor moves to ^0.7.0 in library.json, idf_component.yml and examples/espidf-basic. Resident calls none of courier 0.7.0's new surface. The bump is not optional anyway: a caret range on a 0.x version excludes the next minor, so while Resident pinned ^0.6.0 a consumer could not depend on Resident and courier 0.7.0 at once. It cuts the other way too — ^0.7.0 no longer admits 0.6.x, so this release forces consumers up. Called out in the changelog. Co-Authored-By: Claude Opus 5 (1M context) --- docs/changelog.md | 20 ++++++++++++ .../device-minimal-resident/platformio.ini | 5 +-- .../device/platformio.ini | 5 +-- examples/espidf-basic/main/idf_component.yml | 15 +++------ examples/espidf-basic/tools/fetch-deps.sh | 31 ------------------- examples/m5stick-demo/device/platformio.ini | 5 +-- examples/m5stick-voice/device/platformio.ini | 5 +-- idf_component.yml | 17 ++++++---- library.json | 4 +-- 9 files changed, 41 insertions(+), 66 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index 307575f..e56945f 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,5 +1,25 @@ # Changelog +## v0.8.1 + +Courier 0.7.0 support. No Resident source changes — this is the dependency +bump and the build verification behind it. + +- The Courier floor moves to `^0.7.0` in `library.json` and + `idf_component.yml`. Resident calls none of Courier 0.7.0's new surface + (MQTT binary publish, topic-scoped binary receive, a client-lifetime lock), + but a caret range on a `0.x` version excludes the next minor: while Resident + pinned `^0.6.0`, a consumer could not depend on Resident and Courier 0.7.0 + at the same time. **This forces consumers to Courier 0.7.0** — `^0.7.0` no + longer admits 0.6.x. +- `examples/espidf-basic` follows the same bump. +- Verified against Courier 0.7.0 ahead of its release: the full example matrix + (7 PlatformIO envs plus `espidf-basic` under ESP-IDF 5.5.3) builds, and + `m5stick-voice` runs on an M5StickS3 — drivers register, Wi-Fi joins, NTP + syncs, and the reconnect state machine backs off as before. + +--- + ## v0.8.0 Theme: the device speaks first. A device hello announces protocol, limits and diff --git a/examples/adafruit-esp32-s2-feather/device-minimal-resident/platformio.ini b/examples/adafruit-esp32-s2-feather/device-minimal-resident/platformio.ini index d992693..2d2ed80 100644 --- a/examples/adafruit-esp32-s2-feather/device-minimal-resident/platformio.ini +++ b/examples/adafruit-esp32-s2-feather/device-minimal-resident/platformio.ini @@ -33,10 +33,7 @@ lib_ldf_mode = deep lib_deps = ; Resident: symlink to in-tree source. CI has no SSH key for this private repo. symlink://../../.. - ; TEMPORARY: pinned to courier PR #26 (MQTT binary publish + topic-scoped - ; binary receive) to build-verify Resident against it ahead of the merge. - ; Revert to the bare URL (or a released tag) once that PR lands. - git+https://github.com/inanimate-tech/courier.git#genmon/mqtt-broker-hardening + git+https://github.com/inanimate-tech/courier.git tzapu/WiFiManager@^2.0.17 bblanchon/ArduinoJson@^7.4.2 ropg/ezTime@^0.8.3 diff --git a/examples/adafruit-esp32-s2-feather/device/platformio.ini b/examples/adafruit-esp32-s2-feather/device/platformio.ini index b6fdbec..1d3830a 100644 --- a/examples/adafruit-esp32-s2-feather/device/platformio.ini +++ b/examples/adafruit-esp32-s2-feather/device/platformio.ini @@ -35,10 +35,7 @@ lib_deps = ; PIO's auto-scan of our own lib/, so lib/drivers/FeatherTFTDrivers ; vanishes. Re-add it explicitly. symlink://lib/drivers - ; TEMPORARY: pinned to courier PR #26 (MQTT binary publish + topic-scoped - ; binary receive) to build-verify Resident against it ahead of the merge. - ; Revert to the bare URL (or a released tag) once that PR lands. - git+https://github.com/inanimate-tech/courier.git#genmon/mqtt-broker-hardening + git+https://github.com/inanimate-tech/courier.git tzapu/WiFiManager@^2.0.17 bblanchon/ArduinoJson@^7.4.2 ropg/ezTime@^0.8.3 diff --git a/examples/espidf-basic/main/idf_component.yml b/examples/espidf-basic/main/idf_component.yml index 6449fab..e7c66c5 100644 --- a/examples/espidf-basic/main/idf_component.yml +++ b/examples/espidf-basic/main/idf_component.yml @@ -12,18 +12,11 @@ dependencies: espressif/arduino-esp32: version: "^3.0.0" - # Courier 0.6.0+ (receive parallels send: Client::onMessage delivers the - # default transport only — required by resident's channel routing). - # - # TEMPORARY: tools/fetch-deps.sh currently clones courier PR #26 into - # components/inanimate__courier, which overrides this registry pin (a local - # component wins over a managed one, and over resident's own transitive - # `^0.6.0`). Putting `git:` here instead does NOT work — resident also - # requires inanimate/courier, and the solver picks the registry 0.6.0 while - # the build still goes green. Drop the override from fetch-deps.sh, and bump - # this to `^0.7.0`, once courier publishes. + # Courier 0.7.0+ (MQTT binary publish and topic-scoped binary receive; the + # 0.6.0 floor was receive-parallels-send, which resident's channel routing + # requires). inanimate/courier: - version: "^0.6.0" + version: "^0.7.0" bblanchon/arduinojson: version: "^7.0.0" diff --git a/examples/espidf-basic/tools/fetch-deps.sh b/examples/espidf-basic/tools/fetch-deps.sh index 3a56c44..a44ac6e 100755 --- a/examples/espidf-basic/tools/fetch-deps.sh +++ b/examples/espidf-basic/tools/fetch-deps.sh @@ -3,9 +3,6 @@ # examples/espidf-basic/components/. Esp32Lua is not on the ESP Component # Registry, so a pure `idf.py build` can't resolve it. # -# It also currently places courier there — see the COURIER block at the foot -# of this file. That part is temporary and goes away when courier 0.7.0 ships. -# # The upstream repo (https://github.com/Fischer-Simon/Esp32Lua) has no git # tags, only a main branch — so we pin by commit SHA via clone-then-checkout. # Bump the SHA below intentionally when picking up upstream changes. @@ -18,9 +15,6 @@ DIR="$(cd "$(dirname "$0")/.." && pwd)" COMPONENTS="$DIR/components" mkdir -p "$COMPONENTS" -COURIER_URL="https://github.com/inanimate-tech/courier.git" -COURIER_REF="genmon/mqtt-broker-hardening" - ESP32LUA_URL="https://github.com/Fischer-Simon/Esp32Lua.git" ESP32LUA_SHA="53c7d504ee266532e625145dc141d76692063145" @@ -49,29 +43,4 @@ list(FILTER LUA_SRCS EXCLUDE REGEX "lua\\.c$|luac\\.c$") idf_component_register(SRCS ${LUA_SRCS} INCLUDE_DIRS "src") EOF -# --- TEMPORARY: courier PR #26 ------------------------------------------- -# Build-verify this example against courier's unreleased MQTT work (binary -# publish, topic-scoped binary receive, client-lifetime lock) before it -# merges. courier ships a root CMakeLists.txt, so its checkout drops in as a -# component unmodified — no shim needed, unlike Esp32Lua above. -# -# It has to arrive as a LOCAL component, under the registry's `namespace__name` -# directory convention. A `git:` source in main/idf_component.yml does not -# work: resident's own manifest also requires inanimate/courier, and the -# solver resolves that to the registry 0.6.0 and builds green against the -# wrong courier. A local component overrides both. -# -# Delete this whole block, and bump main/idf_component.yml to `^0.7.0`, once -# courier publishes. -echo "Fetching courier @ $COURIER_REF into $COMPONENTS" -if [[ -d "$COMPONENTS/inanimate__courier" ]]; then - echo " inanimate__courier already present — skipping" -else - echo " fetching courier @ $COURIER_REF" - git clone --quiet --branch "$COURIER_REF" --depth 1 \ - "$COURIER_URL" "$COMPONENTS/inanimate__courier" - rm -rf "$COMPONENTS/inanimate__courier/.git" -fi -# --- end TEMPORARY ------------------------------------------------------- - echo "Done." diff --git a/examples/m5stick-demo/device/platformio.ini b/examples/m5stick-demo/device/platformio.ini index 1ad784b..e07da25 100644 --- a/examples/m5stick-demo/device/platformio.ini +++ b/examples/m5stick-demo/device/platformio.ini @@ -10,10 +10,7 @@ lib_deps = ; PIO quirk: symlinking a parent that contains this project suppresses PIO's ; auto-scan of our own lib/, so lib/drivers/M5StickDrivers vanishes. Re-add it. symlink://lib/drivers - ; TEMPORARY: pinned to courier PR #26 (MQTT binary publish + topic-scoped - ; binary receive) to build-verify Resident against it ahead of the merge. - ; Revert to the bare URL (or a released tag) once that PR lands. - git+https://github.com/inanimate-tech/courier.git#genmon/mqtt-broker-hardening + git+https://github.com/inanimate-tech/courier.git tzapu/WiFiManager@^2.0.17 bblanchon/ArduinoJson@^7.4.2 ropg/ezTime@^0.8.3 diff --git a/examples/m5stick-voice/device/platformio.ini b/examples/m5stick-voice/device/platformio.ini index 79c3276..14b5911 100644 --- a/examples/m5stick-voice/device/platformio.ini +++ b/examples/m5stick-voice/device/platformio.ini @@ -10,10 +10,7 @@ lib_deps = ; Shared drivers live in the m5stick-demo example — reuse them here rather ; than keeping a second copy. symlink://../../m5stick-demo/device/lib/drivers - ; TEMPORARY: pinned to courier PR #26 (MQTT binary publish + topic-scoped - ; binary receive) to build-verify Resident against it ahead of the merge. - ; Revert to the bare URL (or a released tag) once that PR lands. - git+https://github.com/inanimate-tech/courier.git#genmon/mqtt-broker-hardening + git+https://github.com/inanimate-tech/courier.git tzapu/WiFiManager@^2.0.17 bblanchon/ArduinoJson@^7.4.2 ropg/ezTime@^0.8.3 diff --git a/idf_component.yml b/idf_component.yml index 4c685d9..723dded 100644 --- a/idf_component.yml +++ b/idf_component.yml @@ -1,4 +1,4 @@ -version: "0.8.0" +version: "0.8.1" description: "Sandbox with hardware IO and hot reload for ESP32 devices" url: "https://github.com/inanimate-tech/resident" @@ -11,12 +11,17 @@ dependencies: # sync (robust HTTPS-Date fallback), larger receivable payloads on no-PSRAM # boards, and per-transport endpoint state (Resident sets the WS endpoint via # _ws.setEndpoint() inside onTransportsWillConnect(), which requires that - # surface). Pinned to ^0.6.0, which makes Client::onMessage deliver the - # default transport only (receive parallels send) — required so channel - # routing (Resident's `channel` envelope field) sees one coherent message - # stream per transport instead of everything funnelled through onMessage. + # surface) — and 0.6.0 made Client::onMessage deliver the default transport + # only (receive parallels send), so channel routing (Resident's `channel` + # envelope field) sees one coherent message stream per transport instead of + # everything funnelled through onMessage. + # + # The floor is ^0.7.0 because a caret range on 0.x excludes the next minor: + # while Resident pinned ^0.6.0, a consumer that wanted courier 0.7.0 (MQTT + # binary publish, topic-scoped binary receive) could not have both. Resident + # calls none of that new surface itself. inanimate/courier: - version: "^0.6.0" + version: "^0.7.0" bblanchon/arduinojson: version: "^7.0.0" # Esp32Lua is not on the ESP component registry. Consumers must provide it diff --git a/library.json b/library.json index b2ef0e9..1408246 100644 --- a/library.json +++ b/library.json @@ -1,6 +1,6 @@ { "name": "resident", - "version": "0.8.0", + "version": "0.8.1", "description": "Sandbox with hardware IO and hot reload for ESP32 devices", "keywords": "esp32, sandbox, iot, hot-reload", "repository": { @@ -17,7 +17,7 @@ "frameworks": ["arduino", "espidf"], "platforms": "espressif32", "dependencies": { - "inanimate/courier": "^0.6.0", + "inanimate/courier": "^0.7.0", "bblanchon/ArduinoJson": "^7.4.2", "fischer-simon/Esp32Lua": "^5.4.7" },