Using the Sofle keyboard for software development

A Sofle Choc keyboard illuminates a matching desk mat in quiet green and blue tones. Some of the keys have different base colors.
The keyboard in question

But also Cyrillic text input, playing games, and more.

A layout-focused continuation of my recent newsletter post.

The keyboard

Cutting short from what I already wrote in the newsletter - it's a split keyboard with 58 keys and two rotary encoders, which puts it in the "medium-small" category and roughly equivalent to a 60% keyboard.

This one runs on Vial firmware, meaning that it's pretty customizable even without getting into the Cool Tricks area with flashing firmware and tweaking C code.


A little crocodile-like creature with a caption reading "small challenges" above it, referencing Sanrio's "Big Challenges"

At 58 keys, Sofle does not require Intense Layer Action for everyday tasks (and you could do away with as little as two layers total), but you will have to make some decisions in terms of picking keys that will now be slightly trickier to access.

For example, you cannot have ]} and \| keys in their usual spots because both of those keys are beyond the right edge of the keyboard (being 7th and 8th key of right half, respectively). And there's no "right" way to solve this - that depends on how you use the keyboard and what is comfortable to you.

The general circumstances for my layout are as following:

  • I use a handful of 2d and 3d editors, therefore Space, Tab, modifier keys, and F-keys should all be accessible on the left side of the keyboard.
  • For the same reason, Space and common letter keys for panning controls (Q,W,E,A,S,D) should remain possible to hold down.
  • I use arrows and navigation block keys pretty extensively when working with text and code, therefore arrow keys should remain easily accessible and possible to hold down.
  • [{, ]}, ;:, '", ,<, and .> keys have to be preserved because both Ukrainian and Russian layouts use these keys for letters.
  • This is one of the three keyboards that I use on a regular basis, therefore I did not want to get too wild with moving keys around.

Default layer

With above in mind, a suitable main layer seems to be some variation of the following:

