Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 21 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ telemetry.
- Official example collection: [PyBLE-dev/examples](https://github.com/PyBLE-dev/examples)
- iPad external beta:
[join with TestFlight](https://testflight.apple.com/join/yU4e8s6d)
- Android invited testing: [see the app page](https://pyble.dev/app)
- Android 0.2.0 published for open testing:
[get PyBLE on Google Play](https://play.google.com/store/apps/details?id=dev.pyble.pyble)
- License: [MIT](LICENSE)

<p align="center">
Expand Down Expand Up @@ -75,13 +76,20 @@ and asks separately before overwriting existing files. Import never creates a
remote folder hierarchy, opens an editor document, or runs downloaded code.

The current App source version is `0.2.0+8`; App and firmware versions are
independent. iPad testing uses TestFlight, and Android distribution follows
the testing access shown on the [App page](https://pyble.dev/app). The
independent. The published Android version is `0.2.0`, available through
[Google Play open testing](https://play.google.com/store/apps/details?id=dev.pyble.pyble).
iPad testing continues through TestFlight. The
[App page](https://pyble.dev/app) provides both installation links and QR codes.
Google Play determines account, country, device, and testing availability;
open testing is a beta channel, not a production-track release.

The [publication review](docs/testing/website/android-open-testing-2026-09-25.md)
records the current Android availability. The earlier
[Google Play build-8 handoff](docs/testing/google-play/0.2.0-build-8.md)
records prepared artifacts and their exact source; preparation does not
establish a live store release or mean those earlier artifacts contain later
connection-lifecycle fixes. Both platforms share the same Flutter source and
app test gates. The iOS/iPadOS project minimum is 15.
records prepared artifacts and their exact source. The store's public version
does not establish its installed build/source identity or mean those earlier
artifacts contain later connection-lifecycle fixes. Both platforms share the
same Flutter source and app test gates. The iOS/iPadOS project minimum is 15.

### Firmware

Expand Down Expand Up @@ -168,9 +176,12 @@ shared conformance corpus, documentation, and CI atomically.

## Try PyBLE

1. Install the iPad beta from
[TestFlight](https://testflight.apple.com/join/yU4e8s6d), or build the
Flutter app locally.
1. Install PyBLE 0.2.0 for Android open testing from
[Google Play](https://play.google.com/store/apps/details?id=dev.pyble.pyble),
or install the iPad external beta from
[TestFlight](https://testflight.apple.com/join/yU4e8s6d). The
[App page](https://pyble.dev/app) has links and QR codes for both platforms.
You can also build the Flutter app locally.
2. Open [pyble.dev/flash](https://pyble.dev/flash) in a supported desktop
Chromium browser. Confirm that the published v0.6.1 release is selected,
then choose only the exact profile matching the board and memory topology.
Expand Down
20 changes: 13 additions & 7 deletions docs/ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,19 @@ v0.7.0 remains non-normative and requires separate maintainer approval.
## Available now

- iPad external beta through TestFlight
- Android PyBLE 0.2.0 published for
[Google Play open testing](https://play.google.com/store/apps/details?id=dev.pyble.pyble),
subject to Play's account, country, device, and testing availability
- PBLE/1 editing, run/stop, console, and file workflows over BLE
- Offline Blockly with beginner GPIO and NeoPixel examples
- The published firmware v0.6.1 covers five exact profiles: four ESP
Web Serial installers and the verified Pico 2 W UF2/manual-BOOTSEL path.
Publication follows the owner's qualification confirmation, recorded in the
[owner confirmation](https://pyble.dev/firmware-v0.6.1-owner-confirmation.md).
Incomplete automated evidence is preserved unchanged; the qualified v0.6.0
release remains a separate historical baseline.
release remains a separate historical baseline. The original qualification
tracker [#24](https://github.com/PyBLE-dev/PyBLE/issues/24) was closed as
superseded on 2026-09-13; its incomplete checklist is not marked completed.
- Guided [tutorials](https://pyble.dev/learn) with reviewed Lenovo captures,
the [firmware functional reference](https://pyble.dev/features), and the
separate [official example collection](https://github.com/PyBLE-dev/examples)
Expand All @@ -27,14 +32,15 @@ v0.7.0 remains non-normative and requires separate maintainer approval.
## Near term

- Continue the app 0.2.0 beta train; source is currently `0.2.0+8`. The
[prepared build-8 handoff](testing/google-play/0.2.0-build-8.md) is not proof
of store publication or validation of subsequent source changes.
- Reconcile the original automated qualification tracker
[#24](https://github.com/PyBLE-dev/PyBLE/issues/24) with the recorded
owner-confirmed v0.6.1 publication without inventing missing measurements.
[Android publication review](testing/website/android-open-testing-2026-09-25.md)
records live open-testing availability. The
[prepared build-8 handoff](testing/google-play/0.2.0-build-8.md) remains a
source-specific historical record, not validation of subsequent source
changes in the installed store app.
- Review the proposed v0.7.0 Reliable Projects scope before implementation.
- Expand user-facing setup, recovery, and board-specific wiring guidance
- Open and document the Android beta distribution path
- Gather Android open-testing feedback and improve installation and recovery
guidance
- Convert remaining pre-public planning references into focused GitHub issues
- Improve automated app-to-board integration coverage

Expand Down
44 changes: 34 additions & 10 deletions docs/specifications/google-play-release.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,40 @@

# Google Play open-testing preparation

Status: candidate preparation, 10 September 2026. This contract supplements
Status: historical candidate preparation, 10 September 2026; publication status
updated 25 September 2026. This contract supplements
the [app distribution requirements](App/specs.md#9-build-versioning--distribution--bld)
and [ADR-0044](../decisions/0044-start-app-v020-beta-train-at-build-5.md).

The owner has reported that open testing is available for the existing Play
application. Preparation does not imply a submitted or approved release.
At preparation time, the owner reported that the open-testing track was
available for the existing Play application. That preparation alone did not
establish a submitted or approved release.

## Published status — 25 September 2026

The owner confirms that PyBLE **0.2.0** is now published on Google Play for
Android **open testing**. The official
[listing](https://play.google.com/store/apps/details?id=dev.pyble.pyble)
identifies SciLabPro and describes open testing for this version. The
[publication review](../testing/website/android-open-testing-2026-09-25.md)
records the primary-source check.

Current README and website copy MUST reflect this live open-testing status,
as specified by [website §3.1](website.md#31-app-beta-distribution). Google Play
determines account, country, device, and testing availability. Do not infer a
production-track release, worldwide availability, or the installed artifact's
exact version code/source from the public version alone. Keep the official
listing as the public link; no signed-in opt-in workflow is asserted verified.

The preparation, artifact identities, and remaining historical checklists
below retain their original scope. Publication does not retroactively certify
unrecorded Console decisions, hardware evidence, or later source changes.

## Candidate identity

The next candidate is **0.2.0 (8)**, owned by `app/pubspec.yaml`, for production
package `dev.pyble.pyble`. Build 5 remains a historical handoff; retained local
builds 6 and 7 must not be relabelled or replaced. The automated app-version
The 10 September candidate is **0.2.0 (8)**, owned by `app/pubspec.yaml`, for
production package `dev.pyble.pyble`. Build 5 remains a historical handoff;
retained local builds 6 and 7 must not be relabelled or replaced. The automated app-version
contract must bind build 8 to base version 0.2.0, PBLE/1 HELLO, and the existing
GitHub User-Agent. If Play Console has already consumed code 8 or higher,
increase this declaration and the version contract before rebuilding.
Expand Down Expand Up @@ -58,10 +80,12 @@ any stale golden requiring a reviewed update. Physical release-candidate BLE
checks and iOS distribution parity remain separate release gates; an emulator
or historical engineering report does not close them.

Keep the public website's existing testing status until open testing is
actually available. Console declarations, reviewer arrangements, upload,
review submission and rollout remain explicit handoff steps. This preparation
does not authorize sending tester messages or publishing a production release.
At the preparation handoff, the public website's testing status was to remain
unchanged until open testing became available. The dated publication status
above now governs current public copy. Console declarations, reviewer
arrangements, upload, review submission and rollout remain explicit handoff
steps. This preparation does not authorize sending tester messages or
publishing a production release.

## Official references

Expand Down
50 changes: 34 additions & 16 deletions docs/specifications/website.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# PyBLE — Public Website Specification

Status: **FROZEN (pre-v1 and v1 launch surface)** · Owner: project maintainer · Last updated:
2026-09-01
2026-09-25

This document is the source of truth for the first public website at
`pyble.dev`. It specifies only the public site; the Flutter app, PBLE/1, and
Expand Down Expand Up @@ -127,23 +127,31 @@ or promise that every eligible board has a firmware image today.

### 3.1 App beta distribution

The currently approved app-testing channels are:
The current app channels, verified on 2026-09-25, are:

- the public Apple external-testing invitation at
`https://testflight.apple.com/join/yU4e8s6d`; and
- the restricted Android internal-testing listing at
`https://play.google.com/store/apps/details?id=dev.pyble.pyble`, available
only to approved testers signed in with the Google account that was invited.
- PyBLE **0.2.0** published on Google Play for Android **open testing**, at
`https://play.google.com/store/apps/details?id=dev.pyble.pyble`.

The project owner confirms the Android publication. The official Google Play
listing identifies SciLabPro and describes open testing for PyBLE 0.2.0. This
supersedes the former invited internal-testing status. It does not establish a
production-track release, worldwide availability, a verified opt-in URL, or
the exact source/build identity of the installed store artifact.

While either channel is active, the home page and `/app` MUST:

- distinguish the iPad external beta from the Android internal test, without
implying a production App Store or public Google Play release;
- distinguish the iPad external beta from the published Android Google Play
open test, without implying a production-track release on either store;
- summarize both channels in the home-page hero and link its primary app action
to `/app`; the hero MUST NOT present the iPad channel as the only available
app test;
- explain that an unapproved or signed-out visitor may be unable to open the
restricted Google Play listing;
- describe Android as Google Play open testing, with no invited-account or
approved-internal-tester requirement; installation remains subject to Google
Play's account, country, device compatibility, and testing availability;
- keep visible copy, page descriptions, Open Graph/Twitter descriptions, and
setup guidance consistent with these channel states;
- provide a normal HTTPS link that works on the device displaying the page;
- provide a high-contrast QR code encoding each channel's exact HTTPS
destination for a user viewing the site on another screen; and
Expand All @@ -160,7 +168,7 @@ normal navigation.

The two home-page invitations MUST appear in one labelled **Choose your tablet
beta** comparison group. Within that group the iPad external-beta and Android
invited-internal-test cards MUST be peer siblings, render side by side when the
open-testing cards MUST be peer siblings, render side by side when the
viewport permits, and stack without changing order on narrower screens. Each
card retains its own accessible heading, exact link, local QR, direct-device
instructions, and channel-specific availability warning.
Expand All @@ -173,14 +181,23 @@ contract, and corresponding QR asset to change together before deployment.
`https://pyble.dev/app` is the stable first-party app-discovery destination
encoded by exact-board firmware. It MUST be a complete statically rendered
document, not an external redirect. It MUST have its own canonical metadata,
identify the iPad external beta and restricted Android internal test (not
production store releases), reuse `siteConfig.testFlightUrl` and
`siteConfig.googlePlayInternalTestUrl` as the approved destination sources,
identify the iPad external beta and published Android Google Play open test,
reuse `siteConfig.testFlightUrl` and `siteConfig.googlePlayUrl` as the approved
destination sources,
present both local authored QR codes plus visible direct-URL fallbacks, and link
to `/flash` and `/support`. Its firmware wording MUST remain release-state-neutral
or derive from the same build-selected state as the home page; it MUST NOT copy
a version/profile claim that can become stale.

The Android QR asset is `/google-play/pyble-google-play-qr.svg` and MUST encode
the exact listing URL above. Its name and accessible description MUST NOT
retain the superseded internal-testing restriction. The existing listing URL
remains the direct installation destination; an inferred or unverified opt-in
URL MUST NOT replace it. Repository documentation MUST distinguish app source
version `0.2.0+8`, published app version `0.2.0`, and independent firmware
versions. A public listing does not prove that later source fixes are included
in the store artifact.

`/app/` MUST permanently normalize to `/app` while preserving the query. Exact
document routing MUST coexist with the existing `/app/*` real-app screenshot
asset namespace: adding or redirecting the document MUST NOT capture, rename,
Expand Down Expand Up @@ -1126,9 +1143,10 @@ The v1 site is releasable when:
- the hero uses a reviewed real-app capture with meaningful alternative text,
a visible actual-app caption, and a responsive crop that never obscures the
pictured Blocks workspace or generated Python;
- the current external iPad beta and restricted Android internal test are each
exposed as an operable link and locally served, exact-URL QR code without
claiming production availability;
- the current external iPad beta and published Android Google Play open test
are each exposed as an operable link and locally served, exact-URL QR code,
with matching page/social descriptions and setup guidance; no current copy
requires an Android invitation or claims production-track availability;
- `/app` is canonical, statically rendered, uses both approved testing-channel
destination/link/QR contracts, links setup and support, and its slash
normalization does not break an existing nested `/app/*` screenshot asset;
Expand Down
53 changes: 53 additions & 0 deletions docs/testing/website/android-open-testing-2026-09-25.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<!-- SPDX-License-Identifier: MIT -->
<!-- Part of PyBLE (https://pyble.dev) — see /LICENSE. -->

# Android open-testing publication review — 2026-09-25

## Observed status

The project owner confirms that PyBLE is published on Google Play. Current
first-party README and website copy still described an invited Android
internal test, while the public store listing described open testing.

The official [Google Play listing](https://play.google.com/store/apps/details?id=dev.pyble.pyble)
was retrieved over HTTPS on 2026-09-25 with English/US presentation parameters
(`hl=en&gl=US`). It returned HTTP 200 and identified **SciLabPro**, app version
**0.2.0**, and release notes stating **“Open testing for PyBLE 0.2.0.”** The
package is `dev.pyble.pyble`. This primary-source result supports the
owner-confirmed publication and supersedes the invited internal-testing copy.

The [AppAgg entry](https://appagg.com/android/education/pyble-micropython-ide-44135975.html?hl=en)
also lists version 0.2.0 and the same open-testing release notes, with a
2026-09-16 listing date. It is corroborating third-party indexing, not proof of
the exact rollout date or Play Console configuration.

## Current publication contract

- Describe Android as **PyBLE 0.2.0 published on Google Play for open testing**.
- Keep iPad described as the external TestFlight beta.
- Link directly to the existing official Google Play listing and encode the
same destination in the neutral `/google-play/pyble-google-play-qr.svg` asset.
- Keep README, home, `/app`, metadata, setup guidance, and current distribution
documentation consistent. Remove the invitation requirement from current
Android installation guidance.
- Google Play determines account, country, device, and testing availability.
Open testing does not establish a production-track release or universal
availability.

The candidate opt-in endpoint redirected to Google sign-in. No signed-in
enrollment or on-device installation was verified in this review. The public
listing remains the link; no inferred opt-in destination is introduced.

## Source and evidence boundaries

The repository's App source version remains `0.2.0+8`. The public app version
`0.2.0` does not establish the installed store artifact's version code, source
commit, or inclusion of later connection-lifecycle fixes. The
[build-8 handoff](../google-play/0.2.0-build-8.md) and original submission
materials remain historical preparation records. Firmware versions and
qualification evidence remain independent of the app distribution channel.

This record documents availability and the coordinated content contract. It
does not attest a deployment, signed-in Play Console state, installed app
binary, or hardware-validation result. Search engines control when indexed
snippets refresh after updated pages are published.
13 changes: 11 additions & 2 deletions tests/publication/test_public_claims.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,13 +182,22 @@ def test_current_public_surfaces_agree_on_v061_publication(self) -> None:
"v0.7.0",
near_term,
)
self.assertIn("automated qualification", near_term)
self.assertIn("closed as superseded on 2026-09-13", available)
self.assertIn("incomplete checklist is not marked completed", available)

def test_readme_distinguishes_app_source_from_store_availability(self) -> None:
firmware = markdown_section(self.readme, "What works")
normalized = " ".join(firmware.split())
self.assertIn("0.2.0+8", firmware)
self.assertIn("does not establish a live store release", normalized)
self.assertIn("Google Play open testing", normalized)
self.assertIn("published Android version is `0.2.0`", normalized)
self.assertIn("exact source", normalized)
self.assertIn("later connection-lifecycle fixes", normalized)
self.assertIn(
"https://play.google.com/store/apps/details?id=dev.pyble.pyble",
self.readme,
)
self.assertNotRegex(self.readme, r"(?i)Android (?:invited|internal) test")
self.assertIn("offline privacy policy", normalized)
self.assertIn("multi-file deletion", normalized)

Expand Down
Loading
Loading