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.

Concurrent Optimization - Parallelizing Layout Search

configuration file : etc/tutorial-04.conf
output : out/tutorials/04


If you have multiple CPUs you can run carpalx multiple times to increase the likelihood of finding the best layout for your parameter set. The only caveat is to set the output file names to unique values for each run, so that concurrent instances of carpalx do not overwrite each others files.

To do this, I usually set a runid parameter in the configuration file to a random string (parsed and evaluated at run-time) and then concatenate this string to all output files.

runid = __join("", map { chr(97+rand(26)) } (0..5))__
keyboard_output = /home/martink/work/carpalx/dev/out/tutorials/04/tmp-__$CONF{runid}__.conf
keyboard_output_show_parameters = current,annealing

If you flank configuration values with "__" (e.g. __2+2__), the string between the __ delimiters will be evaluated before it is assigned to a variable. Thus, runid will be random 6 character string and the value of keyboard_output will have this value embedded. The likelihood of two instances having the same value is negligibly small.

In this example, I ran 100 instances of carpalx. Each instance optimized over 1,000 iterations. It is very important to include the current parameters in the output file so that you can determine the best candidate.


After the runs are done, I have 100 output files of the form tmp-xxxxxx.conf in the output directory.

> cd /home/martink/work/carpalx/dev/out/tutorials/04
> ls
-rw-r--r--  1 martink users 825 Aug 13 17:06 tmp-aedfne.conf
-rw-r--r--  1 martink users 826 Aug 13 17:06 tmp-alxgbj.conf
-rw-r--r--  1 martink users 829 Aug 13 17:06 tmp-bhlypi.conf
-rw-r--r--  1 martink users 827 Aug 13 17:06 tmp-bwukea.conf
-rw-r--r--  1 martink users 825 Aug 13 17:06 tmp-cuovlg.conf
-rw-r--r--  1 martink users 829 Aug 13 17:06 tmp-ddlrja.conf
-rw-r--r--  1 martink users 825 Aug 13 17:06 tmp-dfplfh.conf

To list the solutions with the 5 lowest efforts,

> grep ^effort * | sort -n +2 -3 | head -5
tmp-zjqgub.conf:effort             = 1.69679625336239785
tmp-taefqt.conf:effort             = 1.71535465610664482
tmp-hwlnsw.conf:effort             = 1.72057806732281894
tmp-ezikjb.conf:effort             = 1.72235159706217446
tmp-ejtrhx.conf:effort             = 1.725622120225492

Out of the 100 iterations, final typing efforts range from 1.697 to 2.598. The top layout is in tmp-zjqgub.conf with a final typing effort of 1.697.

z y u l b c d g f q [{ ]} \|
 r i a o h n t e s ;: '"
  x v k p j m w ,< .> /?