New UHK 80 user, very impressed, though I have encountered some bugs

I received my UHK 80 yesterday, and I’m so far loving the experience! I’m having to get used to the layout (first split keyboard for me), but I’m already feeling an easing in the discomfort I was starting to get with a “regular” keyboard.

Experience & Positives

  1. The keyboard feels very solid and well-built! I’m loving the typing experience, it’s very comfortable and well-laid-out, feeling like a premium product (which you’d hope given the price, but I’m very happy to find the hardware exceeding expectations).

  2. I ordered all of the right half mouse modules to find out which works best for me, and by far I find the Trackpoint to be the most ergonomic to me. I am biased by having used laptops with it in the past, but I love the lack of need to move my in large motions as I use it.

  3. I’m already finding myself using the Mouse layer more than I expected. My usual mouse is the Logitech MX Master 3S (which I personally believe to be the best mouse ever manufactured), but I’ve been sticking more to the keyboard, either using the Trackpoint or the Mouse layer.

Issues & Bugs

  1. I haven’t been able to upgrade the Dongle firmware from 12.4.0. When I do the update from Agent (AppImage), it reports that /dev/ttyACM1 doesn’t exist. I have confirmed that /dev/ttyACM1 does appear during the upgrade with a watch ls..., and I’m in group with access to it (uucp). A firmware upgrade (to the same firmware version, as my unit came with 13.0.1) without the dongle connected does however succeed on both halves (though the Trackpoint module stays stuck at 10.4.0). Unlike in Error updating UHK80 from 12.4.0 to 13.0.0: cannot open /dev/ttyACM0 · Issue #2573 · UltimateHackingKeyboard/agent · GitHub, the error I get is that the device isn’t found, not that permission is denied. The log is pasted below.
