At first I thought this project was actually going to be relatively simple to implement, but it actually ended up being quite challenging and fun to do. The difficulty here was actually in the discovery of inference methods much more than the code implementation of them.
This was my first time learing and applying set theory, although it wasn't actually until after I had started work on the inference logic that I realized that. Speaking of: I've also tried to document the theory/proof behind what my code does on a page in that repo. Hopefully it's as interesting to read as it was to write.
I also decided to eventually port the core of the inference logic to Rust (with WebAssembly), because I noticed performance issues for a feature to determine the most likely guilty cards (since it's essentially just brute-forcing all possible hand arrangements given the current data). That was my first time ever using WebAssembly.
I've been invited to help maintain this project, along with a handful of some other great developers: https://github.com/orgs/color-js/people. Most of my work here is on writing and updating typings for TypeScript support.