If you already have CircuitPython on your ESP32-S3, you just need to boot the board into UF2 bootloader mode, and then copy the latest CircuitPython UF2 firmware file onto the drive via the file manager you use on your computer.
Download the latest release version of the UF2 bootloader for your specific ESP32-S3 board from here.
You are after the file named: tinyuf2-unexpectedmaker_BOARDNAME-xxx.zip that has the parts in it, NOT the UF2 updater file.
To install the ESP32-S3 UF2 bootloader on your board, you will need to have the latest esptool installed (3.2 as of this time). You can grab esptool tool from the github repo or pip install esptool
Unzip and put the .bin files into a folder, and then open a terminal session (or command prompt in Windows) and navigate to the folder.
To flash your board you need to plug it into your computer and put it into download mode. To do that you press and hold the [BOOT] button and then press & release [RESET], then let go of the [BOOT] button. If you are on Windows, you'll need to determine which COM port your board is connected to.
Now you just need to run the following command:
esptool.py --chip esp32s3 -p /dev/cu.usbmodem111101 --before=default_reset --after=no_reset write_flash --flash_mode dio --flash_size detect --flash_freq 80m 0x0 bootloader.bin 0x8000 partition-table.bin 0xe000 ota_data_initial.bin 0x410000 tinyuf2.bin
esptool.py --chip esp32s3 -p /dev/ttyACM0 --before=default_reset --after=no_reset write_flash --flash_mode dio --flash_size detect --flash_freq 80m 0x0 bootloader.bin 0x8000 partition-table.bin 0xe000 ota_data_initial.bin 0x410000 tinyuf2.bin
esptool --chip esp32s3 -p COMxxx --before=default_reset --after=no_reset write_flash --flash_mode dio --flash_size detect --flash_freq 80m 0x0 bootloader.bin 0x8000 partition-table.bin 0xe000 ota_data_initial.bin 0x410000 tinyuf2.bin
Your should then see the following results (or similar)
esptool.py v3.2-dev Serial port /dev/cu.usbmodem111101 Connecting... Chip is ESP32-S3 Features: WiFi, BLE Crystal is 40MHz MAC: 84:f7:03:c0:5f:d4 Uploading stub... Running stub... Stub running... Configuring flash size... Auto-detected Flash size: 16MB Flash will be erased from 0x00000000 to 0x00005fff... Flash will be erased from 0x00008000 to 0x00008fff... Flash will be erased from 0x0000e000 to 0x0000ffff... Flash will be erased from 0x00410000 to 0x00436fff... Compressed 21968 bytes to 13849... Wrote 21968 bytes (13849 compressed) at 0x00000000 in 0.4 seconds (effective 451.4 kbit/s)... Hash of data verified. Compressed 3072 bytes to 136... Wrote 3072 bytes (136 compressed) at 0x00008000 in 0.0 seconds (effective 529.7 kbit/s)... Hash of data verified. Compressed 8192 bytes to 31... Wrote 8192 bytes (31 compressed) at 0x0000e000 in 0.1 seconds (effective 688.0 kbit/s)... Hash of data verified. Compressed 157136 bytes to 98691... Wrote 157136 bytes (98691 compressed) at 0x00410000 in 1.8 seconds (effective 707.9 kbit/s)... Hash of data verified. Leaving... Hard resetting via RTS pin...Now all you need to do is reset your board and you will see the RGB LED flash green (maybe red first very quickly) and then the USB will be mounted into UF2 mode! That's it!
Now you can install any version of the CiruitPython firmware you like, for your specific ESP32-S3 board, simply by downloading the .uf2 version of the firmware and copying it onto the mounted UF2 drive. When it's copying, you'll see the RGB LED start flashing orange, until it's done!
You can always grab the latest "release" versions of CircuitPython from here.