Ä, Ö and QMK

So turns out keyboards don’t emit characters per se, instead they emit key codes which then in turn the operating system resolves into characters. Therefore, if one wants to use the EN-US ANSI layout but still be able to write ä or ö, things get tricky. I’m still figuring out the best way to do it, but here are my ideas:

  • Use AutoHotkey or similar to bind Alt-A to ä, Alt-O to ö. Works, but it’s no fun to have to rely on a utility.
  • Use EN-Intl layout and get ä and ö via Alt Gr. Works great, but makes the ” key behave frustratingly (if I just want to output a “, I have to first press ” and then space).
  • Remap all keys in a funky german layout in ANSI style, like done here. More explanation in a Reddit thread.

Still on my TODO to try out the last one.


Woodworking project ideas

My scratchpad of ideas:

  • Floor lamp to our livingroom
  • A narrow shelf between the back of our bed and the wall
  • A case for a keyboard
    • 304 x 95 mm PCB KBD67
    • Also, a carrying case?
    • 29,4 x 10,7 x 3-4 cm Idobo
    • Case vinyl cover is called ”Tolex”.
  • Hanging lamp to our kitchen
  • Watch storage box
  • Pendants cut with a scroll saw
  • Laptop stand
  • Electrical & USB plugs mounted on a nightstand
  • Plywood & plexi case for the Disney castle


My own keyboard -project

It makes zero sense but I really would like to build my own handwired keyboard. One that’s mine and no-one else’s. I’m in the research phase at the moment and here I’ve collected a bunch of resources for mostly my own convenience.

Guides & articles



Printing/cutting in Finland

Printing/cutting in EU


AliExpress links

Gear Keyboards

Programming Vortex Race 3

  1. Switch to a programmable (=non-default) layer by hitting Fn+ Right Shift
  2. Hit Fn + Right Cmd (or Ctrl)
  3. A white LED switches on under the space bar, that means we’re now in programming mode
  4. Press the key to be re-mapped (a red LED starts flashing)
  5. Hit the target key (or key sequence)
  6. Commit by pressing the Pn key
  7. Exit the programming mode by pressing Fn + Right Cmd (or Ctrl)

Let’s have an example. In my ISO Nordic version of the Race 3 for some reason the § and < keys are mapped just the opposite as what’s printed on the keycaps. Here’s the exact keys I press to change them vice versa:

  1. Fn + Right Shift
  2. Fn + Right Cmd
  3. §
  4. <
  5. Pn
  6. <
  7. §
  8. Pn
  9. Fn + Right Cmd

If I mess up and need to reset the current layer, I can do so by pressing and holding Fn + R for 5 seconds.

Gear Keyboards

Configuring Dual Action keys with BootMapper Client

One of the cooler features of BootMapper Client (BMC) is that it can be used to make keys work double duties – act as one key when pressed alone, and act as another when pressed in combination with another key. Unfortunately by default BMC can only do a couple of keys (for instance, it’s not possible to map Caps Lock to act as both Esc and Control), but it’s quite easy to extend the selection of keys that are available.

In order to do this we need to edit a JSON file from under the json directory whereever BMC is installed. As the functionality is called “dual action”, search for a file called dualaction.json.

The file contanis two lists of mapping objects: compoundKeys and aloneKeys. In order to do the aforementioned Caps Lock configuration we see that while Left Control is already listed under compoundKeys, Esc is nowhere to be seen in the aloneKeys. In order to add it, we need it’s BMC key code. That can be found from this Google sheet.

The key code for Esc is 41, so we add the following to the JSON file:

  "label": "Escape",
  "index": 41

Now when we launch BMC the next time, Escape should be possible to be selected in the Dual Action menus.

Gear Keyboards macOS

Mapping Ctrl-hjkl to arrow keys on macOS

After mapping my Caps Lock key to work double duties as both Esc and Control I soon wondered how it would be like if I could have Control-hjkl act as arrow keys, full Vim style. Turns out it’s not that hard:

  1. Install Hammerspoon
  2. Open it’s config file and add the following setup:
local function pressFn(mods, key)
	if key == nil then
		key = mods
		mods = {}

	return function() hs.eventtap.keyStroke(mods, key, 1000) end

