Page sent to the glasses
The preview is the exact page string. Nothing has been sent.
Settings
Defaults match the Python app. Width, height, cache pages, and the 24×4 layout are guesses. Enums below are the ones the device protocol names.
Legacy service UUID from BLUETOOTH_DEVELOPER_GUIDE.md. It is not the Bluetooth-base form. Edit it if retail firmware uses another UUID. Connect uses acceptAllDevices so you can pick the glasses. Web Bluetooth will not list any service you did not put here.
If a hardware run stays blank on preview, try scene 1. That advice is untested.
The start JSON already includes mode. The docs do not say the extra command is required. When this is on, the extra command is always 1, same as the Python app.
Web Bluetooth does not report ATT MTU. 20 is the characteristic value size in the guide's MTU-23 example, not a measurement of these glasses. Raise it only after a log shows the link can take a larger write.
Story: the sample is a JSON copy of the Python YAML. Tests fail if they drift. Paste or pick another JSON story with title, start, and scenes.
Sample story not loaded yet.
Hex log
Every GM frame this page builds or receives. Copy it and send it back after a hardware try. A GATT write completing is not proof the glasses drew pixels.