I’m trying to speak more to my computer because it’s so much faster than typing when interacting with AI. I still cling to typing when it’s just way slower. My ape brain chooses the path of least resistance.
So I started cutting any friction I saw that hindered my use of voice input.
One point of friction was the shortcut key to record. I needed one I would remember in flow state. The one I wanted was Caps Lock - that big juicy button I never use - but it’s not available by default.
The majority of voice transcription apps I tried don’t support caps lock as the trigger key. I could install libraries and apps that enable keyboard shortcuts but the reliable ones tended to be pretty huge toolkits that felt like overkill for this one need.
It turns out a tiny amount of code can do this.
macOS has a built-in tool - hidutil - which doesn’t require special privileges and can remap one key to another key.
hidutil property --set '{"UserKeyMapping":[{
"HIDKeyboardModifierMappingSrc":0x700000039,
"HIDKeyboardModifierMappingDst":0x70000003E
}]}'Now, pressing caps lock (0x39) will trigger an F5 (0x3E) keypress. But this is just written to temporary state and will be gone after you restart your computer.
(F5 seemed an obvious choice because it has a microphone icon. It is also intended to represent victory over that key being tied to the native dictation service)
Creating a LaunchAgent that registers the same key mapping above is the way to do this every time you reboot your machine.
mkdir -p ~/Library/LaunchAgents && cat > ~/Library/LaunchAgents/com.local.capslock-remap.plist << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.local.capslock-remap</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/hidutil</string>
<string>property</string>
<string>--set</string>
<string>{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000039,"HIDKeyboardModifierMappingDst":0x70000003E}]}</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
EOFlaunchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.local.capslock-remap.plistNow you can use Caps Lock as a shortcut key in your voice transcription app. I use Handy with Nvidia’s Parakeet v3 model which is free, local and fast.

Remove the keymapping:
hidutil property --set '{"UserKeyMapping":[{}]}'Unload the LaunchAgent:
launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.local.capslock-remap.plistLeaving aside the question of why on earth we still need a caps lock light, I did try to get the caps lock light working after this. I thought it would be like a retro on-air recording indicator.
I eventually got the light to work. But it was gross. It required two macOS permissions that create a ton of permissions friction to enable (and keep enabled), even on my own machine signed with my keys. Even if that was ok, the caps lock light would fall out of sync with the recording state several times a day (because pressing Escape cancels recording too). So now my light indicator was both irritating to set up and not very reliable.
Can I fix those problems with yet more code and more layers of complexity, yes probably.
Better solution: no caps lock light. YAGNI (you are not gonna need it):
Keep simple things simple.