Skip to content

Commit 0858c95

Browse files
committed
[docs] publish qualified firmware 0.6.0 status
Signed-off-by: Viwat Vchirawongkwin <viwat.v@chula.ac.th>
1 parent 2d85bd8 commit 0858c95

2 files changed

Lines changed: 156 additions & 83 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 92 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -5,61 +5,105 @@ are released independently from this monorepo.
55

66
## Unreleased
77

8-
- Admitted the characterized Waveshare single-page largest-block transient
9-
with a fixed `98304` heap floor in a second-replacement qualification era
10-
(ADR-0039), with byte-identity-conditioned carry-forward of already-passed
11-
physical evidence; no firmware bytes changed.
12-
- Established `PyBLE-dev/PyBLE` as the canonical public monorepo.
13-
- Added public contributor, security, architecture, protocol, and validation
14-
documentation.
8+
These app, website, and repository-source changes do not designate a new app
9+
or firmware release. The qualified firmware release remains v0.6.0, built from
10+
its annotated tag rather than from the newer branch tip.
1511

16-
### App and website source
12+
### App source
1713

1814
- Added fail-closed Android upload signing and signed App Bundle CI contracts,
19-
plus the invited Google Play internal-test link and QR alongside TestFlight
20-
on `pyble.dev`.
21-
- Added an independent `/privacy` policy and stable `/app` landing page.
15+
while retaining invited Google Play testing as distinct from a public Play
16+
release.
2217
- Extended every Blocks GPIO surface to accept explicit bounded MicroPython
2318
pin names such as `LED` while preserving numeric GPIOs, offline operation,
2419
and the app's board-neutral architecture.
20+
- Hardened the Android WebView integration path so a named-pin edit made after
21+
preview is re-read from the live field before generated-code assertions.
22+
23+
### Website and repository source
24+
25+
- Established `PyBLE-dev/PyBLE` as the canonical public monorepo and added
26+
contributor, security, architecture, protocol, and validation documentation.
27+
- Added an independent `/privacy` policy and stable `/app` landing page, with
28+
invited Android testing and public TestFlight presented as distinct channels.
2529
- Patched the remediable website PostCSS/Nanoid dependency chain and bounded
2630
the remaining build-only `image-size` advisory behind a static-deploy and
2731
no-metadata-image-route contract until an upstream fix exists.
32+
- Made publication CI fetch the complete source history required by
33+
ancestry-routed firmware gates, and made the RP2 runtime-closure fixture
34+
hermetic instead of depending on a retained local archive.
35+
- Made RP2 builds report a missing or mismatched pinned Arm toolchain before
36+
evaluating the nested source graph, while preserving fail-closed source
37+
validation once the compiler is present.
38+
- Corrected two C3 ADR links for the public repository layout.
39+
40+
## Website deployment — 2026-08-22
41+
42+
- Activated the validated v0.6.0 release descriptor on `pyble.dev`, so the
43+
home, flash, and support surfaces derive their current five-profile status
44+
from the selected immutable release instead of hard-coded board copy.
45+
- Kept the exact-board Waveshare presentation separate from the lean generic
46+
S3 profile and retained the real-hardware image on the flash page.
47+
- Published the firmware release notes, checksums, recovery instructions,
48+
license inventory, and exact profile artifacts under `/firmware/v0.6.0/`.
49+
50+
## Firmware 0.6.0 — 2026-08-21
51+
52+
_Firmware release only. The app is versioned independently and remains
53+
`0.1.0+2` in this source tree._
54+
55+
- Published and deployed the qualified five-profile release at
56+
[pyble.dev/flash](https://pyble.dev/flash): `esp32-4mb`,
57+
`esp32-s3-n16r8`, `waveshare-esp32-s3-lcd-147b`, `esp32-c3-4mb`, and
58+
`rpi-pico2-w`.
59+
- Completed the exact-byte qualification matrix: all five HIL rows passed,
60+
including install and recovery, PBLE/1 workflows, run/stop and console
61+
behavior, filesystem reliability, fixed resource and timing limits, and app
62+
operation on iPadOS and Android.
63+
- Provisioned the four ESP profiles through ESP Web Serial. Pico 2 W uses a
64+
verified UF2 download followed by a manual BOOTSEL copy; it is not a Web
65+
Serial target.
66+
- Added qualified ESP32-C3 revision v0.3-or-newer support for the exact 4 MiB
67+
profile and qualified Raspberry Pi Pico 2 W support through the portable
68+
frozen-Python RP2 agent.
69+
- Kept `esp32-s3-n16r8` lean and board-neutral while giving the exact
70+
Waveshare B-version profile its ST7789 runtime and fresh-install splash with
71+
persistent disable.
72+
- Hardened response delivery, VM and run lifecycle, STOP and soft-reboot
73+
ordering, filesystem concurrency, and console flow across the ESP and RP2
74+
ports.
75+
- Bound the immutable release to annotated tag `firmware-v0.6.0`, PyBLE source
76+
`0c7230d6708797c241160ba71fbd37e6b22f180a`, MicroPython v1.28.0 and
77+
ESP-IDF v5.5.1, agent `0.6.0`, protocol `PBLE/1`, and zero upstream patches.
78+
- Published schema-4 metadata with SHA-256
79+
`c2940281a14feddb55c48de15ac18087e9317d1b7130e514fab5a209b046a1e6`
80+
and independently hashed artifacts, notices, release notes, and recovery
81+
instructions.
82+
- Admitted the characterized Waveshare single-page largest-block transient
83+
with the fixed `98304` heap floor defined by ADR-0039; firmware bytes stayed
84+
unchanged while the final qualification policy was corrected.
2885

29-
### Firmware 0.6.0 source integration
30-
31-
- Abandoned the unpublished local `firmware-v0.6.0` candidate at `719b211…`
32-
after the C3 stateless-PHY/post-OI receipt and fixed performance-contract
33-
amendments. Version 0.6.0 and its atomic five-profile scope are retained for
34-
a source-era-routed replacement; all candidate/HIL gates restart before any
35-
tag is pushed or release is published.
36-
- Added the `rpi-pico2-w` portable frozen-Python agent port, its isolated RP2
37-
build plane, and pinned Arm GNU toolchain input alongside the four existing
38-
ESP build variants.
39-
- Recorded successful pre-GP2 Pico 2 W BLE/app operation and physical onboard
40-
LED actuation as engineering evidence. Pico remains absent from public
41-
release metadata and the web installer until its complete GP2 matrix passes.
42-
- Reserved a new source identity instead of reusing the earlier `0.5.1`
43-
Waveshare/ESP candidate version; all publishable artifacts require fresh
44-
version-bound build, provenance, resource, recovery, and HIL evidence.
45-
46-
### Firmware 0.5.1 source candidate — 2026-08-03
47-
48-
- Defined the independently selected `waveshare-esp32-s3-lcd-147b`
49-
provisioning profile for the exact ESP32-S3-LCD-1.47B B-version board with
50-
16 MiB flash and 8 MiB Octal PSRAM.
51-
- Specified its exact-board-only ST7789 MicroPython runtime, bounded boot
52-
companion, app QR, persistent splash opt-out, and dedicated display/HIL
53-
qualification contract. An erased exact-board installation defaults the
54-
splash on; stored `0` remains an explicit opt-out.
55-
- Kept `esp32-s3-n16r8` lean and board-neutral: its image contract contains no
56-
Waveshare pin map, TFT driver, companion, QR, splash hook, or display-only
57-
readiness seam.
58-
- Expanded the candidate source/build contract to four variants over the three
59-
initial ESP32-family targets. No new exact bytes or public profile are
60-
qualified by this documentation change; reproducible builds, license audit,
61-
and independent final-candidate HIL remain required for all three candidate
62-
release profiles, while ESP32-C3 remains deferred.
86+
## Firmware 0.5.1 — 2026-08-03
87+
88+
- Published the qualified three-profile release for `esp32-4mb`, the lean
89+
`esp32-s3-n16r8`, and the separate exact-board
90+
`waveshare-esp32-s3-lcd-147b` profile.
91+
- Made the Waveshare PyBLE splash the fresh-install default while preserving a
92+
stored opt-out; kept its ST7789 runtime and board pin map out of the generic
93+
S3 image.
94+
- Bound the release to annotated tag `firmware-v0.5.1`, source
95+
`bab472131f0a71c5c4a7efc689eab266189a1896`, MicroPython v1.28.0, and
96+
ESP-IDF v5.5.1. ESP32-C3 and Pico 2 W were not included in this release.
97+
98+
## Firmware 0.5.0 — 2026-08-03
99+
100+
- Published the first qualified three-profile bundle, adding the exact
101+
Waveshare ESP32-S3-LCD-1.47B B-version profile alongside the two generic ESP
102+
profiles.
103+
- Added its isolated ST7789 MicroPython runtime and opt-in splash without
104+
adding board-specific display code to `esp32-s3-n16r8`.
105+
- Bound the release to annotated tag `firmware-v0.5.0` and source
106+
`4ac661e610a00207246bc9e9863d96085e77854f`.
63107

64108
## Firmware 0.4.2 — 2026-07-31
65109

@@ -95,7 +139,7 @@ are released independently from this monorepo.
95139

96140
The pre-publication development history is intentionally archived outside this
97141
repository. Public development starts from the audited source snapshot.
98-
Firmware 0.4.1 therefore remains a legacy pre-publication release; its source
142+
Firmware 0.4.1 therefore remains a legacy pre-publication release: its source
99143
is present here, but its original commit identifier is not part of the public
100-
history. The next firmware release will rebuild and requalify from a public
101-
commit.
144+
history. Later firmware entries identify the annotated public source tag and
145+
exact commit used for their immutable artifacts.

‎README.md‎

Lines changed: 64 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@ MicroPython IDE.
77
[![License: MIT](https://img.shields.io/badge/license-MIT-yellow.svg)](LICENSE)
88
[![Platforms](https://img.shields.io/badge/app-iPadOS%20%7C%20Android-2D5BFF.svg)](#app)
99
[![Protocol](https://img.shields.io/badge/protocol-PBLE%2F1-0E7490.svg)](docs/specifications/protocol.md)
10+
[![Firmware](https://img.shields.io/badge/firmware-v0.6.0%20qualified-15803D.svg)](https://pyble.dev/flash)
1011

1112
PyBLE lets you edit, transfer, run, and stop MicroPython programs on a
1213
compatible microcontroller board over Bluetooth Low Energy. Its normal
1314
workflow needs no USB serial connection, Wi-Fi onboarding, cloud account, or
1415
telemetry.
1516

16-
- Website and browser-installer status: [pyble.dev](https://pyble.dev)
17+
- Qualified firmware v0.6.0: [installer and download](https://pyble.dev/flash)
1718
- iPad external beta:
1819
[join with TestFlight](https://testflight.apple.com/join/yU4e8s6d)
1920
- Android invited testing: [see the app page](https://pyble.dev/app)
@@ -65,27 +66,36 @@ BLE GATT peripheral. It supports:
6566
- board naming and identify support; and
6667
- upstream MicroPython’s standard `neopixel` module.
6768

68-
The public browser installer currently offers the exact v0.4.2 hardware-tested
69-
beta for both current profiles. Production Chrome erase/install and deliberately
70-
interrupted-flash recovery passed on real hardware for both exact profiles.
71-
Complete release qualification continues across the app, PBLE/1, resource, and
72-
remaining firmware matrices:
73-
74-
| Installer profile | Exact target constraint | Public status |
75-
| ----------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
76-
| `esp32-4mb` | Classic ESP32, 4 MiB external SPI flash; no PSRAM assumed | v0.4.2 hardware-tested beta; browser install/recovery passed |
77-
| `esp32-s3-n16r8` | ESP32-S3, 16 MiB flash / 8 MiB Octal PSRAM; N16R8-class only | v0.4.2 hardware-tested beta; browser install/recovery passed |
78-
| `esp32-c3-4mb` | ESP32-C3, 4 MiB external SPI flash; no PSRAM assumed | Planned; unavailable; no public image |
79-
80-
See the
81-
[post-release production-browser attestation](docs/validation/browser-flashing/v0.4.2-production.md)
82-
for the exact hashes, completed checks, and deliberately bounded claim.
83-
84-
These are the initial port targets, not a chip-family allowlist. A future board
85-
is compatible when it has a maintained PyBLE agent port, BLE GATT
86-
peripheral support, adequate resources, PBLE/1 conformance, recovery testing,
87-
and hardware-validation evidence. Stock MicroPython plus generic Bluetooth
88-
hardware is not sufficient by itself.
69+
The installer offers the qualified public v0.6.0 release across all five exact
70+
release profiles. All five exact-byte HIL rows passed. The four ESP profiles
71+
use Web Serial from a supported desktop Chromium browser; Pico 2 W uses a
72+
browser-verified UF2 download followed by a manual BOOTSEL copy.
73+
74+
| Profile | Exact hardware constraint | Provisioning | Public status |
75+
| ----------------------------- | ----------------------------------------------------------------------- | ---------------------------------- | ---------------- |
76+
| `esp32-4mb` | Classic ESP32; exactly 4 MiB external flash; no PSRAM required | ESP Web Serial | Qualified v0.6.0 |
77+
| `esp32-s3-n16r8` | Lean ESP32-S3; exactly 16 MiB flash and 8 MiB Octal PSRAM | ESP Web Serial | Qualified v0.6.0 |
78+
| `waveshare-esp32-s3-lcd-147b` | Exact ESP32-S3-LCD-1.47B B-version; 16 MiB flash and 8 MiB Octal PSRAM | ESP Web Serial | Qualified v0.6.0 |
79+
| `esp32-c3-4mb` | ESP32-C3 revision v0.3 or newer; exactly 4 MiB flash; no PSRAM required | ESP Web Serial | Qualified v0.6.0 |
80+
| `rpi-pico2-w` | Raspberry Pi Pico 2 W; RP2350 with CYW43439 | Verified UF2 + manual BOOTSEL copy | Qualified v0.6.0 |
81+
82+
The immutable
83+
[release descriptor](https://pyble.dev/firmware/v0.6.0/release.json), with
84+
SHA-256
85+
`c2940281a14feddb55c48de15ac18087e9317d1b7130e514fab5a209b046a1e6`,
86+
binds the five artifacts and passed HIL status to source commit
87+
`0c7230d6708797c241160ba71fbd37e6b22f180a` and the annotated
88+
[`firmware-v0.6.0` source tag](https://github.com/PyBLE-dev/PyBLE/tree/firmware-v0.6.0).
89+
See the [release notes](https://pyble.dev/firmware/v0.6.0/RELEASE_NOTES.md),
90+
[artifact checksums](https://pyble.dev/firmware/v0.6.0/SHA256SUMS), and
91+
[recovery guide](https://pyble.dev/firmware/v0.6.0/RECOVERY.md) before
92+
installing.
93+
94+
These maintained release profiles are not an app-side chip or board allowlist.
95+
A future board is compatible when it has a maintained PyBLE agent port, BLE
96+
GATT peripheral support, adequate resources, PBLE/1 conformance, recovery
97+
testing, and hardware-validation evidence. Stock MicroPython plus generic
98+
Bluetooth hardware is not sufficient by itself.
8999

90100
## How it fits together
91101

@@ -117,15 +127,14 @@ shared conformance corpus, documentation, and CI atomically.
117127
[TestFlight](https://testflight.apple.com/join/yU4e8s6d), or build the
118128
Flutter app locally.
119129
2. Open [pyble.dev/flash](https://pyble.dev/flash) in a supported desktop
120-
Chromium browser.
121-
The exact v0.4.2 hardware-tested beta is active. Browser installation and
122-
interrupted-flash recovery passed on both exact profiles; complete release
123-
qualification continues. Confirm the active version, your exact profile,
124-
and the enabled install action.
125-
3. Before flashing, back up the board, confirm its exact memory profile, and
126-
accept every safety acknowledgement before using the one-time wired
127-
installer. Flashing erases the board.
128-
4. Open PyBLE, scan for the provisioned board, connect, and run an example over
130+
Chromium browser. Confirm that the qualified v0.6.0 release is selected,
131+
then choose only the exact profile matching the board and memory topology.
132+
3. Before provisioning, back up the board and accept every safety
133+
acknowledgement. Flashing erases the board and its existing workspace.
134+
4. For the four ESP profiles, connect the board and install with Web Serial.
135+
For Pico 2 W, download the verified UF2 and copy it manually to the BOOTSEL
136+
mass-storage volume. iPadOS cannot perform either wired provisioning step.
137+
5. Open PyBLE, scan for the provisioned board, connect, and run an example over
129138
BLE.
130139

131140
See [support and troubleshooting](https://pyble.dev/support) for browser,
@@ -148,7 +157,9 @@ flutter pub get --enforce-lockfile
148157
flutter gen-l10n
149158
dart format --output=none --set-exit-if-changed lib test integration_test
150159
flutter analyze
151-
flutter test
160+
flutter test --exclude-tags golden
161+
# Run the pixel-golden lane on its pinned macOS host:
162+
flutter test --tags golden
152163
```
153164

154165
Firmware host tests:
@@ -169,9 +180,18 @@ firmware/scripts/install_arm_toolchain.sh
169180
firmware/scripts/build_rp2.sh rpi-pico2-w
170181
```
171182

172-
The Pico 2 W command builds the in-progress `0.6.0` source port. It has
173-
successful pre-GP2 hardware evidence but no public installer image or support
174-
claim until the complete GP2 matrix passes.
183+
These are the five target builds in the qualified v0.6.0 release. The four ESP
184+
targets produce Web Serial artifacts; `rpi-pico2-w` produces the UF2 used by
185+
the verified-download and BOOTSEL flow.
186+
187+
The commands above build the current checkout. To start from the exact source
188+
used for the public v0.6.0 artifacts, detach at the annotated release tag and
189+
restore its pinned submodules:
190+
191+
```sh
192+
git switch --detach firmware-v0.6.0
193+
git submodule update --init --recursive
194+
```
175195

176196
Website:
177197

@@ -184,9 +204,17 @@ npm run check
184204
The complete build requires the pinned toolchains documented in the relevant
185205
component README and specifications.
186206

207+
Firmware binaries are external release artifacts, not committed source. The
208+
production website receives a qualified bundle and validates its descriptor
209+
and hashes before enabling installation. A source-only website build remains
210+
fail-closed unless an explicit validated release input is supplied.
211+
187212
## Documentation
188213

189214
- [Documentation index](docs/README.md)
215+
- [Changelog](CHANGELOG.md)
216+
- [Qualified firmware v0.6.0 source](https://github.com/PyBLE-dev/PyBLE/tree/firmware-v0.6.0)
217+
- [Qualified firmware v0.6.0 release notes](https://pyble.dev/firmware/v0.6.0/RELEASE_NOTES.md)
190218
- [Product specification](docs/specifications/product.md)
191219
- [Architecture](docs/specifications/architecture.md)
192220
- [PBLE/1 protocol](docs/specifications/protocol.md)
@@ -195,6 +223,7 @@ component README and specifications.
195223
- [Hardware and compatibility](docs/specifications/hardware.md)
196224
- [Public roadmap](docs/ROADMAP.md)
197225
- [Architecture decisions](docs/decisions/README.md)
226+
- [Validation evidence index](docs/validation/README.md)
198227
- [Security policy](SECURITY.md)
199228

200229
## Contributing

0 commit comments

Comments
 (0)