Skip to the content
PCBKitNew board
4 layers112 × 75 mmKvm board, the printed circuit board in 3D

A network KVM that can switch inputs of smart monitors

Size
112 × 75 mm
Copper layers
4
Thickness
1.6 mm
Parts
95
Nets
75
Pads
495
Tracks, vias
1,160, 500
Pours
6
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
7 Feb 2025
Updated
6 Nov 2026

Overview

Kvm board is an open-source printed circuit board by FuNK3Y, from the FuNK3Y/picoKVM repository on GitHub. It is a 4-layer board of 112 × 75 mm with 95 parts on 75 nets, routed with 1,160 tracks and 500 vias.

It is built around the ESP32-S3-WROOM-1-N8R2, LM66100DCK and USBLC6-2SC6, with the PCA9306DC, AP2112K-3.3 and HD3SS3212IRKSR among its other parts. Its parts include 27 resistors, 25 capacitors, 22 ICs, 9 connectors and 3 switches. It belongs with the ESP32 boards of this library.

Main components

12

README

README.md

PicoKVM

An inexpensive network KVM that can switch USB and monitor inputs simultaneously

Why

Samsung makes great monitors, but they often lack a KVM. The project started as a way to switch them along with the USB devices, over their network API. It was later generalized to most monitors, driven over HDMI DDC/CI by its own board, while still driving network-controlled monitors and devices.

Features

  • Switches the USB devices and the monitors' inputs together
  • Drives most monitors over HDMI DDC/CI, and others (or any device: a lamp, ...) over the network
  • No video goes through it: every computer is connected directly to every monitor, so HDCP, VRR, G-Sync, FreeSync, HDR, ... work natively
  • Controlled from its button, a web page or an HTTP API, from any device on the network

Hardware

picoKVM runs on its own board, designed in hardware/: an ESP32-S3, a USB 3.0 switch (two computers, one peripheral port), two HDMI ports carrying DDC/CI only (no video) to switch monitor inputs, an RGB status LED, and a Grove port for an M5Stack key unit as the switch button.

picoKVM board

The original build (M5Stack AtomS3 Lite + USB multiplexer) is no longer supported; its last version is 5d5997c.

Install

  1. Open the browser installer in Chrome or Edge, and plug the board's AUX / FLASH USB-C port into the computer.
  2. Install, then connect the board to your Wi-Fi from the same page.
  3. Visit device opens the settings page: set the admin password first, then the input names and the monitors.

Wiring

  • Computers' video goes directly to the monitors, as without a KVM.
  • Each computer's USB goes to the board; the keyboard and mouse go to its peripheral port, through a hub (the monitor's own hub works).
  • For monitors driven over DDC/CI, an HDMI cable goes from one of the board's HDMI ports to the monitor. It carries only the input-switch commands, no video. Monitors driven over the network need none.
mermaid
graph LR
    KB["Keyboard"] <--> |USB| HUB["USB hub"]
    MOUSE["Mouse"] <--> |USB| HUB
    KVM <--> |USB| HUB
    PC1["Computer 1"] --> |Video| MON["Monitor"]
    PC2["Computer 2"] --> |Video| MON
    PC1 <--> |USB| KVM["picoKVM"]
    PC2 <--> |USB| KVM
    KVM -.-> |"HDMI (DDC/CI only)"| MON
    style MON fill:#f9f,stroke:#333
    style KVM fill:#bbf,stroke:#333
    style HUB fill:#ddd,stroke:#333
    style KB fill:#ddd,stroke:#333
    style MOUSE fill:#ddd,stroke:#333
    style PC1 fill:#ddd,stroke:#333
    style PC2 fill:#ddd,stroke:#333

Settings

