arduino esp32 raspberry pi emulator https://velxio.dev
Find a file
davidmonterocrespo24 adad446518 fix(esp32): LEDC signal IDs are 71-86 per ESP32 TRM, not 72-87
User report: on the solar-tracker project (5218f9e3) only one servo
moved and the log showed `ch=0 duty=X% gpio=12` (wrong — servoPan was
attached to GPIO 13) and `ch=1 ... gpio=-1` (servoTilt's channel
never resolved).

Root cause traced through the GPIO Matrix dump: the firmware does
exactly what the Arduino-ESP32 Servo library says — `ledcAttachPin(
13, 0)` writes signal 71 (LEDC_HS_SIG_OUT0) into `gpio_out_sel[13]`,
and `ledcAttachPin(12, 1)` writes signal 72 (LEDC_HS_SIG_OUT1) into
`gpio_out_sel[12]`. Per the ESP32 Technical Reference Manual section
4.11, Table 4-3:

    71 .. 78  →  LEDC HS channels 0..7
    79 .. 86  →  LEDC LS channels 0..7

The legacy worker code at esp32_worker.py:426 used the off-by-one
range `72 <= signal <= 87` with `ledc_ch = signal - 72`. The mistake
masked itself for single-servo projects because the 0x5000 duty
callback's channel index was internally consistent with the bogus
math, so the duty STILL reached the correctly-routed pin (just
labelled wrong). The new SignalRouter unit tests caught the
discrepancy the moment two servos drove distinct channels: signal
71 (HS_CH0, gpio 13) was REJECTED by the off-by-one filter and
signal 72 (HS_CH1, gpio 12) was misclassified as channel 0.

When I ported the legacy range into `esp32_signals.SIG_LEDC_HS_CH0_OUT_IDX`
the bug came along for the ride. Fix both modules:

* `backend/app/services/esp32_signals.py`: HS 71-78, LS 79-86.
* `frontend/src/simulation/esp32-signals.ts`: mirror.
* tests updated; 20 backend + 23 frontend pass.

After deploy the user's two servos will resolve to their declared
pins:

    ch=0  duty=X%  gpio=13   (servoPan, was wrongly emitting gpio=12)
    ch=1  duty=X%  gpio=12   (servoTilt, was wrongly emitting gpio=-1)

This is also why the multi-servo blink "patch" in commit 77bf897
appeared to help: with both pins ALIASED to the same channel via
the off-by-one, the broadcast fallback was the only thing producing
ANY movement on the second servo at all.
2026-05-17 05:42:52 +02:00
.github ci: fix Frontend Tests — use build:docker instead of build 2026-05-15 23:42:52 +02:00
.vite/deps Add backend and frontend test suites for Arduino compilation and simulation 2026-03-03 16:44:07 -03:00
backend fix(esp32): LEDC signal IDs are 71-86 per ESP32 TRM, not 72-87 2026-05-17 05:42:52 +02:00
docker fix(nginx): use relative redirects so trailing-slash 301s preserve HTTPS 2026-05-09 04:56:35 +02:00
docs feat(esp32): SignalRouter — model the GPIO Matrix as first-class 2026-05-17 05:00:53 +02:00
frontend fix(esp32): LEDC signal IDs are 71-86 per ESP32 TRM, not 72-87 2026-05-17 05:42:52 +02:00
prebuilt/qemu feat: pre-built QEMU binaries from GitHub Release + WiFi SSID normalization 2026-04-04 14:27:52 -03:00
scripts Add HD44780Decoder and various I2C sketches 2026-05-12 14:26:33 -03:00
test fix(esp32): LEDC signal IDs are 71-86 per ESP32 TRM, not 72-87 2026-05-17 05:42:52 +02:00
vscode-extension vs extension fix 2026-04-03 18:14:22 -03:00
.dockerignore chore: stop committing package-lock.json (cross-platform breakage) 2026-05-04 01:08:23 -03:00
.gitignore Add end-to-end tests for ESP32 I2C functionality and circuit verification 2026-05-12 16:55:15 -03:00
.gitmodules refactor: rename wokwi-libs/ → third-party/ 2026-05-03 00:58:57 -03:00
.markdownlint.json Refactor code structure for improved readability and maintainability 2026-03-16 14:28:16 -03:00
build_qemu_all.sh refactor: rename wokwi-libs/ → third-party/ 2026-05-03 00:58:57 -03:00
build_qemu_step4.sh refactor: rename wokwi-libs/ → third-party/ 2026-05-03 00:58:57 -03:00
CLAUDE.md chore(oss): drop dead auth/DB dependencies from OSS image 2026-05-14 17:06:27 -03:00
COMMERCIAL_LICENSE.md Add commercial licensing and AGPLv3 license files; update submodule references to dirty state; create strategic plan document for Velxio project 2026-03-06 22:32:05 -03:00
docker-compose.yml perf(compile): dedup, concurrency limits, and persistent build dir for ESP-IDF 2026-05-09 08:33:11 +02:00
Dockerfile.espidf-toolchain feat: add pre-built ESP-IDF toolchain image workflow 2026-04-04 18:03:43 -03:00
Dockerfile.standalone feat(sim): boot_images module + Pi 3 emulation restored 2026-05-16 05:41:46 +02:00
LICENSE Add commercial licensing and AGPLv3 license files; update submodule references to dirty state; create strategic plan document for Velxio project 2026-03-06 22:32:05 -03:00
make-test.js feat: add BMP280 sensor component and circuit preview 2026-04-14 17:27:30 -03:00
package.json feat: add component metadata types and generator 2026-03-03 19:30:25 -03:00
pytest.ini feat(sim): boot_images module + Pi 3 emulation restored 2026-05-16 05:41:46 +02:00
README.md chore(oss): drop dead auth/DB dependencies from OSS image 2026-05-14 17:06:27 -03:00

Velxio: Arduino & Embedded Board Emulator

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).

Visitors Live Demo Docker Image GitHub stars Discord License: AGPLv3 Commercial License


Product Hunt


Support the Project

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!


Try it now

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 \
  -v velxio-data:/app/data \
  -v velxio-arduino-libs:/root/.arduino15 \
  -v velxio-arduino-user-libs:/root/Arduino \
  -v velxio-ccache:/var/cache/ccache \
  -v velxio-build:/var/lib/velxio-build \
  ghcr.io/davidmonterocrespo24/velxio:master

Then open http://localhost:3080.

The named volumes are what make compile times reasonable on subsequent runs — without them, every container restart wipes the ESP-IDF build cache and the first compile after each restart takes 5-7 minutes instead of 5-30 seconds.


Screenshots

Raspberry Pi Pico ADC simulation with Serial Monitor

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

ILI9341 TFT display simulation on Arduino Uno

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

Library Manager with full library list

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

Component Picker with 48 components

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

Raspberry Pi 3 connected to Arduino on the same canvas

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 with HC-SR04 ultrasonic sensor

ESP32 simulation with an HC-SR04 ultrasonic distance sensor — real Xtensa emulation via QEMU with trigger/echo GPIO timing.


Supported Boards

Raspberry Pi Pico
Raspberry Pi Pico
Raspberry Pi Pico W
Raspberry Pi Pico W
ESP32 DevKit C
ESP32 DevKit C
ESP32-S3
ESP32-S3
ESP32-C3
ESP32-C3
Seeed XIAO ESP32-C3
Seeed XIAO ESP32-C3
ESP32-C3 SuperMini
ESP32-C3 SuperMini
ESP32-CAM
ESP32-CAM
Seeed XIAO ESP32-S3
Seeed XIAO ESP32-S3
Arduino Nano ESP32
Arduino Nano ESP32
Raspberry Pi 3B
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 QEMU lcgamboa (backend) C++ (Arduino)
Seeed XIAO ESP32-C3 RISC-V RV32IMC @ 160 MHz QEMU lcgamboa (backend) C++ (Arduino)
ESP32-C3 SuperMini RISC-V RV32IMC @ 160 MHz QEMU lcgamboa (backend) C++ (Arduino)
CH32V003 RISC-V RV32EC @ 48 MHz QEMU lcgamboa (backend) C++ (Arduino)
Raspberry Pi 3B ARM Cortex-A53 @ 1.2 GHz QEMU raspi3b (backend) Python

Features

