Github link: https://github.com/Dakkaron/Fairberry
Here’s a video of it in action: https://www.youtube.com/watch?v=iDb8_ld9gOQ
I’ve been using it for almost two years now, and I’m not going back.
It’s based on a spare Blackberry Q10 keyboard and a custom Arduino-compatible board that reads the keyboard matrix and outputs it as USB HID to the phone. From the viewpoint of the phone, it’s just a regular USB keyboard, so no special software is needed.
But I do use a custom virtual keyboard to have just two rows of symbols that are not natively on the keyboard, as I didn’t want to add another layer of rarely used symbols that I’d have to memorize.
(On the image you can see Ubuntu with XFCE4 running on it. I chose Ubuntu because it’s what was easiest to get running in a chroot jail on the phone. I’m using VNC to display the GUI. I even managed to get FEX (x86/x64 emulator) and Wine running, so it runs x86/x64 Linux and Windows apps.)
I get 55 WPM without errors on the physical keyboard, compared to 45 WPM on the touch keyboard where I also have a significant amount of typos.
But tbh, typing speed is not the main reason. With the physical keyboard, I am much more accurate. I can use key combinations like CTRL+A/X/C/V (the microphone button is mapped to CTRL). There is an alternate mode (activated by pressing both shift keys at the same time) that remaps WASD as cursor keys, which makes e.g. selecting text (SHIFT + Cursor key) much easier. Also I can type while walking and not looking at the phone. And don’t get me started about how much of a difference it is when I use a command line, e.g. with SSH.