Live Agent working · engine-01 Placer/router engine positioning
KV-00Open Source Hardwaredesigned

KVM Board

Remote keyboard, video, and mouse control over IP. Built with RISC-V, designed in KiCad 10, simulation-first.

Readout
Board120×92mm
Layers6layer
Components33rows·73parts
BOM Cost$20.85/ unit
Placementextracted
DRC0S/0U
Schematics8sheets
Build Phases5
Info

A fully open-source KVM-over-IP appliance. The compositor (a Milk-V Duo S running KVMD) takes HDMI input from the target machine via a TC358743 HDMI-to-CSI bridge, encodes it to H.264 with hardware acceleration, and streams it to the browser over WebRTC. An ESP32-S3 acts as a USB HID composite device, receiving keyboard and mouse events from the browser via WebSocket. Front-panel power, reset, and LED control happens through PC817 optocouplers.

The whole stack runs in QEMU first — the simulator is the development environment, the hardware is the deployment target.

Specification
Compositor MV-01 Milk-V Duo S RISC-V SG2000, runs KVMD daemon
HID ES-01 ESP32-S3 USB HID composite via TinyUSB
Video TC-01 TC358743XBG HDMI 1.4 → MIPI CSI-2, 1080p30
USB Hub UH-01 USB2514B 4-port USB 2.0, single cable to target
ATX AT-01 PC817 ×4 Optocoupler front-panel control
Protocol PR-01 UART Binary HID packets, Duo S ↔ ESP32-S3
Web UI KV-01 Astro + DaisyUI WebRTC video, 17 themes, virtual media
Board PB-01 6-layer PCB 120 × 92mm, 78 components, Rust VG router
Cost BM-01 ~$62/unit At qty 5, LCSC sourced
Architecture
WebSocket HID UART HID packets USB HID USB-C HDMI MIPI CSI-2 H.264 WebRTC POST /atx GPIO opto Browser KVMDaiohttp ESP32-S3TinyUSB HID Target Machine TC358743HDMI→CSI Milk-V Duo S USB2514B Hub ATX Optos
ASCII Flow
Browser → KVMD (aiohttp WebSocket) → UART → ESP32-S3 (USB HID) → Target Machine
Browser ← WebRTC (go2rtc + H.264) ← FFmpeg ← VNC ← QEMU/TC358743 ← Target HDMI
Browser → KVMD (POST) → QMP/GPIO → ATX Power/Reset/LEDs
Features
KV-01
WebRTC Video
H.264 over WebRTC via go2rtc. Low-latency, hardware-accelerated decode in browser.
KV-02
Keyboard & Mouse
Pointer-lock capture with full HID keycode translation. Modifier keys, scroll, absolute pointer.
KV-03
ATX Power Control
Power on/off, force off, reset via QMP (sim) or GPIO optocouplers (hardware).
KV-04
Paste as Keystrokes
Type text character-by-character over HID. ASCII-to-USB keycode mapping.
KV-05
Virtual Media
Upload ISOs, download presets (FreeBSD, Ubuntu, Arch, TempleOS), mount/eject.
KV-06
17 Themes
Catppuccin, Gruvbox, Tokyo Night, Nord, and 13 more. Persisted to localStorage.
Project Status
  • Design spec and BOM (~$62/unit at qty 5)
  • ESP32-S3 HID firmware (TinyUSB composite device)
  • KVMD daemon with WebRTC video + WebSocket HID
  • Web UI: Astro + Tailwind + DaisyUI, 17 themes
  • Virtual media (ISO upload/download/mount/eject)
  • QEMU VM simulation with full KVM pipeline
  • KiCad 10 schematics (7 sheets, 0 ERC errors)
  • PCB layout (6-layer, Rust analytical placer + 3D VG router, 0 shorts, 0 unconnected)
  • Rust crates: designgraph (TOML→KiCad), router (VG+A*), simulator
  • Hardware prototype fabrication
  • Duo S Linux image + device tree
  • TC358743 CSI driver integration
