
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.

A network KVM that can switch inputs of smart monitors
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.
An inexpensive network KVM that can switch USB and monitor inputs simultaneously
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.
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.

The original build (M5Stack AtomS3 Lite + USB multiplexer) is no longer supported; its last version is 5d5997c.
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:#333The 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.
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 are added on the settings page: a form for DDC/CI monitors, JSON for the others (config.example.json has an example of each).
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.
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.
A GenericDevice sends an HTTP request for each input: another monitor's API (e.g. SmartThings, untested), a lamp, ...
Switch with the button, the web page at http://picokvm.local (it follows the KVM whoever switches it), or the API:
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.
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:
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/updateMicroPython does not check GitHub's certificate when downloading a release: the SHA-256 GitHub publishes only guards against a corrupted download.
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:
packages:
picokvm: github://FuNK3Y/picoKVM/esphome/picokvm.yaml@main
substitutions:
inputs:
a: Work laptop
b: Gaming PC
monitors: 2Each 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.
firmware/build.sh builds MicroPython with src/ frozen in, into firmware/build/ (needs ESP-IDF v5.5.2):
. $IDF_PATH/export.sh
firmware/build.shCI 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:
python3 -m unittest discover -s tests| Qty | Value | Footprint | References |
|---|---|---|---|
| 11 | 100nF | Capacitor_SMD:C_0402_1005Metric | C1, C3, C6, C9, C14, C15, C16, C17, C19, C21, C22 |
| 9 | 10k | Resistor_SMD:R_0402_1005Metric | R3, R4, R6, R7, R8, R10, R22, R23, R24 |
| 8 | 1uF | Capacitor_SMD:C_0402_1005Metric | C2, C4, C5, C10, C12, C20, C23, C24 |
| 6 | TPD4E05U06DQAR_C138714 | lcsc:USON-10_L2.5-W1.0-P0.50-BL | U11, U12, U13, U17, U18, U19 |
| 5 | LM66100DCK | Package_TO_SOT_SMD:SOT-363_SC-70-6 | U6, U7, U8, U21, U22 |
| 4 | 2k | Resistor_SMD:R_0402_1005Metric | R15, R16, R20, R21 |
| 4 | 4.7k | Resistor_SMD:R_0402_1005Metric | R13, R14, R18, R19 |
| 4 | MountingHole | MountingHole:MountingHole_3.2mm_M3 | H1, H2, H3, H4 |
| 3 | 100 | Resistor_SMD:R_0402_1005Metric | R25, R26, R27 |
| 3 | 100mA | Fuse:Fuse_0805_2012Metric | F2, F3, F4 |
| 3 | 10uF | Capacitor_SMD:C_0805_2012Metric | C11, C13, C25 |
| 3 | 22uF | Capacitor_SMD:C_0805_2012Metric | C7, C8, C18 |
| 3 | USBLC6-2SC6 | Package_TO_SOT_SMD:SOT-23-6 | U14, U15, U16 |
| 2 | 15k | Resistor_SMD:R_0402_1005Metric | R9, R11 |
| 2 | 200k | Resistor_SMD:R_0402_1005Metric | R12, R17 |
| 2 | 5.1k | Resistor_SMD:R_0402_1005Metric | R1, R2 |
| 2 | HC-USB3.0-L1845-BF | lcsc:USB-B-TH_9P-L18.5-W12.0 | J1, J2 |
| 2 | HDMI-001 | lcsc:HDMI-SMD_19P-P0.50-H-F | J5, J6 |
| 2 | PCA9306DC | Package_SO:VSSOP-8_2.3x2mm_P0.5mm | U9, U10 |
| 1 | 1N4148W | Diode_SMD:D_SOD-123 | D4 |
| 1 | 20k | Resistor_SMD:R_0402_1005Metric | R5 |
| 1 | AP2112K-3.3 | Package_TO_SOT_SMD:SOT-23-5 | U5 |
| 1 | BOOT | Button_Switch_SMD:SW_Push_1P1T_XKB_TS-1187A | SW2 |
| 1 | ESP32-S3-WROOM-1-N8R2 | RF_Module:ESP32-S3-WROOM-1 | U1 |
| 1 | GPIO | Connector_PinHeader_2.54mm:PinHeader_2x08_P2.54mm_Vertical | J9 |
| 1 | GROVE_BTN | lcsc:CONN-SMD_4P-P2.00_ZX-HY2.0-4PWT | J8 |
| 1 | HC-USB3.0-L168-WP | lcsc:USB-TH_USB3.0-A | J3 |
| 1 | HD3SS3212IRKSR | lcsc:DHVQFN-20_L4.5-W2.5-P0.50-BL-EP | U2 |
| 1 | RESET | Button_Switch_SMD:SW_Push_1P1T_XKB_TS-1187A | SW1 |
| 1 | SK6812SIDE-A | lcsc:LED-SMD_4P-L4.0-W1.6-L | D3 |
| 1 | SWITCH | Button_Switch_SMD:SW_Push_1P1T_XKB_TS-1187A | SW3 |
| 1 | TPS2116DRL | Package_TO_SOT_SMD:SOT-583-8 | U4 |
| 1 | TPS2553DBVR | lcsc:SOT-23-6_L2.9-W1.6-P0.95-LS2.8-BR | U20 |
| 1 | TS3USB221ARSER | lcsc:UQFN-10_L2.0-W1.5-P0.50-BL | U3 |
| 1 | UART | Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical | J7 |
| 1 | USB_C_Receptacle_USB2.0_16P | Connector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12 | J4 |
It measures 112 × 75 mm and has 4 copper layers, 1.6 mm thick.
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.
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.
Its repository states no licence, so its author keeps all rights: ask FuNK3Y before reusing the design.

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.




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.

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