Dongle Firmware Upgrade Error Log
Start flashing firmware
[DeviceService] stop poll UHK Device
[DeviceService] stopped poll UHK Device
[DeviceService] Operating system: Linux 6.13.8-arch1-1 x64
[DeviceService] Agent version: 6.0.0
[DeviceService] New firmware version: 13.0.1
[DeviceService] New firmware user config version: 9.0.0
[DeviceService] UHK Dongle firmware upgrade starts: {"id":5,"asCliArg":"dongle","firmwareUpgradeMethod":"mcuboot","logName":"UHK Dongle","name":"UHK Dongle","keyboard":[{"vid":14248,"pid":5}],"bootloader":[{"vid":14248,"pid":4}],"buspal":[],"reportId":4}
[UhkHidDevice] Available devices changed.
[UhkHidDevice] Added: {"vendorId":"0x37A8","productId":"0x9","path":"/dev/hidraw0","serialNumber":"1235453265","manufacturer":"Ultimate Gadget Laboratories","product":"UHK 80 Right USB","release":1,"interface":0,"usagePage":1,"usage":6}
[UhkHidDevice] Added: {"vendorId":"0x37A8","productId":"0x9","path":"/dev/hidraw3","serialNumber":"1235453265","manufacturer":"Ultimate Gadget Laboratories","product":"UHK 80 Right USB","release":1,"interface":2,"usagePage":65280,"usage":1}
[UhkHidDevice] Added: {"vendorId":"0x37A8","productId":"0x9","path":"/dev/hidraw13","serialNumber":"1235453265","manufacturer":"Ultimate Gadget Laboratories","product":"UHK 80 Right USB","release":1,"interface":3,"usagePage":12,"usage":1}
[UhkHidDevice] Added: {"vendorId":"0x37A8","productId":"0x5","path":"/dev/hidraw4","serialNumber":"4294967295","manufacturer":"Ultimate Gadget Laboratories","product":"UHK dongle","release":1,"interface":0,"usagePage":1,"usage":6}
[UhkHidDevice] Added: {"vendorId":"0x37A8","productId":"0x5","path":"/dev/hidraw8","serialNumber":"4294967295","manufacturer":"Ultimate Gadget Laboratories","product":"UHK dongle","release":1,"interface":2,"usagePage":65280,"usage":1}
[UhkHidDevice] Added: {"vendorId":"0x37A8","productId":"0x5","path":"/dev/hidraw6","serialNumber":"4294967295","manufacturer":"Ultimate Gadget Laboratories","product":"UHK dongle","release":1,"interface":3,"usagePage":12,"usage":1}
[UhkHidDevice] Added: {"vendorId":"0x37A8","productId":"0x5","path":"/dev/hidraw9","serialNumber":"4294967295","manufacturer":"Ultimate Gadget Laboratories","product":"UHK dongle","release":1,"interface":4,"usagePage":1,"usage":5}
[UhkHidDevice] Used device: {"vendorId":"0x37A8","productId":"0x5","path":"/dev/hidraw8","serialNumber":"4294967295","manufacturer":"Ultimate Gadget Laboratories","product":"UHK dongle","release":1,"interface":2,"usagePage":65280,"usage":1}
[UhkHidDevice] productId: 5 protocol versions: {"firmwareVersion":"12.4.0","deviceProtocolVersion":"4.14.1","moduleProtocolVersion":"4.3.0","userConfigVersion":"8.3.0","hardwareConfigVersion":"1.0.0","smartMacrosVersion":"3.2.0"}
[DeviceService] Current Dongle built firmware checksum: f7d57b27642cdbd8d9f164bcf6cb9c7d
[DeviceService] New Dongle firmware checksum: cd5c6cbdbe028b188403f77b62967578
[UhkOperations] Start flashing device firmware with mcuboot
[UhkOperations] Start flashing UHK Dongle firmware with mcumgr
[UhkOperations] Reenumerate bootloader
[UhkHidDevice] Device communication closing.
[UhkHidDevice] Device communication closed.
[UhkHidDevice] Start reenumeration, mode: Bootloader, timeout: 5000ms
[UhkHidDevice] Reenumeration error. We hope it would not break the process TypeError: Cannot write to hid device at qr.reenumerate (/tmp/.mount_UHK.AgJQtm9v/resources/app.asar/electron-main.js:5:1104902) at async Vn.updateFirmwareWithMcuManager (/tmp/.mount_UHK.AgJQtm9v/resources/app.asar/electron-main.js:5:1137335) at async Fs.updateFirmware (/tmp/.mount_UHK.AgJQtm9v/resources/app.asar/electron-main.js:5:1192417) at async $s.process (/tmp/.mount_UHK.AgJQtm9v/resources/app.asar/electron-main.js:5:1184261)
[UhkHidDevice] closing normal keyboard after reenumeration
[UhkHidDevice] Could not find reenumerated device: Bootloader. Waiting...
[UhkHidDevice] Available devices changed.
[UhkHidDevice] Removed: {"vendorId":"0x37A8","productId":"0x9","path":"/dev/hidraw0","serialNumber":"1235453265","manufacturer":"Ultimate Gadget Laboratories","product":"UHK 80 Right USB","release":1,"interface":0,"usagePage":1,"usage":6}
[UhkHidDevice] Removed: {"vendorId":"0x37A8","productId":"0x9","path":"/dev/hidraw1","serialNumber":"1235453265","manufacturer":"Ultimate Gadget Laboratories","product":"UHK 80 Right USB","release":1,"interface":1,"usagePage":1,"usage":2}
[UhkHidDevice] Removed: {"vendorId":"0x37A8","productId":"0x9","path":"/dev/hidraw3","serialNumber":"1235453265","manufacturer":"Ultimate Gadget Laboratories","product":"UHK 80 Right USB","release":1,"interface":2,"usagePage":65280,"usage":1}
[UhkHidDevice] Removed: {"vendorId":"0x37A8","productId":"0x9","path":"/dev/hidraw13","serialNumber":"1235453265","manufacturer":"Ultimate Gadget Laboratories","product":"UHK 80 Right USB","release":1,"interface":3,"usagePage":12,"usage":1}
[UhkHidDevice] Removed: {"vendorId":"0x37A8","productId":"0x5","path":"/dev/hidraw4","serialNumber":"4294967295","manufacturer":"Ultimate Gadget Laboratories","product":"UHK dongle","release":1,"interface":0,"usagePage":1,"usage":6}
[UhkHidDevice] Removed: {"vendorId":"0x37A8","productId":"0x5","path":"/dev/hidraw7","serialNumber":"4294967295","manufacturer":"Ultimate Gadget Laboratories","product":"UHK dongle","release":1,"interface":1,"usagePage":1,"usage":2}
[UhkHidDevice] Removed: {"vendorId":"0x37A8","productId":"0x5","path":"/dev/hidraw8","serialNumber":"4294967295","manufacturer":"Ultimate Gadget Laboratories","product":"UHK dongle","release":1,"interface":2,"usagePage":65280,"usage":1}
[UhkHidDevice] Removed: {"vendorId":"0x37A8","productId":"0x5","path":"/dev/hidraw6","serialNumber":"4294967295","manufacturer":"Ultimate Gadget Laboratories","product":"UHK dongle","release":1,"interface":3,"usagePage":12,"usage":1}
[UhkHidDevice] Removed: {"vendorId":"0x37A8","productId":"0x5","path":"/dev/hidraw9","serialNumber":"4294967295","manufacturer":"Ultimate Gadget Laboratories","product":"UHK dongle","release":1,"interface":4,"usagePage":1,"usage":5}
[UhkHidDevice] Device communication closing.
[UhkOperations] Init SerialPeripheral: /dev/ttyACM1
[UhkOperations] Read UHK Dongle firmware from file
[UhkOperations] Write memory with mcumgr
[UhkHidDevice] Device communication closing..
[UhkHidDevice] Device communication closed.
[DeviceService] updateFirmware error {"message":"Error: No such file or directory, cannot open /dev/ttyACM1","stack":"Error: Error: No such file or directory, cannot open /dev/ttyACM1"}
[DeviceService] start poll UHK Device
Error: No such file or directory, cannot open /dev/ttyACM1
  1. When I try to pair the keyboard to a Windows computer over BLE, I get a right-half crash and restart, without it ever prompting for a PIN (and the pairing fails). On my Linux desktop, pairing works fine, but I can’t get input to work. There’s no assigned device Connection for it on the keyboard, and no input seems to get sent to the computer. EDIT: Trying the firmware at [Dev build] Testing request: Bluetooth ble-hid-to-ble-hid switchovers has fixed some of the issues. I’m now able to pair and use the Linux computer, and pair the Windows device. I can initially use the Windows device but as soon as I switch away it gets stuck in a fast connect-disconnect loop (switching between the normal device name and the “NUS” one), and I can never switch back to it.