— · — · —
Bill of Materials
33 rows · 73 components · Total $20.85
Ref Category MPN Description Qty Unit Ext Links
U1 SOT-223-3_TabPin2 AMS1117-3.3 3.3V 1A LDO Regulator 1 $0.30 $0.30 LCSC
U2 SOT-223-3_TabPin2 AMS1117-1.8 1.8V 1A LDO Regulator 1 $0.30 $0.30 LCSC
U3 SOT-223-3_TabPin2 AMS1117-1.2 1.2V 1A LDO Regulator 1 $0.30 $0.30 LCSC
U4 BGA-80 TC358743XBG HDMI 1.4 to MIPI CSI-2 Bridge 1 $6.00 $6.00 LCSC
U5 QFN-36 USB2514B-I/M2 4-Port USB 2.0 Hub Controller 1 $3.50 $3.50 LCSC
U6 TSSOP-24 TPD12S016PWR HDMI ESD Protection + Level Shift 1 $2.00 $2.00 LCSC
U7, U8, U9, U10 DIP-4_W7.62mm PC817 Phototransistor Optocoupler 4 $0.20 $0.80 LCSC
C1, C2, C3, C4, C5, C6 C_0805_2012Metric 10u 10uF 25V MLCC X5R 0805 6 $0.05 $0.30 LCSC
C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21 C_0402_1005Metric 100n 100nF 50V MLCC X7R 0402 15 $0.01 $0.15 LCSC
C22, C23, C24, C25, C26, C27 C_0402_1005Metric 1u 1uF 25V MLCC X5R 0402 6 $0.02 $0.12 LCSC
C28, C29 C_0805_2012Metric 22u 22uF 16V MLCC X5R 0805 2 $0.08 $0.16 LCSC
R1, R2 R_0402_1005Metric 5.1k 5.1k 1% 0402 (USB-C CC) 2 $0.01 $0.02 LCSC
R3, R4, R5, R6 R_0402_1005Metric 330 330R 1% 0402 (Opto LED) 4 $0.01 $0.04 LCSC
R7, R8, R9, R10 R_0402_1005Metric 10k 10k 1% 0402 (Pull-ups) 4 $0.01 $0.04 LCSC
R11, R12 R_0402_1005Metric 4.7k 4.7k 1% 0402 (I2C pull-up) 2 $0.01 $0.02 LCSC
R13 R_0402_1005Metric 1k 1k 1% 0402 (Power LED) 1 $0.01 $0.01 LCSC
Y1 Crystal_SMD_3215 24MHz 24MHz Crystal (USB2514B) 1 $0.50 $0.50 LCSC
Y2 Crystal_SMD_3215 27MHz 27MHz Crystal (TC358743) 1 $0.50 $0.50 LCSC
FB1, FB2, FB3, FB4, FB5 L_0402_1005Metric 600R 600R@100MHz Ferrite Bead 0402 5 $0.02 $0.10 LCSC
D1 LED_0603_1608Metric Green Green LED 0603 (Power) 1 $0.03 $0.03 LCSC
D2 LED_0603_1608Metric Yellow Yellow LED 0603 (Network) 1 $0.03 $0.03 LCSC
D3 LED_0603_1608Metric Blue Blue LED 0603 (HDMI) 1 $0.03 $0.03 LCSC
J1 HDMI_A_Horizontal HDMI_A HDMI Type-A Receptacle 1 $0.80 $0.80 LCSC
J2 USB_A_Horizontal USB_A USB-A Receptacle (to target) 1 $0.30 $0.30 LCSC
J3 USB_C_Receptacle USB_C USB-C Receptacle (power input) 1 $0.50 $0.50 LCSC
J4 RJ45_Shielded RJ45 RJ45 Jack w/ Integrated Magnetics 1 $1.00 $1.00 LCSC
J5 PinHeader_2x05_P2.54mm ATX_Header 2x5 2.54mm Pin Header 1 $0.20 $0.20 LCSC
J6 FFC_FPC_15pin_1mm FPC_15 15-pin 1.0mm FPC Connector (CSI) 1 $0.30 $0.30 LCSC
J7 PinSocket_2x13_P2.54mm DuoS_Hdr1 2x13 Female Pin Header 1 $0.75 $0.75 LCSC
J8 PinSocket_2x13_P2.54mm DuoS_Hdr2 2x13 Female Pin Header 1 $0.75 $0.75 LCSC
J9 PinSocket_1x20_P2.54mm ESP32_Hdr1 1x20 Female Pin Header 1 $0.50 $0.50 LCSC
J10 PinSocket_1x20_P2.54mm ESP32_Hdr2 1x20 Female Pin Header 1 $0.50 $0.50 LCSC
TOTAL (components only) 1
Total $20.85
— · — · —
Wiring