Code Editing

  • Monaco Editor — Full C++ / Python editor with syntax highlighting, autocomplete, minimap, and dark theme
  • Multi-file workspace — create, rename, delete, and switch between multiple .ino / .h / .cpp / .py files
  • Arduino compilation via arduino-cli backend — compile sketches to .hex / .bin files
  • Compile / Run / Stop / Reset toolbar buttons with status messages
  • Compilation console — resizable output panel showing full compiler output, warnings, and errors

Multi-Board Simulation

AVR8 (Arduino Uno / Nano / Mega / ATtiny85 / Leonardo / Pro Mini)

  • Real ATmega328p / ATmega2560 / ATmega32u4 / ATtiny85 emulation at native clock speed via avr8js
  • Full GPIO — PORTB, PORTC, PORTD (Uno/Nano/Mega); all ATtiny85 ports (PB0PB5)
  • Timer0/Timer1/Timer2millis(), delay(), PWM via analogWrite()
  • USART — full transmit and receive, auto baud-rate detection
  • ADCanalogRead(), voltage injection from potentiometers on canvas
  • SPI — hardware SPI peripheral (ILI9341, SD card, etc.)
  • I2C (TWI) — hardware I2C with virtual device bus
  • ATtiny85 — all 6 I/O pins, USI (Wire), Timer0/Timer1, 10-bit ADC; uses AttinyCore
  • ~60 FPS simulation loop via requestAnimationFrame

RP2040 (Raspberry Pi Pico / Pico W)

  • Real RP2040 emulation at 133 MHz via rp2040js — ARM Cortex-M0+
  • All 30 GPIO pins — input/output, event listeners, pin state injection
  • UART0 + UART1 — serial output in Serial Monitor; Serial input from UI
  • ADC — 12-bit on GPIO 2629 (A0A3) + internal temperature sensor (ch4)
  • I2C0 + I2C1 — master mode with virtual device bus (DS1307, TMP102, EEPROM)
  • SPI0 + SPI1 — loopback default; custom handler supported
  • PWM — available on any GPIO pin
  • WFI optimizationdelay() skips ahead in simulation time instead of busy-waiting
  • Oscilloscope — GPIO transition timestamps at ~8 ns resolution
  • Compiled with the earlephilhower arduino-pico core

See docs/RP2040_EMULATION.md for full technical details.

ESP32 / ESP32-S3 (Xtensa QEMU)

  • Real Xtensa LX6/LX7 dual-core emulation via lcgamboa/qemu
  • Full GPIO — all 40 GPIO pins, direction tracking, state callbacks, GPIO3239 fix
  • UART0/1/2 — multi-UART serial, baud-rate detection
  • ADC — 12-bit on all ADC-capable pins (03300 mV injection from potentiometers)
  • I2C — synchronous bus with virtual device response
  • SPI — full-duplex with configurable MISO byte injection
  • RMT / NeoPixel — hardware RMT decoder, WS2812 24-bit GRB frame decoding
  • LEDC/PWM — 16-channel duty cycle readout, LEDC→GPIO mapping, LED brightness
  • WiFi — SLIRP NAT emulation (WiFi.begin("PICSimLabWifi", ""))
  • Requires arduino-esp32 2.0.17 (IDF 4.4.x) — only version compatible with lcgamboa WiFi

See docs/ESP32_EMULATION.md for setup and full technical details.

ESP32-C3 / XIAO-C3 / SuperMini / CH32V003 (RISC-V via QEMU)

  • RV32IMC emulation through QEMU lcgamboa with libqemu-riscv32 and the esp32c3-picsimlab machine — same backend pattern as Xtensa ESP32, different libqemu binary
  • GPIO 021 via W1TS/W1TC MMIO registers (ESP32-C3); PB0PB5 (CH32V003)
  • UART0 serial output in Serial Monitor
  • CH32V003 — RV32EC core at 48 MHz, 16 KB flash, DIP-8 / SOP package — ultra-compact
  • TypeScript ISA layer (RiscVCore.ts, Esp32C3Simulator.ts) is kept as Vitest-only unit-test infrastructure — it cannot handle the 150+ ROM functions ESP-IDF needs and is not the production emulation path

See docs/RISCV_EMULATION.md for full technical details.

Raspberry Pi 3B (QEMU raspi3b)

  • Full BCM2837 emulation via qemu-system-aarch64 -M raspi3b
  • Boots real Raspberry Pi OS (Trixie) — runs Python scripts directly
  • RPi.GPIO shim — drop-in replacement for the GPIO library; sends pin events to the frontend over a text protocol
  • GPIO 027 — output and input, event detection, PWM (binary state)
  • Dual serial — ttyAMA0 for user Serial Monitor, ttyAMA1 for GPIO protocol
  • Virtual File System — edit Python scripts in the UI, upload to Pi at boot
  • Multi-board serial bridge — Pi ↔ Arduino serial communication on the same canvas
  • qcow2 overlay — base SD image never modified; session changes are isolated

See docs/RASPBERRYPI3_EMULATION.md for full technical details.

Serial Monitor

  • Live serial output — characters as the sketch/script sends them
  • Auto baud-rate detection — reads hardware registers, no manual configuration needed
  • Send data to the RX pin from the UI
  • Autoscroll with toggle

Component System (48+ Components)

  • 48 electronic components from wokwi-elements
  • Component picker with search, category filters, and live previews
  • Drag-and-drop repositioning on the simulation canvas
  • Component rotation in 90° increments
  • Property dialog — pin roles, Arduino pin assignment, rotate & delete

Wire System

  • Wire creation — click a pin to start, click another pin to connect
  • Orthogonal routing — no diagonal paths
  • 8 signal-type wire colors: Red (VCC), Black (GND), Blue (Analog), Green (Digital), Purple (PWM), Gold (I2C), Orange (SPI), Cyan (USART)
  • Segment-based wire editing — drag segments perpendicular to their orientation

Library Manager

  • Browse and install the full Arduino library index directly from the UI
  • Live search, installed tab, version display

Portable Project Persistence

  • .vlx file format — single-file JSON snapshot of the whole workspace (boards, file groups, components, wires). Download with the Save button, restore with the Open .vlx button. The format is versioned so files round-trip cleanly across versions.
  • Zero server-side state — OSS Velxio has no database, no accounts, no login. Your projects live wherever you keep your .vlx files (local disk, Dropbox, GitHub, Google Drive — your choice).
  • Need accounts, public profiles at /:username, server-side project URLs and admin panels? Those live in the private overlay used to run velxio.dev — see velxio-prod for the open-core split details.

Example Projects

  • Built-in examples including Blink, Traffic Light, Button Control, Fade LED, Serial Hello World, RGB LED, Simon Says, LCD 20×4, and Pi + Arduino serial control
  • One-click loading into the editor

Self-Hosting

Pick the install path that matches your appetite for setup. All three work out-of-the-box without an .env file — defaults are picked automatically.

Path Boards available Build time Best for
A. Docker (prebuilt image) All 19 (AVR, RP2040, RISC-V, ESP32, Raspberry Pi 3) ~30 s download Just want it running
B. Docker Compose (build from source) All 19 ~1015 min first build Want to modify the code
C. Manual install Browser-only boards (AVR, RP2040, RISC-V) ~5 min Frontend / backend dev

ESP32 (Xtensa) and Raspberry Pi 3 emulation rely on QEMU .so libraries that ship inside the Docker image. Manual installs get the browser-side boards out of the box — for ESP32 you'll want Docker (or follow docs/ESP32_EMULATION.md to wire up the QEMU binaries by hand).


Option A: Docker (prebuilt image)

docker run -d \
  --name velxio \
  -p 3080:80 \
  -v velxio-data:/app/data \
  -v velxio-arduino-libs:/root/.arduino15 \
  -v velxio-arduino-user-libs:/root/Arduino \
  -v velxio-ccache:/var/cache/ccache \
  -v velxio-build:/var/lib/velxio-build \
  ghcr.io/davidmonterocrespo24/velxio:master

Open http://localhost:3080.