Minor Issues & “Feedback”

  1. It would be nice to have a default pre-programmed macro for entering Bluetooth pairing mode. While Agent is required to take full advantage of the keyboard, out-of-the-box it would be handy to have the ability to force pairing mode.

  2. When I plug in the Dongle on my Windows work computer, I get a pop-up asking me how I’d like to open an ms-gamebar URL (Gamebar isn’t installed on it, so it was prompting me to open the Microsoft Store to install it).

  3. I believe that it’s already planned, but I would like an option to limit battery charging to 80%. While I want batteries for the occasional wireless use, it would be nice to keep them as healthy as possible. I care more about long-term battery health than current usable capacity.

  4. With the Riser 80, there’s some flex towards the front left corner of the right half. This isn’t an “issue” on the left half (20 deg) because of its shorter length (and maybe steeper angle), but the right half (15 deg) does noticeably flex under the weight of my wrist resting on it. It’s not a problem, just something I notice (though I can see having individual risers for each half significantly increasing cost).

  5. I slightly wish that the right half modules had an extra key to use as “B”. I’m sure I’ll get used to it in time, but I find myself reaching for “B” in the empty space beside “N” when writing certain words. Though I can also see that being challenging for ergonomics.

Overall, I’m very happy with my purchase! I hope that the existing software bugs get fixed soon, but I already have others around me eyeing my keyboard with interest, considering getting one of their own.

1 Like

Glad you like it!

1 Like

Thanks for the information, it’s always great to see the ongoing software/firmware development, having it in the open is one of the things that pushed me towards UHK! I’m always compelled to try out bleeding-edge (even if it’s to my own detriment :sweat_smile:), so I’ve upgraded to that linked firmware.

On 4., the Dongle firmware update, I’ve managed to get the issue to go away and I was able to upgrade the Dongle firmware to 13.0.1 #dev250402, but I’m not sure what was different that made it work.

I did update the launch arguments in my start menu shortcut to:
--no-sandbox --enable-features=UseOzonePlatform,WaylandWindowDecorations --ozone-platform-hint=auto,
but I was already trying those arguments (especially --no-sandbox) when I was launching from the command line. I did also move the dongle from my computer to instead be connected through a KVM (which I thought would have made things worse), but then the update went through.

The Trackpoint module however stays at 10.4.0.

I’m not quite brave enough yet to take a Dremel to my modules, but that is a very cool mod! In the future, when I get myself set up for 3D printing, I might try making an alternative top cover.

1 Like

I’m pretty sure #8 is because your dongle had fw v12.4.0, which was before implementing Disable gamepad by default. by kareltucek · Pull Request #1157 · UltimateHackingKeyboard/firmware · GitHub

2 Likes

The trackpoint module will stay at the older firmware. As far I understood, the UHK 80 cannot update the firmware of modules yet. (Only the UHK 60 currently supports that.) The older firmware on the module should not cause any problems, though.

2 Likes

Thanks for the kind words and for elaborating!

4: Please report an Agent issue.

10: The mentioned part of Riser 80 exhibits the most flex, but nobody has mentioned it yet because it’s so slight. As you correctly assumed, the two Riser halves were made the same size to optimize for manufacturing. We could make the halves different-sized, reducing the flex, but it wouldn’t be a good tradeoff given the lack of complaints.

1 Like

Done! Firmware upgrade fails when connected to certain USB ports · Issue #2606 · UltimateHackingKeyboard/agent · GitHub

After more experimenting to gather data, it doesn’t seem to be unique to the Dongle, I was just connecting the keyboard through a hub, which seems to make the issue go away (as opposed to the Dongle, which I had connected directly to a root hub).

It seems to be specific to some root hubs in my system, unless a hub is used, then the issue goes away.


On the Riser 80, that’s definitely reasonable. It doesn’t have a significant impact by feel, it’s just visually noticeable if I’m looking at the keyboard as place my hands on it.