A free, open-source emulator for 19 embedded boards: Arduino, ESP32, Raspberry Pi, RISC-V , running real compiled code in your browser.
The best part: it's fully local.
No cloud dependency. No student accounts. No data leaving your network. Self-hostable with a single Docker container.
Universities and bootcamps can deploy it on their own servers and give every student access to a complete embedded development environment, for free.
I've been working on this for over a year, and just shipped v2.0 with ESP32 emulation (via QEMU), a custom RISC-V core, and Raspberry Pi 3 support that runs real Python
One suggestion: The main splash screen image is nearly 8MB big. It takes a noticeable time to download on my connection. I'm not sure what bandwidth costs these days, but seems like that could be something to optimize.
Can this project help me in any way during dev stage before uploading the code to device just to see it doesnβt work ? Eg could I use this to somehow compile&run those esphome yamls via this emulator?
What's new in v2:
- 19 boards across 5 CPU architectures (AVR8, Xtensa, RISC-V, ARM Cortex-M0+, ARM Cortex-A53) - ESP32 emulation via QEMU (lcgamboa fork) β real flash images, ROM function emulation, GPIO/ADC/timers - ESP32-C3 and CH32V003 run on a custom RISC-V core written in TypeScript, entirely in the browser - Raspberry Pi 3B via QEMU raspi3b β boots real Pi OS, runs Python - Realistic sensor simulation: DHT22 (40-bit protocol timing), HC-SR04 (trigger/echo), WS2812B NeoPixel (GRB decoding) - 48+ electronic components from wokwi-elements
Architecture:
- AVR, RP2040, and RISC-V emulation runs client-side (avr8js, rp2040js, custom TS core) - ESP32 Xtensa and Pi 3 run on backend QEMU - Compilation via real arduino-cli - React + Vite frontend, FastAPI backend - Self-hostable via Docker, no account needed
Source: https://github.com/davidmonterocrespo24/velxio (AGPLv3)
Happy to discuss the emulation architecture β particularly the trade-offs between in-browser vs. backend QEMU emulation
Live at velxio.dev
A fully local, open-source multi-board emulator. Write Arduino C++ or Python, compile it, and simulate it with real CPU emulation and 48+ interactive electronic components β all running in your browser.
19 boards Β· 5 CPU architectures: AVR8 (ATmega / ATtiny), ARM Cortex-M0+ (RP2040), RISC-V RV32IMC/EC (ESP32-C3 / CH32V003), Xtensa LX6/LX7 (ESP32 / ESP32-S3 via QEMU), and ARM Cortex-A53 (Raspberry Pi 3 Linux via QEMU).
Velxio is free and open-source. Building and maintaining a full multi-board emulator takes a lot of time β if it saves you time or you enjoy the project, sponsoring me directly helps keep development going.
| Platform | Link |
|---|---|
| GitHub Sponsors (preferred) | github.com/sponsors/davidmonterocrespo24 |
| PayPal | paypal.me/odoonext |
Your support helps cover server costs, library maintenance, and frees up time to add new boards, components, and features. Thank you!
https://velxio.dev β no installation needed. Open the editor, write your sketch, and simulate directly in the browser.
To self-host with Docker (single command):
docker run -d -p 3080:80 ghcr.io/davidmonterocrespo24/velxio:master
Then open http://localhost:3080.

Raspberry Pi Pico simulation β ADC read test with two potentiometers, Serial Monitor showing live output, and compilation console at the bottom.

Arduino Uno driving an ILI9341 240Γ320 TFT display via SPI β rendering a real-time graphics demo using Adafruit_GFX + Adafruit_ILI9341.

Library Manager loads the full Arduino library index on open β browse and install libraries without typing first.

Component Picker showing 48 available components with visual previews, search, and category filters.

Multi-board simulation β Raspberry Pi 3 and Arduino running simultaneously on the same canvas, connected via serial. Mix different architectures in a single circuit.

