johnlindquist/claude/karabiner

Claude Code and agent skill by johnlindquist/claude

Trust tier 2
  • community
LLM review pending
Source check pending

Checking that the SKILL.md file is still in the repository.

Configure Karabiner-Elements keyboard remapping using Goku EDN syntax. Use when creating keybindings, layers, simlayers, app-specific shortcuts, or modifying karabiner.edn.

Install

npx vskill@latest install johnlindquist/claude/karabiner

SKILL.md

Karabiner (via Goku)

Configure macOS keyboard remapping with GokuRakuJoudo - an EDN-based DSL that compiles to Karabiner-Elements JSON.

Why Goku?

Karabiner's native JSON is verbose (20,000+ lines). Goku's EDN format is 10-50x more concise:

clojure
;; Goku: 1 line
[:caps_lock :escape]
;; Karabiner JSON: ~30 lines

Prerequisites

bash
# Install Goku
brew install yqrashawn/goku/goku
# Start as service (watches ~/.config/karabiner.edn)
brew services start goku
# Or run once manually
goku

Config location: ~/.config/karabiner.edn

Logs: ~/Library/Logs/goku.log

EDN Syntax Quick Reference

Basic Structure
clojure
{:main [{:des "Rule description"
:rules [[:from :to]
[:from2 :to2]]}]}
Keycodes

All keys use keyword syntax: :a, :1, :f19, :spacebar, :return_or_enter

Find keycodes:

Modifier Syntax
SymbolModifierExample
!CLeft Command:!Ca = Cmd+A
!TLeft Control:!Ta = Ctrl+A
!OLeft Option:!Oa = Opt+A
!SLeft Shift:!Sa = Shift+A
!QRight Command:!Qa
!WRight Control:!Wa
!ERight Option:!Ea
!RRight Shift:!Ra
!FFn:!Fa
!PCaps Lock:!Pa
!!Hyper (Cmd+Ctrl+Opt+Shift):!!a
##Optional any modifier:##a

Combine modifiers: :!CTSa = Cmd+Ctrl+Shift+A

Rule Format
clojure
[:from :to] ;; Basic
[:from :to :condition] ;; With condition
[:from :to :condition {:alone :x}] ;; With options
Multiple Keys
clojure
;; Press sequence
[:a [:1 :2 :3]] ;; a -> types 1, 2, 3
;; Simultaneous press (from)
[[:j :k] :escape] ;; j+k together -> escape
Shell Commands
clojure
[:!!1 "open -a Safari"] ;; Hyper+1 runs shell command

Conditions

Application Conditions
clojure
{:applications {:chrome ["^com\\.google\\.Chrome$"]
:code ["com.microsoft.VSCode"]}
:main [{:des "Chrome only"
:rules [[:a :b :chrome]]}]}
Device Conditions
clojure
{:devices {:hhkb [{:vendor_id 1278 :product_id 51966}]}
:main [{:rules [[:a :b :hhkb]]}]}
Input Source Conditions
clojure
{:input-sources {:us {:input_source_id "com.apple.keylayout.US"}}
:main [{:rules [[:a :b :us]]}]}
Combining & Negating Conditions
clojure
[:a :b [:chrome :hhkb]] ;; Both conditions
[:a :b [:!chrome]] ;; NOT in Chrome

Layers

Simlayers (Recommended)

Fast, simultaneous-key based layers - best for typing speed:

clojure
{:simlayers {:w-mode {:key :w}} ;; Hold W activates layer
:main [{:des "w-mode shortcuts"
:rules [:w-mode ;; Apply to this layer
[:e "open -a Finder"] ;; W+E opens Finder
[:r "open -a Safari"] ;; W+R opens Safari
]}]}

Simlayer options:

clojure
{:simlayers {:w-mode {:key :w
:modi {:mandatory [:left_control]}}}} ;; Ctrl+W activates
Standard Layers (Tap/Hold)

Different behavior on tap vs hold:

