A glance at the Keychron K2 keyboard

9 minute read Published: 2021-03-21

Last year I've bought a mechanical keyboard because I was annoyed by the unappealing feedback of the laptop keyboard. Also, since the laptop chassis and its touchpad both already show early signs of wear (both cosmetic and physical) just after about two years of intense everyday day.

I was hoping these parts were more durable in a Lenovo Thinkpad. The years of the X220 are well in the past, unfortunately. Therefore I've decided I'd go back to a "classic" setup with keyboard + external mouse (which I don't use often).

I am a longtime fan of mechanical keyboards, I have two IBM Model M plus another one (forgot which brand). The Model M is gorgeous but honestly I find a prolonged use exhausting, both physically (it's huge) and mentally (it's loud). Not to mention that it is strictly forbidden in any working environment of the XXI century. This kind of poetry is also a relic of the previous century, apparently.

So I've tried finding a compromise with a Cherry MX brown from a Chinese vendor a friend of mine suggested (he had bought one and demoed it for me). I was convinced by the really good price (about 120 USD is a bargain compared to other mechanical keyboards) the sturdy look and having my friend-as-guinea-pig tested it before me. The keyboard in question is the Keychron K2.

After a few months of usage, I now have a clear picture of the product and the company, so here's some thoughts.

I won't repeat the tech specs from the website, let's just summarize the keypoints:

This keyboard (like many reduced layouts) has by design some missing keys. In this case two important keys: the Insert and the PrintScreen are missing. I had realized this detail only when I receveid it and cursed against my being an idiot.

§ Good customer service

The company replies reasonably fast to inquiries and tries to work out problems with the customer, they're not dismissive (looks like to be a small company). Strangely, they provide support on ... facebook (wtf?!) by using a group where users exchange tips and ask questions. Luckily someone thought to at least create a Reddit forum. But seriously, facebook?!

§ Shipment and packaging

The shipment and delivery was ok, minus the usual wrinkles when receiving stuff from China: the tracking starts at the origin, follows the package until it leaves the continent, disappears for days in a black hole while traversing the Plateau of Leng to suddenly appear at your door without any notification from the courier.

§ It works on Linux by "chance"

The official support is for Win/MacOS/Android/iPhone, the instructions are Apple-style (a thin leaflet explaining the "happy paths" and some turn-it-off-then-on kind of troubleshooting) so I had to figure out some stuff by myself or with the help of other Linux users. I have contacted the company to push for a better Linux support but they politely declined to release more specs or to help me figure out some low-level stuff I was investigating. This does not mean that it could stop working on Linux at some point, just that the hacking is pretty limited for a non-expert hacker.

The Apple-centric design is also visible in the keys layout: the last row with Ctrl, Modifier and Super are arranged like an Apple keyboard.

Above: the Keychron. Under: Lenovo Thinkpad

This is really annoying because switching from one keyboard to the other needs some time to adjust. And in that row, there are keys I use like 1000 times a day! When you're in Emacs, clicking Alt instead of Control it's dangerous and will drive you nuts. Every. Single. Time.

To a certain extend, this can be however circumvented with software :) and that's where the fun begins.

§ XKB, here be dragons

XKB is an X11 module (?) extension (?) whatever reading the incoming scancodes from the keyboard and translating them into keystrokes. This XKB thing is the most awkward and retrocomputing thing I saw since the time I was playing with a Motorola 68000 CPU. Just scroll the documentation and try to make sense of it.
It's obscure and hostile but it's what we have on Linux to be able to use any input device, so luckily Sway (the window manager / Wayland composer I use) supports it. The maintainer of libinput has some interesting writeups on how to deal with this monster, allow me to quote him on that:

Now, I fully agree that this is cumbersome, clunky and feels outdated. This is
easy to fix, all that is needed is for someone to develop a better file format,
make sure it's backwards compatible with the full spec of the XKB parser (the
above is a fraction of what it can do), that you can generate the old files
from the new format to reduce maintenance, and then maintain backwards
compatibility with the current format for the next ten or so years. Should be a
good Google Decade of Code beginner project.

Long story short, by using these strange levers, I could customize the scancodes remapping them to match the keystrokes I wanted. I won't explain the following snippets because it would take too long. I'll paste them here just for teh lulz.

Everything is noted down in excruciating detail in my dotfiles on Sourcehut.

Then at some point I realized there's a tiny firmware bug. The USB-C and the Bluetooth controllers expose a slightly different device name. This got me scratching my head wondering why the Keychron worked when connected via Bluetooth and not via USB.

Here's what Sway says about the keyboard when connected via USB and then Bluetooth: can you spot the difference? :)

# Keychron K2 via USB
$ swaymsg -t get_inputs
Input device: Keychron Keychron K2
 Type: Keyboard
 Identifier: 1452:591:Keychron_Keychron_K2
 Product ID: 591
 Vendor ID: 1452
 Active Keyboard Layout: English (US)
 Libinput Send Events: enabled

# Keychron K2 via Bluetooth
$ swaymsg -t get_inputs
Input device: Keychron K2 Keyboard
 Type: Keyboard
 Identifier: 1452:591:Keychron_K2_Keyboard
 Product ID: 591
 Vendor ID: 1452
 Active Keyboard Layout: English (US)
 Libinput Send Events: enabled

The USB Identifier field has a typo (lol). The xkb reads the device by its name, so in my config I was just reading one of them. I had to duplicate the mappings to also have xkb read the other device.

I had reported this to Keychron but received no answer. I suspect that my mails now go straight to /dev/null :)

§ Using the keyboard

After having fun learning some 30 years old sort-of-DSL, I could finally use the keyboard without feeling that weird moment of "adjustment" when coming from my laptop keyboard. The keys are now more or less where I expect them to be.

The sound is great, typing on it gives a lovely feedback without being annoying. The weight makes the keyboard very stable on the surface, the keys looks solid. The aluminium surface of the external closure adds to the feel of a solid piece of hardware. The closure is removable using a Torx screwdriver, so I think it is also serviceable. It's also compact so I can bring it everywhere. On Bluetooth connection, the battery lasts a couple of days of intense use.

One more complaint, though, is that the Fn keys (from F5 to F9) are only partially lid, so when I turn its light on I don't read the labels very well.

To see and hear the keyboard in action, please go to one of the many online reviews with better camera and microphone I can possibly have.

§ Conclusions

Overall, I like it very much. I think I'll keep it for a long while.

But I've learned a couple of things to keep in mind for the next one: