Exciting news for developers! 🎉 Introducing Esp32sim, a tool that lets you run ESP32 firmware directly in your browser. This innovation simplifies testing and development, making it easier to bring your IoT projects to life. Check it out and elevate your codi…
mikroverk/esp32sim
esp32sim by @MattiaFiumara and co: mikroverk/esp32sim
the PR adds the TC001 as a board and fixes the cap: esp32sim#311
1 like · 16 views
esp32sim GitHub Overview: ESP32 Firmware Emulation, ROM Setup, and Web UI
esp32sim by mikroverk: mikroverk/esp32sim
esp32sim is an open-source Rust emulator for ESP32 firmware. This overview follows its execution model from release files and mask ROM configuration to modeled audio and display outputs, then shows the local web interface and the command-line choices used for custom firmware. It also covers platform considerations for macOS, Linux, and Windows, the Pocket Synth demonstration assets, headless output flags, and the distinction between split firmware binaries and a monolithic flash image.
TimeStamps:
0:00 What esp32sim emulates
0:29 Platform support and repeatable execution
0:55 Release files and version verification
1:11 macOS execution considerations
1:40 Mask ROM dependency and directory configuration
2:30 Headless Pocket Synth output
3:42 Local web UI on port 8766
4:23 Custom firmware mapping
5:04 Flash-image option for monolithic builds
🧩 Instruction-level ESP32 firmware emulation
🗃️ Mask ROM files and boot configuration
🎛️ Headless audio and display artifacts
🌐 Local web UI and firmware mapping
The practical takeaway is a clear view of esp32sim's configuration boundaries: the emulated chip, ROM files, and firmware layout must align. Headless flags support scripted output collection, while the local web UI provides interactive inspection of virtual hardware and UART activity.
#ESP32 #Rust #EmbeddedSystems
[de-DE] YNAS ynp_b62b20fa1fa64673 Cinematic
Privater automatisierter Staging-Upload. Paketidentität: ynp_b62b20fa1fa64673; Ausgabe: cinematic.
[es-US] YNAS ynp_b62b20fa1fa64673 cinemática
Carga de entorno de prueba de automatización privada. Identidad del paquete: ynp_b62b20fa1fa64673; salida: cinemática.
[fr-FR] YNAS ynp_b62b20fa1fa64673 cinématique
Téléchargement de l'environnement de test d'automatisation privé. Identifiant du package : ynp_b62b20fa1fa64673 ; sortie : cinématique.
[hi] YNAS ynp_b62b20fa1fa64673 सिनेमैटिक
निजी स्वचालन स्टेजिंग अपलोड। पैकेज पहचान: ynp_b62b20fa1fa64673; आउटपुट: सिनेमाई।
[id] YNAS ynp_b62b20fa1fa64673 sinematik
Unggahan staging otomatisasi pribadi. Identitas paket: ynp_b62b20fa1fa64673; output: sinematik.
[it] YNAS ynp_b62b20fa1fa64673 cinematic
Caricamento di automazione privata. Identità del pacchetto: ynp_b62b20fa1fa64673; output: cinematico.
[pt-BR] YNAS ynp_b62b20fa1fa64673 cinematográfico
Upload de teste de automação privada. Identificação do pacote: ynp_b62b20fa1fa64673; saída: cinemática.
332 views
项目完全采用 MIT 开源协议,不管是个人玩具项目还是团队工程集成都可以直接用。
GitHub 传送门:mikroverk/esp32sim
4 likes · 210 views
esp32sim: an ESP32-S3 emulator in Rust/Wasm that runs the real mask ROM and bootloader, then stock firmware, in a browser tab
Not my project. Saw it on GitHub this week and recorded a run.
In the video a Waveshare Touch-LCD-4B board restarts: the boot goes through the real mask ROM and the bootloader, the boot log scrolls in the console, then the app's 480x480 LVGL panel redraws and reacts to swipes and taps. The firmware is the stock binary, nothing patched, and everything runs client-side in WebAssembly.
Repo: mikroverk/esp32sim
For those of you who have emulated this kind of SoC: how would you handle the LCD and touch peripherals' timing at this level?
I made a tool that lets coding agents boot and test ESP-IDF firmware in an emulator, no board needed
Disclosure: this is my project (MIT, free, no account). The emulation itself is esp32sim's work (mikroverk/esp32sim), the Rust emulator that boots unmodified ESP32 / S3 / C3 / C6 images through the real mask ROM and bootloader. I built the layer around it.
Why: I use coding agents (Claude Code, Codex, Cursor) for ESP-IDF work, and the loop always stopped at "it compiles". Nobody knew whether the firmware actually worked until I flashed a board. esp32sim-mcp lets the agent (or a CI job) boot what it just built and check the result:
- read UART0 and USB-Serial/JTAG output, with panics (Guru Meditation, stack overflow, failed asserts) reported along with the log leading up to them
- assert on the console: pass/fail, plus the exact line that's missing
- press buttons, turn the encoder, drive GPIO/UART at emulated timestamps
- join a virtual WiFi AP with DHCP/DNS/NAT (the station gets 10.0.2.15)
- grab a PNG of the display on boards that have one
What was tricky on the ESP32 side:
- Two consoles at once. On S3/C3/C6, ESP-IDF often mirrors logs to both UART0 and USB-Serial/JTAG, and the emulator writes bytes as they arrive, so you get "Hello wHello world!". esp32sim can tag every chunk with its source, so I split the stream on the tags, rebuild each console's lines and drop the mirrored duplicates. Without the tags it couldn't be done reliably.
- No guessing about the image layout. It reads build/flasher_args.json, so the bootloader, partition table and app land at the same offsets idf.py flash would use, for any target.
- Deterministic input. Button presses and UART input are scheduled in emulated time, not wall-clock time, so a test behaves the same on a fast laptop and a slow CI runner.
- Mask ROMs. The boot chain needs Espressif's ROM ELFs for each chip; setup downloads the pinned esp-rom-elfs release and checks SHA-256 hashes.
Setup:
npx -y esp32sim-mcp setup (prebuilt emulator + ROMs)
npx -y esp32sim-mcp init (in your ESP-IDF project, registers it with your agent)
The same check runs in CI with no agent, exit code 0/1:
npx -y esp32sim-mcp expect --max-seconds 10 --pattern "app_main" "Counter: 5"
Limits: it's an emulator, so no Bluetooth or RF timing, and only the peripherals esp32sim models. Confirm on hardware before shipping. Tested on macOS and Linux.
Source, demo GIF and docs: stramanu/esp32sim-mcp
Contributions are welcome. Useful places to start:
- try it on your own ESP-IDF project and open an issue when something doesn't boot or the output looks wrong
- Windows: it's untested, and reports or fixes are very welcome
- example projects and CI recipes for other chips (C3, C6, classic ESP32)
Board and peripheral models live in esp32sim itself, so that's the place to contribute those. The details are in CONTRIBUTING.md in the repo.
8 points · 6 comments
esp32sim 0.3.0: the classic ESP32 joins the S3, C3 and C6. Now with Wi-Fi and BLE on all four chips. Stock MicroPython boots and draws live prices on an emulated T-Display — same files on the board and in your browser. github.com/mikroverk/esp32sim/releases/tag/v0.3.0 #esp32 #IoT t.co
5 likes · 1 repost · 108 views
esp32sim: an ESP32 emulator in Rust/Wasm that boots unmodified Espressif firmware in the browser
Not my project, found it on GitHub this week and had to try it.
In the video a Touch-LCD-4B panel goes through the real mask ROM and bootloader, then its LVGL UI responds to swipes and toggles. Unmodified firmware, running in WebAssembly, nothing on a server.
Repo: mikroverk/esp32sim
Curious whether anyone here has tried it with their own firmware, and how far the peripheral support goes.
93 points · 6 comments
Show HN: Esp32sim – Run ESP32 firmware in the browser mikroverk/esp32sim (news.ycombinator.com)
1 like
Show HN: Esp32sim – Run ESP32 firmware in the browser
View Article | Discussion + AI Summary
Summary of HN discussion 🧵👇
2 likes
Mentions
Exciting news for developers! 🎉 Introducing Esp32sim, a tool that lets you run ESP32 firmware directly in your browser. This innovation simplifies testing and development, making it easier to bring your IoT projects to life. Check it out and elevate your codi… mikroverk/esp32sim
esp32sim by @MattiaFiumara and co: mikroverk/esp32sim the PR adds the TC001 as a board and fixes the cap: esp32sim#311
esp32sim GitHub Overview: ESP32 Firmware Emulation, ROM Setup, and Web UI esp32sim by mikroverk: mikroverk/esp32sim esp32sim is an open-source Rust emulator for ESP32 firmware. This overview follows its execution model from release files and mask ROM configuration to modeled audio and display outputs, then shows the local web interface and the command-line choices used for custom firmware. It also covers platform considerations for macOS, Linux, and Windows, the Pocket Synth demonstration assets, headless output flags, and the distinction between split firmware binaries and a monolithic flash image. TimeStamps: 0:00 What esp32sim emulates 0:29 Platform support and repeatable execution 0:55 Release files and version verification 1:11 macOS execution considerations 1:40 Mask ROM dependency and directory configuration 2:30 Headless Pocket Synth output 3:42 Local web UI on port 8766 4:23 Custom firmware mapping 5:04 Flash-image option for monolithic builds 🧩 Instruction-level ESP32 firmware emulation 🗃️ Mask ROM files and boot configuration 🎛️ Headless audio and display artifacts 🌐 Local web UI and firmware mapping The practical takeaway is a clear view of esp32sim's configuration boundaries: the emulated chip, ROM files, and firmware layout must align. Headless flags support scripted output collection, while the local web UI provides interactive inspection of virtual hardware and UART activity. #ESP32 #Rust #EmbeddedSystems [de-DE] YNAS ynp_b62b20fa1fa64673 Cinematic Privater automatisierter Staging-Upload. Paketidentität: ynp_b62b20fa1fa64673; Ausgabe: cinematic. [es-US] YNAS ynp_b62b20fa1fa64673 cinemática Carga de entorno de prueba de automatización privada. Identidad del paquete: ynp_b62b20fa1fa64673; salida: cinemática. [fr-FR] YNAS ynp_b62b20fa1fa64673 cinématique Téléchargement de l'environnement de test d'automatisation privé. Identifiant du package : ynp_b62b20fa1fa64673 ; sortie : cinématique. [hi] YNAS ynp_b62b20fa1fa64673 सिनेमैटिक निजी स्वचालन स्टेजिंग अपलोड। पैकेज पहचान: ynp_b62b20fa1fa64673; आउटपुट: सिनेमाई। [id] YNAS ynp_b62b20fa1fa64673 sinematik Unggahan staging otomatisasi pribadi. Identitas paket: ynp_b62b20fa1fa64673; output: sinematik. [it] YNAS ynp_b62b20fa1fa64673 cinematic Caricamento di automazione privata. Identità del pacchetto: ynp_b62b20fa1fa64673; output: cinematico. [pt-BR] YNAS ynp_b62b20fa1fa64673 cinematográfico Upload de teste de automação privada. Identificação do pacote: ynp_b62b20fa1fa64673; saída: cinemática.
项目完全采用 MIT 开源协议,不管是个人玩具项目还是团队工程集成都可以直接用。 GitHub 传送门:mikroverk/esp32sim
esp32sim: an ESP32-S3 emulator in Rust/Wasm that runs the real mask ROM and bootloader, then stock firmware, in a browser tab Not my project. Saw it on GitHub this week and recorded a run. In the video a Waveshare Touch-LCD-4B board restarts: the boot goes through the real mask ROM and the bootloader, the boot log scrolls in the console, then the app's 480x480 LVGL panel redraws and reacts to swipes and taps. The firmware is the stock binary, nothing patched, and everything runs client-side in WebAssembly. Repo: mikroverk/esp32sim For those of you who have emulated this kind of SoC: how would you handle the LCD and touch peripherals' timing at this level?
I made a tool that lets coding agents boot and test ESP-IDF firmware in an emulator, no board needed Disclosure: this is my project (MIT, free, no account). The emulation itself is esp32sim's work (mikroverk/esp32sim), the Rust emulator that boots unmodified ESP32 / S3 / C3 / C6 images through the real mask ROM and bootloader. I built the layer around it. Why: I use coding agents (Claude Code, Codex, Cursor) for ESP-IDF work, and the loop always stopped at "it compiles". Nobody knew whether the firmware actually worked until I flashed a board. esp32sim-mcp lets the agent (or a CI job) boot what it just built and check the result: - read UART0 and USB-Serial/JTAG output, with panics (Guru Meditation, stack overflow, failed asserts) reported along with the log leading up to them - assert on the console: pass/fail, plus the exact line that's missing - press buttons, turn the encoder, drive GPIO/UART at emulated timestamps - join a virtual WiFi AP with DHCP/DNS/NAT (the station gets 10.0.2.15) - grab a PNG of the display on boards that have one What was tricky on the ESP32 side: - Two consoles at once. On S3/C3/C6, ESP-IDF often mirrors logs to both UART0 and USB-Serial/JTAG, and the emulator writes bytes as they arrive, so you get "Hello wHello world!". esp32sim can tag every chunk with its source, so I split the stream on the tags, rebuild each console's lines and drop the mirrored duplicates. Without the tags it couldn't be done reliably. - No guessing about the image layout. It reads build/flasher_args.json, so the bootloader, partition table and app land at the same offsets idf.py flash would use, for any target. - Deterministic input. Button presses and UART input are scheduled in emulated time, not wall-clock time, so a test behaves the same on a fast laptop and a slow CI runner. - Mask ROMs. The boot chain needs Espressif's ROM ELFs for each chip; setup downloads the pinned esp-rom-elfs release and checks SHA-256 hashes. Setup: npx -y esp32sim-mcp setup (prebuilt emulator + ROMs) npx -y esp32sim-mcp init (in your ESP-IDF project, registers it with your agent) The same check runs in CI with no agent, exit code 0/1: npx -y esp32sim-mcp expect --max-seconds 10 --pattern "app_main" "Counter: 5" Limits: it's an emulator, so no Bluetooth or RF timing, and only the peripherals esp32sim models. Confirm on hardware before shipping. Tested on macOS and Linux. Source, demo GIF and docs: stramanu/esp32sim-mcp Contributions are welcome. Useful places to start: - try it on your own ESP-IDF project and open an issue when something doesn't boot or the output looks wrong - Windows: it's untested, and reports or fixes are very welcome - example projects and CI recipes for other chips (C3, C6, classic ESP32) Board and peripheral models live in esp32sim itself, so that's the place to contribute those. The details are in CONTRIBUTING.md in the repo.
esp32sim 0.3.0: the classic ESP32 joins the S3, C3 and C6. Now with Wi-Fi and BLE on all four chips. Stock MicroPython boots and draws live prices on an emulated T-Display — same files on the board and in your browser. github.com/mikroverk/esp32sim/releases/tag/v0.3.0 #esp32 #IoT t.co
esp32sim: an ESP32 emulator in Rust/Wasm that boots unmodified Espressif firmware in the browser Not my project, found it on GitHub this week and had to try it. In the video a Touch-LCD-4B panel goes through the real mask ROM and bootloader, then its LVGL UI responds to swipes and toggles. Unmodified firmware, running in WebAssembly, nothing on a server. Repo: mikroverk/esp32sim Curious whether anyone here has tried it with their own firmware, and how far the peripheral support goes.
Show HN: Esp32sim – Run ESP32 firmware in the browser mikroverk/esp32sim (news.ycombinator.com)
Show HN: Esp32sim – Run ESP32 firmware in the browser View Article | Discussion + AI Summary Summary of HN discussion 🧵👇