December 22, 2025
Recently, i built a new mechanical Keyboard. I based this on an american layout, as the [, ] and \ Keys are more accessible. This poses a problem how to type the German Characters Ä, Ü, Ö ("Umlaute") and ß. Ideally, i'd want to implement this by customizing the firmware1 of the keyboard. But as the base-layout is US, there is no way for the micro-controller on the board to communicate the characters to the OS. So there are 2 options
Option 2 is problematic too, since i use multiple operating systems (Fedora on the Desktop, a Macbook and Windows for Work). Since different OSes require different methods of sending unicode characters, i'd have to build in a switch, where the current os can be configured. This, again, is time-intensive. What then? Implement the Umlaute on the software layer. This can be done with a hotkey application. Requirements:
My choice fell on Espanso. On Fedora, there are 2 installation options
The rest of this post is a set of instructions on how i did this. To replicate, also refer to the official Instructions.
Install required packages:
001sudo dnf install cargo002sudo dnf install wxGTK-devel003sudo dnf install libcap # For setting permissions for keyboard access later
001git clone https://github.com/espanso/espanso.git --depth 1002cd espanso
001cargo build --release --no-default-features --features wayland,modulo,vendored-tl
001sudo cp target/release /opt/espanso/espanso002sudo chmod +x /usr/local/bin/espanso
001sudo setcap cap_dac_override+ep /opt/espanso/espanso002getcap /opt/espanso/espanso
File: ~/.config/espanso/match/german.yml
001matches:002 - trigger: ";;a"003 replace: "ä"004 word: false005 - trigger: ";;A"006 replace: "Ä"007 word: false008 - trigger: ";;o"009 replace: "ö"010 word: false011 - trigger: ";;O"012 replace: "Ö"013 word: false014 - trigger: ";;u"015 replace: "ü"016 word: false017 - trigger: ";;U"018 replace: "Ü"019 word: false020 - trigger: ";;s"021 replace: "ß"022 word: false
Here is a Github-Gist.
001espanso register002espanso start003espanso status
Test in editor:
001;;a → ä002;;A → Ä003;;o → ö004;;O → Ö005;;u → ü006;;U → Ü007;;s → ß