ls ~/projects
A few things I've built. Everything else is on GitHub.
usb-hid-relay
I use Linux for everything except League of Legends, which lives on an old Windows PC that I stream to my laptop with Sunshine and Moonlight. Everything is wired, so there's no noticeable latency. The catch is that Riot's Vanguard anti-cheat blocks the virtual mouse Moonlight uses.
The fix is to give Windows a real mouse. A Raspberry Pi Zero 2 W plugged into the PC runs as a USB HID gadget, so Windows just sees an ordinary USB mouse. On the laptop, a small C program reads mouse events from evdev and sends them over UDP to the Pi, which writes them out as HID reports. It asks hyprctl for the active window, so input is only forwarded while Moonlight has focus.
nixos + pi-shop
nixos
My NixOS config for my Framework laptop, built with the Dendritic pattern: every file is a flake-parts module for one aspect of the system, like Hyprland, kitty or Tailscale. verify.sh formats and evaluates the whole thing, and can build and boot every host in a VM using the exact config the real machine runs. A fresh install is a single script that adopts the generated hardware config and switches over.
The look of this site comes from it: the wallpaper, kitty's colours and Hyprland's window borders.
pi-shop
My setup for the pi coding agent: a global AGENTS.md, portable skills and my own extensions. It installs as a home-manager module, a pi package or a plain git repo, and uses the same Dendritic layout. My NixOS config pulls it in and adds machine-specific instructions on top.
learning rust
I write Java for a living. These are how I'm learning Rust.
rust-shell
A POSIX shell, built by working through CodeCrafters' Build Your Own Shell challenge: parsing, a REPL, builtins like cd, pwd and echo, and running external programs.
powr
A minimal, keyboard-driven power menu (lock, sleep, reboot, shutdown and so on) built with iced. Still in progress.