-
Pressing more than one modifier key at once would lead to loops in the circuit; an issue known as key rollover. ↩
-
Which, although a little nuanced to set up, is an absolutely wonderful tool I can’t recommend enough. ↩
Revisiting the Psion Bluetooth Keyboard
My take on a Psion bluetooth keyboard has been in the works since 2018. It’s one of my first hardware projects and, if I’m honest with myself, was a litte beyond my abilities at the time. There were just too many new things all at once: microcontrollers, 3D printing, and PCB design.
The PsiBoard, while working, has never felt complete
Now that I’ve a little more experience behind me, I’m going to have a go at finishing it—I receive a constant trickle of emails from folks intereted in building their own, and I’d love to be able to offer a complete set of parts and instructions.
Shifting Sands and a New Direction
The world of custom keyboards has moved on significantly since 2018, with devices like the Pro Micro and it’s cousin the nice!nano becoming the go-to microcontrolers, supported by a wide range of off-the-shelf customizable firmware.
Moving forwards, I’m going to use ZMK and a nice!nano. This is a combination I’ve experience with from my work on the Little Luggable, and it should allow me to foucs on the electronics and the industrial design, rather than spending my days working around already-solved firmware issues.
Electronics
The Psion Series 5/5mx keyboard connects using a 20-pin ribbon cable
When I last worked on the PsiBoard, my understanding of the keyboard matrix was as follows (ribbon cable pin numbering given in parentheses):
Col 01 (15) | Col 02 (11) | Col 03 (10) | Col 04 (9) | Col 05 (8) | Col 06 (7) | Col 07 (6) | Col 08 (5) | Col 09 (4) | Col 10 (3) | Col 11 (2) | Col 12 (1) | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Row 01 (20) | Space | Up | . / | Left | Right | Left Shift | ||||||
Row 02 (19) | Z | X | C | V | B | N | Right Shift | |||||
Row 03 (18) | H | J | K | M | . ? | Down | Fn | |||||
Row 04 (17) | Tab | A | S | D | F | G | Left Control | |||||
Row 05 (16) | 1 | 2 | 3 | 4 | 5 | 6 | ||||||
Row 06 (14) | U | I | O | P | L | Enter | Menu | |||||
Row 07 (13) | Q | W | E | R | T | Y | Esc | |||||
Row 08 (12) | 7 | 8 | 9 | 0 | Del | ‘ - |
This has 12 columns, and 8 rows, requiring 20 I/O pins—too many for most microcontrollers (the nice!nano has only 18). Previously, to work around this, I tied the modifier keys to a single column, leading to issues identifying multiple modifier keys1.
With the benefit of experience, I’ve realized that these modifier keys are intentionally broken-out to allow diodes to be introduced on each of the modifer lines to avoid exactly this problem—Psion skipped putting diodes on the flexible PCB itself, but made it possible to add them where it really matters.
Taking this into account, here’s my updated understanding of what the Series 5 keyboard matrix should look really look like:
Col 0 (20) | Col 1 (19) | Col 2 (18) | Col 3 (17) | Col 4 (16) | Col 5 (14) | Col 6 (13) | Col 7 (12) | |
---|---|---|---|---|---|---|---|---|
Row 0 (15) | Z | H | Tab | 1 | U | Q | 7 | |
Row 1 (11) | Space | X | J | A | 2 | I | W | 8 |
Row 2 (10) | Up | C | K | S | 3 | O | E | 9 |
Row 3 (9) | , / | V | M | D | 4 | P | R | 0 |
Row 4 (8) | Left | B | . ? | F | 5 | L | T | Del |
Row 5 (7) | Right | N | Down | G | 6 | Enter | Y | ‘ ~ |
Row 6 (6,5,4,3,2,1) | Left Shift | Right Shift | Fn | Left Control | Menu | Esc |
Our new row 6 is created by tying pins 1-6 from the ribbon cable to a single pin, by means of a diode on each wire. This prevents loops in the keyboard matrix by ensuring current can only flow in a single direction through the circuit. Happily, this also only requires 15 I/O pins, leaving 3 spare pins on the nice!nano.
Using a breadboard to test the new modifier row and diodes
Returning to a breadboard for prototyping, I was able to confirm this all works correctly and give myself a testbed for my customized ZMK firmware.
Next Steps
With the wiring in place, the next step is to convince myself I can get all the functionality I want with the ZMK firmware, especially around power management.
Retiring Bookmarks
For the last 4 years, I’ve been working on Bookmarks, a Pinboard client for iOS, macOS, and iPadOS. Bookmarks was my attempt at bringing a Pinboard-like visual experience to private bookmarking. It’s been in public TestFlight beta for the last couple of years and has picked up a fair number of users. After much consideration, I’ve decided to stop working on it.

Bookmarks focuses on offering a more visual experience
Before getting into the details, I’d like to say thank you to everyone who’s been helping me test Bookmarks, and has provided feedback and suggestions during development. It makes a huge difference to know that what I’m building helps others and is very much why I started writing software in the first place. Thank you!
While I’m really proud of what I’ve created with Bookmarks (it’s an app I’ve used almost daily for the last few years), I want to invest my time elsewhere. Maintaining indie software represents a huge amount of work and, of all the software I write and maintain, Bookmarks deviates most from the product I’d design if I started again today1, and is the one with the most alternatives in the market2.
Bookmarks is open source (under the MIT license), so if you’re interested in taking over the project, I encourage you to do so and am happy to help you get up to speed.
Tracking File Changes
Introducing Reporter
Over the past couple of months, I’ve been working on-and-off on Reporter, a new command line utility to make it easier to keep track of changes to your files.
Reporter generates email reports letting you know about changes over time. It’s intended to fill in one of the missing pieces from services like Dropbox for folks who choose to self-host their files using network shares, or tools like Syncthing1, providing both a quick sanity check that file changes match expectations and an easy way to discover edits in files shared with others.

Reporter generates clean email reports showing file changes
Reporter works by scanning your files and generating a snapshot containing paths, modification times, sizes, and shasums. It then compares this snapshot to the previous one and sends an email summary if there have been any changes. It includes a built in SMTP client (using Swift-SMTP from the Kitura project) to avoid the need to rely on platform-provided mailers and, while it’s written in Swift, compiles and runs happily on Linux (I run it primarily on my Raspberry Pi based home Syncthing mirror).
There’s not much more to say. Reporter is a simple tool with a single purpose. I find it incredibly useful and maybe you will too. Right now, you’ll need to build it from source (and there are some known issues), but if there’s interest, I’ll look into packaging for various platforms. You can find it on GitHub. I’d love to hear how you get on.