Connect the board over USB and install the firmware from this page.
No toolchain, no download, nothing uploaded anywhere — the image
goes from the project’s release page straight to your board.
Chip revision:
This browser cannot talk to serial devices. Chrome or Edge on a
desktop can; Firefox and Safari cannot, and neither can any browser
on iOS.
Serial access needs a secure page. Open this over https.
What to expect
Connect the board to this computer with a USB-C cable.
Press Install and pick the board’s serial port
from the list the browser shows. On Linux it is usually
/dev/ttyACM0, on Windows a COM port.
Wait about a minute. The whole flash is written — bootloader,
partition table and firmware — so this also works on a board
that has never run anything.
Plug in Ethernet and open https://espkvm.local/. Accept
the certificate warning, sign in as admin /
admin, and set a password.
Two USB ports, one of them right. These boards have a
USB-serial port and a USB-OTG port. Flashing goes through the serial
one — the OTG port is what the target machine sees as a keyboard.
If the port list is empty, try the other socket.
If Install fails to connect, hold the board’s
BOOT button, press Install, and keep holding until it starts writing.
That forces the chip into its bootloader when the automatic reset
does not take.
If your board is already running ESP-KVM, you do not
need this page or a cable. In the console, Settings → System
either checks for a newer build and installs it in one click, or takes
a .bin you downloaded from the
releases page.
Either way it writes a spare slot and rolls back if the new image fails
to start.
A full flash from this page erases everything,
including any rescue image you put in the device’s flash. That is
fine for a first install; on a board you are only updating, the console
route above keeps the rescue image (and your settings). Re-upload the
rescue image afterwards if you use this page instead.
If the browser will not do it
Web Serial exists in Chrome and Edge on desktop, and nowhere else.
Every other browser has to fall back to the command line, which does
the same thing: