Computer Engineering student at the University of Ottawa.
color.js - co-maintainer
Color conversion and manipulation library by the editors of the CSS Color specifications. Over 8 million weekly downloads on npm, 2.3k stars.
I was invited to help maintain it alongside a handful of other great developers. I wrote the library's TypeScript definitions, then moved them into the JavaScript source as JSDoc so the published declarations are generated rather than hand-maintained. I also review the incoming community PRs.
nixpkgs - package maintainer
[20+ PRs merged](https://github.com/NixOS/nixpkgs/pulls?q=is%3Apr+is%3Amerged+author%3AMy
steryBlokHed). I wrote the NixOS service module for kiwix-serve (with a VM
integration test), which closed a feature request that had been open for years,
enabled Darwin builds for the Kiwix suite, and fixed the shared Gradle update
script under structured attributes so automated package updates work again.
Definitely Typed - contributor and reviewer
100+ PRs authored, 200+ reviewed, 45 type definition packages maintained.
SESA website - development lead
The site for uOttawa's Software Engineering Students' Association: a bilingual Next.js Turborepo monorepo on tRPC and Drizzle ORM. I built most of it and now also lead the club's other devs, delegating work, reviewing PRs, and getting new members up to speed.
Live site · Source · Rust, WebAssembly, Svelte, TypeScript
Automatic inference for the board game Clue: you record what you see at the table, and it works out everything that logically follows.
I expected this to be relatively straightforward and it turned out to be a pretty interesting problem, requiring me to come up with a bunch of inference techniques to derive info from the game state. I ended up deriving eight original ones, and I've written up the reasoning behind each in Inference.md Hopefully it's as interesting to read as it was to write.
The engine started in TypeScript and now lives in Rust compiled to WebAssembly, which was my first time using WASM. Hands are encoded as 64-bit bitmasks and constraints propagate to a fixed point. Murder probabilities come from backtracking over every deal consistent with what's known. It's roughly 30× faster than the original TypeScript version, even after adding several more (and more expensive) inference techniques on top. Every technique is regression-tested against replayed games, asserting the full engine state after each suggestion.





