
Summary
Many of us will be used to the idea of a KVM, a device that pipes keyboard, video, and mouse over the network from a remote machine to your own. But many remote machines don’t run a GUI, so there’s not always the need for a full video experience. Enter [morpheuslord] with the PicoTTY. It’s somewhere between an old-fashioned serial terminal and a KVM. The system has two components, a Pi Pico which plugs in to the USB port of each client machine and connects to the network with a WIZnet W5100S Ethernet Hat, and a Pi Zero 2 W which forms the hub. The Pico acts as both a keyboard and a serial terminal, and streams both to the user via a web interface on the Zero. We can see the use of a machine like this, but we have a few questions. Why for instance is the keyboard needed, given that the serial terminal could provide input in itself. But however it works we can see it might have a use in cases where a terminal can’t be accessed over the network directly, and we especially like it that a single USB peripheral does the job that a conventional KVM would use a bunch of cables for. If it’s a more conventional KVM you seek, they can now be done using a microcontroller. “Why for instance is the keyboard needed […]” A keyboard can send e.g. Ctrl+Alt+Del or SysRq, a serial terminal can’t. That’s the main reason for HID in this system. I have also added playbooks and macros for folks to add stuff specific to them as well, mainly for me, cause I will add a bunch of debug stuff and just run that when I am in a pickle. I have always associated kvm with a device that allows multiple machine to share the same user hardware … I guess over s network is valid but using rdp or even ssh usually is a bit more complex than a box with a multixontact rotary switch So this is not actually a KVM in that sense, it’s closer to a JetKVM, a per-system IP-KVM but without the video, more of a serial console. My thinking was: IP-KVMs are one per system, and in my country I’d have to import each one. I run Proxmox which basically gives me a terminal anyway, so why not just serial? But my mini PCs have no serial port, so I made this. I have 4 systems, so 4 nodes in a small enclosure in my homelab rack connected to my managed switch, with a raspi zero as the hub which is also connected via Ethernet (waveshare Ethernet hat) to that managed vlan, and I can control all 4 at the same time from the hub. The rotary switch approach also means being physically at the rack, and my whole use case is a node dropping off the network when I’m not there. Working on getting the BIOS side of things to work next, but I need to learn how to do that first. “KVM” only means “keyboard/video/mouse”. A “KVM switch” is a device that switches KVM. An “IP KVM” or “remote KVM” is a device that sends KVM over the network. Using “KVM” by itself does not implicitly refer to either one. I had to name it better KVM is not actually the best term, I never knew that someone pointed that out on reddit and then I added a note in the readme 😅. Hey, morpheuslord here. This is a utility I personally wanted for my homelab. I run Proxmox on regular mini PCs, and almost everything ops-wise happens over serial. The catch is these mini PCs don’t have a serial port out of the box, on ThinkCentre Tinys it’s an optional punch-out module that mine never shipped with, so a real RS-232 console was never an option. The reason I built this is for when a node drops off the network and I need a way to diagnose it without being physically present, and without messing with a ton of wires in an already cramped box. So it’s the same serial workflow, just over USB, the Pico shows up as a composite USB CDC serial plus HID keyboard device on the host. I’m looking at expanding it with UART support and maybe even BIOS access, but that’s a long shot as of now. On the question of why the HID keyboard is there: the serial side is USB CDC, so it only works once the OS has enumerated the device and is servicing the console. If userspace is wedged or the box is stuck pre-boot, in GRUB or the BIOS, there’s nothing listening on the serial end. The HID keyboard works at a level CDC serial doesn’t, BIOS and bootloaders speak HID natively, so I can still send key combinations for restarts and low-level changes in exactly those situations. And yes, I used vibe coding to build this. This was a quick side project for managing my own systems at home, not a product, so I went with whatever got me from idea to working hardware fastest. I know what I want and how it works, and CircuitPython was new to me, so this was the practical route. Thanks for covering the project, it was a nice surprise to see it here. Happy to answer any other questions about it. If your ThinkCenter is an i5 or better, there is a good chance you have Intel AMT built in, which is a network accessible management agent that operates below the OS. It includes a serial console (as well as actual KVM for the graphical console), which you can access with tools like MeshCommander. I tried it, both AMT on Intel as well as dash in amd, both did not work, worst part is the amt one actually caused my system to crash and go into boot loops, which happened all the time. I suppose the “KVM” connection made this more accessible, but it’s a USB-serial-IP concentrator. We’ve been using such devices in HPC for a very long time. Before the loss of the servers’ serial ports, it was a serial-IP concentrator. The beauty of the serial protocol is that it can be scripted. Trying to manage multiple machines with video/keyboard/mouse-over-IP quickly becomes a scalability nightmare. =8^o Bit puzzled here. I suppose this might be useful for systems that need repair or rebuilding but normally I just run ssh into the remote system. The ssh link does more than just be a terminal as well — it can be used to tunnel an applications traffic when you don’t trust that traffic’s network security. (I’ll confess to being a bit old-fashioned since I also prefer to use ‘X’ rather than a remote desktop.)