The five named volumes persist:

  • velxio-data/app/data: SQLite DB, project sketch files, auto-generated SECRET_KEY
  • velxio-arduino-libs/root/.arduino15: arduino-cli config + installed cores (saves a 510 min reinstall on every container restart)
  • velxio-arduino-user-libs/root/Arduino: Library Manager-installed Arduino libraries (e.g. Adafruit_BMP280, DHT, GFX). Without this, every container restart re-downloads them on next compile.
  • velxio-ccache/var/cache/ccache: ccache C/C++ object cache for ESP-IDF compiles. Empty on first compile, populated as you go; subsequent compiles hit the cache and finish in seconds instead of minutes.
  • velxio-build/var/lib/velxio-build: persistent ESP-IDF build dir (one subdir per target — esp32, esp32c3, esp32s3). Lets ninja's incremental build skip everything that hasn't changed; a re-compile of an unchanged sketch finishes in 2-5 seconds.

If you skip the volume flags, the Dockerfile declares all five paths as VOLUME, so docker creates anonymous volumes and the caches still survive container restarts (just harder to inspect/back up than named ones). Only docker rm -v or docker volume prune would wipe them.


Option B: Docker Compose (build from source)

git clone https://github.com/davidmonterocrespo24/velxio.git
cd velxio
docker compose up -d --build

First build takes ~1015 minutes (downloads ESP-IDF, builds the frontend). Subsequent builds are cached and take ~1 min.

Then open http://localhost:3080. The container generates a random SECRET_KEY on first boot and persists it in ./data/, so no .env is required to get going.

Optional: customize environment

The OSS image has almost no configuration — there's no database, no auth, no third-party integrations. Create backend/.env only if you want to change the CORS origin used during local development.

Variable Default Description
FRONTEND_URL http://localhost:5173 Origin allowed by CORS for local Vite dev

Deploying behind a reverse proxy? The container listens on plain HTTP on port 80 and accepts any Host header — no server_name whitelist.

Running velxio.dev itself? Production-only configuration (host nginx


Option C: Manual Setup (frontend + backend separately)

Prerequisites: Node.js 18+, Python 3.12+, arduino-cli

git clone https://github.com/davidmonterocrespo24/velxio.git
cd velxio

No --recurse-submodules needed. @wokwi/elements, avr8js and rp2040js come from the npm registry. Board SVGs live in frontend/public/boards/. The folders under third-party/ are reference-only — you only need to clone wokwi-elements if you're adding a new component to the catalog (the metadata generator scans its src/).

# Terminal 1 — 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
# Terminal 2 — frontend
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 ATtiny85:
arduino-cli config add board_manager.additional_urls \
  http://drazzy.com/package_drazzy.com_index.json
arduino-cli core install ATTinyCore:avr

ESP32 (Xtensa) compilation in manual install requires the ESP-IDF 4.4.7 toolchain installed locally. The Docker image bundles this — for manual installs see docs/ESP32_EMULATION.md. If you only need AVR / RP2040 / RISC-V boards you can skip ESP-IDF entirely.


Project Structure

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
├── third-party/                  # Reference-only upstream clones (credits)
│   │                            # — runtime libs come from npm; the only
│   │                            # one used by the build is qemu-lcgamboa.
│   ├── wokwi-elements/          # (npm: @wokwi/elements)
│   ├── avr8js/                  # (npm: avr8js)
│   ├── rp2040js/                # (npm: rp2040js)
│   └── qemu-lcgamboa/           # QEMU fork for ESP32 Xtensa (build from source)
├── img/                         # Raspberry Pi 3 boot images (kernel8.img, dtb, OS)
├── docker/                      # In-container nginx.conf + entrypoint.sh
├── docs/                        # Technical documentation
├── Dockerfile.standalone        # Single-container image used for self-hosting
└── docker-compose.yml           # Self-hosting compose
                                 # (production deployment lives in
                                 # https://github.com/velxio/velxio-prod)

Technologies

Layer Stack
Frontend React 19, Vite 7, TypeScript 5.9, Monaco Editor, Zustand, React Router 7
Backend FastAPI, uvicorn (stateless: compile, libraries, simulation, MCP)
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) + ESP-IDF (subprocess)
Auth None — anonymous, single-user editor by design
Persistence .vlx file export/import (no server-side database)
Deploy Docker, nginx, GitHub Actions → GHCR + Docker Hub

Documentation

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

Troubleshooting

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 25 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.


Community

Join the Discord server to ask questions, share projects, and follow updates:

discord.gg/3mARjJrh4E

Contributing

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.

License

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.

Star History

Star History Chart


References