The settings page (Settings, below the switch button at http://picokvm.local) edits everything: Wi-Fi, input names and colors, LED brightness, admin password, monitors and updates.

Admin password

Once set, the admin password protects everything the settings page does: opening it, reading and changing the configuration, and installing updates, from the page or through the API. The browser asks for it (any user name); API calls send it as HTTP Basic credentials, e.g. curl -u admin:<password>. Switching inputs, the state and /metrics stay open.

Until it is set, all of that is open to anyone on the network.

To remove it, use Clear password, then Save, on the settings page, or send "admin_password": null to /api/config; everything above is then open again.

It travels over plain HTTP, so anyone able to watch the network traffic can read it.

Monitors

Monitors are added on the settings page: a form for DDC/CI monitors, JSON for the others (config.example.json has an example of each).

DDC/CI monitors

Enable DDC/CI in the monitor's menu. For each computer, choose the monitor input it is on. The settings page reads the monitor: its name, the input it is on now, and the inputs it lists, named as the MCCS standard names them (VCP 0x60: 15 DisplayPort 1, 17 HDMI 1, ...). Some monitors use other values, or name their ports differently: put the monitor on each computer's input by hand, and the page shows which value it is (Other value... takes any number). Power the monitor on first wakes up monitors that keep DDC/CI alive in standby.

The monitor must accept DDC/CI on an input that is not the active one, since it is showing the other computer when the command arrives. Most do: tested on AOC, Samsung, Dell, Acer, Philips and Lenovo monitors. Some have no DDC/CI at all (the Samsung G80SD): drive those over the network.

Samsung monitors over the network

For Samsung smart monitors without DDC/CI, the KVM sends remote-control key presses: enable IP remote on the monitor (Connection > Network > Expert Settings). Find a repeatable sequence of keys that selects each input from the home screen, and write it with the key codes as a SamsungMonitor. KEY_RETURN first also wakes the monitor up; command_delay (or a delay on one key) slows the sequence down if the menu cannot keep up.

Other network devices

A GenericDevice sends an HTTP request for each input: another monitor's API (e.g. SmartThings, untested), a lamp, ...

Use

Switch with the button, the web page at http://picokvm.local (it follows the KVM whoever switches it), or the API:

sh
curl -X POST http://picokvm.local/api/active_input/A   # or B; without the input, toggles
curl http://picokvm.local/api/active_input             # the state: active input, switching, last error
curl http://picokvm.local/api/events                   # the state as server-sent events, on every change

/api/config reads (GET) and writes (POST) the configuration, without the passwords, only admin_password_set tells whether one is set (admin password required). /metrics gives Wi-Fi signal, memory, USB power and version for Prometheus.

picokvm is the default hostname; it can be changed in the settings.

Updates

Check for updates, then Install, on the settings page installs the latest release over the network; Upload installs a firmware-ota.bin of your own. Settings are kept. The first boot of an update is a trial: if the device is not back on Wi-Fi within 2 minutes, it returns to the previous firmware.

The same through the API, with the admin password:

sh
curl -u admin:<admin_password> -X POST http://picokvm.local/api/update/latest
curl -u admin:<admin_password> --data-binary @firmware-ota.bin http://picokvm.local/api/update

MicroPython does not check GitHub's certificate when downloading a release: the SHA-256 GitHub publishes only guards against a corrupted download.

ESPHome

The board can also run ESPHome instead of this firmware, for a native Home Assistant integration (DDC/CI monitors only). Include the esphome/picokvm.yaml package, then name the computers and set the number of monitors:

yaml
packages:
  picokvm: github://FuNK3Y/picoKVM/esphome/picokvm.yaml@main

substitutions:
  inputs:
    a: Work laptop
    b: Gaming PC
  monitors: 2

Each monitor's input values and the LED colors and brightness are then set from Home Assistant. esphome/example.yaml is a complete starting point; it builds, but has not been run on a board yet.

Development

firmware/build.sh builds MicroPython with src/ frozen in, into firmware/build/ (needs ESP-IDF v5.5.2):

sh
. $IDF_PATH/export.sh
firmware/build.sh

CI runs the same build on pull requests and main and keeps the images as an artifact. A v* tag publishes a release and the installer to GitHub Pages.

The tests run the application on CPython, with stand-ins for the board (tests/mocks.py); CI requires 95% coverage:

sh
python3 -m unittest discover -s tests

Parts

95
QtyValueFootprintReferences
11100nFCapacitor_SMD:C_0402_1005MetricC1, C3, C6, C9, C14, C15, C16, C17, C19, C21, C22
910kResistor_SMD:R_0402_1005MetricR3, R4, R6, R7, R8, R10, R22, R23, R24
81uFCapacitor_SMD:C_0402_1005MetricC2, C4, C5, C10, C12, C20, C23, C24
6TPD4E05U06DQAR_C138714lcsc:USON-10_L2.5-W1.0-P0.50-BLU11, U12, U13, U17, U18, U19
5LM66100DCKPackage_TO_SOT_SMD:SOT-363_SC-70-6U6, U7, U8, U21, U22
42kResistor_SMD:R_0402_1005MetricR15, R16, R20, R21
44.7kResistor_SMD:R_0402_1005MetricR13, R14, R18, R19
4MountingHoleMountingHole:MountingHole_3.2mm_M3H1, H2, H3, H4
3100Resistor_SMD:R_0402_1005MetricR25, R26, R27
3100mAFuse:Fuse_0805_2012MetricF2, F3, F4
310uFCapacitor_SMD:C_0805_2012MetricC11, C13, C25
322uFCapacitor_SMD:C_0805_2012MetricC7, C8, C18
3USBLC6-2SC6Package_TO_SOT_SMD:SOT-23-6U14, U15, U16
215kResistor_SMD:R_0402_1005MetricR9, R11
2200kResistor_SMD:R_0402_1005MetricR12, R17
25.1kResistor_SMD:R_0402_1005MetricR1, R2
2HC-USB3.0-L1845-BFlcsc:USB-B-TH_9P-L18.5-W12.0J1, J2
2HDMI-001lcsc:HDMI-SMD_19P-P0.50-H-FJ5, J6
2PCA9306DCPackage_SO:VSSOP-8_2.3x2mm_P0.5mmU9, U10
11N4148WDiode_SMD:D_SOD-123D4
120kResistor_SMD:R_0402_1005MetricR5
1AP2112K-3.3Package_TO_SOT_SMD:SOT-23-5U5
1BOOTButton_Switch_SMD:SW_Push_1P1T_XKB_TS-1187ASW2
1ESP32-S3-WROOM-1-N8R2RF_Module:ESP32-S3-WROOM-1U1
1GPIOConnector_PinHeader_2.54mm:PinHeader_2x08_P2.54mm_VerticalJ9
1GROVE_BTNlcsc:CONN-SMD_4P-P2.00_ZX-HY2.0-4PWTJ8
1HC-USB3.0-L168-WPlcsc:USB-TH_USB3.0-AJ3
1HD3SS3212IRKSRlcsc:DHVQFN-20_L4.5-W2.5-P0.50-BL-EPU2
1RESETButton_Switch_SMD:SW_Push_1P1T_XKB_TS-1187ASW1
1SK6812SIDE-Alcsc:LED-SMD_4P-L4.0-W1.6-LD3
1SWITCHButton_Switch_SMD:SW_Push_1P1T_XKB_TS-1187ASW3
1TPS2116DRLPackage_TO_SOT_SMD:SOT-583-8U4
1TPS2553DBVRlcsc:SOT-23-6_L2.9-W1.6-P0.95-LS2.8-BRU20
1TS3USB221ARSERlcsc:UQFN-10_L2.0-W1.5-P0.50-BLU3
1UARTConnector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_VerticalJ7
1USB_C_Receptacle_USB2.0_16PConnector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12J4

Questions

How big is the Kvm board PCB?

It measures 112 × 75 mm and has 4 copper layers, 1.6 mm thick.

What parts does the Kvm board use?

95 parts, built around the ESP32-S3-WROOM-1-N8R2, LM66100DCK, USBLC6-2SC6 and PCA9306DC. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Kvm board KiCad files?

From the FuNK3Y/picoKVM repository on GitHub, at the commit this page was made from: the board is hardware/revA/kvm_board.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.

Can I use the Kvm board design in my own project?

Its repository states no licence, so its author keeps all rights: ask FuNK3Y before reusing the design.

Similar boards

  • 6 layers133 × 102 mmIasis, the printed circuit board in 3D

    Iasis

    hydazz/iasis

    An optional Raspberry Pi Compute Module 5 carrier for Iasis. It plugs into the main board's HubPD population and carries Ethernet, NVMe storage, an accessory USB-C port and a service USB-C port.

    723 partsApache-2.0
  • 6 layers135 × 77 mmPortaRe0, the printed circuit board in 3D

    PortaRe0

    0Re0-8192/PortaRe0

    Cubie A7Z based clamshell cyberdeck

    357 parts2
  • 4 layers92.7 × 29.7 mmCh398, the printed circuit board in 3D

    Ch398

    zOnlyKroks/pcb-consortium

    38 partsCC0-1.0
  • 2 layers127 × 95 mmPrerouted, the printed circuit board in 3D

    Prerouted

    bruk-io/pcb-route

    A fast autorouter for KiCad boards that, above all, reroutes incrementally: given the previous route, it keeps what an edit left standing and routes again only what the edit disturbed.

    160 partsMIT
  • 4 layers94.3 × 81.8 mmYukaLink revA, the printed circuit board in 3D

    YukaLink revA

    Misaka0x2730/YukaLink

    Dual targets USB+ETH ARM JTAG/SWD debugger (BlackMagic port) based on RP2350. JTAG and SWD interfaces are implemented on PIO.

    321 parts3GPL-3.0
  • 2 layers50 × 70 mmLcdtap rp2350, the printed circuit board in 3D

    Lcdtap rp2350

    shapoco/lcdtap

    A tool for mirroring or capturing I2C/SPI LCD displays

    100 parts85
  • 4 layers142 × 119.7 mmQMTech MiSTeX, the printed circuit board in 3D

    QMTech MiSTeX

    MiSTeX-devel/MiSTeX-hardware

    Hardware for MiSTeX

    247 parts73