## Decision

Remove the **firmware flashing system** entirely. Keep **program upload** to a connected board — that is how the editor runs a program on real hardware.

The raw `/tools/flasher` page and the firmware-flashing code path go. The device protocol upload/run path stays.

## Source

- "Remove flashing system???"
- "Make flashing and connection flow easier. Try and filter non-robot devices. Can we do any special USB spec stuff to make this work well???"
- "Remember USB serial device grants and show them in our UI instead of making the user go to Chrome one every time"
- "If a device is disconnected, especially during flash showing an error."

## Acceptance

- [ ] Delete the `/tools/flasher` route and UI.
- [ ] Remove firmware-flashing code paths that program upload does not use; audit `@shell.build/flasher`/`espflash` dependencies afterwards.
- [ ] Keep program upload/run over the device protocol and verify it still works.
- [ ] Remove flashing links, copy and docs from the editor and public site.
- [x] Decision: boards ship pre-flashed; firmware updates happen over the air through the firmware protocol.
- [ ] Define and implement the OTA update path; #26 owns the user-facing update prompt.
- [ ] Remove any remaining manual-flash instructions from the app and docs.
- [ ] If a board has incompatible firmware, show an actionable error instead of a flash button.
- [ ] Tests cover program upload success, disconnect mid-upload, and the incompatible-firmware error.
- [ ] Keep serial-grant/forget UI if it still helps program upload; otherwise remove it too.


<sub>Generated on _MrBeast_ using _opencode/deepseek-v4.1-flash_ in _ses_e8326e581ffeJviTmSkomwnKES_</sub>