7 hierarchical sheets designed in KiCad 10. 78 components, 0 ERC errors.

8 sheets · click to open
Drag to pan · Wheel/pinch to zoom · ← → next sheet
— · — · —
Mech

6-layer board, 120 × 92mm. 78 components. Rust analytical placement, 3D visibility-graph routing, KiCad DRC feedback, and generated GLB/SVG/PNG assets.

120 × 92 mm 6 layer
PCB front
KV-00 Front
PCB back
KV-00 Back
DRC Report
2026-04-26T13:43:48
0
Shorts
0
Unconnected
0
Parity
0
Violations
Component Map · Dimensions
Hover BOM ↔ Map
101.7 mm 91.0 mm R1 R2 R3 D1 C1 U1 C2 C3 C4 U2 C5 C6 C7 U3 C8 C9 C10 U4 C11 C12 C13 U5 X1 C26 C27 FB1 FB2 R4 R5 R6 R7 C16 C17 C18 C19 C20 C21 C22 C24 J1 J2 U7 U8 U9 U10 R10 R11 R12 R13 J5 J6 J8 J10
Enclosure (TurboCase)
Ready
TurboCase enclosure outline
3D Model
Loading…
KV-00 Copper Layers
Copper layers
X-Ray Layer Viewer
F.SilkscreenF.CuIn1.CuIn2.Cu (GND)In3.Cu (+3V3)In4.CuB.CuB.SilkscreenEdge Cuts
— · — · —
Instructions
  1. Phase 01 Order PCB & components
    Tools: JLCPCB account, LCSC account
    1. Run `mise run kicad:gerbers` to regenerate gerbers from the latest sources.
    2. Upload `hardware/manufacturing/gerbers/kvm-carrier-gerbers.zip` to JLCPCB.
    3. Pick: 6-layer, 1.6mm thickness, ENIG finish, impedance-controlled stackup (JLC04161H-7628).
    4. Order qty 5 (~$120 incl. shipping at 2026 prices).
    5. In parallel, copy the BOM CSV to LCSC cart via `mise run lcsc:cart`. Total ~$210/board for the IC bag (TC358743 dominates).
  2. Phase 02 Assemble PCB
    Tools: Hot air gun, Soldering iron, Solder paste, Tweezers, Stencil from JLCPCB
    1. Apply solder paste with the JLC stencil. Align using the fiducials at the four corners.
    2. Place the BGAs first (TC358743XBG and the Duo S header) — they're the only components that benefit from reflow before manual rework.
    3. Reflow at 245°C peak, 60s liquidus.
    4. Hand-place 0402 passives — start at the power supply (U1-U3), then move outward.
    5. Reflow second pass for hand-placed components, or hot-air rework individually.
    6. Hand-solder through-hole connectors last (HDMI jack, USB-C, ATX header, RJ45).
  3. Phase 03 Power-on smoke test
    Tools: USB-C power meter, Multimeter, Bench supply (current-limited to 500 mA)
    1. Visual inspection under microscope: shorts, tombstones, missing parts.
    2. Measure VBUS-to-GND resistance at the USB-C jack — should read >50 kΩ. Anything below that is a short, do not power.
    3. Apply 5V via current-limited bench supply at 500 mA.
    4. Verify rails: +5V (USB), +3V3 (U1 out), +1V8 (U2 out), +1V2 (U3 out). All within ±2% of nominal.
    5. Total quiescent draw at idle should be ~150 mA.
  4. Phase 04 Flash firmware
    Tools: USB-C cable, ESP32 flasher, Milk-V Duo S SD card, balena Etcher
    1. Flash the Milk-V Duo S Linux image (`firmware/duos-image.img`) to a microSD card with Etcher.
    2. Insert the SD card into the Duo S, power up the board, wait for the boot LED.
    3. Connect a laptop to the ESP32-S3's USB-C port. The ESP32 is in download mode by default on first boot.
    4. Flash `firmware/kvm-firmware.bin` via `mise run firmware:flash`.
    5. Reboot. The ESP32 should re-enumerate as a composite USB HID device.
  5. Phase 05 First connection
    Tools: HDMI cable, USB-A → USB-C cable, Web browser
    1. Find the Duo S on your network (mDNS name `kvm.local` by default, or check your router).
    2. Open `https://kvm.local` in a browser. Accept the self-signed cert on first connect.
    3. Connect the HDMI input to a target machine's HDMI output.
    4. Connect the USB-C output to the target machine's USB port.
    5. Click "Power On" in the web UI to confirm ATX optocouplers fire correctly.
    6. Click into the video and confirm keyboard + mouse passthrough works.
