carpalx - keyboard layout optimizer - save your carpals

Carpalx optimizes keyboard layouts to create ones that require less effort and significantly reduced carpal strain!

Download keyboard layouts, or run the code yourself to explore new layouts.

X11 layouts are available! Patches to include Carpalx layouts in xkeyboard-config and kbd have been submitted by Perry Thompson. Meanwhile, many thanks to Sven Hallberg for providing X11 configuration for Carpalx layouts. Richard Gomes contributed an archive of these files for KDE/Gnome users.

Love your coworkers? Switch them to QWKRFY layout or a fully optimized QGMLWY layout.

Hate your coworkers? Switch them to TNWMLC layout. It's the only keyboard layout that has its own fashion line.

Have ideas? Tell me.

25/may/18 — The BBC article Why we can't give up this off way of typing by Tim McDonald discusses the history and persistence of QWERTY and my Carpalx work.

16/aug/16 — Ergonomic Keyboard Layout Designed for the Filipino Language at AHFE2016 derives layout for Filipino language using Carpalx

18/apr/16 — Carpalx layouts soon to appear in freedesktop (package xkeyboard-config) and kbd. Thanks to Perry Thompson.

9/sep/14 — A new layout—De Correspondent—for the Dutch language in collaboration with De Correspondent.

16/may/14 — Added evaluation of the Norman layout. This layout modifies 14/26 keys and has statistics similar to Colemak. Detailed statistics are available.

12/feb/14 — Added evaluation of the abKey layout. Its alphabetic layout makes no attempt at ergonomics. Detailed statistics are available.

Model Parameters

A complete description of the typing model can be found in Carpalx - Typing Effort section. Here I list parameter sets.


The typing effort model is parametrized by the following sets of parameters

  • effort component weights: kb, kp, ks
  • triad interaction parameters: k1, k2, k3
  • penalty weights: w0, whand, wrow, wfinger
  • penalties: Phand, Prow, Pfinger
  • stroke path weights: frow, fhand, ffinger
model name description kb,p,s k1,2,3 w0, whand,row,finger P f
mod_01 balanced contributions 0.3555, 0.6423, 0.4268 1, 0.367, 0.235 penalty_weight_01
0, 1, 1.3088, 2.5948
Phand = 0, 0
Prow = 1.5, 0.5, 0, 1
Pfinger = 1, 0.5, 0, 0, 0, 0, 0.5, 1
fhand = 1
frow = 0.3
ffinger = 0.3

parameter selection

Since there are many parameters, there is opportunity to define a variety of models, each with a focus on different aspects of typing. For example, one model could have parameters that have no finger penalties whereas another model might heavily penalize the pinky.

I used to have multiple parameter sets listed here, but found that this added too much complexity to the description. Therefore, I will present a single set of parameters and use this set for all layout evaluation and simulation. This parameter set is called mod_01 (i.e. model 01).

The penalty weights (whand, wrow, wfinger), effort component weights (kb, kp, ks) and triad interaction parameters (k1, k2, k3) were selected so that the effort components for QWERTY had specific ratios. The ratios for the model for the base:penalty:stroke effort components is 1:1:1 (fairly easily justifiable — a balanced contribution) and the row and finger component of the penalty also has a ratio of 1:1.

Specifically and first, the hand penalty weight whand was set arbitrarily to 1 — this value is unimportant since there is no hand penalty (i.e. Phand=left = Phand=right = 0). The row penalty weight, wrow, and finger penalty weight, wfinger, were set so that the row- and finger-associated penalties were identical. This can be achieved with any number of parameter pairs (I don't immediately recall why I didn't make one of these 1). Next, the interaction parameters were set so that the ratio of efforts for k1,k2=k3=0 : k1,k2,k3=0 : k1,k2,k3 was 60:30:10. k1 was arbitrarily set to 1. In other words, the interaction between the second and first key in the triad contributed to 30% of the effort and the interaction between the third and the first two keys contributed 10%. Once these parameters were fixed, the component weights were adjusted so that the base, penalty and path efforts for QWERTY were all 1, making up a total effort of 3.

To make the consequences of the parameter selection process concrete, below is the effort table for QWERTY. Notice that the effort contributions from base, penalty and path are equal. Furthermore, the row and finger components of the penalty are also equal (these penalty components do not mix linearly, and therefore the total penalty is larger than the sum of the components).

QWERTY typing effort - english corpus
model keyboard total effortrel% effort contributionsrel%
base penalties path
mod_01 qwerty 3.000


Penalty Weight Sets

The penalty weights are the w0,hand,row,finger parameters in the equation for key effort.

These weights adjust contribution of baseline, hand, row and finger penalties.

penalty weight name description w0 whand wrow wfinger
penalty_weight_01 default penalty weight 0 1 1.3088 2.5948

As described above, the penalty weights were set to balance row and finger contributions. The hand penalty weight value is arbitrary, since no hand penalties are incurred in this parameter set (the hand penalty values were set to 0, so as not to penalize either hand). The row penalties are subjective, and I set them to 1.5 for the digit row, 0.5 for the top row, 0 for the home row and 1 for the bottom row. I consider the bottom row to be less accessible than the top row. Finger penalties were levied at the ring finger, with a value of 0.5, and the pinky, with a value of 1. I consider the pinky to be quite weak (here some may argue that this pinky penalty, which is 2x the ring finger penalty, is too high) and intuitively prefer layouts that lay off the pinky, so to speak.

Penalty Sets

The penalty values are Phand,row,finger parameters in the equation for key effort.

These values map the value of hand (L,R), row (number, top, home, bottom) and finger (index, middle, ring, index) onto a penalty. A given model will weight each penalty value using the penalty weight parameters.

penalty name description Phand Prow Pfinger
penalty_01 default penalties
hand qh
L 0
R 0
row qh
number 1.5
top 0.5
home 0
bottom 1
finger h, qf
index L 0 R 0
middle L 0 R 0
ring L 0.5 R 0.5
pinky L 1 R 1

Stroke Path Sets

The stroke path effort, si, is determined based on the hand, row and finger stroke pattern categories pr,h,f. Stroke path effort is computed by summing efforts associated with each category.

Each triad is assigned a distinct hand, row and finger stroke category based on the layout of the triad keys. For example, row category 1 (pr = 1) is associated with a downward row progression with repetition (e.g. rows=top, top, home) for example.

The balanced stroke path (path_01) yield approximately equal hand, row and finger contributions to the stroke path over the English corpus.

stroke path name description fhand frow ffinger
path_01 balanced stroke path 1 0.3 0.3