Skip to main content


Karabiner is life changing tool that lets you remap keys at a low level on macOS.

I completely remapped my keyboard with it and every key on my keyboard is a custom modifier key that I can program to do what I want.

For example you can make caps lock into an escape key when pressed once but if you hold it, it becomes a hyper key. Hyper key means that a key now serves two purposes, once when pressed alone and once when held down. So for example for remapping caps lock, we can remap it to act as escape when pressed alone once but if we hold down on it it becomes ⌘ + βŒƒ modifier key. So caps lock + F becomes ⌘ + βŒƒ + F. And so on.

I take this idea further and define these kind of hyper keys but for every single key on my keyboard.

My personal Karabiner setup​

I generate my Karabiner config with Goku.

Will make a web explorer for Karabiner/Goku bindings soon. But briefly, I group keys by theme. q = cmd+shift. w = open apps. e = cmd. r = open more apps. i = insert symbols like & or |. o = Alfred searches. a = control. s = arrow keys, selecting text & more text helpers. d = d+v will do left mouse click, use that a lot. f = various helpers. g = move windows left/right/maximize & more. hjkl are no hyper keys as I press on them often for scrolling in vim/browser and need instant response, hyper keys have a little delay after press. : = caps lock key, so :+w will insert W. z = open chat apps, like z+k opens telegram. x = spotify helpers, like current song, search songs & more. c = helpers, use c+s often to clone current open GitHub URL & open it in VSCode. v = change volume, next song & more. b = open 'news' sites like Reddit/HN. n = Alfred searches, use n+s to trigger web searches often. m = search Dash docsets with Alfred. . = insert text fast like console.log() & more.

Interesting configs​


  • I can embed simultaneous key mappings inside sticky key definitions.


3 finger trackpad actions​

{:des "hold three fingers on trackpad & press keys" :rules [
[:condi ["multitouch_extension_finger_count_total" 3]]
[:f :button2] ;
:v [:button1 :!Cv]]