Linux Journey: Solving Hid Access Denied Errors for the Keychron Launcher
The article provides a step-by-step guide for Linux users to resolve "HID access denied" errors when using the Keychron Launcher app to configure wireless mechanical keyboards. It explains how to fix permission issues by adding a udev rule that grants the necessary HID raw access, ultimately enabling the launcher to connect and modify keyboard settings.
Background
Keychron is a popular brand of mechanical keyboards, especially among developers and Linux users. The Keychron Launcher is a web-based configuration tool (like VIA) that lets users remap keys, create macros, and change RGB lighting on supported Keychron keyboards. On Linux, this tool communicates with the keyboard via raw HID (Human Interface Device) USB interfaces; device permissions are often restrictive, causing "HID access denied" errors. This article documents how to fix those errors — typically requiring udev rules (system files that grant user-level access to hardware devices). A common prior step is enabling "VIA support" or "keyboard mode" on the keyboard itself, and the fix usually involves adding a udev rule for the keyboard's vendor/product ID, then reloading udev and replugging the device.
Max Weinbach says he had early access to OpenAI's new model GPT-5.6 Sol, calling it his favorite model by far. He highlights that it never gives up and will keep reasoning until it's done. OpenAI announced that GPT-5.6 Sol, along with Terra and Luna, will launch publicly on Thursday, with preview access expanding globally now.
Newer Claude models sometimes invent extra keys in tool call arguments, breaking validation in Pi's edit tool. The author suspects post-training for Claude Code's forgiving harness makes alternative schemas fail. This suggests closed RL training can degrade general tool-use reliability.
The author builds and trains a GPT-2 small model from scratch in JAX, starting from a basic bigram-style model and incrementally adding components like LayerNorm and Transformer blocks. Achieved a final loss of 3.418, beating their PyTorch version (3.538) and original GPT-2 small (3.499) on the same test dataset.
The author debugged a Flax NNX training loop where the loss was stuck at 10.82, indicating random guessing. By hashing the model parameters and comparing hashes across steps, they discovered the parameters weren't changing. The root cause was using @jax.jit instead of @nnx.jit, which is needed for proper in-place state propagation of parameter updates in NNX.
Building a JAX training loop for an LLM from scratch using Flax NNX and Optax. First validated the harness with a minimal "A-to-A" model (embedding then projection) before adding Transformer layers. Key challenges included fixing JAX's GPU memory default and slow data iteration by committing data to CPU memory.