helm
take the wheel
An engraving of a
    ship's console: an eight-spoke helm wheel mounted above a keyboard and a
    mouse, drawn as the ship's controls.

A thing I built for myself

I built the way my computer works.

Helm is a set of keys I assembled on top of Hammerspoon until my Mac started behaving the way my hands already expected. Hold a key, press a letter, be in the app. That's the heart of it.

There's nothing to buy here and nothing to sign up for. I just think it's good, and I wanted somewhere to point at when I say so.

The problem

You didn't build your tools, so you don't know them.

Every program you use shipped with a few hundred options and a shortcut sheet as long as your arm. Window managers are the clearest case. Rectangle, the snap panes on Windows: dozens of combinations, all of them chosen by somebody else. You weren't there when they were picked, so you never learn them, and the two you did learn you've forgotten by March.

Configurability that someone else chose is not the same thing as control. It's a menu. You can move things around in it, but it isn't yours, so it never quite goes in.

The opposite of that

You build it, so you know it.

Helm isn't an app you install and configure. It's a thing you assemble on top of Hammerspoon, with an AI writing the Lua alongside you, one key at a time. Each one goes in because you wanted it that particular afternoon. Nothing in it is a default. You remember all of it, because you were there.

That's what the name means: take the wheel of your own ship. You steer, because you built the steering.

The underrated one

Jumping to a program by name, on a key.

I'd put this just behind copy and paste in the list of things worth learning on a computer, and I'm not joking. Not ⌘-tabbing through a stack of nine icons and hoping. Pressing the letter that means Chrome, and being in Chrome.

Most days I live in five apps: an AI, an editor, a browser, a terminal, a file manager. Microsoft's lot are in there too. It's the same five, all day, for years. Five letters covers most of a working life.

c Claude
b Chrome
v VS Code
p PhpStorm
t Terminal
f Finder
s Slack
o Obsidian
m Microsoft…

Hold right , tap the letter, you're there. with any of them makes a new one instead of switching, and where that means anything, a new one at the folder you just came from. Press the same letter again to cycle that app's windows; hold it to get a picker with all of them on screen. m is a chord rather than an app, so it puts up a small pill naming what it's waiting for.

And it isn't only for developers.

Somebody who lives in Adobe builds the same thing pointed at Premiere, Illustrator and Photoshop, probably leaning harder on direct keys than on app jumps, because that's the shape of that job. The idea generalises. The specific keys never should. That's the whole point of building it yourself.

There's more room on a keyboard than people use.

Chords, held keys, double taps. A modifier you were only ever using for accents turns out to be a whole spare layer. Once you decide the keyboard is yours, there's a surprising amount of unclaimed space on it.

Where it came from

The mouse was right. The desk kept changing.

I'm left-handed and I use a Razer Naga, the MMO mouse with the twelve button thumb grid, and it is genuinely one of the best objects I own. Twelve buttons under your thumb, each one a jump.

The problem was everywhere else. A PC keyboard, a Mac keyboard, and a laptop with no mouse attached at all. All the muscle memory lived in the mouse, so the moment I was away from the mouse the shortcuts were simply gone.

So Helm mirrors the mouse onto the keyboard. Hold right and the number row is the thumb grid. 7 8 9 0 are the same four apps they are under my thumb. The arrows are the wheel tilt. is the gather button. Same gestures, too: tap to go, tap again to cycle, hold for the picker. The desk I'm sitting at stopped mattering.

123 456 12 789 10 11 twelve buttons, under one thumb same four apps same gestures hold right ⌥ 78 90 ClaudePhpStorm ChromeTerminal the wheel tilt gather
Buttons 7 to 10 sit under my thumb in that shape. On the keyboard they're four keys in a row: same four apps, same taps. 11 is the gather button and becomes ; the wheel tilt becomes the arrows. 12 stays a mouse thing, because ⌘C needs no help when both hands are already on a keyboard.

What it does

Four quick ones, and then the ones I'm properly pleased with.

Where was I cClaude bChrome vCode tTerm fFinder helm

Sessions 3

boat-namer
wants to run a migration · 4m
harbour-index
working · 12s
tide-table
done · 1h

Terminals 2

›_
~/projects/harbour
›_
~/dotfiles

Editors 2

VS
notes.md
lighthouse
PS
wheel.lua
harbour

Finder 2

F
Downloads
F
projects
~/projects

Chrome 6 tabs

Personal
Miscellaneous Technical | Unicode
Hammerspoon docs: hs.eventtap
how do lighthouses actually work
Other window
tide times, Firth of Clyde
why is my lua table nil
Cloudflare Pages · custom domains
A drawing of the panel, built by hand for this page. Every session, file, folder and tab named in it is invented. There are no screenshots of my machine anywhere on this site, and there won't be.

The ones I'm pleased with · one

in Chrome, but by the tabs you actually looked at.

Chrome's own walks the tab strip left to right by position. In a window with fifty tabs in it that tells you nothing about where you've been. It is the order the tabs happened to open in, which is not an order anybody remembers.

So Helm reimplements it the way works for apps: most-recently-looked-at first, frozen for as long as you hold the key, with the titles and the real favicons on screen, and typing filters the list down. Getting this working at all was, and I don't use the phrase lightly, mind blowing.

The reason it's hard: Chrome will not tell anybody when the active tab changes. There's no event for it. So recency has to be inferred from the window title, and the whole thing had to be built to never ask Chrome a single question while you are holding the key. The list is captured the moment the hold begins and then frozen, because a list that reshuffles while you are walking it moves the row you were aiming for.

light 3 of 48
L
how do lighthouses actually work
en.wikipedia.org
L
Lighthouse board | sailing directions
nlb.org.uk
S
stormlight, colour ramps
example.com
hold , tap type to filter to move release to go
Also a drawing. Invented tabs, invented favicons. The real one reads the site icons out of Chrome's own cache on disk.

The ones I'm pleased with · two

"Give me a terminal in here."

Helm works out the folder you are actually looking at, whether that is a Finder window, a Claude session or an editor, and opens a terminal already sitting in it. Same question, answered from wherever you happened to ask it.

The mouse version of that is: find the path, copy the path, open a terminal, cd, paste, realise you copied the file and not the folder. It takes forever and I was doing it constantly. Now it's a key.

The ones I'm pleased with · three

The save dialog is already in the right folder.

Same question as the last one, asked from the other end, and it is the one I reach for most. Open a Save As anywhere. Go and look at the folder you actually want it in. A Finder window, a terminal, the editor the file is open in. Then come back to the dialog. It's already pointed there, and it says so.

~/projects/lighthouse/drafts
That's the entire interface. Invented folder, like everything else drawn on this page.

Default Folder X has been selling this idea for twenty years and it is a good idea, but it only reads Finder windows. This reads anything the machine can name a folder from, so a terminal's working directory and an editor's open file count too.

The last folder wins: rummage three deep in Finder and you come back to the one you ended on, not the one you started from. And it moves the dialog once per folder, deliberately, because coming back to the same place a second time is not a second instruction. Quietly re-aiming a save you had already aimed is the sort of bug you don't find out about until the file isn't where you put it.

I used this one about ten minutes before writing this paragraph and it still got an out-loud "yes" out of me.

The ones I'm pleased with · four

A screenshot shouldn't have to live on the Desktop.

Take a screenshot the way you always do, 4, nothing new to learn, and the folder list comes up asking where it goes. Pick a row and the file is moved there. moves it and shows you where it went. Escape leaves it exactly where macOS put it, which is a real answer and not a failure.

It asks afterwards rather than guessing, and that's the whole design. Filing it automatically into "the project you were looking at" sounds cleverer and is wrong: taking a screenshot usually means clicking out of the thing you're shooting first, so by the time the file lands, the app in front is the wrong answer. A question has no such failure mode.

It's the same shape as the two above, which I only noticed after building all three: the machine asking one short question at the moment it has the context to ask it, instead of leaving you to go and do the filing later.

The name

A ship's wheel already meant "take control".

Helm, because you take the wheel of the thing you built. It's part of a small fleet. Shore builds the ships in containers, Helm steers them. Which is the sort of naming that happens when you name things for yourself and nobody is there to stop you.

U+2388, the helm symbol. It is the glyph Nordic keyboards print on the Control key. A ship's wheel has been sitting on keyboards meaning "take control" this whole time. I picked the name before I knew that, and I'm choosing to take it as a good sign.