Lenke til norsk versjon

(If you already know about Home Row Mods, click here to go straight to my quick method for getting it on your Mac - even on the .internal laptop keyboard)

As part of my ergonomics voyage, I’ve been working on getting home row mods on my keyboard. This excellent guide provides tons of info on this, but the short version is this:

To contort your hands less when using modifiers (like shift and control), the letter keys on your home row serves double duty: They’re the letters if you tap them, but modifiers if you hold them.

Letter keys A, S, D and F, with icons for modifier keys on them.

The home row letters on the right side is usually used as well, mirrored from the left. Image from the guide.

Image of the ZSA Voyager split keyboard.

Many users of this completely gets rid of the regular modifier keys. But it can be benefitial as a compliment to those as well, by reducing the amount you use them.

Tapping vs holding

But what’s constitutes a tap and what constitutes a hold? That’s the central question here…

Let’s say I’ve made the A key become Shift when held.

If I’ve decided that I have to hold the key for 500 ms before it counts as a hold, I have to wait 0.5 seconds every time I want to type a capital letter. That can be quite annoying!

OK, so I might say I only have to hold the key for 70 ms for it to register as a hold. But as it turns out, when I type the word «after», I hit the F key before I release the A key - so instead I wrote «Fter» with a capital F !

Finding your sweet spot

A normal place to start is at 200 ms, and then it works like this:

  • Input: Press down (only) A, and release it before 200 ms.
    • Output: «a» (click)
  • Input: Press down (only) A, and release it after 200 ms.
    • Output: shift click (hold)
  • Input: Press down A, and then click F before 200 ms (even if you keep holding A).
    • Output: «af» (click)
      • (But if you kept holding F, it would type out the A, and then transition into an «F hold», which in my case is Command.)
  • Input: Click A, and then click F before releasing A and after 200 ms.
    • Output: «F» (Hold - and the shift modifier continues to be held, so you can write more capital letters.)

Higher treshold:

  • You have to wait for the modifier function to kick in.
    • This can be a bit slow and annoying, and can, lead to things like typing the letters «fa» instead of selecting all with «Command + A».
  • But typing instead of hitting hotkeys is often less annoying than the other way around.

Lower treshold:

  • Less waiting time, so feels more like regular modifiers.
  • But this leads to more misfirings - especially if you type fast and/or hold your keys a bit while typing. (The last thing is called key roll, and I do that quite a lot it turns out.)
    • You’ll get less unintended activations if you learn to type with shorter clicks,
    • or you have a keyboard with more key travel.

The guide linked above recommends starting quite high, and then work your way down as you become more familiar with the concept. Don’t give up on the ergonomic upsides even though it’s not optimal the first days! It’s also possible to have different tresholds on ondividual keys - but I think it might be easier to get the muscle memory if it’s not too different.

How to activate

There are two main alternatives to get this function:

  1. Via the firmware in external keyboards (like QMK and ZMK).
  2. Via software running in the OS (like KMonad and Karabiner-Elements).

These are some of the things you need to consider when choosing your method:

  • With firmware, you get access to some more advanced functions, like Permissive Hold and Retro Tapping,
    • and you can also map keys to adjust the tresholds on the fly.
    • I also think it’s a bit more flexible when transitioning between several modifiers.
  • If the functions are in the keyboard’s firmware, you also get it when connecting to a different computer.
    • But the flip side of this, is that doing it in software makes it accessible regardless of the keyboard you’re using with your computer (like an external keyboard without QMK support, or the internal laptop keyboard.
      • Also, software is quicker and easier to install, so doing it on several computers isn’t that hard.
  • I found the typing feel way nicer (much less lag) with Karabiner-Element (software) vs QMK (firmware) - but that might be due to my settings.

Screenshot of a QMK firmware file.

I don’t mind messing with QMK files, compiling and flashing. But it’s much more complex than adding actions via Karabiner-Elements.

Image of my keyboard, numpad and trackpad.

I still adjust the numpad and features I only want on the external keyboard with QMK. And I keep home row mods and other dual layer functions on Karabiner - both because I want it on the internal keyboard, and because I prefer the typing feel.


If you want to do it via firmware or KMonad, you can follow the guide I linked in the beginning. However, I didn’t manage to get KMonad to work on my Mac, and I haven’t found any guides online for how to activate via Karabiner-Elements - so that’s what I want to provide here.

I made the actions using the excellent Karabiner.ts tool.

1) Install Karabiner-Elements

You can download the app from their website, or if you have Homebrew installed, just type brew install karabiner-elements in the terminal.

You do have to give it bunch of permissions in the OS, though!

2) Add the actions

I have a GitHub repo here, with some variants of the home row mods action (and a couple more). The actions themselves are long .json files, that you copy and paste into Karabiner here:

First click “Complex Modifications”, then “Add your own rule”. Then copy and paste everything from the .json files here, and hit save.

3) Adjust the tresholds

The default to_if_hold_down_treshold is 500 ms - which is very long. So here’s how you adjust it:

I’ve went into “Parameters”, and then highighted to_if_alone and to_if_held_down. About the first, i’ve said: “This does the following, when on 1000 milliseconds (1 second): If you hold F for 1 second, and then release it without hitting any other buttons, F gets written. But if you hold for 1.1 secons, Command gets sent instead.” And about the second, I wrote: “This starts on 500 - but I’d set it to 200, and see what you ike. It’s how long you must hold F before it becomes Command. Lower value makes it possible to do hotkeys faster. But if it’s too low, and you write the word “Fast” and hold F and A together for a few milliseconds, you wil send “Command + A”."

When using multiple modifiers (like Shift + Option ), you press and hold the letter keys simultanously. The simultaneous_threshold_milliseconds is how closely you must press them to be counted as being pressed at once.

**If you first hold A, to activate Shift, and then want to activate Shift + Command, you have to release A and then press A and F together. **This is a limitation I haven’t found a way around yet.

4) Test and adjust

You won’t love it at once! So try to adjust the tresholds, while also consider adjusting how you type a bit. Because there will always be some trade-offs.

While testing, I can recommend using something like Keycastr or Karabiner-Element’s EventViewer, which you’ll find here:

Click Karabiner in the menu bar, then “Launch EventViewer”.

In that image you can also see that Karabiner-Elements can hold different Profiles. This can be useful if you find that you prefer different tresholds for different keyboards, so you might have three profiles named something like:

  • Laptop
  • External
  • Gaming (because gaming with home row mods is A Bad Time™️)

Searching for «home row mods karabiner-elements» has given little useful in the past. Now I hope someone will find this, and find it useful!