Develop
Languages, development tools and ready-made projects for your next build.
If this is your first time using an Unexpected Maker development board, please check out the Getting Started guide → first.
Languages / platforms
Choose your language and development tools. Runtime support varies by chip; follow the linked project’s hardware requirements and board setup.

Write Python for sensors, displays and your next hardware idea.

Run Python on the board and try ideas in the interactive prompt.
Build with familiar sketches and the ESP32 Arduino library ecosystem.
Use Espressif’s C/C++ framework for direct control of the chip.

Manage Arduino and ESP-IDF projects, libraries and builds in VS Code.

Develop in C# with Visual Studio and ESP32 or ESP32-S3 firmware.
Compile embedded Rust with esp-rs for the ESP32 family.
Run the PHP engine on ESP32-S3/P4 with external PSRAM and 8 MB or more flash.
Go for microcontrollers, including supported ESP32 and ESP32-S3 targets.
Run JavaScript interactively on the original ESP32 using Espruino.

Use Lua RTOS for lightweight scripting and hardware control on the original ESP32.

Run concurrent Erlang and Elixir applications on ESP32 with AtomVM.
Choose your MCU
Install Arduino IDE
Download Arduino IDE for your operating system and install it on your computer. If it is already installed, open it and continue below.
Add ESP32 board support
Open the IDE’s preferences and add this address to Additional Boards Manager URLs. Keep any addresses you already have.
https://espressif.github.io/arduino-esp32/package_esp32_index.jsonSave your changes, then open Boards Manager from the IDE’s left sidebar. Search for esp32 and install esp32 by Espressif Systems. If it is already installed, use its version selector to update it.
This package adds the ESP32 compiler, upload tools and board definitions to the Arduino IDE.
Select your UM board
Open Tools → Board → esp32 and select your board’s definition.
| Your board | Arduino board selection |
|---|---|
| TinyPICO / TinyPICO Nano | UM TinyPICO |
TinyPICO and TinyPICO Nano use the UM TinyPICO definition. It configures the ESP32, flash and PSRAM for these boards.
Select the USB-to-serial port
TinyPICO connects to your computer through its onboard USB-to-serial bridge. Open Tools → Port and select the port that appears when you connect the board.
If no port appears, first check the USB data cable. If your operating system needs a driver, use the driver for the USB-to-serial chip fitted to your board. Set Serial Monitor to the baud rate used by your sketch.
Install Arduino IDE
Download Arduino IDE for your operating system and install it on your computer. If it is already installed, open it and continue below.
Add ESP32 board support
Open the IDE’s preferences and add this address to Additional Boards Manager URLs. Keep any addresses you already have.
https://espressif.github.io/arduino-esp32/package_esp32_index.jsonSave your changes, then open Boards Manager from the IDE’s left sidebar. Search for esp32 and install esp32 by Espressif Systems. If it is already installed, use its version selector to update it.
This package adds the ESP32-S2 compiler, upload tools and board definitions to the Arduino IDE.
Select your UM board
Open Tools → Board → esp32 and select your board’s definition.
| Your board | Arduino board selection |
|---|---|
| TinyS2 | UM TinyS2 |
| FeatherS2 | UM FeatherS2 |
| FeatherS2 Neo | UM FeatherS2 Neo |
Choose FeatherS2 Neo for the Neo board; FeatherS2 has a separate definition.
Enable USB serial
ESP32-S2 uses its USB-OTG peripheral for USB serial. Its UM board definitions configure the USB upload connection; S2 does not have the S3 Hardware CDC and JTAG mode.
| Tools menu | Setting |
|---|---|
| USB CDC On Boot | Enabled |
| USB DFU On Boot | Disabled for USB serial |
If your selected definition exposes Upload Mode, choose Internal USB for the board’s USB connector.
Install Arduino IDE
Download Arduino IDE for your operating system and install it on your computer. If it is already installed, open it and continue below.
Add ESP32 board support
Open the IDE’s preferences and add this address to Additional Boards Manager URLs. Keep any addresses you already have.
https://espressif.github.io/arduino-esp32/package_esp32_index.jsonSave your changes, then open Boards Manager from the IDE’s left sidebar. Search for esp32 and install esp32 by Espressif Systems. If it is already installed, use its version selector to update it.
This package adds the ESP32-S3 compiler, upload tools and board definitions to the Arduino IDE.
Select your UM board
Open Tools → Board → esp32 and select your board’s definition.
| Your board | Arduino board selection |
|---|---|
| TinyS3 | UM TinyS3 |
| FeatherS3 | UM FeatherS3 |
| ProS3 | UM ProS3 |
The board selection configures its flash, PSRAM and pin definitions. These are the names for the three original boards listed above.
Enable USB serial
UM ESP32-S3 boards use the chip’s native USB connection. The settings below enable USB serial using Hardware CDC and JTAG.
| Tools menu | Setting |
|---|---|
| USB CDC On Boot | Enabled |
| USB Mode | Hardware CDC and JTAG |
| Upload Mode | UART0 / Hardware CDC |
USB-OTG (TinyUSB) also supports USB serial, as well as USB functions such as keyboards and mice. Keep USB CDC On Boot enabled when using it for serial communication.
Install Arduino IDE
Download Arduino IDE for your operating system and install it on your computer. If it is already installed, open it and continue below.
Add ESP32 board support
Open the IDE’s preferences and add this address to Additional Boards Manager URLs. Keep any addresses you already have.
https://espressif.github.io/arduino-esp32/package_esp32_index.jsonSave your changes, then open Boards Manager from the IDE’s left sidebar. Search for esp32 and install esp32 by Espressif Systems. If it is already installed, use its version selector to update it.
This package adds the ESP32-C6 compiler, upload tools and board definitions to the Arduino IDE.
Select your UM board
Open Tools → Board → esp32 and select your board’s definition.
| Your board | Arduino board selection |
|---|---|
| TinyC6 | UM TinyC6 |
UM TinyC6 configures the ESP32-C6 and the original TinyC6’s 8 MB flash. This table describes the original board.
Enable USB serial
ESP32-C6 uses its built-in USB Serial/JTAG controller. The UM TinyC6 definition configures this connection; C6 does not support USB-OTG (TinyUSB).
| Tools menu | Setting |
|---|---|
| USB CDC On Boot | Enabled |
There is no USB Mode choice needed for UM TinyC6: USB Serial/JTAG is configured by its board definition.
Choose your MCU
Download CircuitPython for your board
The original ESP32 has no native USB, so it cannot use the UF2 bootloader or show a CIRCUITPY drive. CircuitPython is installed as a .bin file over the board’s USB-to-serial connection.
Open your board’s page on circuitpython.org. The web installer in step 3 downloads the file for you; for esptool, download the latest stable .bin.
| Your board | CircuitPython download |
|---|---|
| TinyPICO | TinyPICO |
| TinyPICO Nano | TinyPICO NANO |
Connect the board
Connect your board with a USB data cable and close any serial monitor. TinyPICO and TinyPICO Nano enter download mode automatically when the flashing tool starts; there are no buttons to press.
Install CircuitPython
Installing erases the board’s flash.
- In a browser that supports Web Serial, such as Chrome or Edge, click OPEN INSTALLER on your board’s page.
- Click Connect and select the board’s serial port.
- Follow the installer’s steps. When it finishes, press RESET.
Install with esptool
These commands are for esptool 5.4.0, the latest release. Replace PORT with your board’s port and firmware.bin with the downloaded file. esptool documentation →
- You must erase the flash first.
- Write the .bin at address
0x0.
esptool --chip esp32 --port PORT erase-flash
esptool --chip esp32 --port PORT write-flash 0x0 firmware.binConnect to CircuitPython
There is no CIRCUITPY drive. Open the board’s serial port at 115200 baud, for example in Thonny, to reach the Python prompt. To edit files over Wi-Fi, set up CircuitPython’s web workflow.
Download CircuitPython for your board
Your board ships with CircuitPython and the UF2 bootloader installed. Follow these steps to update CircuitPython, or to reinstall it after using Arduino, MicroPython or ESP-IDF.
Open your board’s page on circuitpython.org and download the latest CircuitPython version as a .uf2 file.
| Your board | CircuitPython download | Bootloader drive |
|---|---|---|
| TinyS2 | TinyS2 | TINYS2BOOT |
| FeatherS2 | FeatherS2 | UFTHRS2BOOT |
| FeatherS2 Neo | FeatherS2 Neo | FS2NEOBOOT |
- .uf2 installs by copying it onto the bootloader drive. Use it to install or update CircuitPython.
- .bin is a complete firmware image, written over USB with the web installer or esptool while the board is in download mode. It doesn’t need the UF2 bootloader; use it if the bootloader isn’t installed.
Whichever file you use, once CircuitPython is running your board appears as a USB drive named CIRCUITPY, which holds your code.
Put your board into UF2 bootloader mode
The UF2 bootloader (TinyUF2) is a small program, separate from CircuitPython. In bootloader mode your board appears as a USB drive named for the board, such as TINYS2BOOT; the table in step 1 lists the name for each board. This bootloader drive is only for installing CircuitPython; it is not where your code lives.
Press and release RESET.
When the RGB LED turns purple, press and release BOOT.
Your board’s bootloader drive appears on your computer.
Every new UM board that ships with CircuitPython has the UF2 bootloader installed. If the LED turns purple but no drive appears, BOOT was pressed too late: run the sequence again and press BOOT while the LED is still purple.
LED doesn’t turn purple? Install the UF2 bootloader.
Copy the .uf2 file to the bootloader drive
Drag the .uf2 file onto your board’s bootloader drive, not onto CIRCUITPY. The board installs it and restarts by itself. Your computer may warn that the drive was removed; this is normal.
When the CIRCUITPY drive appears, CircuitPython is running.
Download CircuitPython for your board
Your board ships with CircuitPython and the UF2 bootloader installed. Follow these steps to update CircuitPython, or to reinstall it after using Arduino, MicroPython or ESP-IDF.
Open your board’s page on circuitpython.org and download the latest CircuitPython version as a .uf2 file.
| Your board | CircuitPython download | Bootloader drive |
|---|---|---|
| TinyS3[D] / TinyS3 | TinyS3 | TINYS3BOOT |
| FeatherS3[D] / FeatherS3 | FeatherS3 | UFTHRS3BOOT |
| ProS3[D] / ProS3 | ProS3 | PROS3BOOT |
| EdgeS3[D] | EdgeS3[D] | EDGES3BOOT |
| NanoS3 | NanoS3 | NANOS3BOOT |
| OMGS3 | OMGS3 | OMGS3BOOT |
| FeatherS3 Neo | FeatherS3 Neo | UFTHS3NBOOT |
- .uf2 installs by copying it onto the bootloader drive. Use it to install or update CircuitPython.
- .bin is a complete firmware image, written over USB with the web installer or esptool while the board is in download mode. It doesn’t need the UF2 bootloader; use it if the bootloader isn’t installed.
Whichever file you use, once CircuitPython is running your board appears as a USB drive named CIRCUITPY, which holds your code.
Put your board into UF2 bootloader mode
The UF2 bootloader (TinyUF2) is a small program, separate from CircuitPython. In bootloader mode your board appears as a USB drive named for the board, such as TINYS3BOOT; the table in step 1 lists the name for each board. This bootloader drive is only for installing CircuitPython; it is not where your code lives.
Press and release RESET.
When the RGB LED turns purple, press and release BOOT.
Your board’s bootloader drive appears on your computer.
Every new UM board that ships with CircuitPython has the UF2 bootloader installed. If the LED turns purple but no drive appears, BOOT was pressed too late: run the sequence again and press BOOT while the LED is still purple.
EdgeS3[D] has no RGB LED, so there is no colour to watch for. Use the bootloader instructions on its CircuitPython download page.
LED doesn’t turn purple? Install the UF2 bootloader.
Copy the .uf2 file to the bootloader drive
Drag the .uf2 file onto your board’s bootloader drive, not onto CIRCUITPY. The board installs it and restarts by itself. Your computer may warn that the drive was removed; this is normal.
When the CIRCUITPY drive appears, CircuitPython is running.
Download CircuitPython for your board
ESP32-C6 has a USB Serial/JTAG connection but not the native USB needed for the UF2 bootloader or a CIRCUITPY drive. CircuitPython is installed as a .bin file over that connection.
Open your board’s page on circuitpython.org. The web installer in step 3 downloads the file for you; for esptool, download the latest stable .bin.
| Your board | CircuitPython download |
|---|---|
| TinyC6 | TinyC6 |
Enter download mode
Connect the board with a USB data cable and close any serial monitor.
Keep BOOT pressed.
Press and release RESET while still holding BOOT.
Select the download-mode port on your computer.
There is no LED signal to confirm download mode. Check your computer’s serial-port list instead.
Install CircuitPython
Installing erases the board’s flash.
- In a browser that supports Web Serial, such as Chrome or Edge, click OPEN INSTALLER on your board’s page.
- Click Connect and select the board’s USB Serial/JTAG port.
- Follow the installer’s steps. When it finishes, press RESET.
Install with esptool
These commands are for esptool 5.4.0, the latest release. Replace PORT with your board’s port and firmware.bin with the downloaded file. esptool documentation →
- You must erase the flash first.
- Write the .bin at address
0x0.
esptool --chip esp32c6 --port PORT erase-flash
esptool --chip esp32c6 --port PORT write-flash 0x0 firmware.binConnect to CircuitPython
There is no CIRCUITPY drive. In Thonny, select CircuitPython (generic) and your board’s serial port to reach the Python prompt and the files on the board. To edit files over Wi-Fi, set up CircuitPython’s web workflow.
Choose your MCU
Download MicroPython for your board
Your board ships with MicroPython installed. Use these steps to update it, or to reinstall it after using another platform.
Open your board’s page on micropython.org and download the latest release as a .bin file.
| Your board | MicroPython download |
|---|---|
| TinyPICO | TinyPICO |
Connect the board
Connect TinyPICO with a USB data cable and close any serial monitor. It enters download mode automatically through its USB-to-serial bridge; it has no BOOT button.
Install MicroPython with esptool
These commands are for esptool 5.4.0, the latest release. Replace PORT with your board’s port and firmware.bin with the downloaded file. esptool documentation →
- You must erase the flash first.
- Write the .bin at address
0x1000.
esptool --chip esp32 --port PORT erase-flash
esptool --chip esp32 --port PORT write-flash 0x1000 firmware.bin
When it finishes, MicroPython starts automatically.
Connect to MicroPython
MicroPython doesn’t show a drive on your computer. You reach the Python prompt and the board’s files over its serial port.
With mpremote, install it once, list the ports, then open the prompt on your board’s port:
pipx install mpremote
mpremote connect list
mpremote connect PORT repl
Or, in Thonny, select MicroPython (ESP32) and your board’s port.
Download MicroPython for your board
Your board ships with CircuitPython. Installing MicroPython replaces it.
Open your board’s page on micropython.org and download the latest release as a .bin file.
| Your board | MicroPython download |
|---|---|
| TinyS2 | TinyS2 |
| FeatherS2 | FeatherS2 |
| FeatherS2 Neo | FeatherS2 Neo |
Enter download mode
Connect the board with a USB data cable and close any serial monitor.
Keep BOOT pressed.
Press and release RESET while still holding BOOT.
Select the download-mode port on your computer.
There is no LED signal to confirm download mode. Check your computer’s serial-port list instead.
Install MicroPython with esptool
These commands are for esptool 5.4.0, the latest release. Replace PORT with your board’s port and firmware.bin with the downloaded file. esptool documentation →
- You must erase the flash first.
- Write the .bin at address
0x1000.
esptool --chip esp32s2 --port PORT erase-flash
esptool --chip esp32s2 --port PORT write-flash 0x1000 firmware.bin
When it finishes, press RESET to start MicroPython.
Connect to MicroPython
MicroPython doesn’t show a drive on your computer. You reach the Python prompt and the board’s files over its serial port.
With mpremote, install it once, list the ports, then open the prompt on your board’s port:
pipx install mpremote
mpremote connect list
mpremote connect PORT repl
Or, in Thonny, select MicroPython (ESP32) and your board’s port.
Download MicroPython for your board
Your board ships with CircuitPython. Installing MicroPython replaces it.
Open your board’s page on micropython.org and download the latest release as a .bin file.
Enter download mode
Connect the board with a USB data cable and close any serial monitor.
Keep BOOT pressed.
Press and release RESET while still holding BOOT.
Select the download-mode port on your computer.
There is no LED signal to confirm download mode. Check your computer’s serial-port list instead.
Install MicroPython with esptool
These commands are for esptool 5.4.0, the latest release. Replace PORT with your board’s port and firmware.bin with the downloaded file. esptool documentation →
- You must erase the flash first.
- Write the .bin at address
0.
esptool --chip esp32s3 --port PORT erase-flash
esptool --chip esp32s3 --port PORT write-flash 0 firmware.bin
When it finishes, press RESET to start MicroPython.
Connect to MicroPython
MicroPython doesn’t show a drive on your computer. You reach the Python prompt and the board’s files over its serial port.
With mpremote, install it once, list the ports, then open the prompt on your board’s port:
pipx install mpremote
mpremote connect list
mpremote connect PORT repl
Or, in Thonny, select MicroPython (ESP32) and your board’s port.
Download MicroPython for your board
TinyC6[D] ships with MicroPython installed; the original TinyC6 ships with CircuitPython. Installing MicroPython replaces the firmware on your board.
Open your board’s page on micropython.org and download the latest release as a .bin file.
| Your board | MicroPython download |
|---|---|
| TinyC6 | TinyC6 |
Enter download mode
Connect the board with a USB data cable and close any serial monitor.
Keep BOOT pressed.
Press and release RESET while still holding BOOT.
Select the download-mode port on your computer.
There is no LED signal to confirm download mode. Check your computer’s serial-port list instead.
Install MicroPython with esptool
These commands are for esptool 5.4.0, the latest release. Replace PORT with your board’s port and firmware.bin with the downloaded file. esptool documentation →
- You must erase the flash first.
- Write the .bin at address
0.
esptool --chip esp32c6 --port PORT erase-flash
esptool --chip esp32c6 --port PORT write-flash 0 firmware.bin
When it finishes, press RESET to start MicroPython.
Connect to MicroPython
MicroPython doesn’t show a drive on your computer. You reach the Python prompt and the board’s files over its serial port.
With mpremote, install it once, list the ports, then open the prompt on your board’s port:
pipx install mpremote
mpremote connect list
mpremote connect PORT repl
Or, in Thonny, select MicroPython (ESP32) and your board’s port.
Choose your MCU
Install ESP-IDF
Install ESP-IDF v6.1, the current stable release, with Espressif’s ESP-IDF Installation Manager (EIM). It installs the compiler, Python tools and example projects together.
When it finishes, open a terminal with the ESP-IDF environment active. On macOS and Linux, run the activation command EIM shows at the end of the installation.
Download EIM →EIM documentation →
Prefer an IDE? The ESP-IDF extension for VS Code installs and runs the same tools. VS Code extension →
Build the hello_world example
Copy the example into a working folder, set the target to esp32 and build it:
cp -r $IDF_PATH/examples/get-started/hello_world .
cd hello_world
idf.py set-target esp32
idf.py build
Console output uses the board’s USB-to-serial connection; no configuration change is needed.
Connect the board
Connect TinyPICO with a USB data cable and close any serial monitor. It enters download mode automatically through its USB-to-serial bridge; it has no BOOT button.
Flash and open the monitor
Replace PORT with your board’s port, such as /dev/cu.usbmodem01 on macOS or COM4 on Windows.
idf.py -p PORT flash monitor
The program starts automatically after flashing. Exit the monitor with Ctrl+].
Install ESP-IDF
Install ESP-IDF v6.1, the current stable release, with Espressif’s ESP-IDF Installation Manager (EIM). It installs the compiler, Python tools and example projects together.
When it finishes, open a terminal with the ESP-IDF environment active. On macOS and Linux, run the activation command EIM shows at the end of the installation.
Download EIM →EIM documentation →
Prefer an IDE? The ESP-IDF extension for VS Code installs and runs the same tools. VS Code extension →
Build the hello_world example
Copy the example into a working folder, set the target to esp32s2 and build it:
cp -r $IDF_PATH/examples/get-started/hello_world .
cd hello_world
idf.py set-target esp32s2
idf.py build
ESP32-S2 sends console output to UART0 by default. To see it over the board’s USB connector, run idf.py menuconfig, set Channel for console output to USB CDC, then build again.
Enter download mode for the first flash
Your board ships running CircuitPython, so enter download mode before the first ESP-IDF flash. Once your program has USB CDC enabled, later flashes work without the buttons.
Keep BOOT pressed.
Press and release RESET while still holding BOOT.
Select the download-mode port on your computer.
There is no LED signal to confirm download mode. Check your computer’s serial-port list instead.
Flash and open the monitor
Replace PORT with your board’s port, such as /dev/cu.usbmodem01 on macOS or COM4 on Windows.
idf.py -p PORT flash monitor
If you entered download mode manually, press RESET after flashing to start your program, then reopen the monitor on the running board’s port if it changed. Exit the monitor with Ctrl+].
Install ESP-IDF
Install ESP-IDF v6.1, the current stable release, with Espressif’s ESP-IDF Installation Manager (EIM). It installs the compiler, Python tools and example projects together.
When it finishes, open a terminal with the ESP-IDF environment active. On macOS and Linux, run the activation command EIM shows at the end of the installation.
Download EIM →EIM documentation →
Prefer an IDE? The ESP-IDF extension for VS Code installs and runs the same tools. VS Code extension →
Build the hello_world example
Copy the example into a working folder, set the target to esp32s3 and build it:
cp -r $IDF_PATH/examples/get-started/hello_world .
cd hello_world
idf.py set-target esp32s3
idf.py build
For console input and output over the board’s USB connector, run idf.py menuconfig and set Channel for console output to USB Serial/JTAG, then build again.
Enter download mode for the first flash
Your board ships running CircuitPython, so enter download mode before the first ESP-IDF flash. After that, idf.py flash can usually put the board into download mode by itself over USB Serial/JTAG.
Keep BOOT pressed.
Press and release RESET while still holding BOOT.
Select the download-mode port on your computer.
There is no LED signal to confirm download mode. Check your computer’s serial-port list instead.
Flash and open the monitor
Replace PORT with your board’s port, such as /dev/cu.usbmodem01 on macOS or COM4 on Windows.
idf.py -p PORT flash monitor
If you entered download mode manually, press RESET after flashing to start your program, then reopen the monitor on the running board’s port if it changed. Exit the monitor with Ctrl+].
Install ESP-IDF
Install ESP-IDF v6.1, the current stable release, with Espressif’s ESP-IDF Installation Manager (EIM). It installs the compiler, Python tools and example projects together.
When it finishes, open a terminal with the ESP-IDF environment active. On macOS and Linux, run the activation command EIM shows at the end of the installation.
Download EIM →EIM documentation →
Prefer an IDE? The ESP-IDF extension for VS Code installs and runs the same tools. VS Code extension →
Build the hello_world example
Copy the example into a working folder, set the target to esp32c6 and build it:
cp -r $IDF_PATH/examples/get-started/hello_world .
cd hello_world
idf.py set-target esp32c6
idf.py build
For console input and output over the board’s USB connector, run idf.py menuconfig and set Channel for console output to USB Serial/JTAG, then build again.
Enter download mode for the first flash
Enter download mode before the first ESP-IDF flash. After that, idf.py flash can usually put the board into download mode by itself over USB Serial/JTAG.
Keep BOOT pressed.
Press and release RESET while still holding BOOT.
Select the download-mode port on your computer.
There is no LED signal to confirm download mode. Check your computer’s serial-port list instead.
Flash and open the monitor
Replace PORT with your board’s port, such as /dev/cu.usbmodem01 on macOS or COM4 on Windows.
idf.py -p PORT flash monitor
If you entered download mode manually, press RESET after flashing to start your program, then reopen the monitor on the running board’s port if it changed. Exit the monitor with Ctrl+].
Choose your MCU
Install PlatformIO IDE
Install Visual Studio Code, then install the PlatformIO IDE extension from the VS Code Extensions view.
Use pioarduino for Arduino ESP32 core 3.x
Configure your board manually
Create a new PlatformIO project, then replace the contents of platformio.ini with the configuration below. Change the board line to your board’s ID from the table.
[env:tinypico]
platform = https://github.com/pioarduino/platform-espressif32/releases/download/stable/platform-espressif32.zip
board = tinypico
framework = arduino
monitor_speed = 115200
| Your board | Board ID |
|---|---|
| TinyPICO / TinyPICO Nano | tinypico |
Serial output uses the board’s USB-to-serial connection, so no USB build flags are needed.
Connect the board
Connect TinyPICO with a USB data cable and close any serial monitor. It enters download mode automatically through its USB-to-serial bridge; it has no BOOT button.
Build and upload
Click Upload in the PlatformIO toolbar. The program starts automatically after the upload. Open the Serial Monitor to see your program’s output.
Install PlatformIO IDE
Install Visual Studio Code, then install the PlatformIO IDE extension from the VS Code Extensions view.
Use pioarduino for Arduino ESP32 core 3.x
Configure your board manually
Create a new PlatformIO project, then replace the contents of platformio.ini with the configuration below. Change the board line to your board’s ID from the table.
[env:tinys2]
platform = https://github.com/pioarduino/platform-espressif32/releases/download/stable/platform-espressif32.zip
board = um_tinys2
framework = arduino
monitor_speed = 115200
build_flags =
-D ARDUINO_USB_CDC_ON_BOOT=1
| Your board | Board ID |
|---|---|
| TinyS2 | um_tinys2 |
| FeatherS2 | um_feathers2 |
| FeatherS2 Neo | um_feathers2_neo |
ARDUINO_USB_CDC_ON_BOOT=1 sends Serial output over the board’s USB connection. ESP32-S2 uses its USB-OTG peripheral; don’t copy the S3 Hardware CDC and JTAG setting.
Enter download mode for the first upload
If your board is running firmware from another platform, such as CircuitPython, put it into download mode before your first upload.
Keep BOOT pressed.
Press and release RESET while still holding BOOT.
Select the download-mode port on your computer.
There is no LED signal to confirm download mode. Check your computer’s serial-port list instead.
Build and upload
Click Upload in the PlatformIO toolbar. If you entered download mode manually, press RESET after the upload finishes to start your program. Open the Serial Monitor to see your program’s output.
Install PlatformIO IDE
Install Visual Studio Code, then install the PlatformIO IDE extension from the VS Code Extensions view.
Use pioarduino for Arduino ESP32 core 3.x
Configure your board manually
Create a new PlatformIO project, then replace the contents of platformio.ini with the configuration below. Change the board line to your board’s ID from the table.
[env:tinys3]
platform = https://github.com/pioarduino/platform-espressif32/releases/download/stable/platform-espressif32.zip
board = um_tinys3
framework = arduino
monitor_speed = 115200
board_upload.wait_for_upload_port = false
build_flags =
-D ARDUINO_USB_MODE=1
-D ARDUINO_USB_CDC_ON_BOOT=1
| Your board | Board ID |
|---|---|
| TinyS3[D] / TinyS3 | um_tinys3 |
| FeatherS3[D] / FeatherS3 | um_feathers3 |
| ProS3[D] / ProS3 | um_pros3 |
| EdgeS3[D] | um_edges3_d |
| NanoS3 | um_nanos3 |
| OMGS3 | um_omgs3 |
| FeatherS3 Neo | um_feathers3_neo |
ARDUINO_USB_MODE=1 and ARDUINO_USB_CDC_ON_BOOT=1 send Serial output over the board’s USB connection using Hardware CDC and JTAG.
For a complete working project, see the UM FeatherS3 PlatformIO example. It uses the same settings; change its board line for other UM S3 boards.
Enter download mode for the first upload
If your board is running firmware from another platform, such as CircuitPython, put it into download mode before your first upload.
Keep BOOT pressed.
Press and release RESET while still holding BOOT.
Select the download-mode port on your computer.
There is no LED signal to confirm download mode. Check your computer’s serial-port list instead.
Build and upload
Click Upload in the PlatformIO toolbar. If you entered download mode manually, press RESET after the upload finishes to start your program. Open the Serial Monitor to see your program’s output.
Install PlatformIO IDE
Install Visual Studio Code, then install the PlatformIO IDE extension from the VS Code Extensions view.
Use pioarduino for Arduino ESP32 core 3.x
Configure your board manually
Create a new PlatformIO project, then replace the contents of platformio.ini with the configuration below. Change the board line to your board’s ID from the table.
[env:tinyc6]
platform = https://github.com/pioarduino/platform-espressif32/releases/download/stable/platform-espressif32.zip
board = um_tinyc6
framework = arduino
monitor_speed = 115200
build_flags =
-D ARDUINO_USB_CDC_ON_BOOT=1
| Your board | Board ID |
|---|---|
| TinyC6 | um_tinyc6 |
ARDUINO_USB_CDC_ON_BOOT=1 sends Serial output over the board’s USB Serial/JTAG connection.
Enter download mode for the first upload
If your board is running firmware from another platform, such as CircuitPython, put it into download mode before your first upload.
Keep BOOT pressed.
Press and release RESET while still holding BOOT.
Select the download-mode port on your computer.
There is no LED signal to confirm download mode. Check your computer’s serial-port list instead.
Build and upload
Click Upload in the PlatformIO toolbar. If you entered download mode manually, press RESET after the upload finishes to start your program. Open the Serial Monitor to see your program’s output.
Choose your MCU
Install the tools
Install Visual Studio 2022 and the .NET nanoFramework extension from the Visual Studio Marketplace. Then install the .NET 6.0 SDK or later and the nanoff flashing tool:
dotnet tool install -g nanoff
Connect the board
Connect TinyPICO with a USB data cable and close any serial monitor. It enters download mode automatically through its USB-to-serial bridge; it has no BOOT button.
Flash the nanoFramework firmware
With --platform esp32, nanoff detects your board and chooses the matching firmware.
Replace PORT with your board’s port. nanoff --listports lists the available ports.
nanoff --platform esp32 --serialport PORT --update
Create and deploy an app
In Visual Studio, choose File → New → Project and pick Blank Application (nanoFramework). Build it, check your board responds to Ping in Device Explorer, then press F5 to deploy and debug.
Install the tools
Install Visual Studio 2022 and the .NET nanoFramework extension from the Visual Studio Marketplace. Then install the .NET 6.0 SDK or later and the nanoff flashing tool:
dotnet tool install -g nanoff
Enter download mode
Connect the board with a USB data cable and close any serial monitor. Enter download mode before flashing.
Keep BOOT pressed.
Press and release RESET while still holding BOOT.
Select the download-mode port on your computer.
There is no LED signal to confirm download mode. Check your computer’s serial-port list instead.
Flash the nanoFramework firmware
Use the ESP32_S3 target, or ESP32_S3_BLE if you need Bluetooth LE. Both work with UM ESP32-S3 boards through their USB connection.
Replace PORT with your board’s port. nanoff --listports lists the available ports.
nanoff --target ESP32_S3 --serialport PORT --update
When flashing finishes, press RESET to start the new firmware.
Create and deploy an app
In Visual Studio, choose File → New → Project and pick Blank Application (nanoFramework). Build it, check your board responds to Ping in Device Explorer, then press F5 to deploy and debug.
Choose your MCU
Install Rust
Install Rust with rustup. It also installs Cargo, Rust’s build tool and package manager, which the cargo commands in the following steps use.
Install the Xtensa toolchain
ESP32 uses an Xtensa CPU, which needs Espressif’s Rust toolchain. Install it with espup, then follow espup’s instructions to load its environment:
cargo install espup --locked
espup install
Install esp-generate and espflash
esp-generate creates a project for your chip; espflash flashes it.
cargo install esp-generate --locked
cargo install espflash --lockedGenerate a project
Create a project for esp32, or run esp-generate on its own to choose options interactively:
esp-generate --headless -o esp32 my-project
cd my-project
Choose pins from your UM board’s pin reference; the chip support alone doesn’t know your board’s LED, regulator or battery connections.
Connect the board
Connect TinyPICO with a USB data cable and close any serial monitor. It enters download mode automatically through its USB-to-serial bridge; it has no BOOT button.
Build, flash and run
cargo run builds the project, flashes it with espflash and opens the serial monitor.
cargo run --release
Install Rust
Install Rust with rustup. It also installs Cargo, Rust’s build tool and package manager, which the cargo commands in the following steps use.
Install the Xtensa toolchain
ESP32-S2 uses an Xtensa CPU, which needs Espressif’s Rust toolchain. Install it with espup, then follow espup’s instructions to load its environment:
cargo install espup --locked
espup install
Install esp-generate and espflash
esp-generate creates a project for your chip; espflash flashes it.
cargo install esp-generate --locked
cargo install espflash --lockedGenerate a project
Create a project for esp32s2, or run esp-generate on its own to choose options interactively:
esp-generate --headless -o esp32s2 my-project
cd my-project
Choose pins from your UM board’s pin reference; the chip support alone doesn’t know your board’s LED, regulator or battery connections.
Enter download mode
Connect the board with a USB data cable and close any serial monitor. Enter download mode before flashing.
Keep BOOT pressed.
Press and release RESET while still holding BOOT.
Select the download-mode port on your computer.
There is no LED signal to confirm download mode. Check your computer’s serial-port list instead.
Build, flash and run
cargo run builds the project, flashes it with espflash and opens the serial monitor.
cargo run --release
When flashing finishes, press RESET to start the new firmware.
Install Rust
Install Rust with rustup. It also installs Cargo, Rust’s build tool and package manager, which the cargo commands in the following steps use.
Install the Xtensa toolchain
ESP32-S3 uses an Xtensa CPU, which needs Espressif’s Rust toolchain. Install it with espup, then follow espup’s instructions to load its environment:
cargo install espup --locked
espup install
Install esp-generate and espflash
esp-generate creates a project for your chip; espflash flashes it.
cargo install esp-generate --locked
cargo install espflash --lockedGenerate a project
Create a project for esp32s3, or run esp-generate on its own to choose options interactively:
esp-generate --headless -o esp32s3 my-project
cd my-project
Choose pins from your UM board’s pin reference; the chip support alone doesn’t know your board’s LED, regulator or battery connections.
Enter download mode
Connect the board with a USB data cable and close any serial monitor. Enter download mode before flashing.
Keep BOOT pressed.
Press and release RESET while still holding BOOT.
Select the download-mode port on your computer.
There is no LED signal to confirm download mode. Check your computer’s serial-port list instead.
Build, flash and run
cargo run builds the project, flashes it with espflash and opens the serial monitor.
cargo run --release
When flashing finishes, press RESET to start the new firmware.
Install Rust
Install Rust with rustup. It also installs Cargo, Rust’s build tool and package manager, which the cargo commands in the following steps use.
Install the RISC-V toolchain
ESP32-C6 uses a RISC-V CPU, supported by the standard Rust toolchain. Add the source component and the C6 target:
rustup toolchain install stable --component rust-src
rustup target add riscv32imac-unknown-none-elf
Install esp-generate and espflash
esp-generate creates a project for your chip; espflash flashes it.
cargo install esp-generate --locked
cargo install espflash --lockedGenerate a project
Create a project for esp32c6, or run esp-generate on its own to choose options interactively:
esp-generate --headless -o esp32c6 my-project
cd my-project
Choose pins from your UM board’s pin reference; the chip support alone doesn’t know your board’s LED, regulator or battery connections.
Enter download mode
Connect the board with a USB data cable and close any serial monitor. Enter download mode before flashing.
Keep BOOT pressed.
Press and release RESET while still holding BOOT.
Select the download-mode port on your computer.
There is no LED signal to confirm download mode. Check your computer’s serial-port list instead.
Build, flash and run
cargo run builds the project, flashes it with espflash and opens the serial monitor.
cargo run --release
When flashing finishes, press RESET to start the new firmware.
Choose your MCU
Use the generic target
TinyGo has no UM board targets. Use the generic esp32-generic target and take pin numbers from your UM board’s pin reference.
Connect the board
Connect TinyPICO with a USB data cable and close any serial monitor. It enters download mode automatically through its USB-to-serial bridge; it has no BOOT button.
Flash your program
From your program’s folder, build and flash it. Replace PORT with your board’s port. TinyGo flashes the board itself; no esptool is needed.
tinygo flash -target=esp32-generic -port=PORT .
Use the generic target
TinyGo has no UM board targets. Use the generic esp32s3-generic target and take pin numbers from your UM board’s pin reference.
Enter download mode
Connect the board with a USB data cable and close any serial monitor. Enter download mode before flashing.
Keep BOOT pressed.
Press and release RESET while still holding BOOT.
Select the download-mode port on your computer.
There is no LED signal to confirm download mode. Check your computer’s serial-port list instead.
Flash your program
From your program’s folder, build and flash it. Replace PORT with your board’s port. TinyGo flashes the board itself; no esptool is needed.
tinygo flash -target=esp32s3-generic -port=PORT .
When flashing finishes, press RESET to start the new firmware.
Choose your MCU
Download Espruino
Espruino runs on the original ESP32. Download the latest ESP32 firmware from the Espruino download page. You need three files from it: bootloader.bin, partitions_espruino.bin and espruino_esp32.bin.
Connect the board
Connect TinyPICO with a USB data cable and close any serial monitor. It enters download mode automatically through its USB-to-serial bridge; it has no BOOT button.
Install Espruino with esptool
These commands are for esptool 5.4.0, the latest release. Replace PORT with your board’s port. esptool documentation →
esptool --chip esp32 --port PORT --baud 921600 write-flash --flash-mode dio --flash-freq 40m --flash-size detect 0x1000 bootloader.bin 0x8000 partitions_espruino.bin 0x10000 espruino_esp32.bin
To update Espruino later, write only espruino_esp32.bin at 0x10000.
Connect to Espruino
Open the Espruino Web IDE, or any serial terminal, and connect to your board’s port at 115200 baud.
Choose your MCU
Download the Whitecat Console
Lua RTOS runs on the original ESP32. Its last update was in December 2022. The Whitecat Console (wcc) flashes the prebuilt firmware.
Connect the board
Connect TinyPICO with a USB data cable and close any serial monitor. It enters download mode automatically through its USB-to-serial bridge; it has no BOOT button.
Flash Lua RTOS
List the ports, then flash the latest firmware and filesystem. Replace PORT with your board’s port.
wcc -ports
wcc -p PORT -f -ffsConnect to the Lua shell
Open your board’s port in a serial terminal at 115200 baud, 8 data bits, no parity, 1 stop bit.
Choose your MCU
Download the AtomVM image
Download the latest AtomVM release image for ESP32: AtomVM-esp32-v0.6.6.img for Erlang, or AtomVM-esp32-elixir-v0.6.6.img for Elixir.
Connect the board
Connect TinyPICO with a USB data cable and close any serial monitor. It enters download mode automatically through its USB-to-serial bridge; it has no BOOT button.
Install AtomVM with esptool
These commands are for esptool 5.4.0, the latest release. Replace PORT with your board’s port. esptool documentation →
- Erase the flash first.
- Write the image at address
0x1000.
esptool --chip esp32 --port PORT erase-flash
esptool --chip esp32 --port PORT write-flash 0x1000 AtomVM-esp32-v0.6.6.img
Deploy your application
Package your application and flash it alongside AtomVM. With rebar3 for Erlang:
rebar3 atomvm packbeam
rebar3 atomvm esp32_flash --port PORT
Or with mix for Elixir:
mix atomvm.packbeam
mix atomvm.esp32.flash --port PORT
Download the AtomVM image
Download the latest AtomVM release image for ESP32-S2: AtomVM-esp32s2-v0.6.6.img for Erlang, or AtomVM-esp32s2-elixir-v0.6.6.img for Elixir.
Enter download mode
Connect the board with a USB data cable and close any serial monitor. Enter download mode before flashing.
Keep BOOT pressed.
Press and release RESET while still holding BOOT.
Select the download-mode port on your computer.
There is no LED signal to confirm download mode. Check your computer’s serial-port list instead.
Install AtomVM with esptool
These commands are for esptool 5.4.0, the latest release. Replace PORT with your board’s port. esptool documentation →
- Erase the flash first.
- Write the image at address
0x1000.
esptool --chip esp32s2 --port PORT erase-flash
esptool --chip esp32s2 --port PORT write-flash 0x1000 AtomVM-esp32s2-v0.6.6.img
When flashing finishes, press RESET to start the new firmware.
Deploy your application
Package your application and flash it alongside AtomVM. With rebar3 for Erlang:
rebar3 atomvm packbeam
rebar3 atomvm esp32_flash --port PORT
Or with mix for Elixir:
mix atomvm.packbeam
mix atomvm.esp32.flash --port PORT
Download the AtomVM image
Download the latest AtomVM release image for ESP32-S3: AtomVM-esp32s3-v0.6.6.img for Erlang, or AtomVM-esp32s3-elixir-v0.6.6.img for Elixir.
Enter download mode
Connect the board with a USB data cable and close any serial monitor. Enter download mode before flashing.
Keep BOOT pressed.
Press and release RESET while still holding BOOT.
Select the download-mode port on your computer.
There is no LED signal to confirm download mode. Check your computer’s serial-port list instead.
Install AtomVM with esptool
These commands are for esptool 5.4.0, the latest release. Replace PORT with your board’s port. esptool documentation →
- Erase the flash first.
- Write the image at address
0x0.
esptool --chip esp32s3 --port PORT erase-flash
esptool --chip esp32s3 --port PORT write-flash 0x0 AtomVM-esp32s3-v0.6.6.img
When flashing finishes, press RESET to start the new firmware.
Deploy your application
Package your application and flash it alongside AtomVM. With rebar3 for Erlang:
rebar3 atomvm packbeam
rebar3 atomvm esp32_flash --port PORT
Or with mix for Elixir:
mix atomvm.packbeam
mix atomvm.esp32.flash --port PORT
Download the AtomVM image
Download the latest AtomVM release image for ESP32-C6: AtomVM-esp32c6-v0.6.6.img for Erlang, or AtomVM-esp32c6-elixir-v0.6.6.img for Elixir.
Enter download mode
Connect the board with a USB data cable and close any serial monitor. Enter download mode before flashing.
Keep BOOT pressed.
Press and release RESET while still holding BOOT.
Select the download-mode port on your computer.
There is no LED signal to confirm download mode. Check your computer’s serial-port list instead.
Install AtomVM with esptool
These commands are for esptool 5.4.0, the latest release. Replace PORT with your board’s port. esptool documentation →
- Erase the flash first.
- Write the image at address
0x0.
esptool --chip esp32c6 --port PORT erase-flash
esptool --chip esp32c6 --port PORT write-flash 0x0 AtomVM-esp32c6-v0.6.6.img
When flashing finishes, press RESET to start the new firmware.
Deploy your application
Package your application and flash it alongside AtomVM. With rebar3 for Erlang:
rebar3 atomvm packbeam
rebar3 atomvm esp32_flash --port PORT
Or with mix for Elixir:
mix atomvm.packbeam
mix atomvm.esp32.flash --port PORT
Choose your MCU
Install phpflash
PHP on ESP32 runs the PHP engine on an ESP32-S3 with external PSRAM and 8 MB or more flash. The phpflash tool builds and flashes it. Download the phpflash release for your computer and put it on your path.
Set up and create a project
Install the build tools and firmware sources once, then create a project:
phpflash system-setup
phpflash init my-project
cd my-project
Your PHP code goes in project-src/index.php.
Enter download mode
Connect the board with a USB data cable and close any serial monitor. Enter download mode before flashing.
Keep BOOT pressed.
Press and release RESET while still holding BOOT.
Select the download-mode port on your computer.
There is no LED signal to confirm download mode. Check your computer’s serial-port list instead.
Build, flash and monitor
Build the firmware, flash it and watch the serial output:
phpflash build
phpflash flash
phpflash monitor
When flashing finishes, press RESET to start the new firmware.
Deployable projects
Ready-made firmware and connected applications for lighting, sensors and home automation. Follow each project’s supported hardware and configuration guide.