ESP32 simulation with an HC-SR04 ultrasonic distance sensor β real Xtensa emulation via QEMU with trigger/echo GPIO timing.
![]() Raspberry Pi Pico |
![]() Raspberry Pi Pico W |
![]() ESP32 DevKit C |
![]() ESP32-S3 |
![]() ESP32-C3 |
![]() Seeed XIAO ESP32-C3 |
![]() ESP32-C3 SuperMini |
![]() ESP32-CAM |
![]() Seeed XIAO ESP32-S3 |
![]() Arduino Nano ESP32 |
![]() Raspberry Pi 3B |
Arduino Uno Β· Nano Β· Mega 2560 ATtiny85 Β· Leonardo Β· Pro Mini (AVR8 / ATmega) |
| Board | CPU | Engine | Language |
|---|---|---|---|
| Arduino Uno | ATmega328p @ 16 MHz | avr8js (browser) | C++ (Arduino) |
| Arduino Nano | ATmega328p @ 16 MHz | avr8js (browser) | C++ (Arduino) |
| Arduino Mega 2560 | ATmega2560 @ 16 MHz | avr8js (browser) | C++ (Arduino) |
| ATtiny85 | ATtiny85 @ 8 MHz (int) / 16 MHz (ext) | avr8js (browser) | C++ (Arduino) |
| Arduino Leonardo | ATmega32u4 @ 16 MHz | avr8js (browser) | C++ (Arduino) |
| Arduino Pro Mini | ATmega328p @ 8/16 MHz | avr8js (browser) | C++ (Arduino) |
| Raspberry Pi Pico | RP2040 @ 133 MHz | rp2040js (browser) | C++ (Arduino) |
| Raspberry Pi Pico W | RP2040 @ 133 MHz | rp2040js (browser) | C++ (Arduino) |
| ESP32 DevKit V1 | Xtensa LX6 @ 240 MHz | QEMU lcgamboa (backend) | C++ (Arduino) |
| ESP32 DevKit C V4 | Xtensa LX6 @ 240 MHz | QEMU lcgamboa (backend) | C++ (Arduino) |
| ESP32-S3 | Xtensa LX7 @ 240 MHz | QEMU lcgamboa (backend) | C++ (Arduino) |
| ESP32-CAM | Xtensa LX6 @ 240 MHz | QEMU lcgamboa (backend) | C++ (Arduino) |
| Seeed XIAO ESP32-S3 | Xtensa LX7 @ 240 MHz | QEMU lcgamboa (backend) | C++ (Arduino) |
| Arduino Nano ESP32 | Xtensa LX6 @ 240 MHz | QEMU lcgamboa (backend) | C++ (Arduino) |
| ESP32-C3 DevKit | RISC-V RV32IMC @ 160 MHz | RiscVCore.ts (browser) | C++ (Arduino) |
| Seeed XIAO ESP32-C3 | RISC-V RV32IMC @ 160 MHz | RiscVCore.ts (browser) | C++ (Arduino) |
| ESP32-C3 SuperMini | RISC-V RV32IMC @ 160 MHz | RiscVCore.ts (browser) | C++ (Arduino) |
| CH32V003 | RISC-V RV32EC @ 48 MHz | RiscVCore.ts (browser) | C++ (Arduino) |
| Raspberry Pi 3B | ARM Cortex-A53 @ 1.2 GHz | QEMU raspi3b (backend) | Python |
.ino / .h / .cpp / .py filesarduino-cli backend β compile sketches to .hex / .bin filesmillis(), delay(), PWM via analogWrite()analogRead(), voltage injection from potentiometers on canvasAttinyCorerequestAnimationFramedelay() skips ahead in simulation time instead of busy-waitingSee docs/RP2040_EMULATION.md for full technical details.
WiFi.begin("PICSimLabWifi", ""))See docs/ESP32_EMULATION.md for setup and full technical details.
See docs/RISCV_EMULATION.md for full technical details.
qemu-system-aarch64 -M raspi3bSee docs/RASPBERRYPI3_EMULATION.md for full technical details.
/project/:id/:username showing public projects# Pull and run
docker run -d \
--name velxio \
-p 3080:80 \
-v $(pwd)/data:/app/data \
ghcr.io/davidmonterocrespo24/velxio:master
Open http://localhost:3080.
The /app/data volume contains:
velxio.db β SQLite database (users, projects metadata)projects/{id}/ β sketch files per projectgit clone https://github.com/davidmonterocrespo24/velxio.git
cd velxio
cp backend/.env.example backend/.env # edit as needed
docker compose -f docker-compose.prod.yml up -d
backend/.env)| Variable | Default | Description |
|---|---|---|
SECRET_KEY |
(required) | JWT signing secret |
DATABASE_URL |
sqlite+aiosqlite:////app/data/velxio.db |
SQLite path |
DATA_DIR |
/app/data |
Directory for project files |
FRONTEND_URL |
http://localhost:5173 |
Used for OAuth redirect |
GOOGLE_CLIENT_ID |
β | Google OAuth client ID |
GOOGLE_CLIENT_SECRET |
β | Google OAuth client secret |
GOOGLE_REDIRECT_URI |
http://localhost:8001/api/auth/google/callback |
Must match Google Console |
COOKIE_SECURE |
false |
Set true when serving over HTTPS |
Prerequisites: Node.js 18+, Python 3.12+, arduino-cli
git clone https://github.com/davidmonterocrespo24/velxio.git
cd velxio
# Backend
cd backend
python -m venv venv && source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
uvicorn app.main:app --reload --port 8001
# Frontend (new terminal)
cd frontend
npm install
npm run dev
Open http://localhost:5173.
arduino-cli setup (first time):
arduino-cli core update-index
arduino-cli core install arduino:avr
# For Raspberry Pi Pico / Pico W:
arduino-cli config add board_manager.additional_urls \
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
arduino-cli core install rp2040:rp2040
# For ESP32 / ESP32-S3 / ESP32-C3:
arduino-cli config add board_manager.additional_urls \
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
arduino-cli core install esp32:esp32@2.0.17
velxio/
βββ frontend/ # React + Vite + TypeScript
β βββ src/
β βββ pages/ # LandingPage, EditorPage, UserProfilePage, ...
β βββ components/ # Editor, simulator canvas, modals, layout
β βββ simulation/ # AVRSimulator, RP2040Simulator, RiscVCore,
β β # RaspberryPi3Bridge, Esp32Bridge, PinManager
β βββ store/ # Zustand stores (auth, editor, simulator, project, vfs)
β βββ services/ # API clients
βββ backend/ # FastAPI + Python
β βββ app/
β βββ api/routes/ # compile, auth, projects, libraries, simulation (ws)
β βββ models/ # User, Project (SQLAlchemy)
β βββ services/ # arduino_cli, esp32_worker, qemu_manager, gpio_shim
β βββ core/ # config, security, dependencies
βββ wokwi-libs/ # Local clones of Wokwi repos
β βββ wokwi-elements/ # Web Components for electronic parts
β βββ avr8js/ # AVR8 CPU emulator
β βββ rp2040js/ # RP2040 emulator
β βββ qemu-lcgamboa/ # QEMU fork for ESP32 Xtensa emulation
βββ img/ # Raspberry Pi 3 boot images (kernel8.img, dtb, OS image)
βββ deploy/ # nginx.conf, entrypoint.sh
βββ docs/ # Technical documentation
βββ Dockerfile.standalone # Single-container production image
βββ docker-compose.yml # Development compose
βββ docker-compose.prod.yml # Production compose
| Layer | Stack |
|---|---|
| Frontend | React 19, Vite 7, TypeScript 5.9, Monaco Editor, Zustand, React Router 7 |
| Backend | FastAPI, SQLAlchemy 2.0 async, aiosqlite, uvicorn |
| AVR Simulation | avr8js (ATmega328p / ATmega2560) |
| RP2040 Simulation | rp2040js (ARM Cortex-M0+) |
| RISC-V Simulation | RiscVCore.ts (RV32IMC, custom TypeScript) |
| ESP32 Simulation | QEMU 8.1.3 lcgamboa fork (Xtensa LX6/LX7) |
| Raspberry Pi 3 Simulation | QEMU 8.1.3 (qemu-system-aarch64 -M raspi3b) + Raspberry Pi OS Trixie |
| UI Components | wokwi-elements (Web Components) |
| Compiler | arduino-cli (subprocess) |
| Auth | JWT (httpOnly cookie), Google OAuth 2.0 |
| Persistence | SQLite + disk volume (/app/data/projects/{id}/) |
| Deploy | Docker, nginx, GitHub Actions β GHCR + Docker Hub |
| Topic | Document |
|---|---|
| Getting Started | docs/getting-started.md |
| Architecture Overview | docs/ARCHITECTURE.md |
| Emulator Architecture | docs/emulator.md |
| Wokwi Libraries Integration | docs/WOKWI_LIBS.md |
| RP2040 Emulation (Pico) | docs/RP2040_EMULATION.md |
| Raspberry Pi 3 Emulation | docs/RASPBERRYPI3_EMULATION.md |
| ESP32 Emulation (Xtensa) | docs/ESP32_EMULATION.md |
| RISC-V Emulation (ESP32-C3) | docs/RISCV_EMULATION.md |
| Components Reference | docs/components.md |
| MCP Server | docs/MCP.md |
| Roadmap | docs/roadmap.md |
arduino-cli: command not found β install arduino-cli and add to PATH.
LED doesn't blink β check port listeners in browser console; verify pin mapping in the component property dialog.
Serial Monitor shows nothing β ensure Serial.begin() is called before Serial.print().
ESP32 not starting β verify libqemu-xtensa.dll (Windows) or libqemu-xtensa.so (Linux) is present in backend/app/services/.
Pi 3 takes too long to boot β QEMU needs 2β5 seconds to initialize; the "booting" status in the UI is expected.
Compilation errors β check the compilation console; verify the correct core is installed for the selected board.
Join the Discord server to ask questions, share projects, and follow updates:
Suggestions, bug reports, and pull requests are welcome at github.com/davidmonterocrespo24/velxio.
If you'd like to support the project financially, see the Support the Project section above or sponsor directly at github.com/sponsors/davidmonterocrespo24.
Note: All contributors must sign a Contributor License Agreement (CLA) so that the dual-licensing model remains valid. A CLA check runs automatically on pull requests.
Velxio uses a dual-licensing model:
| Use case | License | Cost |
|---|---|---|
| Personal, educational, open-source (AGPLv3 compliant) | AGPLv3 | Free |
| Proprietary / closed-source product or SaaS | Commercial License | Paid |
The AGPLv3 is a certified Open Source license. It is free for all uses β including commercial β as long as any modifications or network-accessible deployments make their source code available under the same license. Companies that cannot comply with that requirement can purchase a Commercial License.
For commercial licensing inquiries: davidmonterocrespo24@gmail.com
See LICENSE and COMMERCIAL_LICENSE.md for full terms.
It also provides a more visual and interactive environment (editor, peripherals, simulation controls), which is especially useful for teaching and for beginners.
The Docker image is there so you can easily install it on your own machine if you want to run it locally or work on development
Itβs still exploratory, but it could definitely go in that direction