Debug firmware on a virtual chip — breakpoints, stepping (including reverse), registers, memory — with no hardware attached.
Optionally connect agent tools (the same labwired_* MCP surface as the Playground and CLI) so Copilot, Claude Code, or Cursor can compile, run, and verify firmware on the twin.
- VS Code — search LabWired in Extensions, or
code --install-extension w1ne.labwired-vscode - VSCodium, Cursor, Windsurf, Theia — search LabWired; the extension is published to Open VSX as well.
- Any editor, no registry — download
labwired-vscode.vsixfrom the latest release and run Extensions: Install from VSIX…
Linux, macOS and Windows, on Intel and Arm. The simulator and debug adapter download themselves on first use; nothing needs a Rust toolchain.
- Install the extension.
- Open a firmware project and build it.
- Press F5.
No launch.json required: the extension resolves the ELF from .labwired/lab.yaml or discovers your build. The simulator and debug adapter download themselves on first use.
Same tools everywhere: labwired_list, labwired_describe, labwired_compile, labwired_run, labwired_verify, part knowledge, …
- LabWired: Sign In (optional; unlocks authenticated hosted tools).
- LabWired: Configure Agent Tools → writes
.vscode/mcp.jsonpointing athttps://api.labwired.com/mcp. - Use your editor’s agent chat; it can call those tools.
OpenCode agent (same tools — like Embedder’s CLI, driven from the extension):
- LabWired: Start OpenCode Agent — opens a terminal with
labwired(installs if missing). - Or manually:
curl -fsSL https://labwired.com/install | bash
labwired login # optional hosted MCP + model
labwired # OpenCode + skills + labwired_* toolsClaude Code (same MCP URL):
claude mcp add labwired --transport http https://api.labwired.com/mcpPalette: Copy Claude MCP Install Command / Copy Agent Install Command.
Local debug and Run Test (lab.yaml) stay free and do not require sign-in.
| Breakpoints and stepping | Including step back — the simulator can run in reverse. |
| Registers | CPU and decoded peripherals, searchable, changes since last stop highlighted. |
| Memory | Hex/ASCII inspect and edit. Unmapped space is unreadable, not zeros. |
| Peripherals | Names and bit-fields where modeled; honest empty state when not. |
| Timeline, trace, profiler | Execution history and where cycles went. |
| Agent MCP | Shared hosted tools for AI agents (configure once). |
Inspecting is passive: reading a peripheral does not perturb the firmware under debug.
schema_version: "1.0"
inputs:
firmware: "../../target/thumbv7em-none-eabi/release/firmware-foo"
system: "../system.yaml"
limits:
max_steps: 100000
assertions:
- uart_contains: "OK"
- expected_stop_reason: max_stepsLabWired: Run Test (lab.yaml) runs the same labwired test … path CI uses, so the editor and CI cannot disagree.
LabWired: Configure Project… generates .labwired/lab.yaml.
Local simulation needs no account. Sign-in uses LabWired’s OAuth (Clerk-backed) at api.labwired.com for hosted features only.
- Tokens live in VS Code SecretStorage.
- Override the API with
labwired.apiUrl.
| Setting | Purpose |
|---|---|
labwired.apiUrl |
API base (default https://api.labwired.com) |
labwired.cliPath |
Use your own labwired binary |
labwired.dapPath |
Use your own labwired-dap |
labwired.cliVersion |
Release tag for auto-download |
labwired.executionMode |
local or docker |
npm install
npm run compile
npm run test:unitPress F5 in this folder to launch an Extension Development Host.
npm run package # → labwired-vscode-*.vsixMIT.