Read from left to right, the diagram begins with the PyBLE app on iPadOS or Android. After a separate one-time wired installation, the app discovers a board, reads its capabilities, manages files, runs and stops code, sends console input, and receives standard output and errors over Bluetooth Low Energy. ESP images use desktop Chromium and Web Serial; Pico 2 W uses a verified UF2 download and manual BOOTSEL copy. Installation replaces the existing firmware and workspace.
Inside the compatible-device boundary, RX writes, TX notifications, and the readable INFO characteristic connect the app to the BLE GATT transport. Transport, identity, boot, and security modules feed the central PBLE/1 protocol engine. PBLE/1 version 1 defines 24 opcodes for device information, files, execution, console, labels, autorun, and optional Identify control. Frames carry request IDs and CRC-32 checks.
Below the engine, the filesystem bridge lists and inspects files, downloads from an offset, resumes windowed uploads, verifies CRC-32, and commits through a temporary .pbltmp sibling and rename. The run controller executes one file or inline source at a time with fresh globals and supports idempotent Stop and soft reboot. Imported modules and hardware state are not reset by fresh globals. The console carries tagged standard output and error plus bounded, run-owned stdin; idle input is discarded. Connection-generation and virtual-machine-epoch controls discard stale work after disconnects or resets.
The agent runs beside a normal upstream MicroPython 1.28.0 user runtime with zero PyBLE patches to upstream MicroPython. User programs retain ordinary filesystem and machine APIs and must select pins and buses explicitly; PyBLE does not detect a carrier board or supply a pin map.
The lower strip distinguishes five firmware 0.6.1 profiles. Four ESP profiles use the native C agent, NimBLE, LFS2 storage, upload window eight, and Web Serial. Pico 2 W uses the frozen-Python agent, BTstack, LFS2, upload window four, and manual UF2 provisioning. Memory alone does not identify a board, and matching N16R8 hardware does not make an arbitrary ESP32-S3 board the Waveshare B version.