What ESP-KVM does
Everything in the firmware today, in one list. Where something is new and not tried on hardware yet, or needs a part you may not have, it says so.
ESP-KVM is open-source firmware for an ESP32-P4 board with an HDMI capture chip: the target computer's screen, keyboard and mouse in a browser tab, from the BIOS up. There is no Linux and no cloud. Anything a board cannot do, the console shows switched off with the reason.
- Video
- Keyboard and mouse
- Text screens
- Virtual media
- Recording
- Automation
- Power and the target
- Network and VPN
- Security
- The device
- Not yet
Video
| Follows the target's resolution | From an 800×600 firmware screen to a 1080p desktop, with nothing to set. |
| MJPEG and H.264 | Both encoded by the chip's hardware. H.264 uses far less bandwidth on a screen that barely changes, and needs HTTPS in the browser. |
| Adapts to a slow link | Over WiFi or a VPN the stream lowers its quality instead of stuttering. |
| Measured delay | "Measure the delay" times the whole round trip, mouse to picture: about 155 ms at 1080p H.264. |
| Several viewers | Anyone signed in can watch; one is in control at a time, and control can be taken over. |
| A viewing token for dashboards | Opens the stream and the figures, and nothing that can touch the target. Off until you make one. |
| EDID presets | The device tells the target which modes to offer, so a BIOS picks one that is easy to capture. |
Keyboard and mouse
| Keyboard, mouse and media keys | The device is a USB keyboard and mouse to the target. Works in a BIOS, with no drivers. |
| Absolute and relative pointer | Absolute: the click lands where you aimed, whatever the target's mouse acceleration. Relative for the few programs that need it. |
| Alt+Tab, Ctrl+W, the Windows key | Reach the target in Chrome and Edge, in full screen with control taken. Firefox and Safari give a page no way to catch them. |
| Paste text | Typed out as key presses, with a keyboard layout: US English, Russian, Czech, Ukrainian, Lithuanian. |
| Phone and tablet | A touch trackpad and an on-screen keyboard, with a short tick under the finger on Android. |
| Key macros | Your own buttons for key sequences. The commands. |
| Wake from the keyboard | Over USB, if the machine allows it. Otherwise Wake-on-LAN or the ATX power button. |
| Gamepad | The device can be a controller for a Nintendo Switch; a pad on your own computer drives it through the console. An original Xbox pad (XID) was tried on a real Xbox in a fork. The Xbox 360 pad mode for Windows and a Steam Deck is not tried on hardware yet. |
Text screens
| Copy text off a BIOS screen | A BIOS, a boot loader or a console: select it with the mouse, or copy the whole screen. Not OCR - the characters are matched against the fonts these screens draw with, so text comes back exactly or not at all. |
| Text instead of video | On a character screen the device can send the text instead of a picture: a couple of kilobytes a screen, for a link too slow for video. |
| Watch for words | Give it phrases; it alerts when one appears, with nobody looking. Off by default. |
| A screen of one colour | A stop screen or a blank output is noticed, and can raise an alert or save a clip. |
Virtual media
| Boot from a disk image | An image handed to the target as a USB drive it can boot from, from a microSD card (FAT32 or exFAT, MBR or GPT). |
| An image with no card | A small rescue image kept in the device's own flash. netboot.xyz goes there in one click. |
| Download onto the card | Paste a link and the device downloads the image itself. |
| The whole card as a disk | The target sees the card itself, read-write. |
Recording
| Record the screen and take screenshots | To the microSD card. The stream the viewers already get is saved, so nothing is encoded twice. A panel lists, plays and downloads them. |
| Dashcam | The last minutes kept, in memory or on the card. Saved as an MP4 with chapters on a stop screen, a watched phrase, the power going off or a button - and sent to Telegram. |
| Timelapse | A frame every few seconds, played back at 25 fps. |
| Search a recording | The screen's text is saved beside the video; search it and play from that moment. Character screens only. |
Automation
| Runbooks | A macro that waits for words on the screen: wait Press F2, then key f2. Runs on the device, with the browser closed. Character screens only. |
| Scheduler | Actions on a cron timetable: Wake-on-LAN in the morning, a runbook overnight, a reset every Sunday. |
| Notifications | To Telegram, with a screenshot or a clip, or to a webhook: a watched phrase, a blank screen, a panic in the target's log. |
| Home Assistant | Over MQTT, found by itself: sensors, buttons for each runbook, an update entity, and a camera with a still of the screen. Off by default. |
| REST API | Everything the console does, for scripts. An AI agent can use it too, behind a switch that is off by default. |
| Guess the target's OS | From the way it talks to the USB keyboard. |
Power and the target
| ATX power control | Power, reset and the power LED, wired to the motherboard's front-panel header. Wiring. |
| Wake-on-LAN | From the console, a schedule, a button or Home Assistant. |
| A button on the box | A push button on a free pin, with one action for a short press and one for a hold. |
| Serial console new | Two pins to the target's UART give a terminal in the browser that keeps the boot messages. For a NAS, a router or a server with no screen. Not tried on hardware yet. |
| The target's log over the network new | netconsole or syslog over UDP, kept and shown live, with an alert on "Kernel panic". No wiring. Not tried on hardware yet. |
| HDMI-CEC | The device acts as a TV: see the source's name, send it remote keys, standby and wake. Media boxes, consoles and a Raspberry Pi speak CEC; an ordinary PC does not. Boards with a TC358743 chip. |
Network and VPN
| Ethernet, PoE on some boards | With IPv6 and a local name, espkvm.local. |
| WiFi | On boards with an ESP32-C6, or an ESP32-C5 for 5 GHz. Joins a network or makes its own, with a rescue hotspot and a captive portal. |
| Ethernet with WiFi as the backup | Pull the cable and the device moves to WiFi, then back, with no restart. |
| Tailscale, built in | The device joins your tailnet itself: no port forward, no gateway, no cloud of mine. |
| WireGuard | A split tunnel to your own hub. The key is made on the device. |
Security
| HTTPS from the first boot | The device is its own certificate authority. Import its CA once and the browser trusts it, which also opens H.264. |
| Let's Encrypt over Tailscale new | A real certificate for the device's tailnet name, got and renewed on the device. No warning, nothing to import. How it works. |
| Your own certificate | From an internal CA or any other, in Settings or with PUT /api/v1/tls/cert from a renewal hook. |
| Login and two-factor sign-in | A password, and optionally a TOTP app with eight recovery codes. |
| Password reset by hand | The board button, held after a reset, clears a lost password and the second factor. No reflash. |
It is still not meant for the public internet: secure boot and signed updates are not on. Reach it over a VPN.
The device
| Updates from the browser | One click, two firmware slots, and a bad update goes back to the one that worked by itself. Any older release can be installed too. |
| Flash from the browser | The first install needs only a USB cable and Chrome or Edge: the flasher. |
| Settings to a file, and back | No secrets in the file, and a device's own identity is left alone. |
| Thermal protection | Halves the frame rate when the chip is warm, and stops encoding when it is hot until it cools. |
| A clock that survives a restart | Optional: a DS3231 or a similar chip on the capture board's I2C bus, found by itself. |
| A small status display | Optional: an I2C OLED or a round GC9A01 with the address, the link and the capture. |
| Diagnostics and a live log | Memory, temperatures, the network and the capture, and the device's own log as it happens. |
Not yet
| HDMI audio missing | The capture chip offers it, but the wires and the code are missing. |
| Frame rate | Not 60 fps at 1080p: 20-30 fps is what a microcontroller does. Fine for a BIOS and a desktop, not for a game. |
What comes next is in the roadmap, and how it stands next to PiKVM, JetKVM and the others is on the comparison page. Or try the live demo.