local function remap(mods, key, pressFn)
	hs.hotkey.bind(mods, key, pressFn, nil, pressFn)	

remap({'ctrl'}, 'h', pressFn('left'))
remap({'ctrl'}, 'j', pressFn('down'))
remap({'ctrl'}, 'k', pressFn('up'))
remap({'ctrl'}, 'l', pressFn('right'))

remap({'ctrl', 'shift'}, 'h', pressFn({'shift'}, 'left'))
remap({'ctrl', 'shift'}, 'j', pressFn({'shift'}, 'down'))
remap({'ctrl', 'shift'}, 'k', pressFn({'shift'}, 'up'))
remap({'ctrl', 'shift'}, 'l', pressFn({'shift'}, 'right'))

remap({'ctrl', 'cmd'}, 'h', pressFn({'cmd'}, 'left'))
remap({'ctrl', 'cmd'}, 'j', pressFn({'cmd'}, 'down'))
remap({'ctrl', 'cmd'}, 'k', pressFn({'cmd'}, 'up'))
remap({'ctrl', 'cmd'}, 'l', pressFn({'cmd'}, 'right'))

remap({'ctrl', 'alt'}, 'h', pressFn({'alt'}, 'left'))
remap({'ctrl', 'alt'}, 'j', pressFn({'alt'}, 'down'))
remap({'ctrl', 'alt'}, 'k', pressFn({'alt'}, 'up'))
remap({'ctrl', 'alt'}, 'l', pressFn({'alt'}, 'right'))

remap({'ctrl', 'shift', 'cmd'}, 'h', pressFn({'shift', 'cmd'}, 'left'))
remap({'ctrl', 'shift', 'cmd'}, 'j', pressFn({'shift', 'cmd'}, 'down'))
remap({'ctrl', 'shift', 'cmd'}, 'k', pressFn({'shift', 'cmd'}, 'up'))
remap({'ctrl', 'shift', 'cmd'}, 'l', pressFn({'shift', 'cmd'}, 'right'))

remap({'ctrl', 'shift', 'alt'}, 'h', pressFn({'shift', 'alt'}, 'left'))
remap({'ctrl', 'shift', 'alt'}, 'j', pressFn({'shift', 'alt'}, 'down'))
remap({'ctrl', 'shift', 'alt'}, 'k', pressFn({'shift', 'alt'}, 'up'))
remap({'ctrl', 'shift', 'alt'}, 'l', pressFn({'shift', 'alt'}, 'right'))

remap({'ctrl', 'cmd', 'alt'}, 'h', pressFn({'cmd', 'alt'}, 'left'))
remap({'ctrl', 'cmd', 'alt'}, 'j', pressFn({'cmd', 'alt'}, 'down'))
remap({'ctrl', 'cmd', 'alt'}, 'k', pressFn({'cmd', 'alt'}, 'up'))
remap({'ctrl', 'cmd', 'alt'}, 'l', pressFn({'cmd', 'alt'}, 'right'))

remap({'ctrl', 'cmd', 'alt', 'shift'}, 'h', pressFn({'cmd', 'alt', 'shift'}, 'left'))
remap({'ctrl', 'cmd', 'alt', 'shift'}, 'j', pressFn({'cmd', 'alt', 'shift'}, 'down'))
remap({'ctrl', 'cmd', 'alt', 'shift'}, 'k', pressFn({'cmd', 'alt', 'shift'}, 'up'))
remap({'ctrl', 'cmd', 'alt', 'shift'}, 'l', pressFn({'cmd', 'alt', 'shift'}, 'right'))

Source: kkamdooong/hammerspoon-control-hjkl-to-arrow

(I copied and pasted it here mainly for myself so I have it available the next time I need it.)


🌄 Noiry Morning

Noiry morning

Gear Keyboards

Ducky One 2 Mini: How to Use Arrows with Modifiers

So during these last few days I’ve finally cracked how to use the arrow keys with modifiers on the 60% Ducky One 2 Mini keyboard.

As the keyboard does not have dedicated arrow keys, arrows can be simulated by hitting Fn+IJKL. This brings up the question “how do I do Alt+arrows, Ctrl+arrows, Ctrl+Shift+arrows etc”? I found myself a bit confused as it seemed that sometimes I was able to do what I wanted, but not everytime. Here’s the secret:

  1. Press and hold the modifier key(s), e.g. shift
  2. Press and hold Fn
  3. Press IJKL.

The “secret” being you need to hold the modifier first, then Fn, then arrows. If you want to do Ctrl+Shift+arrows, first hit Ctrl+Shift, then Fn, then arrows.

I have the 3rd DIP switch engaged on my keyboard, meaning the Caps Lock key acts as Fn (it’s great, you should do that too. The internet has way too much shouting going on as it is anyway). When I did Shift+arrows the Caps Lock engaged anyway (just hitting Shift+Caps Lock even though Caps Lock was mapped as Fn enabled Caps Lock) and it was driving me nuts! Turns out this behaviour was apparently (and correctly) regarded as a bug by Ducky and it’s fixed in the latest firmware (scroll to the bottom of the page where it says “Downloads”).


🔗 Love Letter To Clojure

For the first time in my career, as I’m nearing fifty years old, I’m finally able to write programs that do what I want them to do, and am able to build upon them for years without them collapsing like a house of cards, as has been my normal experience.

Gene Kim

There are quite many of these “Why I Love Clojure” -type blog posts, but this one is really great and thought-out. At least I bought it.

Gear Keyboards

Keyboards, Layouts, QMK, Oh My!

So yesterday I was wondering whether or not I’m going to be fine with the Ducky One 2 Mini and it’s arrow key-less-ness.

Well, no. It sucks that it’s not quite possible (or requires crazy finger gymnastics) to be able to operate the arrow keys with Shift and Ctrl, which is something that’s not too uncommon when manipulating text.

So today I have another new keyboard, a loaner TADA68 from my old colleague Jaakko. And this blog post is the first test of this board.

The keyboard is kinda similar to the Ducky but at the same time miles apart;

  • This one is 65% instead of 60%, meaning there’s one extra column’s worth of keys, which in this case means the arrow keys (yes!) and Page Up & Down, Del and `.
  • TADA68 is fully programmable, meaning each and every key can be re-bound and fun & weird tricks can be employed. For example, the Caps Lock key could be mapped to act as Esc when pressed alone, but Control when pressed in a key combination.
  • Connects via mini USB (yuck).
  • This one is with ANSI layout, but apparently ISO layout is also available nowadays.
  • The TADA does not have RGB backlighting, just somewhat white LEDs.
  • The Ducky is slightly less tilted than the TADA.

I have to say I really, really enjoy the arrows as now it’s possible to switch chats in Telegram via Alt+Up/Down, select words with Ctrl+Shift+Arrows, minimize windows with Win+Down and do surprisingly many common little tasks with just one hand. I thought it’d be totally cool to every once a while push Fn (Caps Lock) with my pinky and IJKL for an arrow key, but alas, the need is far more common than I realized.

So this leads me thinking should I return the Ducky? If I did, what should I replace it with? TADA68 is great, but…

  • Both the keycaps and the chassis look (and to some extent feel) way cheaper than the Ducky.
  • Although ISO layout is available, Nordic keycaps out-of-the-box are not. Not that what it says on the keys matters that much, but still.
  • Did I mention it uses mini USB? It uses mini USB.
  • Also maybe it’s due to the fact that Jaakko’s keyboard is a year old, but the Ducky’s Cherry MX Browns feel way better (snappier) than the Gateron Browns on the TADA.
  • I do prefer the slightly smaller tilt on the Ducky.

So I’m 50-50 on this! Luckily I get to keep the TADA for a short while so I can get some hours on this to search my feelings.

Then again I just learned that Ducky has made a Nordic version of their Ducky One 2 SF, and that really would solve pretty much all of my problems – with the exception of not being totally programmable. But honestly, I’m not sure how much I’d really utilize such freedom.

Yet another option would be to forget Nordic and ISO layouts and learn to ANSI! That would open up the world of possibilities in both keyboards and keycaps…