The machine, in a browser tab.
Like remote desktop, except it does not run on the machine. A small board plugs into that machine’s HDMI and a USB port and hands you its screen, keyboard and mouse in a browser — so it still works when the machine is stuck in the BIOS, or has no operating system at all. That is an IP-KVM, and this one is built from an ESP32-P4 and a TC358743 HDMI bridge — firmware, with no Linux inside.
- Open source. Free, Apache 2.0.
- Hardware. No soldering.
- Install. From the browser, over USB.
- Try the demo. The real console, no board.
New to this? What an IP-KVM is, and why you might want one →
▶ Try it live — the demo runs in your browser
A commercial KVM-over-IP does this too, for a great deal more money. This one captures HDMI, presents itself over USB as a keyboard and mouse, hands the target a disk image to boot from, and serves the whole thing over HTTPS from a megabyte of firmware — the console inside it is 44 KB.
The screen in your hand
ESP-KVM terminal is firmware for the M5Stack Tab5: the target's screen on the Tab5, with touch, a keyboard and the power buttons. The same ESP32-P4 as the KVM, on the other end of the link.
It is an experiment: I do not know yet how useful it is outside my desk. Try it and tell me.
See the terminal → ▶ Video, 26 sNo Linux, fewer ways to fail
Almost every IP-KVM is a small Linux computer. This one is firmware on a microcontroller, and a KVM is often the only way into a machine that is already in trouble - so the fewer parts that can break, the better. How it compares with PiKVM, JetKVM and the others.
A power cut is harmless
No filesystem holding an operating system to corrupt. Power comes back and the device is ready in about 15 seconds.
An update undoes itself
Two firmware slots. An image that fails to come up puts the device back on the one that worked, with nobody on site.
Less to attack
No shell, no SSH, no package manager. On the network it answers with the web console, and with MQTT or a VPN only if you turn them on.
Nothing to maintain
No distribution, no packages, no kernel to patch. The whole device is one firmware image, updated from the browser.
Small, cool and quiet
A microcontroller board with no fan, on a 5 V USB supply or over PoE, small enough to stay attached to a machine.
The same every time
Nothing updates itself in the background, so it behaves tomorrow the way it did today.
What it does
What the firmware ships with. Anything the hardware cannot support, the device shows disabled with the reason — it does not pretend. The full list.
Any device you have to hand
Laptop, phone or tablet. Nothing to install on either end, and touch gets a trackpad and a keyboard of its own.
Follows the target
800×600 firmware screen to 1080p desktop, followed without being told.
Clicks land where aimed
An absolute pointer: the target’s mouse acceleration cannot drift the cursor off the button you meant.
Copy text off a BIOS screen
Select text on a BIOS, boot loader or console screen, or copy it all. Not OCR: characters are read from the text grid, so a serial number comes back exact or not at all.
MJPEG or H.264
Both encoded by hardware. H.264 costs a fraction of the bandwidth on a screen that barely changes.
Boot from a disk image
A rescue or live image becomes a bootable USB drive for the target, from a microSD card or the device’s own flash. netboot.xyz in one click; any link downloads straight to the card.
A serial console
For a NAS, a router or a headless server: two wires to its serial port give a terminal in the browser. Kernel logs can come over the network too, with an alert on a panic. How to wire it.
Updates itself
Over-the-air updates with two slots and automatic rollback: an image that fails to start goes back to the one that worked.
HTTPS and a login
A certificate made on the device at first boot, a password the board button can reset, and optional codes from an authenticator app.
Lives in Home Assistant
Turn on MQTT and it arrives as one auto-discovered device, sensors and buttons included.
Reach it over WireGuard or Tailscale
Remote access without opening a port: WireGuard to your own server, or Tailscale with no VPS or port forwarding. Off by default.
WiFi, with a rescue hotspot
Join a network or be the access point, on boards with an ESP32-C6. WiFi can back up the cable, switching over and back by itself. Out of range, a rescue hotspot with a captive portal opens the console on your phone.
A little status screen
A cheap OLED or a round colour LCD shows the IP, link, capture and health with no browser open. The round one also shows a QR code for the rescue hotspot.
Wake a machine that went to sleep
A key press wakes it, the way a real keyboard would. Failing that, Wake-on-LAN or the power button.
Power and reset, held down for you
Two optocouplers on the front-panel (ATX) header put the power and reset buttons in the browser. The power LED is read back.
Watches the screen while you do not
Give it phrases like no boot device or kernel
panic, or watch for a screen gone one flat colour. The alert
comes with a screenshot, to Telegram or a webhook.
Records to its own card
Record the screen to the microSD card as H.264. A dashcam keeps the last minutes and saves an MP4 when a crash screen shows or the power drops, keystrokes as subtitles. Plays back in the console.
Runbooks: a macro that can wait
wait Press F2, key f2, wait Boot.
Run on the device, so the tab can close; a button each in Home
Assistant, or on a schedule. The language.
What arrives in Home Assistant
One device, discovered automatically over MQTT. Off by default, TLS optional.
- Sensors — frame rate, HDMI signal, resolution, codec, bitrate, viewers, chip temperature.
- The target — its power state, whether it sees the keyboard, and whether its USB port has power at all.
- Buttons — power, a hard off, reset, Wake-on-LAN, restart the KVM.
- A camera — a still of the target’s screen, on demand or when the screen watch finds a phrase.
- The jiggler — a switch, with its interval beside it.
- An update entity — the version running, the version published, and the button that installs it.
- Diagnostics — free memory and the largest block in it, skipped frames, which firmware slot is running and why the device last booted.
Virtual media, honestly. Images live on a microSD card, FAT32 or exFAT (on exFAT an image can be over 4 GB), and the console uploads them. How fast the card runs depends on the board, and the device finds that out per card. On the Function EV and the P4-ETH the card runs at 40 MHz: it reads at about 8.5 MB/s, and an upload over Ethernet is about 3.5 MB/s on the Function EV and 1.5 MB/s on the older P4-ETH chip. Pause the video while you upload: the encoder and the Ethernet chip share a bus, and the upload is several times faster without it. The other boards with a slot are wired the same way and start at 40 MHz too; they have not been run on hardware yet. For the rescue case there is another option that sidesteps the card entirely: a small image (iPXE, memtest, a DOS floppy) kept in a 4 MB flash partition, served from memory and writable from the browser. The Media panel puts netboot.xyz there in one click, downloaded by the device straight from its site.
FAQ
How is this different from IPMI?
IPMI, the BMC chip built into server motherboards, manages a machine from the inside: real power control, internal sensors, POST codes, over a standard protocol. But it lives only on server-class hardware, and the full remote console is often behind a license.
ESP-KVM is external. It clips onto any machine with an HDMI output and a USB port, captures the physical video, and acts as its keyboard and mouse — bringing the remote console, virtual media and wake-on-LAN part of what a BMC does to hardware that has no BMC and never will: a desktop, a laptop, a mini-PC, an SBC, for about $40. It can press the machine’s power and reset buttons and read its power LED through optocouplers (ATX power control), though it does not read the host’s internal sensors the way a BMC does. Think of it as closer to PiKVM than to IPMI: not a replacement for a BMC on a server, but the useful slice of one for everything that never had a BMC. How it compares with PiKVM, JetKVM, NanoKVM and GL.iNet Comet, honestly: the comparison.
How does it compare with PiKVM, JetKVM or NanoKVM?
They are Linux computers; this is firmware on a microcontroller. They win on video - 1080p at 60 fps and more, where this does about 20. It wins on having no operating system to maintain or break, VPN built into the firmware, and running on fifteen boards you can buy from several makers. JetKVM Mini, announced in September 2026, uses the same ESP32-P4 chip. The full side-by-side, with sources and the cases where you should buy one of the others: ESP-KVM compared.
Which chip revision does my board have?
The easiest: plug the board in and press Read the board on the tools page (Chrome or Edge). Without a browser that can, three ways to tell:
- The marking on the ESP32-P4 itself, or on the lid of the module it sits in. ESP32-P4NRW32X — an X at the end — is revision 3.x; ESP32-P4NRW32 without the X is revision 1.x. On the chip itself the second character of the manufacturing code is the revision: C for v1.0, E for v1.3, F, G, H for v3.0, v3.1, v3.2 (Espressif’s table).
-
Ask the chip over USB with esptool:
esptool --chip esp32p4 chip-id. It printsChip type: ESP32-P4 (revision v3.1), changes nothing on the board and restarts it. -
The boot log of any ESP-IDF firmware says
chip revision: v3.1— the serial monitor here shows it.
The same board can come with either revision: the product code does not tell, so check the chip, or ask the seller.
The number in the part name is the PSRAM in megabytes. ESP-KVM is built for 32; an NRW16 or NRW16X chip has 16, and nobody has tried the firmware on one.
It matters for two reasons. An image built for one revision does not start on the other, so the flasher asks which one you have (a wrong pick damages nothing; flash the other one). And revision 3.x is much faster at H.264: about 22-24 fps at 1080p against 5-7.
What USB cable connects the device to the target (Waveshare ESP32-P4-ETH)?
ESP-KVM presents the keyboard and mouse to the target over the ESP32-P4’s high-speed USB OTG (OTG_HS). It has to be a proper USB data cable, not a charge-only one — the data lines are what carry the keyboard and mouse.
On the Waveshare ESP32-P4-ETH specifically, OTG_HS is not on a USB port at all — it is brought out on a small MX1.25 header (the board’s single USB-C is the CH343 flashing/console port). So you need an MX1.25-to-USB cable ending in a male Type-A plug — ESP-KVM is the USB device, so it plugs into the target’s USB port. A link to one that fits is in this discussion.
On other ESP32-P4 boards the OTG_HS may be routed to a USB-C port instead — check your board’s pinout.
The mouse pointer lands in the wrong place on the target — why?
Almost always because the target has more than one display. ESP-KVM presents itself as an absolute pointing device by default, the way a graphics tablet does: it sends “the pointer is at this position” rather than “move this far”. That is what lets the cursor land exactly where you aim it, with nothing to capture and nothing to run away.
The catch is that an absolute device addresses the target’s whole desktop, not the one output you are watching. With a second monitor attached, that desktop is wider than the screen ESP-KVM captures, so your side of the picture is stretched across both. With two equally wide screens the pointer travels twice as far as the mouse, and half of the picture aims at the display you cannot see — move into it and the cursor simply disappears onto the other monitor.
Two ways out. Unplug or disable the target’s second display while you are working through ESP-KVM — then the desktop and the captured screen are the same thing again. Or switch Settings → Input → mouse mode to relative, which sends movement instead of position and so does not depend on the desktop’s size or layout; click the picture to take control, and use Relative sensitivity if the speed does not suit you.
A pointer that drifts only near the edges while it is accurate in the middle is a different thing entirely, and one that affected macOS targets — that one is fixed.
Can I use a different ESP32 chip (S3, S31, …) instead of the P4?
No — this design needs two things that, across Espressif’s line-up, only the ESP32-P4 has together: a MIPI-CSI-2 receiver and a hardware H.264 encoder.
The capture board (a Toshiba TC358743) outputs MIPI-CSI-2, so the host chip needs a CSI-2 receiver to read it. The other ESP32 parts — including the newer ESP32-S31 — have a DVP (parallel) camera interface, not CSI-2, so they can’t take the bridge at all. And moving 1080p leans on the P4’s hardware H.264 encoder; the S-series has a JPEG codec but no H.264, so software encoding on the cores wouldn’t keep up.
The S31 does have things the P4 lacks (WiFi 6 on-die, no co-processor), so if Espressif ever ships a P-series successor with the radio built in, that would be the dream chip for this — but for now the P4 is the one with the CSI-2 + H.264 combination it needs.
How do I update the firmware?
From the console, over the network. Turn on Settings → System → Offer firmware updates — it is off by default — and the console tells you when a newer build is published and installs it in one click. Your browser does the checking and the download; the device itself never reaches the internet. An update that fails to start rolls back to the version that worked.
To go back to an older release, turn on Let the device fetch
releases itself in the same place; that one does let the
device talk to GitHub, which is why it is off too. Or download that
release’s -merged.bin for your board from
GitHub and
flash it over USB: the web flasher takes a file
under “Install another version from a file”.
How do I install or rescue an OS with no USB stick?
Open Media (the disc button on the left) and press Download it to the rescue slot. The device fetches netboot.xyz from its site into a 4 MB partition in its own flash — no card needed. Pick Rescue image, turn on Expose virtual media, and boot the target from the USB drive it now sees. netboot.xyz shows a menu of installers and rescue systems (Debian, Ubuntu, Fedora, Clonezilla, memtest and more) and loads the one you pick over the network, so the target needs internet access, not the device.
For a full installer ISO, use a microSD card: upload the file from the browser, or paste a link under the card list and the device downloads it itself. On exFAT an image can be over 4 GB.
How do I connect the target's serial console?
Three wires: the target's TX to the device's RX, the target's RX to the device's TX, and ground to ground. Then turn it on in Settings → Power → Serial console, pick the two pins and the speed (115200 for Linux, often 9600 or 115200 for a PC BIOS), and open it with the terminal button at the bottom left. Any two free GPIOs work; avoid 37 and 38, which many boards wire to their own USB-to-serial chip. On the Function EV board GPIO 5 and GPIO 4 are free.
-
3.3 V logic — a Raspberry Pi (GPIO 14 and 15,
with
enable_uart=1inconfig.txt), a router's 4-pin header, most single-board computers: wire it straight in. - RS-232 — the 9-pin COM port of a PC or a server: ±12 V, which destroys a 3.3 V pin. Put a MAX3232 module in between.
- 5 V TTL — a level shifter, or at least a divider on the device's RX.
Nothing comes through? Swap TX and RX first, then check the speed. To test the device alone, join its TX and RX pins with one wire: whatever you type comes straight back.
Which ESP32-P4 boards do not work?
Being an ESP32-P4 board is not enough. Five things decide it, and a board that misses any one of them cannot run ESP-KVM as it is:
- 32 MB of PSRAM. The frame buffers are allocated once, for the largest mode the bridge can deliver: 12.5 MB at 1080p on rev 3.x silicon (three buffers of 1920×1088 YUV422), 11.9 MB on rev < 3.0 (two of 1920×1080 RGB888) — before the H.264 encoder asks for its reference frame. An 8 MB part cannot hold even the first of those, and video shuts itself off with an explanation.
- 16 MB of flash. Two OTA slots and the rescue image do not fit in 4 or 8 MB.
- A camera connector the bridge can reach. Two CSI-2 data lanes, and 3.3 V and I2C on the same connector or somewhere you can wire them from. Some boards bring only 1.8 / 2.8 V sensor rails to the FPC and level-shift the I2C down with it — then a ribbon alone is not enough.
- USB OTG-HS on something you can plug into the target. A USB port or a header. A board that only exposes D+/D− on an edge connector needs a carrier board first.
- A way onto the network — an Ethernet PHY on the board, or an onboard ESP32-C6.
Not sure about a board you already have? Plug it in and read it in the browser: it shows the chip revision, the flash size and the PSRAM.
A worked example: the LILYGO T-Halow P4 is an ESP32-P4 with a camera FPC, an ESP32-C6 and Wi-Fi HaLow, and it fails on four of the five. It has 8 MB of PSRAM; its Ethernet RMII and its USB OTG D+/D− are brought out only on the M.2 edge connector, so there is no PHY and nothing to plug the target into; and its 24-pin camera FPC carries no 3.3 V and a 1.8 V I2C. The C6 is wired exactly as on the Function EV board and would work — but the rest is a carrier board and a custom ribbon away, and the PSRAM still rules out 1080p.
One thing worth checking with the schematic rather than a product photo: which camera connector. The 15-pin, 1.0 mm one is the Raspberry Pi 4 camera connector; the 22-pin, 0.5 mm one (on the P4-ETH, for one) is the Pi 5 kind and carries the same signals. The C790 has both and comes with a ribbon for each; a capture board with only the 15-pin one needs an adapter ribbon for a 22-pin board. And on either, 3.3 V and a 3.3 V I2C have to be on the connector.
About a dozen ESP32-P4 boards have been read through this list, the ones that fail included — mostly on USB, not on memory. They are written up in docs/PORTING.md. If yours is not there, open an issue with a link to its schematic.
Wi-Fi HaLow, for what it is worth, is not a way around any of that: the modules on those boards use a vendor driver ESP-IDF does not carry, and 802.11ah’s narrow channels cannot hold a video stream anyway.
Measured, not estimated
Every number here came off the hardware, at 1080p. The ones that contradicted the documentation are written down in the hardware notes.
| MJPEG | H.264 | |
|---|---|---|
| Frame rate — Waveshare ESP32-P4-ETH (rev v1.3) | 20 fps | ~7 fps |
| Frame rate — Function EV (rev v3.2) | 23 fps | 22–24 fps |
| Mouse moved to picture shown — Function EV | ~160 ms | ~155 ms |
| Mouse moved to picture shown — M5Stack Unit PoE-P4, 720p | — | ~185 ms |
| Idle screen | 0 kbit/s | 170 kbit/s |
| Screen in motion | 8.5 Mbit/s | ~500 kbit/s |
| Chip temperature, full load — rev v1.3 | 46 °C in open air | |
| Chip temperature, full load — rev v3.2 | 34 °C in open air | |
H.264 costs a fraction of MJPEG’s bandwidth either way — an idle screen is 170 kbit/s against MJPEG’s 8.5 Mbit/s in motion — and browsers decode it through WebCodecs, which they only offer on secure pages (one reason the device serves HTTPS). What differs between the two boards is the frame rate.
The delay is the whole way round: the pointer moved on the target until the browser shows it, through USB, the target's own screen, capture, the encoder, the network and the decoder. The console measures it itself - the Video readout has a “Measure the delay” button.
The revision-3.x win we predicted actually landed
The Waveshare figures come from an ESP32-P4 revision v1.3, and the biggest cost in its H.264 path is something that revision forces on us. Below silicon revision 3.0 the CSI receiver cannot hand over YUV420 and the encoder will not accept RGB, so every frame takes a detour through the pixel accelerator to change colour space — measured at ~104 ms of the ~150 ms a 1080p frame costs.
On the Espressif Function EV board (revision v3.2) that detour is gone: the capture feeds YUV422 straight into the encoder, no conversion pass. H.264 goes from ~7 fps to 22–24 fps at 1080p (and 28 fps at 720p) — as fast as MJPEG (23 fps) but at a fraction of the bandwidth — and the chip runs cooler doing it, 34 °C against 46 °C. The revision test was in Espressif’s own driver, quoted in the hardware notes; the prediction held.
Where it stands
What arrived when, and what comes next. The dates are releases; the plan is a guide, not a promise.
-
July 2026
- First release, installed from the browser; MJPEG and H.264
- Virtual media, and a rescue image kept in flash
- Wake-on-LAN, macros, a static address
- ATX power control
- Home Assistant over MQTT, a WireGuard client
-
August 2026
- Native Tailscale, and a console that installs as an app
- Wi-Fi, with a rescue hotspot
- IPv6, a status screen on the device
- Reading the screen as text, and watching it when nobody is
- Going back to any earlier release
- More boards: PoE, Wi-Fi 6, rev 3.x chips
-
September 2026
- Runbooks, a scheduler, alerts to Telegram
- Recording, screenshots, timelapse, a dashcam
- M5Stack Unit PoE-P4 with its own HDMI bridge
- exFAT cards, images over 4 GB, a real CD-ROM drive
-
October 2026
- Two-factor sign-in, a battery-backed clock
- HDMI-CEC, gamepads for a Switch and an original Xbox
- Ethernet with Wi-Fi as the backup
- The target's serial console and its kernel log
- Several screens on one target, a delay meter
- A Let's Encrypt certificate over Tailscale
-
Now
About 110 releases in three months, fifteen boards. Every change.
-
Next
- HDMI audio
- Your own EDID, from a monitor that works
- More boards
Missing something? Ask for it in Discussions.
Every feature and how well it works
| Video capture, resolution changes, MJPEG, H.264 | Works |
| Keyboard, absolute and relative pointer, media keys, paste | Works |
| Touch mode for phones and tablets (trackpad, on-screen keyboard) | Works |
| Multiple viewers, one in control at a time with takeover | Works |
| HTTPS, login, two-factor sign-in, physical password reset | Works |
| Battery-backed clock (an optional DS3231 module) | Works |
| Bring your own TLS certificate (or the self-signed default) | Works |
| Firmware updates over the network, with rollback | Works |
| Thermal protection | Works |
| Recording the screen and screenshots to the device’s microSD card | Works |
| A dashcam — the last minutes saved when a stop screen shows, a phrase appears or the power drops | Works |
| Timelapse, keystroke subtitles, playback and text search in the console | Works |
| Virtual media — boot the target from a disk image (on a card or in flash) | Works |
| Download an image from a link onto the device — netboot.xyz in one click | Works |
| The target’s serial console in the browser wiring | Works |
| The target’s kernel log over the network (netconsole, syslog), with alerts | Works |
| Guessing the target’s OS from how it enumerates USB | Works |
| User macros — replayable key sequences the language | Works |
| Runbooks — a macro that waits for words on the screen, run on the device (text screens only) | Works |
| Wake-on-LAN (no ATX wiring) | Works |
| A gamepad for a console — a HORI pad for a Switch, an original Xbox pad, an Xbox 360 pad for Windows and a Steam Deck; buttons in a window or over the picture | Works |
| HDMI-CEC — see the source, send it remote keys, standby and wake (with a TC358743 capture chip; media boxes and consoles, not PCs) | Works |
| Static IP addressing, or DHCP | Works |
| Status screen on the device (OLED or round LCD), either way up, with a scannable hotspot code | Works |
| IPv6 alongside IPv4, autoconfigured | Works |
| WiFi — station or access point, with a rescue hotspot and captive portal (boards with an ESP32-C6) | Works |
| Ethernet with WiFi as the backup, switching both ways on its own (boards with both) | Works |
| ATX power control (power/reset buttons, power-LED sensing) | Works |
| Home Assistant over MQTT (auto-discovered sensors and buttons) | Works |
| VPN — WireGuard or native Tailscale (pick one; Tailscale needs no gateway or port-forward) | Works |
| HDMI audio | Not yet |
Not for the public internet. There is a login and there is TLS, and the code has been through a security review of my own — but not an external audit, and a device holding a keyboard on someone else’s machine is worth more to an attacker than most things on a network. Secure boot and signed update images are still on the list. Keep it on a network you trust, or reach it over the built-in WireGuard client or native Tailscale.
What you need
Two boards and three cables, plus optional modules — power control, a little status display and a clock. Everything is off-the-shelf; any equivalent works, these are the ones this project is built and tested on.
The board
Any board in the catalog does the whole job. Have one already? Read it in the browser to see which one it matches.
Not sure which one? Put them side by side: chip, memory, Ethernet, PoE, Wi-Fi, microSD and the measured frame rate, with the best marked.
The capture board
Turns the target's HDMI into a camera stream the ESP32-P4 reads. The C790 has both camera connectors, 15-pin and 22-pin, and fits every board above; Waveshare's adapter has only the 15-pin one, so the P4-ETH (22-pin) needs an adapter ribbon for it. M5Stack's module fits only its own PoE-P4 units.
Geekworm
C790
TC358743
Waveshare
HDMI to CSI Adapter
TC358743Waveshare
M5Stack
Add-on Display In
LT6911DM5Stack
Power control (optional)
Two wires to the machine's front-panel header let the console press its power and reset buttons. A relay module does the same job - the firmware only pulses a pin, and which way round it triggers is a setting. Reading the power LED back is the one part a relay cannot do: that input wants an optocoupler. The M5Stack units plug in on a Grove cable, and one of them is a button for the box itself.
PC817Untested
Two-channel optocoupler
Optocoupler
M5StackUntested
Unit Relay
RelayM5Stack
M5StackUntested
Unit Button
ButtonM5Stack
Status display (optional)
A small screen on the box, so you can see its address and link without opening a browser.
I2C OLEDTested
SSD1306 / SH1106 / SSD1315
I2C OLED
M5StackTested
Mini OLED Unit
Grove OLEDM5Stack
M5StackTested
Unit OLED (U119)
Grove OLEDM5Stack
M5StackUntested
Unit Glass2
Grove OLEDM5Stack
Round SPI LCDTested
GC9A01
SPI LCD
WaveshareTested
1.28inch LCD Module
SPI LCDWaveshare
Clock (optional)
The ESP32-P4 forgets the time when it loses power, and learns it again from NTP or from a browser signing in. A battery-backed clock module keeps it, so file names on the card and two-factor codes are right after a restart with no network. A DS3231 or a PCF8563 is found by itself; a PCF85063 or PCF8523 can be named in Settings → System → Clock. A DS1307 is not supported.
DS3231Tested
Raspberry Pi module
DS3231
DS3231Tested
ZS-042
DS3231
MacetechTested
ChronoDot v2
DS3231SN
M5StackTested
Unit RTC
RTC8563M5Stack
Serial adapter (optional)
For the serial console. A 3.3 V console, like a Raspberry Pi's or a router's header, wires straight to two free pins. A PC's 9-pin COM port is RS-232 at ±12 V and needs a MAX3232 module in between. No supported board has RS-232 on it.
Terminal (optional, experimental)
A second screen you hold: an M5Stack Tab5 running the ESP-KVM terminal shows the target's screen and controls it over the network, with no browser. The keyboard is optional.
A case (optional)
Printed by people who built one. All of them are published.
Built on someone else’s work
This project exists because of Jonathan Rowny and
his p4kvm proof of
concept. He was the one who got an ESP32-P4 to pull frames off a
TC358743 at all, and put it in the open with a working
demonstration for anyone
to build on — this is that thing built on. Two pieces of his
work are reverse engineering no datasheet would have handed us: the
TC358743 bring-up sequence, and the direct programming of the
ESP32-P4’s MIPI_CSI_BRIDGE registers, which the
camera API does not expose. Both still carry this firmware; the
layers above them were rewritten. Thank you, Jonathan, for
publishing it.
In the press
Independent coverage of ESP-KVM:
- Hackaday — “A Capable KVM Built With The ESP32”
- CNX Software — “ESP-KVM – An open-source IP KVM solution based on ESP32-P4 RISC-V MCU”
- RISC-V International — “This Week in RISC-V” (July 31, 2026)
- Circuit Rocks — “ESP-KVM Turns an ESP32-P4 Into a $45 Open-Source IP KVM”
- LAB1612 — “ESP-KVM: un IP-KVM open source con un solo ESP32-P4, alternativa economica a PiKVM e JetKVM” (in Italian)
- SMZDM — “一周两条GBA满帧视频、一块59元新板:ESP32-P4终于“能玩了”,但上手前先看这三个问题” (in Chinese)
- Open Source For You — “Microcontroller Enables Remote Device Access”
- Solid State Bytes — “A Raspberry Pi That Boots Straight Into AI, an ESP32-P4 KVM, and More”
- LearningBot — “Build of the Week”
- EdigE — “An ESP32-P4 turned into a real IP-KVM with HDMI, H.264, USB HID and boot images” (in Russian)
- Wels — “5 Minutos de Miercoles #22”, from 5:42 (on video, in Spanish)
- 私人定制 Blog — “GitHub 开源 ESP-KVM:$45 把 ESP32-P4 变成 IP 远程控制卡——HDMI 采集 + 浏览器键鼠 + 虚拟光驱,替代 $300 商业方案” (in Chinese)
- log8.kr — “ESP32 IP-KVM 홈랩 원격 복구 설계”, a recovery-and-security checklist built around the device (in Korean)
- BearBlogtech — “ESPKVM an Open Source Kvm with IP and an ESp32”, a build log written after the author’s $800 datacentre KVM died
Also picked up and translated internationally — French, Greek, Spanish, Russian, Chinese, Japanese, Thai and German.
It has started turning up as a reference point when other devices in the category are written about, rather than only as a story of its own — PC de Mano names it alongside the Sipeed NanoKVM in a review of the USBridge-KVM 2.0 (in Spanish).
Waveshare, the maker of the capture adapter, links ESP-KVM from its HDMI to CSI adapter wiki.
Writing about it? There is a page with everything you would otherwise have to ask me for: descriptions of three lengths to paste, the whole feature list, the facts, the limits I would rather you printed than guessed, photographs, the two clips and the logo — ESP-KVM for writers.
Support and community
ESP-KVM is free and open source. If it saved you a trip to a dead machine you can buy me a coffee — entirely optional. And if you would rather help build it, issues, ideas and pull requests are just as welcome.
Release notes, work in progress and the occasional picture of a board go out on Telegram and X, and the clips live on YouTube:
Ask a question Report a bug Contribute on GitHub
One person builds this, with no budget for ads, so most people who could use it never hear of it. If it was useful to you, telling somebody helps more than anything else:
Built with the help of these contributors:















