@@ -8,14 +8,17 @@ MicroPython IDE.
88[ ![ DOI] ( https://zenodo.org/badge/DOI/10.5281/zenodo.22064467.svg )] ( https://doi.org/10.5281/zenodo.22064467 )
99[ ![ Platforms] ( https://img.shields.io/badge/app-iPadOS%20%7C%20Android-2D5BFF.svg )] ( #app )
1010[ ![ Protocol] ( https://img.shields.io/badge/protocol-PBLE%2F1-0E7490.svg )] ( docs/specifications/protocol.md )
11- [ ![ Firmware] ( https://img.shields.io/badge/firmware-v0.6.0%20qualified -15803D.svg )] ( https://pyble.dev/flash )
11+ [ ![ Firmware] ( https://img.shields.io/badge/firmware-v0.6.1%20published -15803D.svg )] ( https://pyble.dev/flash )
1212
1313PyBLE lets you edit, transfer, run, and stop MicroPython programs on a
1414compatible microcontroller board over Bluetooth Low Energy. Its normal
1515workflow needs no USB serial connection, Wi-Fi onboarding, cloud account, or
1616telemetry.
1717
18- - Qualified firmware v0.6.0: [ installer and download] ( https://pyble.dev/flash )
18+ - Published firmware v0.6.1: [ installer and download] ( https://pyble.dev/flash )
19+ - Tutorials: [ learn PyBLE] ( https://pyble.dev/learn )
20+ - Firmware features and functional block diagram: [ architecture reference] ( https://pyble.dev/features )
21+ - Official example collection: [ PyBLE-dev/examples] ( https://github.com/PyBLE-dev/examples )
1922- iPad external beta:
2023 [ join with TestFlight] ( https://testflight.apple.com/join/yU4e8s6d )
2124- Android invited testing: [ see the app page] ( https://pyble.dev/app )
@@ -45,16 +48,20 @@ The Flutter app currently provides:
4548- a Python-highlighted MicroPython editor with always-visible, one-based line
4649 numbers, an adjustable 10–24 point code font, save, run, stop, soft reboot,
4750 and live console;
48- - wireless file browsing and transfer with integrity checks;
51+ - wireless file browsing and transfer with integrity checks, reviewed
52+ multi-file deletion, and a compact Files action menu;
4953- an optional public GitHub example browser that resolves a repository/ref to
5054 an immutable commit, previews exact ` .py ` source-to-board paths, and imports
5155 selected files into the connected Files folder only after explicit review;
56+ the official repository URL is prefilled and editable, with a branch chooser
57+ and an optional manual tag/commit input;
5258- an offline Blockly workspace with GPIO and standard MicroPython NeoPixel
5359 blocks, including explicit numeric GPIOs and bounded named ` machine.Pin `
5460 identities;
5561- editable beginner examples;
5662- exact Blockly sidecar reopening and a bounded Python-to-blocks importer;
57- - an adaptive tablet interface for portrait and landscape use; and
63+ - an adaptive tablet interface for portrait and landscape use;
64+ - an offline privacy policy accessible from About; and
5865- core editing, BLE, Files, Blocks, and Run operation without an account,
5966 analytics, or cloud dependency. GitHub is the sole optional network surface;
6067 its public, unauthenticated requests start only when the user opens the
@@ -67,47 +74,64 @@ fetches and validates the complete batch, shows the exact destination paths,
6774and asks separately before overwriting existing files. Import never creates a
6875remote folder hierarchy, opens an editor document, or runs downloaded code.
6976
70- The iPad build is available through public TestFlight. An invited Android
71- internal test is available through Google Play; this is not a public Play
72- release. Both platforms share the same Flutter source and app test gates.
77+ The current App source version is ` 0.2.0+8 ` ; App and firmware versions are
78+ independent. iPad testing uses TestFlight, and Android distribution follows
79+ the testing access shown on the [ App page] ( https://pyble.dev/app ) . The
80+ [ Google Play build-8 handoff] ( docs/testing/google-play/0.2.0-build-8.md )
81+ records prepared artifacts and their exact source; preparation does not
82+ establish a live store release or mean those earlier artifacts contain later
83+ connection-lifecycle fixes. Both platforms share the same Flutter source and
84+ app test gates. The iOS/iPadOS project minimum is 15.
7385
7486### Firmware
7587
7688The board-side agent is built with upstream MicroPython and exposes PBLE/1 as a
7789BLE GATT peripheral. It supports:
7890
79- - capability and device-information negotiation;
80- - run, stop, console, and soft-reboot control;
81- - filesystem operations with CRC validation and atomic uploads;
82- - resumable transfer behavior and bounded transport recovery;
83- - optional ` main.py ` auto-run protection;
84- - board naming and identify support; and
91+ - capability and device-information negotiation with session-scoped HELLO;
92+ - run, stop, console, and soft-reboot control, with fresh globals per file RUN
93+ and stdin isolated to its owning run;
94+ - LFS2 workspaces across all five profiles, CRC-checked resumable uploads,
95+ atomic publication, storage-reserve checks, and serialized file mutations;
96+ - bounded fragment reassembly and transport/session recovery;
97+ - optional ` main.py ` auto-run protection and checked configuration persistence;
98+ - board naming and identify support;
99+ - an exact-board ST7789 display and boot splash on Waveshare's B-version; and
85100- upstream MicroPython’s standard ` neopixel ` module.
86101
87- The installer offers the qualified public v0.6.0 release across all five exact
88- release profiles. All five exact-byte HIL rows passed. The four ESP profiles
89- use Web Serial from a supported desktop Chromium browser; Pico 2 W uses a
90- browser-verified UF2 download followed by a manual BOOTSEL copy.
91-
92- | Profile | Exact hardware constraint | Provisioning | Public status |
93- | ----------------------------- | ----------------------------------------------------------------------- | ---------------------------------- | ---------------- |
94- | ` esp32-4mb ` | Classic ESP32; exactly 4 MiB external flash; no PSRAM required | ESP Web Serial | Qualified v0.6.0 |
95- | ` esp32-s3-n16r8 ` | Lean ESP32-S3; exactly 16 MiB flash and 8 MiB Octal PSRAM | ESP Web Serial | Qualified v0.6.0 |
96- | ` 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 |
97- | ` esp32-c3-4mb ` | ESP32-C3 revision v0.3 or newer; exactly 4 MiB flash; no PSRAM required | ESP Web Serial | Qualified v0.6.0 |
98- | ` rpi-pico2-w ` | Raspberry Pi Pico 2 W; RP2350 with CYW43439 | Verified UF2 + manual BOOTSEL copy | Qualified v0.6.0 |
102+ The installer offers the owner-confirmed public v0.6.1 release across all five
103+ exact release profiles. The owner confirmed completed qualification and
104+ authorized publication on 2026-09-11. Existing automated qualification records
105+ remain incomplete and are preserved unchanged; owner confirmation does not
106+ mark missing automated measurements passed. The four ESP profiles use Web Serial
107+ from a supported desktop Chromium browser; Pico 2 W uses a browser-verified UF2
108+ download followed by a manual BOOTSEL copy.
109+
110+ | Profile | Exact hardware constraint | Provisioning | Public status |
111+ | --- | --- | --- | --- |
112+ | ` esp32-4mb ` | Classic ESP32; exactly 4 MiB external flash; no PSRAM required | ESP Web Serial | Owner-confirmed v0.6.1 |
113+ | ` esp32-s3-n16r8 ` | Lean ESP32-S3; exactly 16 MiB flash and 8 MiB Octal PSRAM | ESP Web Serial | Owner-confirmed v0.6.1 |
114+ | ` waveshare-esp32-s3-lcd-147b ` | Exact ESP32-S3-LCD-1.47B B-version; 16 MiB flash and 8 MiB Octal PSRAM | ESP Web Serial | Owner-confirmed v0.6.1 |
115+ | ` esp32-c3-4mb ` | ESP32-C3 revision v0.3 or newer; exactly 4 MiB flash; no PSRAM required | ESP Web Serial | Owner-confirmed v0.6.1 |
116+ | ` rpi-pico2-w ` | Raspberry Pi Pico 2 W; RP2350 with CYW43439 | Verified UF2 + manual BOOTSEL copy | Owner-confirmed v0.6.1 |
99117
100118The immutable
101- [ release descriptor] ( https://pyble.dev/firmware/v0.6.0 /release.json ) , with
119+ [ release descriptor] ( https://pyble.dev/firmware/v0.6.1 /release.json ) , with
102120SHA-256
103- ` c2940281a14feddb55c48de15ac18087e9317d1b7130e514fab5a209b046a1e6 ` ,
104- binds the five artifacts and passed HIL status to source commit
105- ` 0c7230d6708797c241160ba71fbd37e6b22f180a ` and the annotated
106- [ ` firmware-v0.6.0 ` source tag] ( https://github.com/PyBLE-dev/PyBLE/tree/firmware-v0.6.0 ) .
107- See the [ release notes] ( https://pyble.dev/firmware/v0.6.0/RELEASE_NOTES.md ) ,
108- [ artifact checksums] ( https://pyble.dev/firmware/v0.6.0/SHA256SUMS ) , and
109- [ recovery guide] ( https://pyble.dev/firmware/v0.6.0/RECOVERY.md ) before
110- installing.
121+ ` 71f6aca6df07e31a1f54c7f70a48d82c7fe26b1c8ca0626a8ffc57c804fbb1bd ` ,
122+ binds the five artifacts to exact source
123+ [ ` c8f549eeabe6d2b8c2766eab022517944bb09c8c ` ] ( https://github.com/PyBLE-dev/PyBLE/tree/c8f549eeabe6d2b8c2766eab022517944bb09c8c ) .
124+ See the [ owner confirmation] ( https://pyble.dev/firmware-v0.6.1-owner-confirmation.md ) ,
125+ [ release notes] ( https://pyble.dev/firmware/v0.6.1/RELEASE_NOTES.md ) ,
126+ [ artifact checksums] ( https://pyble.dev/firmware/v0.6.1/SHA256SUMS ) , and
127+ [ recovery guide] ( https://pyble.dev/firmware/v0.6.1/RECOVERY.md ) before installing.
128+
129+ Back up before moving from older workspace formats. v0.6.1 refuses nonblank or
130+ uncertain media that it cannot mount safely; it does not silently reformat an
131+ old workspace. That refusal requires USB recovery rather than a BLE session.
132+ The prior [ qualified v0.6.0 release] ( https://pyble.dev/firmware/v0.6.0/RELEASE_NOTES.md )
133+ and its [ source tag] ( https://github.com/PyBLE-dev/PyBLE/tree/firmware-v0.6.0 )
134+ remain historical references, not the current installer selection.
111135
112136These maintained release profiles are not an app-side chip or board allowlist.
113137A future board is compatible when it has a maintained PyBLE agent port, BLE
@@ -129,8 +153,9 @@ This repository is intentionally a monorepo:
129153- [ ` app/ ` ] ( app/ ) — the Flutter tablet application;
130154- [ ` firmware/ ` ] ( firmware/ ) — the portable agent, board overlays, and release
131155 tooling;
132- - [ ` examples/ ` ] ( examples/ ) — clean-room, board-neutral MicroPython examples,
133- including the public GitHub-import fixtures;
156+ - [ ` examples/ ` ] ( examples/ ) — small source/conformance examples and GitHub-import
157+ fixtures; the separately maintained [ official example collection] ( https://github.com/PyBLE-dev/examples )
158+ contains the user-facing examples for all five profiles;
134159- [ ` docs/specifications/protocol.md ` ] ( docs/specifications/protocol.md ) — the
135160 open PBLE/1 wire contract;
136161- [ ` tests/ ` ] ( tests/ ) — host, conformance, release, and HIL test runners;
@@ -147,23 +172,32 @@ shared conformance corpus, documentation, and CI atomically.
147172 [ TestFlight] ( https://testflight.apple.com/join/yU4e8s6d ) , or build the
148173 Flutter app locally.
1491742 . Open [ pyble.dev/flash] ( https://pyble.dev/flash ) in a supported desktop
150- Chromium browser. Confirm that the qualified v0.6.0 release is selected,
175+ Chromium browser. Confirm that the published v0.6.1 release is selected,
151176 then choose only the exact profile matching the board and memory topology.
1521773 . Before provisioning, back up the board and accept every safety
153178 acknowledgement. Flashing erases the board and its existing workspace.
1541794 . For the four ESP profiles, connect the board and install with Web Serial.
155180 For Pico 2 W, download the verified UF2 and copy it manually to the BOOTSEL
156181 mass-storage volume. iPadOS cannot perform either wired provisioning step.
1571825 . Open PyBLE, scan for the provisioned board, and connect over BLE.
158- 6 . To try the optional public example importer, open the destination folder in
159- ** Files** , choose ** Import examples from GitHub** , enter
160- ` https://github.com/PyBLE-dev/PyBLE ` with ref ` main ` , then browse to
161- ` examples/github-import ` .
162- 7 . Select ` hello.py ` or ` count.py ` , review the displayed commit SHA and exact
163- board target, and confirm any overwrite separately. Import does not open or
164- run the file; open it from Files and choose Run only when you are ready.
165-
166- See [ support and troubleshooting] ( https://pyble.dev/support ) for browser,
183+ 6 . In ** Files** , create or open a writable subfolder such as ` /examples ` within
184+ the board's advertised filesystem root. Do not assume ` / ` is writable on
185+ every board; read the destination warning before importing there.
186+ 7 . Choose ** Import examples from GitHub** . The prefilled URL
187+ ` https://github.com/PyBLE-dev/examples ` is editable. Let the branch chooser
188+ load, select ` main ` (or another available branch), and browse to
189+ ` examples/portable/basics/hello_console ` . If GitHub reports its public
190+ request limit, wait for the displayed retry time rather than repeatedly
191+ reloading. Advanced users can enter a tag or commit manually.
192+ 8 . Select ` pyble_hello_console.py ` , review the displayed immutable commit SHA
193+ and exact board destination, and confirm any overwrite separately. The
194+ official URL does not bypass source review or imply validation of every
195+ example. Import does not open or run the file; open it from Files and
196+ choose Run only when you are ready.
197+
198+ Follow the [ guided tutorials] ( https://pyble.dev/learn ) , including real Lenovo
199+ workflow screenshots, for the complete learning path. See
200+ [ support and troubleshooting] ( https://pyble.dev/support ) for browser,
167201Bluetooth, network, and recovery requirements. A GitHub account or token is not
168202needed for the optional import; every other workflow remains available without
169203it.
@@ -194,6 +228,7 @@ Firmware host tests:
194228
195229``` sh
196230tests/firmware_tests/run_tests.sh
231+ python3 -m unittest discover -s tests/firmware_tests/host -p ' test_*.py' -v
197232```
198233
199234Firmware build preparation and target builds:
@@ -205,19 +240,20 @@ firmware/scripts/build.sh esp32-s3
205240firmware/scripts/build.sh waveshare-esp32-s3-lcd-147b
206241firmware/scripts/build.sh esp32-c3
207242firmware/scripts/install_arm_toolchain.sh
243+ firmware/scripts/install_picotool.sh
208244firmware/scripts/build_rp2.sh rpi-pico2-w
209245```
210246
211- These are the five target builds in the qualified v0.6.0 release. The four ESP
247+ These are the five target builds in the published v0.6.1 release. The four ESP
212248targets produce Web Serial artifacts; ` rpi-pico2-w ` produces the UF2 used by
213249the verified-download and BOOTSEL flow.
214250
215251The commands above build the current checkout. To start from the exact source
216- used for the public v0.6.0 artifacts, detach at the annotated release tag and
252+ used for the public v0.6.1 artifacts, detach at the exact source commit and
217253restore its pinned submodules:
218254
219255``` sh
220- git switch --detach firmware-v0.6.0
256+ git switch --detach c8f549eeabe6d2b8c2766eab022517944bb09c8c
221257git submodule update --init --recursive
222258```
223259
@@ -237,17 +273,26 @@ static export with no Node.js website process.
237273The complete build requires the pinned toolchains documented in the relevant
238274component README and specifications.
239275
240- Firmware binaries are external release artifacts, not committed source. The
241- production website receives a qualified bundle and validates its descriptor
242- and hashes before enabling installation. A source-only website build remains
243- fail-closed unless an explicit validated release input is supplied.
276+ Firmware binaries are external release artifacts, not committed source.
277+ The public v0.6.1 installation uses its exact owner-confirmed release descriptor
278+ and artifact hashes; the standard automated qualification gate remains
279+ unchanged. A source-only website build remains fail-closed unless an explicit
280+ validated release input is supplied. See the
281+ [ publication record] ( docs/testing/firmware-v0.6.1-publication-2026-09-11.md )
282+ and [ website deployment record] ( docs/testing/website/site-v061-consistency-2026-09-11.md )
283+ for the release-specific deployment path; building this checkout does not
284+ publish new firmware or replace the live site.
244285
245286## Documentation
246287
247288- [ Documentation index] ( docs/README.md )
248289- [ Changelog] ( CHANGELOG.md )
249- - [ Qualified firmware v0.6.0 source] ( https://github.com/PyBLE-dev/PyBLE/tree/firmware-v0.6.0 )
250- - [ Qualified firmware v0.6.0 release notes] ( https://pyble.dev/firmware/v0.6.0/RELEASE_NOTES.md )
290+ - [ Tutorials with reviewed App screenshots] ( https://pyble.dev/learn )
291+ - [ Firmware features and functional block diagram] ( https://pyble.dev/features )
292+ - [ Official examples repository] ( https://github.com/PyBLE-dev/examples )
293+ - [ Published firmware v0.6.1 source] ( https://github.com/PyBLE-dev/PyBLE/tree/c8f549eeabe6d2b8c2766eab022517944bb09c8c )
294+ - [ Firmware v0.6.1 release notes] ( https://pyble.dev/firmware/v0.6.1/RELEASE_NOTES.md )
295+ - [ Firmware v0.6.1 publication record] ( docs/testing/firmware-v0.6.1-publication-2026-09-11.md )
251296- [ Product specification] ( docs/specifications/product.md )
252297- [ Architecture] ( docs/specifications/architecture.md )
253298- [ PBLE/1 protocol] ( docs/specifications/protocol.md )
@@ -264,7 +309,7 @@ fail-closed unless an explicit validated release input is supplied.
264309If you use PyBLE in research, teaching, or another published work, use the
265310metadata in [ CITATION.cff] ( CITATION.cff ) . The app and firmware are versioned
266311independently, so cite the exact archived project snapshot or component
267- release you used; qualified firmware v0.6.0 is not the app version.
312+ release you used; published firmware v0.6.1 is not the app version.
268313
269314The first whole-project citation snapshot is
270315[ ` source-2026.08.23 ` ] ( https://github.com/PyBLE-dev/PyBLE/releases/tag/source-2026.08.23 ) .
0 commit comments