NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #4015 most downloaded on PyPI
A serial utility for flashing, provisioning, and interacting with Espressif SoCs.
Last release 16 days ago
02 Sep 2026
Ships fairly regularly
a new release about every 5 weeks
Nearly every release is documented
notes for 53 of 54 stable releases
4 versions withdrawn
withdrawn after publishing
10 years old
92 releases · first in 2016
Fixed faulty hard_reset() with RTS pin for ESP32-S2/S3 in slower environments
hard_reset() with RTS pin for ESP32-S2/S3 in slower environmentsThanks to @hathach and others for contributing to this release!
Added a readable message when a device is not detected on a given port
image_info: Print flash settings and extended header fields with --version 2 argumentXTS_AES_256 key_purpose on ESP32-S3-beta2burn_efuse: Improved error messages when a new data value is incorrect (https://github.com/espressif/esptool/issues/760)get_pkg_version: Fixed on ESP32-C2 (https://github.com/espressif/esptool/issues/759)load_extended_header: Load the minimum chip revision min_rev fieldXTS_AES_256 key purposes on ESP32-C3FAIL_BIT and NUM_BITS on ESP32-C3--port/-p argument if connection fails (https://github.com/espressif/esptool/issues/744)_microecc_format: Pad zeroes to curve lengthThanks to @befeleme and others for contributing to this release!
One column per quarter.
ESP32-C2: Added flash encryption support
ESP32-C2: Added flash encryption supportelf2image: Added argument to disable appending SHA256 digestsespsecure.py: Fixed Secure Boot V1 key generationespefuse.py: Corrected eFuse tablesPatched the wrapper scripts to not import themselves to allow running esptool, espefuse, and espsecure in different environments and importing these d
esptool, espefuse, and espsecure in different environments and importing these directly in other Python scripts.Changing or refactoring these limited internals won't be considered a breaking change in future releases. Migration is easy and self-explanatory (you…
Starting from v4.0.0, esptool adopts the semantic versioning specification, please read the related "Versions" esptool documentation page when deciding which version to use.
esptool directly.erase_flash and erase_region cannot be executed.erase_flash, erase_region and write_flash operations cannot be performed (write_flash is just restricted to protect the bootloader region 0x0000->0x8000).--force lets the users execute these operations anyways.v4 and later can't be installed from PyPI on these deprecated Python versions.ESP8684 alias has been removed, ESP32-C2 has to be used.ESP32-C2 ECO1, deprecated ECO0 stub (can still be used with ROM).ESP32-D0WDR2-V3ESP32-S3 USB-OTG compressed flashingesptool project. Contributions will be automatically formatted in a compatible way when following the contributions guide.Thanks to everyone who contributed to this release.
This bugfix release of an older esptool.py version is intended only for purposes when v3.3 needs to be used. The latest v4 release is recommended and
This bugfix release of an older esptool.py version is intended only for purposes when v3.3 needs to be used. The latest v4 release is recommended and under active development.
--pad-to-size <size>.espefuse: Fixed compatibility with Bitstring>=4 (https://github.com/espressif/esptool/issues/797)Thanks to everyone who contributed to this release!
This bugfix release of an older esptool.py version is intended only for purposes when v3.3 needs to be used. The latest v4 release is recommended and
This bugfix release of an older esptool.py version is intended only for purposes when v3.3 needs to be used. The latest v4 release is recommended and under active development.
write_flash: Added the ability to recover from serial errors when flashing, effectively making data transfers more robust (https://github.com/espressif/esptool/issues/182)XTS_AES_256 key_purpose on ESP32-S3-beta2burn_efuse: Improved error messages when a new data value is incorrect (https://github.com/espressif/esptool/issues/760)load_extended_header: Load the minimum chip revision min_rev fieldhard_reset() with RTS pin for ESP32-S2/S3 in slower environmentsget_default_connected_device: Fixed closing unused portsXTS_AES_256 key purposes on ESP32-C3FAIL_BIT and NUM_BITS on ESP32-C3--port/-p argument if connection fails (https://github.com/espressif/esptool/issues/744)_microecc_format: Pad zeroes to curve lengthThanks to @johnboiles, @hathach, and others for contributing to this release!
Full Changelog: https://github.com/espressif/esptool/compare/v3.3.1...v3.3.2
Added stub flasher support for ESP32-C2 ECO1, deprecated ECO0 stub (can still be used with ROM)
Added flash size options up to 128MB.
--flash-mmu-page-size option to change flash MMU page size on ESP32-C2.execute_scripts nesting support, a script can now be called from another script.JTAG_SEL_ENABLE on ESP32-C3.execute_scripts error handling in script files. (https://github.com/espressif/esp-idf/issues/8420)These features are intended for use inside Espressif:
flash.rodata not being recognized as part of IRAM in the ELF parser.UART_RXFIFO_CNT_M mask values in the stub flasher.Thanks to @ESP32DE, @lucasrangit, @Jason2866, and others for contributing to this release.
Support for ESP32-S3 SoC has been added (removed ESP32-S3-beta3).
get_security_info command stub support.encrypt_flash_data.flash_ver, psram_ver, and pkg_ver efuses.soft_dis_jtag efuse.custom_mac eFuse field for ESP32-C3/-S2/-S3/-H2.read_protect_efuse. (https://github.com/espressif/esptool/issues/640)These features are intended for use inside Espressif:
tty and cu ports.merge_bin.Thanks to @bbilas, @xingrz, @loader-bsd, @alvarolb, and others for contributing to this release.
Support for ESP32-C3 SoC has been added
--encrypt-files option to specify which files need encryption before flashing.--use_segments option for elf2image to use segments instead of sections to generate the image. (https://github.com/espressif/esptool/pull/546)write_flash timeout calculation and status message.write_reg command forms (including delay and mask parameters) to flasher stub.merge_bin command to combine binary files on host (https://github.com/espressif/esptool/issues/254, https://github.com/espressif/esptool/pull/568)--min-rev argument of elf2image to work on all chips apart from ESP8266.--after no_reset_stub option to keep the flasher stub running and allow its repeated usage.--aes-xts option to encrypt/decrypt flash data files with AES-XTS algorithm on the S2 and C3.These features are intended for use inside Espressif:
dump_mem overall bytes read message.write_mem mask argument to be optional to match with its usage example on Wiki.expand_file_arguments gets called when using custom command-line arguments. (https://github.com/espressif/esptool/pull/400/)elf2image for the use case of linker scripts that have a large number of sections.Thanks to @Skallwar, @eykamp, @gnought, @middelink and others for contributing to this release.
The default esptool.py write_flash --flash_size argument has changed from detect to keep. This means that if no --flash_size argument is passed when f
esptool.py write_flash --flash_size argument has changed from detect to keep. This means that if no --flash_size argument is passed when flashing a bootloader, the value in the bootloader .bin file header is kept instead of detecting the actual flash size and updating the header. To keep the old behaviour, add the argument esptool.py [...] write_flash [...] -fs detectespefuse.py command line arguments for ESP32 have changed:
BLK1, BLK2, BLK3 is now BLOCK1, BLOCK2, BLOCK3`secure_boot has been replaced with secure_boot_v1, secure_boot_v2. Secure Boot V2 is the new RSA-based Secure Boot mechanism supported on ESP32 V3.--connect-attempts argument (https://github.com/espressif/esptool/pull/464)--chip argument--chip argument (ie -c ESP32, -c esp32-s2, etc.esp_rfc_2217_server.py for flashing via RFC2217 (i.e. flashing over the network, https://github.com/espressif/esptool/issues/383)UART_DOWNLOAD_DISThese features are intended for use inside Espressif:
esptool.py --no-stub read_flash is now supported on ESP32 and later. This option is slower than using the default stub option to read flash, so it's generally not useful for production SoCs.elf2image --elf-sha256-offset option (https://github.com/espressif/esptool/issues/560)Thanks to @jkoelker, @earlephilhower, @paravoid, @niziak, and others for contributing to this release.
esptool.py image_info now prints a summary of segment memory types (IRAM, DRAM, etc) based on the address range.
esptool.py image_info now prints a summary of segment memory types (IRAM, DRAM, etc) based on the address range.esptool.py write_flash will warn if it looks like a bootloader binary is built for ESP32-S2 or another newer chip (support for flashing ESP32-S2 will be added in a future version.)esptool.py elf2image --min-rev X option allows creating a .bin file which only supports a minimum ESP32 silicon revision.New option write_flash --flash-size keep will keep whatever flash size is set in the bootloader header, matching the behaviour of --flash-mode keep an
write_flash --flash-size keep will keep whatever flash size is set in the bootloader header, matching the behaviour of --flash-mode keep and --flash-speed keep. The default is still --flash-size detect but may be changed to keep in a future major update, to be consistent with the other two options.write_flash no longer updates the flash header if the file being written to the bootloader offset isn't a valid image file for the chip. This is useful for flashing pre-encrypted data to ESP32s, where the image file contains ciphertext.main() from Python is now documented in the README (#408)elf2image --sha256-offset will now only write the ELF SHA-256 to this offset if the existing data is all zeroes. Otherwise a warning is printed.write_flash --encrypt option that works with the new Development Mode flash encryption that will be the default flash encryption development workflow in ESP-IDF V4.0.espefuse.py summary --format json will print a JSON dictionary of efuse summary data (#436)espefuse.py burn commands now set the efuse timing before burning, in line with recent ESP32 TRM update.espsecure.py key operations now support --keylen argument, allowing 192-bit keys for ESP32s with 3/4 Coding Scheme set.espsecure.py encryption and decryption speed substantially improved. (#416)FLASH_CRYPT_CNT efuse is now defined as 7 bits wide, as eight bit is not used by flash encryption hardware.Thanks to @grandcat, @darkfader, @tim-nordell-nimbelink, @sbertrand-witekio, @marcelstoer, @eykamp, @cclauss for contributing to this release.
New write_flash --erase-all ... option to erase all flash before writing (single command).
write_flash --erase-all ... option to erase all flash before writing (single command). (#344)esptool.main() more Python-friendly (all functions clean up open files correctly, main(...) can take an optional argument with a command line formatted as a list.) (#341)Special thanks to @Callahan93 and @borro0 for contributing to this release.
Errors during chip detection are now formatted correctly.
Bug fixes:
ESP32 Only:
Thanks to @orangecms for contributing to this release.
Set a write timeout in pyserial (prevents hanging in sync process if port is unavailable).
New features:
elf2image --secure-pad to pad the output binary so once signed it will align to an flash cache page boundary (64KB). Prevents unsigned data from being mapped into the instruction space via the flash cache.Bug fixes:
--port is specified but no serial ports are found in the system.digest_secure_bootloader could produce an incorrect digest.Thanks to @heyinling & @ekiro for contributing to this release.
--port argument was not correctly handled in v2.4.0
Bug fixes:
Thanks to @nopdotcom and @ildar for contributing to this release.
If no serial port is specified, try all serial ports until an Espressif device responds.
Version 2.4.0:
--before no_reset_no_sync for use when immediately reusing the
serial port with an already-running loader.elf2image --version=2 is now compatible with recent ESP8266 SDK bootloader
and produces the same binary output as ESP8266 SDK gen_app.py.Thanks to @devanlai, @andrewwakeling, @Callahan93, @tim-nordell-nimbelink, @cefn and @nkolban for contributing to this release.
Latest stable release available from PyPi: https://pypi.python.org/pypi/esptool/
Latest stable release available from PyPi: https://pypi.python.org/pypi/esptool/
This release: https://pypi.python.org/pypi/esptool/2.3.1
Latest stable release available from PyPi: https://pypi.python.org/pypi/esptool/
Latest stable release available from PyPi: https://pypi.python.org/pypi/esptool/
This release: https://pypi.python.org/pypi/esptool/2.3
Latest stable release available from PyPi: https://pypi.python.org/pypi/esptool/
Latest stable release available from PyPi: https://pypi.python.org/pypi/esptool/
This release: https://pypi.python.org/pypi/esptool/2.2.1
Thanks to @me21 & @igrr for contributing to this release.
PEP8 style cleanup, removal of deprecated language features (thanks @Cabalist!)
Latest stable release available from PyPi: https://pypi.python.org/pypi/esptool/
This release: https://pypi.python.org/pypi/esptool/2.2
esptool.py --trace option provides dump of all serial traffic for easier low-level debugging--spi-connection arguments were mis-typed (thanks @Cabalist!)Latest stable release available from PyPi: https://pypi.python.org/pypi/esptool/
Latest stable release available from PyPi: https://pypi.python.org/pypi/esptool/
This release: https://pypi.python.org/pypi/esptool/2.1
Thanks to @daniel-leonard-robinson for contributing to this release.
Latest stable release available from PyPi: https://pypi.python.org/pypi/esptool/
Latest stable release available from PyPi: https://pypi.python.org/pypi/esptool/
This release: https://pypi.python.org/pypi/esptool/2.0.1
esptool.py version 2.0.1 is a minor bugfix release from v2.0.
New since v2.0:
--help argument if run without command line arguments.Thanks to @hroncok & @marcelstoer for contributing to this release.
Latest stable release available from PyPi: https://pypi.python.org/pypi/esptool/
Latest stable release available from PyPi: https://pypi.python.org/pypi/esptool/
This release: https://pypi.python.org/pypi/esptool/2.0
esptool.py version 2.0 is a major release compared to v1.x. Most command line options are backwards compatible, but some default settings have changed.
--before and --after, to override the way esptool.py enters and exits bootloader mode, respectively. Details here.--flash_mode keep and --flash_freq keep default options mean that write_flash no longer modifies these settings in the image header by default.--spi-connection argument allows overriding SPI flash pin configuration. Details here.Thanks to everyone who contributed to this release, and submitted bug reports during the long beta period!
Latest stable release available from PyPi: https://pypi.python.org/pypi/esptool/
Latest stable release available from PyPi: https://pypi.python.org/pypi/esptool/
This release: https://pypi.python.org/pypi/esptool/1.3
New since v1.2.1:
verify_flash command now accepts optional --flash_mode and --flash_speed arguments, allowing verification of a ROM bootable image at offset 0.test_esptool.py) from esptool v2.0Thanks to @thespooler, @jeremyherbert, @jrobeson for contributing to this release.
Latest stable release available from PyPi: https://pypi.python.org/pypi/esptool/
Latest stable release available from PyPi: https://pypi.python.org/pypi/esptool/
This release: https://pypi.python.org/pypi/esptool/1.2.1
New since v1.2:
Latest stable release available from PyPi: https://pypi.python.org/pypi/esptool/
Latest stable release available from PyPi: https://pypi.python.org/pypi/esptool/
This release: https://pypi.python.org/pypi/esptool/1.2
New since v1.1:
--flash_size default "detect" to interpret flash size from IDThanks to @pfalcon, @jimparis, @jms19 for contributing to this release.
Latest stable release available from PyPi: https://pypi.python.org/pypi/esptool/
Latest stable release available from PyPi: https://pypi.python.org/pypi/esptool/
This release: https://pypi.python.org/pypi/esptool/1.1
Latest stable release available from PyPi: https://pypi.python.org/pypi/esptool/
Latest stable release available from PyPi: https://pypi.python.org/pypi/esptool/
This release: https://pypi.python.org/pypi/esptool/1.0.1
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →