Outside work, I build apps for friends, contribute to open-source projects and work on my audiobook setup.
Kestrel, PHiLIP and my mlx-audio fix are in ML & Research.
fig. 0 · Recent sample of up to 100 public GitHub events. Times are UTC.
A dated cached sample appears if GitHub is unavailable.Cached sample from August 14, 2026 · 100 events · 2026-08-12 03:00 to 2026-08-14 23:00 UTC
Python CLI. EPUB in, chaptered MP3 out, via Edge-TTS, local Kokoro,
Kestrel on Apple Silicon with a separate engine install, compatible Hugging Face
text-to-speech pipeline models, or a local command that writes audio.
Resume checks chapter text and narration settings before reusing audio.
Embeds a timestamped read-along transcript. A historical Kokoro/Edge-TTS check
reports median word-onset error below 30ms on isolated calibration words.
Other backends can provide estimated sentence cues.
Installable audiobook PWA. Import a chaptered MP3, or narrate a PDF,
EPUB, DOCX, text, Markdown or HTML file on-device with Kestrel through WebGPU or WASM.
Audio, source files, covers and transcripts stay on-device. Metadata and progress sync between devices.
Read-along highlights sentences and marks words when the transcript includes word cues.
Saved playback and read-along work offline after the app shell is cached.
Narration downloads about 41MB of weights and a 24MB runtime, then can work offline while those assets remain cached.
Keep Hark open until narration finishes.
fig. 3 · Felt's public landing page, captured October 1, 2026 in
desktop Chromium at 1440 by 900. No room was opened and the room-code field is empty.fig. 4 · NBA Draft Room's room setup form with its default settings,
captured October 1, 2026 in desktop Chromium and cropped to the form. No room was created.
zsh and tmux helper that launches, finds, and reattaches long-running AI CLI sessions by
partial name. tcd zer gets me back into the
session for that repository without needing its full generated name.
Phone reconnects preserve running sessions. Saved layouts need manual restore after a reboot; running processes must restart. I use it from my phone on the train, where matching a partial name is useful.
Rust CLI for macOS that swaps Claude Code accounts by replacing the Keychain entry in
place, plus a per-profile usage dashboard.
Account switching takes under a second, compared with the built-in logout and login flow. Each
account keeps its own settings, and one master profile's skills, commands and agents
are shared across them.
Chrome extension plus a Node server that wakes five minutes before the first game each
day and sets my fantasy basketball lineup off live injury reports. It uses the injury wire because projections can lag injury news by hours.