I work at the quieter end of medicine — teaching machines to read scans, and to be honest about the parts they get wrong. No campus, no tenure clock, no committee to satisfy: just a home laboratory I run myself, where the work answers to no one but the evidence.
Segmentation, classification, detection, and the unglamorous discipline underneath all of them — making models reproducible, explainable, and willing to admit their own uncertainty. That is the part I actually care about.
When I'm not at the bench, I build small software the way I furnish a room: nothing loud, everything intentional. The things I publish aren't badges of identity. They're just tools I wanted to be better, so I made them that way.
queen — a macOS video downloader
A terminal-native downloader built on yt-dlp and rendered with Bubble Tea and Lip Gloss. Concurrent
downloads, per-task progress locked to a fixed width so the numbers never judder, a bilingual interface,
native notifications, and a failure log that actually respects your time.
Go · MIT
ghostty-config — a configuration kept with intent
A single-file Ghostty config for macOS: JetBrainsMono Nerd Font with a PingFang SC fallback for clean CJK rendering, a theme that follows the system, a translucent window, and iTerm2-flavored keybindings. The terminal is where I live; I'd rather not live somewhere shabby. Maintained with CI that validates the config on every change. Ghostty · MIT
I build things in the open and I send fixes back upstream when the tools I use let me down. My contribution history is the honest record of that; the work that currently matters most is on hister, a private search engine. When a semantic search comes back empty, the one control that can recover results is the similarity slider — so PR #712 brings it into the empty-results state. The re-search is debounced so lowering the threshold mid-drag doesn't tear the control away before you're done, and the empty state shows only the threshold slider (the weight slider, which only re-ranks existing results, stays in the Actions menu where it means something).
If a tool is worth using, it's worth leaving a little better than I found it.
Things I recently took from idea to merge — branch, review, CI, homing in on the details, then a clean squash. Every step green before it moved on.
ghostty-config#2 —feat:default working directory for new windows.+validate-configclean on both macOS runners, then merged.ghostty-config#3 —docs:synced README & CHANGELOG to match; markdownlint, zero warnings.ghostty-configv0.2.0 — cut a release whose notes came out of the CHANGELOG, no drift.- Workflow discipline: branch → PR → CI green → squash → prune, every time. Config + docs ship in one atomic PR.
Reviews offered upstream — code handed back with the polish applied, not just a verdict:
averygan/reclip#58 — approved a yt-dlp argument-injection (RCE) fix after reproducing the--separator defense locally against yt-dlp 2026.08.19; suggested hardeningis_safe_urlagainst RFC-1918/loopback hosts.averygan/reclip#47 — reviewed the m4a-preference audio selector; flagged a consistency gap in the generic merge branch and overlap with #29.
- Write the smallest thing that solves the problem, then delete what remains.
- Badges are welcome; declarations of "impact" belong in journals.
- If a tool needs a tutorial, it isn't finished.
Made with care, and a touch of indulgence, by kesonglab.