The left side of the keyboard is pretty normal here:

  • The (half) of the digit key row is kept intact
  • Letters are where they usually are
  • I moved LCtrl and LShift one key upwards, which to me feels nice to press. Swapping LCtrl with Caps Lock is another option.
  • Other two layers and Space are within thumb's grasp.
  • For convenience, Esc can also be pressed by hitting Tab+`~ together.

The right side of the keyboard is slightly less normal:

  • Unlike the default Sofle layout, I moved Backspace back to the digit row
  • ]} key physically does not fit on the keyboard, therefore RShift is now doubling as it when tapped instead of held.
  • Since we're getting into the tap/hold zone anyway, I opted to do the same for 9( / -_ , 0) / =+ , and [{ / \| keys.
    Kind of works for my muscle memory - 9( is on the right of 8* and -_ is on the left of Backspace key, and it doesn't matter that the two are the same key.
  • A row of arrow keys sits on the bottom, with Left/Right keys easily reachable by the thumb.
    Another option is moving a couple arrow keys to be under the left thumb.

Encoders are set to Volume Up/Volume Down/Caps Lock and Page Up/Page Down/mute, respectively.

This makes the default layer almost cover a 65% layout despite lacking a handful of keys.

This is my attempt to do something like people usually have it. Occasionally I swap it to be a toggle layer, but I haven't figured out a good way to signalize the current state to the PC yet.

There are a couple things worth noting here:


I occasionally type in Russian too, but having two Cyrillic layouts makes it harder to tell what layout you're at by looking at what pops up on screen - UA/RU alphabets have a >80% letter overlap so the layouts do too (curiously, this is not the case for Bulgarian layout).

Now, technically I could type Russian text using similar-looking letters in the Ukrainian layout and it would be mostly readable - so instead of an ы there would be ьі (ь + і), and instead of an э there would be є, and ё/ъ would just be е/ь or something, but all of this would cause an average Russian reader to experience a mixed range of emotions best described with the following cat:

A crying/cringing cat emoji with crudely edited streams of tears

So I wrote a little macro that skips over the "secondary" Cyrillic layout (by just polling the current language and hitting the language switch hotkey) and this key flips between which one is that.


This key toggles an override for the digit row that allows entering every symbol as a single press or shift+press, along with making space for Home and End keys.

It is novel, but also kind of neat - so when writing code in a C-style language, all of the condition-related symbols no longer take a Shift key press.

I accomplish this by having the keys trigger RShift+digit presses and then a macro detects whether it's just RShift+digit or RShift+LShift+digit and either lets the original press through or presses the alternate key/combo instead.

This is Layer 1 and NAV is Layer 2, so holding the MO NAV thumb key always lets me type digits as normal without toggling the symbol layer.

Misc layer

This is where all the F-keys are, as well an improvised numpad... although I also have an external numpad lying around.


Column stagger is a thing of taste - after taking a few days to get used to keys being in different spots, I did not feel particularly advantaged or disadvantaged by it. Key groups (like WASD or IJKL) are slightly neater to deal with without stagger, but this comes at a price of layout oddities.

Keyboard's rather-minimal padding between keys and edges of the PCB means that it stacks neatly with various macropads and other programmable keyboard peripherals if you occasionally need more keys:

An XP-Pen ACK05 remote fits neatly next to the right half of a Sofle Choc keyboard
XP-Pen's ACK05 remote pretending to be a navigation block

Of course, if you're looking to build one, and feel like you would consistently need more keys, you can play it safe and check on other similar-styled keyboards.

There's like, a bunch of these

For conciseness, "Choc" here means Kailh Choc V1 switches and "MX" means Cherry MX (-compatible) switches.

Similarly 4x6:

  • Lily58 (58; MX)
    A classic - there are plenty variations of this keyboard, including with Choc switches and encoders.
  • egg58 (58; Choc)
    Thumb keys have different positions here and bottom row reaches corners instead of being near thumb keys.
  • Fortitude60 (60; MX)
  • Dilemma 4x6_4 (56; Choc)
  • Ursa Minor (54; Choc)
    3 thumb keys, but has reduced spacing between keys if that's your thing (photos)
  • typeboy (58; Choc)
    A gimmicky one
  • Soufflé (58/60; MX or Choc)
    "pinky keys" are positioned lower than on a normal Sofle here.
  • Eskarp (58; MX)
    A similar idea, but this one spots an optional touchpad and requires hand-wiring.
  • Pangaea (58..60; MX)
    This one sports a gently curved thumb key row and lets you adjust the position-rotation of thumb row and the two outer pinky columns.
  • mask (56; MX ULP)
    Uses Cherry MX ultra low profile switches.
  • Cantaloupe (60; MX)
    A slightly different thumb key layout with corner keys and a spot for relatively normal arrow keys.
  • SimplyKeeb 60K (60; MX)
    This one's ortholinear but spots a rather familiar thumb cluster.
  • Untitled keyboard
    Sofle-like, but wireless.

4x6 matrices with extra keys/clusters:

  • Pinky4 (64; MX)
  • Avalanche (64; MX)
    Has an extended thumb cluster and optional lonely pinky keys on keyboard edges
  • Redox (70; MX)
  • ErgoDash (66..70; MX)
  • ErgoMax (88?; MX?)
    This one even has F-keys!
  • penguin (70; Choc)
    Redox-like but with minor changes and per-key lighting.
  • Taira (66; Kailh Choc)
    Has more thumb keys and keys reaching bottom corners
  • Breeze (66; MX or Kailh Choc)
    Has a conventional navigation block with arrow keys, and an optional 6/9 key macropad.
  • ErgoNICE (69; MX?)
    Makes space for arrow keys and punctuation keys by adding an extra column of keys to the right half.
  • Willow64 (64; MX)
    An interesting take on the problem, this one gently transitions from column-staggered to row-staggered to allow for an almost perfectly normal 60% layout.
  • Chunky V2 (66; MX or Choc?)
    This one has a bunch more thumb keys and trackpad/trackball support (photos)
  • Jiaex (68; MX)
    Similarly maintains a 60%-like layout, but is fully column-staggered. Some interesting choices for sizes of some of the edge keys.
  • Supersplit (66; Choc?)
    This one has 8-key thumb fans.

4x7 matrices:

  • Ergoinu (66; MX)
  • Interphase (66; MX?)
  • Djinn (64; MX?)
    A bunch wider due to inclusion of 240x320 LCD displays and 5-way switches in each half.
  • PolyKyBd Split72 (72; MX*)
    A keyboard with displays within its keycaps. Pretty experimental.
  • Kapl (70; MX?)
    Gentle stagger and thumb keys close by.
  • Drift (68; MX)
    Depending on how you look at it, this is either 4x7 with side keys or a 4x8 with a single key missing from the edge columns.

And that's about it, really!

Should you need it, you can find the .vil file for my keymap here and the tool that was used to generate keymap images for this post here

Related posts:

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.