Skip to content

Commit 7ab307f

Browse files
committed
[green] refresh README and roadmap for published v0.6.1
Signed-off-by: Viwat Vchirawongkwin <viwat.v@chula.ac.th>
1 parent 8771c8b commit 7ab307f

2 files changed

Lines changed: 118 additions & 66 deletions

File tree

‎README.md‎

Lines changed: 101 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -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

1313
PyBLE lets you edit, transfer, run, and stop MicroPython programs on a
1414
compatible microcontroller board over Bluetooth Low Energy. Its normal
1515
workflow needs no USB serial connection, Wi-Fi onboarding, cloud account, or
1616
telemetry.
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,
6774
and asks separately before overwriting existing files. Import never creates a
6875
remote 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

7688
The board-side agent is built with upstream MicroPython and exposes PBLE/1 as a
7789
BLE 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

100118
The 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
102120
SHA-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

112136
These maintained release profiles are not an app-side chip or board allowlist.
113137
A 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.
149174
2. 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.
152177
3. Before provisioning, back up the board and accept every safety
153178
acknowledgement. Flashing erases the board and its existing workspace.
154179
4. 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.
157182
5. 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,
167201
Bluetooth, network, and recovery requirements. A GitHub account or token is not
168202
needed for the optional import; every other workflow remains available without
169203
it.
@@ -194,6 +228,7 @@ Firmware host tests:
194228

195229
```sh
196230
tests/firmware_tests/run_tests.sh
231+
python3 -m unittest discover -s tests/firmware_tests/host -p 'test_*.py' -v
197232
```
198233

199234
Firmware build preparation and target builds:
@@ -205,19 +240,20 @@ firmware/scripts/build.sh esp32-s3
205240
firmware/scripts/build.sh waveshare-esp32-s3-lcd-147b
206241
firmware/scripts/build.sh esp32-c3
207242
firmware/scripts/install_arm_toolchain.sh
243+
firmware/scripts/install_picotool.sh
208244
firmware/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
212248
targets produce Web Serial artifacts; `rpi-pico2-w` produces the UF2 used by
213249
the verified-download and BOOTSEL flow.
214250

215251
The 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
217253
restore its pinned submodules:
218254

219255
```sh
220-
git switch --detach firmware-v0.6.0
256+
git switch --detach c8f549eeabe6d2b8c2766eab022517944bb09c8c
221257
git submodule update --init --recursive
222258
```
223259

@@ -237,17 +273,26 @@ static export with no Node.js website process.
237273
The complete build requires the pinned toolchains documented in the relevant
238274
component 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.
264309
If you use PyBLE in research, teaching, or another published work, use the
265310
metadata in [CITATION.cff](CITATION.cff). The app and firmware are versioned
266311
independently, 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

269314
The first whole-project citation snapshot is
270315
[`source-2026.08.23`](https://github.com/PyBLE-dev/PyBLE/releases/tag/source-2026.08.23).

‎docs/ROADMAP.md‎

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,34 @@ promising dates; accepted work is tracked through GitHub issues and milestones.
55

66
The detailed [firmware v0.6.1 and v0.7.0 proposal](planning/firmware-v0.6.1-v0.7.0-roadmap.md)
77
records the post-v0.6.0 contract-hardening and Reliable Projects candidates.
8-
The v0.6.1 hardening scope is approved for specification-first implementation;
8+
The v0.6.1 hardening implementation has been published on owner confirmation;
99
v0.7.0 remains non-normative and requires separate maintainer approval.
1010

1111
## Available now
1212

1313
- iPad external beta through TestFlight
1414
- PBLE/1 editing, run/stop, console, and file workflows over BLE
1515
- Offline Blockly with beginner GPIO and NeoPixel examples
16-
- The current qualified firmware v0.6.0 covers five exact profiles: four ESP
17-
Web Serial installers and the verified Pico 2 W UF2/manual-BOOTSEL path. All
18-
five exact-byte hardware, recovery, PBLE/1, iPadOS, and Android rows passed
19-
for that immutable release.
16+
- The published firmware v0.6.1 covers five exact profiles: four ESP
17+
Web Serial installers and the verified Pico 2 W UF2/manual-BOOTSEL path.
18+
Publication follows the owner's qualification confirmation, recorded in the
19+
[owner confirmation](https://pyble.dev/firmware-v0.6.1-owner-confirmation.md).
20+
Incomplete automated evidence is preserved unchanged; the qualified v0.6.0
21+
release remains a separate historical baseline.
22+
- Guided [tutorials](https://pyble.dev/learn) with reviewed Lenovo captures,
23+
the [firmware functional reference](https://pyble.dev/features), and the
24+
separate [official example collection](https://github.com/PyBLE-dev/examples)
2025
- MIT-licensed app, agent firmware, protocol, website, tests, and release tools
2126

2227
## Near term
2328

24-
- Qualify the app 0.2.0 beta train, starting at globally monotonic build 5,
25-
across the retained iPad/Android and five-profile hardware test scope
26-
- Complete source-selected firmware v0.6.1 contract hardening, deterministic
27-
builds, and fresh resource, recovery, and physical qualification across the
28-
same atomic five-profile scope before publication
29+
- Continue the app 0.2.0 beta train; source is currently `0.2.0+8`. The
30+
[prepared build-8 handoff](testing/google-play/0.2.0-build-8.md) is not proof
31+
of store publication or validation of subsequent source changes.
32+
- Reconcile the original automated qualification tracker
33+
[#24](https://github.com/PyBLE-dev/PyBLE/issues/24) with the recorded
34+
owner-confirmed v0.6.1 publication without inventing missing measurements.
35+
- Review the proposed v0.7.0 Reliable Projects scope before implementation.
2936
- Expand user-facing setup, recovery, and board-specific wiring guidance
3037
- Open and document the Android beta distribution path
3138
- Convert remaining pre-public planning references into focused GitHub issues

0 commit comments

Comments
 (0)