“So Jess,” you might say, “last week you procrastinated on your novel by recreating half your Occidental flashcards in Anki.1 On Monday you procrastinated by deleting 1.3GB of bad old photos from your iCloud storage. What have you found to procrastinate with now?”

Here is what, dear reader: I used the application Ukelele(external link) to design myself two custom keyboard layouts that I can use in macOS. The first of these was a customisation of Dvorak left-hand, which I switched back to a year ago. The main thing I wanted to add was a way of typing the Esperanto accented characters. MacOS does let you type a lot of accented characters fairly simply, but not the Esperanto ones. Also, unlike Linux, which lets you set a Compose key then define custom key sequences to produce specific characters, macOS does not let you do this. It just has text replace which only works in some apps that I don’t even use anyway. For months now I’ve had to open up a specific note in my Obsidian vault and copy-paste the correct character every time I wanted to type one, which is pretty bad.

Then the other thing I wanted to add was a way of typing the Icelandic (and Old English) letters thorn ⟨þ⟩ and eth ⟨ð⟩, because when I was playing around with the Brevian alphabet (which is typed in regular Latin characters + some extras, and you install a special font to make them display as Brevian script) yesterday morning, those were the only two characters not easily typable on macOS.

Finally, the second keyboard layout I wanted to make was one for the Shavian alphabet, so I can type in that more easily.

Ukelele itself is not exactly intuitive to use, but the .dmg does come with a manual that walks you through the process of creating (and exporting, and installing) a keyboard layout fairly straightforwardly. The trickiest part was, by far, installing the completed layouts. Ukelele has a dedicated menu that it firmly advises you to use instead of copying your completed layout files to the system directories manually. However, this menu is really buggy. For a start, it moves files – deleting them from their original location – instead of copying them. Also, like half the time, the file only gets moved in a corrupted form but gets deleted from the original location anyway (apparently this is a macOS bug…), so you have to start from scratch and re-create your layout. Guess how I found this out!

The way I eventually made my layouts usable was to manually copy my completed files to ~/Library/Keyboard Layouts/, then used Ukelele’s organiser menu to “install” the copied file. For some reason my Dvorak left-hand file would only install for all users (not just me), while the Shavian file would only install for me (not all users). I didn’t bother debugging this further because I am the only user on my MacBook and so long as I can use my own layouts I don’t really care how they’re installed. But definitely be prepared to deal with some glitchiness if you decide to use Ukelele yourself. Once a new layout is installed, you need to reboot your computer (or sometimes, apparently, just logging out and logging back in works, but not all the time and anyway rebooting is not substantially more time-consuming).

When you first open Ukelele, you see a blank keyboard (well, a keyboard with only function keys). What I wanted to do – for both layouts, truthfully – was to customise the layout I was already using, so I went to “File…” → “New From Current Import Source”. This results in a menu telling you you have a layout called “<Name of Current Layout> copy”. Double-click on that entry and you’ll see a filled-in keyboard, a bit like this:

screenshot of the Ukelele software on macOS, showing a Dvorak left-hand layout

So, for my Dvorak left-hand layout, there were two things I wanted to do. I started with the Icelandic/Old English letters because that was easier. I decided I wanted to put ⟨ð⟩ on Opt + D, and ⟨þ⟩ on Opt + T, so their locations would be memorable.2 To do that, I needed to right-click on the letter I wanted to tweak, and hit “Edit Key…”, which produced a window like this:

screenshot of the 'Edit Key' dialog in Ukelele

Hit the checkmark next to “Option” to make sure you’re customising what happens when you press Opt + your key. You can press “Get Current Output” to see what you would currently get if you press that key combination (you can use that to make sure it won’t be something you’ll miss, I guess). Then put your cursor in the text box under “Enter the new output for the key”, and copy-paste the new character you want. Hit “OK”. Then reopen the dialog and do the same thing again, but with the checkmarks next to “Option” and “Shift” capitalised to add the capital letter version.

Easy enough. Adding my Esperanto letters was a little harder to puzzle out, but I got there. From the top menu, I had to click “Keyboard…” then “Enter Dead Key State…”. Then I had to go through each of the numbered states in turn (1, 2, 3…) until I found the state pertaining to the circumflex accent. In my case, that was state 3. In this state, only the keys that do something in the dead key state are coloured that more vivid blue; the keys that don’t do anything are coloured a greyer blue. Here’s an example, except I only took the screenshot after I’d already added the Esperanto letters ⟨ĉ ĝ ĥ ĵ ŝ⟩ so keep in mind they weren’t there originally 😅:

screenshot of Ukulele with all the letters you can type with a circumflex accent