— · — · —
Extras · Software

Full software stack

The board is one half of the project. KVMD-on-Linux on the Milk-V, TinyUSB on the ESP32-S3, and an Astro/DaisyUI web UI in the browser. Everything is simulation-first — nothing here requires the physical board to develop.

CompositorMV-01 Milk-V Duo SRISC-V SG2000, runs KVMD daemon
HIDES-01 ESP32-S3USB HID composite via TinyUSB
VideoTC-01 TC358743XBGHDMI 1.4 → MIPI CSI-2, 1080p30
USB HubUH-01 USB2514B4-port USB 2.0, single cable to target
ATXAT-01 PC817 ×4Optocoupler front-panel control
ProtocolPR-01 UARTBinary HID packets, Duo S ↔ ESP32-S3
Web UIKV-01 Astro + DaisyUIWebRTC video, 17 themes, virtual media
CostBM-01 ~$62/unitAt qty 5, LCSC sourced
Data flow
Browser → KVMD (aiohttp WebSocket) → UART → ESP32-S3 (USB HID) → Target Machine
Browser ← WebRTC (go2rtc + H.264) ← FFmpeg ← VNC ← QEMU/TC358743 ← Target HDMI
Browser → KVMD (POST) → QMP/GPIO → ATX Power/Reset/LEDs
Features
KV-01
WebRTC Video
H.264 over WebRTC via go2rtc. Low-latency, hardware-accelerated decode in browser.
KV-02
Keyboard & Mouse
Pointer-lock capture with full HID keycode translation. Modifier keys, scroll, absolute pointer.
KV-03
ATX Power Control
Power on/off, force off, reset via QMP (sim) or GPIO optocouplers (hardware).
KV-04
Paste as Keystrokes
Type text character-by-character over HID. ASCII-to-USB keycode mapping.
KV-05
Virtual Media
Upload ISOs, download presets (FreeBSD, Ubuntu, Arch, TempleOS), mount/eject.
KV-06
17 Themes
Catppuccin, Gruvbox, Tokyo Night, Nord, and 13 more. Persisted to localStorage.
Web Interface — 17 Themes

Click any thumbnail to view fullscreen. Arrow keys: left/right to navigate, up/down to cycle themes.

Theme: