Skip to content

Custom Keyboard Layout for Ferris Sweep

Among the solutions I have considered to improve my office comfort was investing in an ergonomic keyboard, mainly for the adjustable wrist position. Although I would later learn that split/ergo keyboards do not solve every posture- and habits-related issues causing wrist pain and shoulder soreness, I ended up being tempted. However, when searching for a relevant keyboard model, I could not wrap my head around the differences between one or another, let alone why one would want one size or another (60%, 40%, full-size?). Moreover, the price of such devices ranges from about 100 to several hundred dollars. Considering how lost I was, I listed a few criteria to help me choose the right keyboard for me.

My needs

My use cases cover normal text typing in French and English, as well as programming/command-line navigation on Linux. Here are the mandatory features:

  1. Less movement than on a regular 104-key standard
  2. A more modern key placement (i.e. not row-staggered)
  3. A light, portable, low-profile model
  4. Wired (no need to charge batteries)
  5. Quiet key switches so I can use it in a classroom or open space
  6. Split design to adjust my hand position at will
  7. Some sort of fun (i.e. customization)
  8. Not breaking the bank (< $150)

Introducing Ferris Sweep

After a lot of research and a few steps down the DIY keyboard rabbit hole, I have learnt about a few clever designs relying on a limited amount of keys to achieve the same functionality as with a regular ISO/ANSI layout, albeit being far cheaper than most mechanical keyboards. Among the more popular options are the Chocofi, Corne, and Ferris series. I opted for the latter, for I thought (and still think to this day), that 34 keys is more than sufficient for a complete layout with all the features one might want from a regular standard. More specifically, I preferred the Ferris Sweep model, for I wanted to have the ability to replace microcontrollers in the event of mishaps.
Building the keyboard was easy and fun, but the most difficult part was coming up with a relevant configuration/layout.

Configuring the keyboard

Note

I might split this page into chapters later on, given how broad the topic of configuration can be.

First, one might want to choose a keyboard firmware that matches their needs. In my case, I was hesitating between ZMK and QMK, but I ended up settling on QMK, for ZMK did not support wired split keyboards when I started building. Configuring such a firmware takes a lot of time, trial and error, but I had a lot of fun doing and learning it. The documentation available online for both firmwares contains a wonderful amount of explanations and details on all the features, so it is a must-read.

Required features for me

  • All a to z letters + ,, ., /, and '
  • All symbols that ColemakDH/QWERTY provides
  • Arrow keys
  • Modifiers (Shift, Ctrl, etc.)
  • Accents for French typing
  • Special keys like space, return, backspace, escape and tab
  • A numpad

Letters and basic punctuation

As a first obvious feature, one wants to have the full set of letters required by their language. In my case, I want my base layout to be ColemakDH, and given I have 34 keys, I can fit at least all letters from a to z, and include four symbols, which I borrowed from the actual ColemakDH/QWERTY layout ,, ., /.
Naturally, these translate to A to Z and <, >, ? when capitalized.

The last symbol one would usually include in that layer is a semicolon, but I do not use it as often as the single/double quote key, so I swapped the two. Below is a diagram representing my base layer, with letters and a few oddities which will be discussed in the next section.

Layer 0 - Letters and basic symbols

Layer 0 - Letters and basic symbols

Modifiers and special keys

So far, only 30 of the 34 keys have been documented. The four remaining thumb keys are used for text editing when tapped, respectively from left to right, Tab, Space, Return, and Backspace. Although spamming the backspace key with a thumb is impractical, if not painful, it can easily be combined with left control to erase words in one go (or Ctrl + W in terminal emulators and shells). When held down, these keys allow the user to switch to another layer for easy access, as shown below in each layer’s section (held key in red). For the escape key, I have chosen to allocate a combo on W + F, as shown in the Combos for Accents paragraph.

Finally, the four modifier keys also have to be placed somewhere, and for this I decided to use the home row mods feature, which corresponds to the hinted keys on, for example, R, S, and T in the previous section. By using this feature, a normal tap on the corresponding keys outputs a character, but a long press or hold outputs a modifier key. This means that, to output the capital letter A, I can hold E for Shift_L and press A at the same time.
Similarly for Ctrl + L shortcut in the browser, I hold my left index on T for Ctrl_L and press L with my right index.

Careful with the position of home row mods!

The current and documented position of the modifier keys differ a little from the usual home row mods, because the ColemakDH often causes involuntary mod actions if I do a finger roll.

Symbols

Thus far, the configuration contains too few symbols to be useful, especially for programming and command-line navigation. We are now going to discuss something that blew my mind when I first learnt about it: keymap layers.
Basically, when using regular keyboards, shifted and alternate symbols are considered part of different layers. Modern DIY keyboard firmwares implement a similar functionality, but allow for many more layers to be added, as long as one has enough keys to press, or finds a workaround, like a layer of layers.

For example, here is my symbol layer below, which I activate by holding the thumb key for Backspace (light red on the diagram) down.

Layer 2 - Symbols

Layer 2 - Symbols

The position of each symbol has been thoroughly chosen based on how the action of pressing them down felt, for maximum typing comfort.
N.B. I especially like the placement of ! and $, which I often type together to call the last argument of the last typed command in Bash and Zsh.

Numpad and Media Keys

Similarly to symbols, I type numbers from a dedicated layer, activated by holding the Return key down with my right thumb.

Layer 4 - Numpad and Media Control layer

Layer 4 - Numpad and Media Control layer

Movement keys and mouse

For movement keys, I hold the left thumb on the Tab key. Note that the arrows are not placed in the way one could expect from a regular keyboard perspective, as I am used to using vim and its navigation bindings.

Layer 1 - Movement keys

Layer 1 - Movement keys

In the same way, I have a layer for the mouse and function keys, activated with Space.

Layer 3 - Mouse and Function keys

Layer 3 - Mouse and Function keys

Combos for Accents

Last, but not least, I need a mechanism to type accents. To achieve this, I have settled with combos for dead accents (Linux only, so far). This way, I type a two-key combo, followed (usually) by a vowel key, which activates a dead key for the corresponding diacritic.

Combos to print accent dead keys

Combos to print accent dead keys

Tips on keeping costs to a minimum

Here are a few tips that help keep the cost of parts a minimum:

  • Use blank keycaps if you can touch-type
  • Build PCBs in batches of 5 for friends and split the cost, or order a single PCB from a supplier (which I did)
  • Though not suited for everyone’s need, preferring wired over wireless drives the cost down
  • 3D-print your own case, tenting kits, and accessories

Caveats with my configuration

For now, my configuration has a few issues making it imperfect, even for my taste:

  • I have had to move the home row mods around to avoid misclicks when typing, for example, ‘attention’ a little too fast (i, o, n are on the home row in ColemakDH).
  • For the same reason, I have had to move combos around
  • Typing passwords while having multiple pages to go through can be tricky, especially for passwords with many symbols.
  • Typing full-caps text is a little tricky with my current setup, even with caps-word, but I plan to address the issue by adding a caps lock one way or another.

As far as the keyboard itself is concerned, I have damaged the USB-C port on one of my microcontrollers (Sea Picro RP2040) as I manually plug and unplug it often. As a result, I have had to purchase additional boards, while I could have replaced the component, had my PCB had an SMD-oriented design. I would also like to come up with a tenting solution that works for me without costing too much, but I am thinking about documenting it in a later article.