Anyway, once I was in the correct dead key state I could add my new desired keys following the same procedure as for ⟨þ⟩ and ⟨ð⟩. However, even after adding all the circumflex letters I wasn’t quite done: I still needed to add a way to type ⟨ŭ⟩. I didn’t want to add this to the circumflex menu because then I wouldn’t be able to type ⟨û⟩. I went through the other dead key states and discovered that the tilde state (for me that was number 4) didn’t already have anything on U; it only had ⟨ñ ã õ⟩. So I added ⟨ŭ⟩ to that state, resulting in a dead key state that looks like this:

screenshot of Ukulele with all the letters you can type with a tilde accent

So then I was all done. I went to “File…” → “Save…”, chose a directory to save my “unused” layouts in, and then tried to install it via the glitchy process I already talked about above. Eventually I managed to successfully install it, and all was well.

So then I made my Shavian layout! I won’t walk you through the whole process again, but here’s what I’ve got:

screenshot of Ukelele showing a layout where all of the Latin letters are replaced by Shavian ones

I don’t know how to screenshot what I have with shift held down… but anyway, in general I tried to place the Shavian letters at the keys where they made the most phonetic sense. So you get the Shavian letter ⟨𐑐⟩, for /p/, by pressing P. The Shavian letter ⟨𐑕⟩, for /s/, by pressing S. And so forth. The ⟨𐑘⟩ /j/ in yes is on Y; the ⟨𐑡⟩ /dʒ/ in just is on J. For A E I O U, I chose their short vowel equivalents: ⟨𐑨 𐑧 𐑦 𐑪 𐑫⟩ /æ e ɪ ɒ ʊ/. Some Latin letters don’t correlate well to an English phoneme, but are used to represent that phoneme in another language, so I have ⟨𐑗⟩ /tʃ/ on C and ⟨𐑖⟩ /ʃ/ on X. Q got ⟨𐑩⟩ (schwa) on it, as by far the most common phoneme that didn’t already have a key by that point.

The other letters have to be produced with Shift + some key. Some pairs were easy to decide: ⟨𐑙⟩ /ŋ/ is on Shift + N, ⟨𐑠⟩ /ʒ/ is on Shift + J, ⟨𐑞⟩ /ð/ on Shift + D, ⟨𐑔⟩ /θ/ on Shift + T. I added the strut vowel ⟨𐑳⟩ /ʌ/ to Q, the same key as schwa, because /ʌ/ is basically just a stressed schwa anyway. Shift + A E I O U got ⟨𐑭 𐑱 𐑰 𐑷 𐑵⟩ /ɑː eɪ iː oː uː/, i.e. mostly the long vowels, except not for E because that doesn’t exist. Shift + E got the face diphthong instead.3

After that, I was able to assign some further letters to keys that I thought I’d stand a chance at remembering… like ⟨𐑲⟩, the price diphthong, I assigned to Shift + H, where it’s right next to the face diphthong. ⟨𐑴⟩, the goat diphthong I put on Shift + S, where it’s right next to O. ⟨𐑻⟩, the nurse vowel I put on R, because I think of it like “errrrrr”. ⟨𐑬⟩, the mouth diphthong I put on W, where I think of it like “ow”. Oh, and the Shavian middot ⟨·⟩ I also put on Shift + . (if I ever need the greater-than sign while typing Shavian, I can switch back to Dvorak left-hand temporarily, haha).

After that, though, there are still some I’m just gonna have to memorise. The good news is that most of them aren’t that common, except for ⟨𐑼⟩ (letter) (Shift + G) which ranks #18 out of 48. So I can mostly just type happily and only look up the occasional letter.

The truth is, I almost feel like I’ve made a mistake and made Shavian too easy to type. I can produce text fairly quickly just drawing on my knowledge of sounds, but then rereading back what I’ve written is like… mega-hard! 😂 Anyway, I joined a Shavian Discord server to give myself more bite-sized practice reading Shavian-alphabet text. It really has to be bite-sized, because sounding out all the letters is so laborious that reading a single paragraph feels like it takes the same amount of effort as reading, like, three pages in the Latin alphabet. (I’m not saying I was really good two months ago, but I feel like I got a lot rustier in the time I haven’t practised much since then.) A little bit of daily practice is going to be much better than a lot of once-a-month practice. And as far as writing goes, handwriting is the thing that’s actually practice; typing is too easy 😉


  1. I still fully intend to recreate the rest of them in Anki, too, but that became something else I’m now procrastinating on, lol. ↩︎

  2. Both the phonemes these letters represent are spelt “th” in normal English spelling, but ð is voiced (like D) and þ is voiceless (like T). ↩︎

  3. This also parallels Brevian, for what it’s worth, where the FACE vowel /eɪ/ is “long E” but the PRICE vowel /aɪ/ is one of the three “diphthong letters” (the others are MOUTH /aʊ/ and CHOICE /oɪ/). ↩︎