I write and package free software. Most of my time goes into mainline Linux and Nura (formerly postmarketOS) support for Qualcomm phones, Linux distribution tooling, and small, fast system services in Rust and Go. When something upstream breaks, I send the fix back. Over the years that has meant patches to the Linux kernel, Nura, systemd, LocalAI, ScummVM, DevilutionX and EasyEffects.
| Area | Highlights |
|---|---|
| Kernel | Linux mainline: Qualcomm MSM8953/SDM630 device trees, PMI8950 PWM support in leds-qcom-lpg, a Novatek touchscreen fix · Nura: linux-postmarketos-qcom-msm8953 kernel upgrades, ALSA UCM audio profiles, lk2nd-msm8953, and the ports for the Xiaomi Redmi 5 Plus (vince) and Redmi Note 6 Pro (tulip) |
| Artifacts | OpenArtifact: a self-hosted package registry for deb, rpm, apk, pacman, npm, PyPI, Maven, Docker, Helm, Cargo, Go, NuGet, RubyGems, Conda, Conan, Terraform, Nix, Ansible and raw files. Hosted, proxy and group repositories, vulnerability scanning with a local OSV mirror, SSO and federation; AGPL, one Go binary |
| Packaging | yap: builds deb, rpm and apk packages from PKGBUILD specs · PKGBUILD: the Arch Linux recipes I maintain · android-udev-rules: one of the most comprehensive sets of Android udev rules around |
| Rust | rmpd: an MPD server in pure Rust · netsukuku-rs: a new implementation of the Netsukuku mesh network · opensubsonic-rs · aulos: a music player for the COSMIC desktop |
| Identity | opencie: an app for signing and verifying documents with the Italian electronic ID card (CIE) · opencie-pkcs11: a cross-platform PKCS#11 library for the CIE |
| Embedded | simonpi: runs Raspberry Pi images in QEMU · qemu-kernels-rpi: the matching QEMU kernel builds |
| Media | lactea: a MilkDrop 2/3 and projectM-compatible music visualizer in pure Rust on wgpu · easyeffects-presets · rivulet-engine · shisper: subtitles generated with whisper.cpp |
Recently merged upstream
- rivulet-kodi/rivulet-engine#82 — fix(media): read local self-origin media through the relay too · 2026-11-04
- rivulet-kodi/plugin.video.rivulet#118 — fix(home): keep the last worker's row when it exits mid-collect · 2026-11-04
- rivulet-kodi/plugin.video.rivulet#115 — chore(release): 0.43.0 · 2026-11-03
- rivulet-kodi/plugin.video.rivulet#116 — feat(server): pin rivulet-engine v0.30.2 · 2026-11-03
- rivulet-kodi/rivulet-engine#78 — fix(memstorage): fetch only the stream's window, not the whole file · 2026-11-03
- rivulet-kodi/plugin.video.rivulet#114 — feat(server): pin rivulet-engine v0.30.1 · 2026-11-03
Cards regenerated daily by a GitHub Actions workflow · last run 2026-11-04





