carpalx - keyboard layout optimizer - save your carpals

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

Have ideas? Tell me.

the best layout

Partially optimized QWKRFY and fully optimized QGMLWY layouts are the last word in easier typing.

the worst layout

A fully anti-optimized TNWMLC layout is a joke and a nightmare to type. It's also the only keyboard layout that has its own fashion line.

download and explore

Download keyboard layouts, or run the code yourself to explore new layouts. Carpalx is licensed under CC BY-NC-SA 4.0.


Download and install the layouts.

19 Mar 21 — Added BEAKL 15, Hieamtsr, Colemak Mod-DH and Mtgap 2.0 layouts to the layouts analysis.

15 Mar 21 — Added the Engram layout by Arno Klein to the layouts analysis.

6 Aug 20 — The search for the world’s best keyboard layout by Paul Guerin

4 May 20 — An interview with Bloomberg's Arianne Cohen Splurge on a Better Keyboard, It's Worth It.

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.

Creating Keyboard Images

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


Configuring carpalx is hard enough, so I make it easier for you to interpret the layout results. Using the draw_* parameters you can create PNG thumbnails of the keyboard layout at different iteration intervals. With the settings below, each time (draw_period=1) a lower energy state is found (draw_filter=lower_monotonic) a PNG thumbnail will be created. Using drawinputkeyboard in the action string you can request that a thumbnail of the input keyboard (QWERTY in this case) is generated.

action = loadkeyboard,drawinputkeyboard,quit
draw_period   = 1
draw_filter   = lower_monotonic # all | lower | lower_monotonic | update | none
pngfile_keyboard_input  = out/tutorials/05/tmp-input-__$CONF{runid}__.png
pngfile_keyboard_output = out/tutorials/05/tmp-output-__$CONF{runid}__.png
imagedetaillevel = 2  # use block named 1 for detail level
imageparamset    = 2  # use block named 1 for image parameters

keyboard images

To creating an image of the keyboard, just run carpalx with an action string that includes 'drawinputkeyboard' or 'drawoutputkeyboard'. The difference between these two actions is the filename used (pngfile_keyboard_input or pngkeyboard_output). Notice that the filename of the PNG files will include the random 6-character runid.

Figure 1. Input keyboard (QWERTY), generated as input-chwwxl.png.

All aspects of the keyboard layout image can be customized in the <imagedetaildef> and <imageparamsdef> blocks. Key color can be adjusted based on effort of the key.

The image below uses imagedetaillevel=1 and imageparamset=1.

Figure 2. Input keyboard (QWERTY), generated as input-xpggaz.png.