karabiner

February 10, 2026

Move at the speed of thought

It all started when I saw this video with Max Stoiber.

The video that started it all.

I was amazed at how fast he moved around his machine. No reaching for the mouse, no hunting through the dock, no fumbling for window controls. He just... went.

So I cloned his repo and made my own config.

After using this for over a year now I think this is the second most important tool I use, right after Raycast. The two go hand in hand.

Why?

Because I want to be able to move at the speed of thought.

Every time you reach for the mouse, or alt-tab through ten windows to find the one you want, you pay a tiny tax. A fraction of a second, plus the context switch in your head. On its own it's nothing. But you do it hundreds of times a day, and it adds up to a constant low hum of friction.

Karabiner lets me delete that friction. I think "Obsidian" and my fingers open Obsidian before I've finished the thought.

The Hyper key

The whole thing is built on one idea: the Hyper key.

Your Caps Lock key is prime real estate. It's right there on the home row, under your strongest finger, and you almost never use it for what it's actually for. So we steal it.

When you hold Caps Lock it becomes Hyper, which is all four modifiers at once, Control + Option + Shift + Command (โŒƒโŒฅโ‡งโŒ˜). No app in existence binds anything to that combo, so it's a clean canvas. When you tap Caps Lock on its own, it sends Escape, which is genuinely useful if you live in Vim.

Caps Lock
Hold โ†’ Hyper (โŒƒโŒฅโ‡งโŒ˜) ยท Tap โ†’ Escape

In Karabiner terms, that's a single rule that flips a hyper variable on while the key is held, and falls back to Escape when tapped alone:

TS

Sublayers, or: a leader key for your whole Mac

A single Hyper key gives you one extra layer of shortcuts. That's nice, but the real trick is sublayers.

If you use Vim or tmux you already know this pattern, it's a leader key. You press a prefix, and now you're in a little mode where the next key means something specific. Karabiner can do the same thing across the entire operating system.

The mental model is a tree. Hyper opens the door, the next key picks a room, and the key after that does the thing:

TEXT

So every shortcut is a tiny three-key sentence: Hyper, category, action. The beauty is you don't have to memorize arbitrary combos, you just remember the mnemonics. Open, Window, System, Raycast.

Why a DSL instead of the GUI?

Karabiner is configured with JSON, and the JSON for this gets enormous, mine compiles down to a 2000+ line file. Writing that by hand is misery. Max's repo ships a small TypeScript layer that generates the JSON for you, so you describe your shortcuts in a way that's actually readable and type-safe.

Here's the helper that builds a sublayer. Each command only fires when its sublayer variable is 1, which is how Karabiner knows you're "inside" that room:

TS

And because that's verbose too, there are a few tiny helpers so the actual config reads almost like plain English:

TS

My layers

With those helpers in place, the whole config is basically one big object. Here's a trimmed version so you can see the shape of it:

TS

A couple of the design choices in there took me a while to appreciate:

  • - v for "moVe" lives on the left hand on purpose, so that hjkl end up under the right hand exactly where they sit in Vim. Same reason music controls are on c ("musiC") and not m.
  • - The window layer mirrors Vim too: h and l snap the window left/right, j and k snap bottom/top. Once your fingers know hjkl, you reuse that muscle memory everywhere.
  • - Most of the power doesn't come from Karabiner alone, it comes from feeding Raycast deeplinks into it. Anything Raycast can do, a single key can now trigger.

That last point is the real unlock, and why I said Karabiner is second to Raycast and not the other way around. Karabiner is the trigger, Raycast is the engine.

Clicking without a mouse

Launching apps and snapping windows gets you most of the way to never touching the mouse. The last mile is clicking things, and for that I lean on Homerow.

Homerow puts a little label on every clickable element on screen, you type the label, it clicks. Karabiner is just the trigger that turns it on:

TS

So

Hyper+F
labels everything I could click, and
Hyper+J
drops me into scroll mode. Between this and the window layer, the trackpad mostly gathers dust.

The whole map

Step back and the whole thing is just one mnemonic tree. Hold Hyper, pick a room, do the thing:

TEXT

That's the entire mental model. Nine rooms, and once your fingers know which letter opens which, the rest is just muscle memory.

Building it

Because the config is TypeScript, there's a build step. It's not scary, the whole "build" just serializes that big object into the karabiner.json Karabiner actually reads:

BASH

I keep yarn watch running whenever I'm adding a new shortcut. Change a line, save, and the binding is live a second later. That tight loop is what makes it fun to keep extending, instead of a thing you set up once and never touch.

Make it yours

Don't copy my layers wholesale, they're shaped around the apps I use. Max gives the same advice: delete all the sublayers, then add your own based on what you actually reach for during the day. The config is the easy part, the hard part is being honest about your own habits.

Was it worth it?

Completely. The setup cost was an afternoon, and a week or two of my fingers fighting old habits. After that it just became how I use a computer. I genuinely notice the friction now when I'm on someone else's machine and Caps Lock is just Caps Lock again.

If you want to start, watch Max's video, clone his repo, and strip it down to a single layer you'll actually use. Open apps is a great first one. Add to it as you go.

Kudos, as always, go to Max Stoiber for the config and the DSL. My own version lives in my dotfiles if you want to poke around.

g+

h homeb blogu usesn notesa abouts somedayw nowq quotes