GitHub: https://github.com/mcyork/keybird
I had a Pi 5 and I thought, "Wow, it's got all these USB ports." The basic inspiration was simple: "Hey, I've got a few keyboards and I can plug them into the Pi, then the Pi into my computer, and I can use multiple keyboards."
That might sound crazy, but here's the thing—I've got a normal Dell keyboard, an Apple mini keyboard, and this really stupid keyboard I bought that's kind of like a number pad. It was supposed to send macros and stuff, but it's horrible at it. The software is just terrible. So I kind of fixed it to just send fixed codes, and now those codes are interpreted through a key map for me. Suddenly I've got 12 programmable buttons that can actually do useful stuff.
Anyhow, I've always been interested in keyloggers, but this is not a keylogger. This is Black Hat Booze software, yes, but this is White Hat software that I've written.
The real question I asked myself was: "What do I really want here?" And the answer was a web page that I could pull up on my phone while I'm sitting around (slightly away from my computer) and type into my computer remotely. Maybe it's doing text-to-speech. Maybe it's just controlling stuff on the TV in the main room, and I was too lazy to bring a keyboard closer to the TV, so I could just use my phone instead.
It just made sense. It's not magic by any means, but I did want to explore USB Gadget Mode and I did want to explore using Cursor to write more code. That's where Keybird started and came from. Sadness did happen. As I couldn't get it to work on a Pi 5, but it runs beautifully on a Pi 4 B, and if you only need the web interface, the Pi Zero 2 W works great.
Then I went and broke all the rules by using pi-shell as the installer. So you actually do a pip install pi-shell keybird on your main development system.
The idea being that with a tool leveraging pi-shell as the installer, you can push your code to a single Pi many times—or every time you image a Pi, you can get something pushed to it that is standard and easy to understand. Just basic commands you want to run.
pi-shell isn't supposed to save the world by any means, but I did want to test Keybird on Pi Zero, Pi 5 (fail), and Pi 4—those are the three models I have here. Using pi-shell to push Keybird instead of SSHing into the machine and trying to ensure that my install was working correctly made everything so much easier. It's much easier to have the LLM do all that for you: find the problems, debug them, iterate quickly.
So long story short, that's why Keybird uses pi-shell to install. I'm not trying to change how software is installed in general. I'm trying to demonstrate that when you're building software for a Pi with an agent-capable LLM tool like Cursor, it can really grease the wheels. I'm sure there are MCPs that can do very similar stuff. I just found connecting an MCP at this point was ugly, and the tool was really easy to write.
All right, anyways—Keybird in practice: You plug it into your computer. It gets power, it boots up. You plug your keyboard(s) into the Pi. And you have a pass-through keyboard by default. And, well, read the documentation obviously.
But yeah, I'm kind of just focusing on why I wrote these two tools. Keybird solves a real problem I had, and it does it in a way that's simple, extensible, and honestly kind of fun to use.
Part of the Black Hat Booze toolset. See also: pi-shell | About BHB