I build practical tools for Linux desktops, self-hosted infrastructure, and the small annoyances between them.
Most of my work lives close to the system: dynamic DNS, shell environments, game-launch pipelines, desktop automation, and incident-response utilities. I care about tools that are easy to inspect, safe to run, and pleasant to use.
📍 Lakewood, Colorado · formerly Milwaukee, Wisconsin
- Building uDDNS, a small multi-provider dynamic DNS updater in TypeScript
- Developing aur-response-toolkit, Rust-based incident-response tooling for Arch Linux supply-chain threats
- Improving Linux gaming and desktop workflows across Steam, Gamescope, Proton, KDE Plasma, Hyprland, Waybar, and Rofi
- Running a Docker Compose homelab with Caddy, secure remote access, monitoring, and automation
| Project | Built with | What it does |
|---|---|---|
| uDDNS | TypeScript | Updates DNS records across multiple providers from one small service |
| aur-response-toolkit | Rust · Shell | Detects and helps recover from known AUR malware campaigns |
| launch-layer | Shell · TypeScript · Python | Composes preflight checks, per-game environments, and wrapper chains for Steam on Linux |
| millennium-helpers | Go · Shell | Manages, upgrades, diagnoses, and controls Millennium across Linux, Windows, and macOS |
| appicon | Go | Resolves desktop and brand icons for Waybar, Rofi, scripts, and MCP clients |
| arch-config | Shell | Keeps my Arch/CachyOS workstation reproducible, tuned, and documented |
Linux · Arch Linux · CachyOS · TypeScript · Rust · Go ·
PowerShell · Bash · Fish · Docker Compose · Caddy · MCP
I also maintain a modular PowerShell profile, my Fish configuration, a Waybar setup for Plasma and Hyprland, and the homelab configuration behind my self-hosted services.
When I'm away from a keyboard, you'll usually find me camping, hiking, cycling, playing disc golf, or exploring Colorado's craft beer scene.




