

This was meant to be a much simpler tool and practice-project that handled my very limited personal use-cases, focused on automated and immediate layer-toggling (no waiting for the 'if held down' threshold). I don't know that learning the syntax for karaml is that much easier than Goku, and it's certainly not as fully-featured, but I tried to make it easy to maintain and read. Multiple frontmost-app conditions and mappings all belong to the same 'from' key for easier organization. karaml will auto-create toggle-off mappings for mappings in both the 'when-tapped' and 'when-held' positions, and automatically adds a condition requiring a layer to be enabled to each mapping that belongs to that layer. The main organizing principle is how 'layers'/conditions are handled. It auto-updates (and backs up) your existing JSON config with Python every time you run the karaml command For individual modifications, instead of JSON key-value pairs, 'to' events are interpreted by position in an array. The config structure is based on the idea that every modification belongs to a layer. My messy side project! karaml lets you write a Karabiner config in yaml with complex modifications in a compressed, easy to maintain format, with lots of shorthands for common functions (open apps, open links, run shell commands, show notifications, etc.). This is a project based on a much cleaner tool by Max Stoiber written in Typescript and if you haven't checked that out, you should! I was inspired to start this project by this great video