clojure
{:layers {:caps-mode {:key :caps_lock
:alone {:key :escape}}}} ;; Tap=Esc, Hold=layer
Manual Layer Variables
clojure
;; Set variable on keydown, clear on keyup
[:w ["w-mode" 1] nil {:afterup ["w-mode" 0] :alone :w}]
;; Use the variable as condition
[:e :!Ce ["w-mode" 1]] ;; W+E -> Cmd+E (only when w-mode=1)

Templates

Reusable shell command patterns:

clojure
{:templates {:open "open -a '%s'"
:launch "/path/to/script.sh %s"
:alfred "osascript -e 'tell application \"Alfred\" to run trigger \"%s\"'"}
:main [{:rules [[:!!1 [:open "Safari"]] ;; %s replaced with Safari
[:!!2 [:launch "arg1"]]]}]}

Predefined Aliases

:froms (Input Keys)
clojure
{:froms {:delete {:key :delete_or_backspace}
:return {:key :return_or_enter}
:mouse1 {:pkey :button1}}}
:tos (Output Actions)
clojure
{:tos {:spotlight {:key :spacebar :modi :command}
:paste {:key :v :modi :command}
:shift-click {:pkey :button1 :modi :left_shift}}}
Custom Modifier Sets
clojure
{:modifiers {:hyper [:command :shift :control :option]
:meh [:shift :control :option]}}

Advanced Options

Fourth position in rules:

clojure
[:from :to :condition {
:alone :key ;; to_if_alone
:held :key ;; to_if_held_down
:afterup :key ;; to_after_key_up
:delayed {:invoked :x :canceled :y}
:params {:alone_timeout 200}
}]

Profile Settings

clojure
{:profiles {:Default {:default true
:sim 250 ;; Simultaneous threshold (ms)
:delay 500 ;; Delayed action time (ms)
:alone 1000 ;; to_if_alone timeout (ms)
:held 500}}} ;; Held threshold (ms)

Common Workflows

Add a Simple Remap
clojure
{:main [{:des "Caps to Escape"
:rules [[:caps_lock :escape]]}]}
Add App-Specific Shortcut
clojure
{:applications {:chrome ["com.google.Chrome"]}
:main [{:des "Chrome shortcuts"
:rules [[:!Cl :!Ct :chrome]]}]} ;; Cmd+L -> Cmd+T in Chrome
Create a Layer
clojure
{:simlayers {:nav {:key :spacebar}}
:main [{:des "Navigation layer"
:rules [:nav
[:h :left_arrow]
[:j :down_arrow]
[:k :up_arrow]
[:l :right_arrow]]}]}
Hyper Key Setup
clojure
{:main [{:des "Caps Lock to Hyper"
:rules [[:caps_lock :!CTOSleft_shift nil {:alone :escape}]]}]}

CLI Commands

bash
goku # Compile karabiner.edn once
gokuw # Watch mode (compile on change)
goku -h # Help
# Service management
brew services start goku # Start watch service
brew services stop goku # Stop service
brew services restart goku # Restart after changes
# Check logs
tail -f ~/Library/Logs/goku.log

Validation & Debugging

  1. Check syntax: Goku reports EDN parse errors
  2. View output: ~/.config/karabiner/karabiner.json
  3. Use EventViewer: Karabiner-EventViewer.app shows key events
  4. Check logs: tail ~/Library/Logs/goku.log

Best Practices

  1. Use simlayers for frequently-accessed shortcuts (faster than hold-layers)
  2. Group rules by purpose with descriptive :des tags
  3. Use templates for repeated shell command patterns
  4. Define aliases in :froms/:tos for complex key definitions
  5. Test incrementally - add one rule, verify, repeat
  6. Back up your config before major changes

Resources

Security

  • Security scanPassed, 100 of 100Pattern checks on the skill's files.
  • Model reviewNot runA model review is scheduled for the next rescan.

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
21
Repository forks
3
7-day trend score
15

Stars and forks are for the whole GitHub repository, not this skill alone. Refreshed 17 Mar 2026, 7 months ago.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/johnlindquist/claude/karabiner/badge)](https://verified-skill.com/skills/johnlindquist/claude/karabiner)

Something wrong with this skill or its page? Tell us.