An ESP32-S3 you can open in a tab
S3 Lab is a from-scratch ESP32-S3 emulator written in Rust and compiled to WebAssembly. It boots real Arduino / ESP-IDF firmware — serial output, GPIO levels, timers, interrupts, peripherals — with no server side. Everything on the bench page runs on your machine.
Why it exists
Embedded development usually means waiting on hardware: flashing boards, wiring probes, sharing one device between people. S3 Lab gives you a second bench that lives in the browser — load one of the 57 example firmware images (or your own merged binary), press Run, and watch the serial console and pin header respond exactly as the chip would.
Because the emulator is deterministic, a run you share is a run someone else can replay bit-for-bit. That makes it useful for teaching, for driver bring-up, and for regression tests that would be flaky on real silicon.
How it works
The core is three Rust crates. xtensa-core decodes and
executes the LX7 instruction set, including windowed registers and the
full ee.* DSP extension. esp32s3-soc models the
memory map and peripherals — UART, GPIO, timers, interrupt matrix, SPI,
I2C, RMT, GDMA, MCPWM, LEDC, TWAI, SDMMC, USB, Wi-Fi scan and station
connect, and more. esp32s3-emu glues CPU to SoC, boots
real flash images through ROM stubs and the second-stage loader, and
steps both cores.
wasm-bridge exposes that machine to JavaScript. The bench
page drives it a few tens of thousands of instructions per frame,
drains the UART into the console, and paints GPIO levels onto the pin
header — all at interactive speed.
How it is validated
Every peripheral earns its place the same way: a real sketch is
compiled with arduino-cli, its merged flash image is booted
in the emulator, and both the serial output and the emulator's internal
state are asserted. The battery currently runs 120 cases with 0
failures and 0 skips, and a Playwright end-to-end suite drives
the real page (boot, MIPS meter, serial echo, UART round-trip, SD card
mount, worker boot, gateway panel) on every change.
Beyond the battery, the stock MicroPython interpreter
(v1.29.0 GENERIC_S3, unmodified) boots to its >>>
REPL and runs Python — arithmetic, floats, lists — through the
windowed-ABI spill path, the LX7 FPU, and UART0 RX. The bench page has a
MicroPython preset that boots the bundled
tools/firmware/ image, appends the littlefs partition it
expects, and boots it; set the serial port to UART0 and type Python.
Headless proof:
node tools/micropython_harness.mjs
(MICROPYTHON HARNESS PASS).
What it is not
Wi-Fi beyond scan and station-connect, Bluetooth LE, and a few closed-radio corners are out of scope — there is no RF front end to validate them against. The coverage page lists every ESP32-S3 feature, what the emulator models, and what is deliberately left out, with reasons.