it seems that the most important bugfix that 3.0 has, compared to 2.8, is that it's upstream and thus not implicitly sets the --no-stub flag by default. This is bad because some boards require it.
TinyPICO:
$ PYTHONPATH=. python3 ./esptool.py flash_id
esptool.py v3.1-dev
Found 3 serial ports
Serial port /dev/ttyUSB0
Connecting......
Detecting chip type... ESP32
Chip is ESP32-PICO-D4 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, Embedded Flash, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: d8:a0:1d:54:76:20
Uploading stub...
Running stub...
Stub running...
Manufacturer: c8
Device: 4016
Detected flash size: 4MB
Hard resetting via RTS pin...
$ PYTHONPATH=. python3 ./esptool.py --no-stub flash_id
esptool.py v3.1-dev
Found 3 serial ports
Serial port /dev/ttyUSB0
Connecting....
Detecting chip type... ESP32
Chip is ESP32-PICO-D4 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, Embedded Flash, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: d8:a0:1d:54:76:20
Enabling default SPI flash mode...
Manufacturer: ff
Device: ffff
Detected flash size: Unknown
Hard resetting via RTS pin...
-- -- Matthias Urlichs