The "open" button is wired between GPIO0 and GND. Why does holding it while the board resets stop the firmware from starting?
GPIO0 is a strapping pin. If it is low at reset, the ESP32 enters its serial bootloader (download mode) instead of running the app. A button from GPIO0 to GND held during reset does exactly that, which is also how the board's own BOOT button works.
At reset the ESP32 samples a few strapping pins to decide how to start. GPIO0 picks the boot mode:
| GPIO0 at reset | Result |
|---|---|
| High (the default, through an internal pull-up) | Run the program in flash |
| Low | Enter the ROM serial bootloader and wait for esptool |
Most ESP32 dev boards wire their BOOT button to GPIO0 and GND for this purpose. A user button on GPIO0 is therefore the same circuit. In normal operation it reads like any active-low button. Only during reset does it have this second meaning: if it is held, the device seems dead, because it is waiting to be flashed. Releasing it and pressing EN (reset) starts the firmware normally.
The second button in this design, on GPIO5, is also a strapping pin, though GPIO5 only affects SDIO timing at boot. Both work as buttons, but a free, non-strapping pin (such as GPIO4) avoids the surprise.
Go deeper:
esptool — Boot mode selection — GPIO0, GPIO2 and how the automatic download circuit uses them.