Things I’ve made for fun.
I’ve worked on a bunch of little projects over the years but these are the ones that I’m most proud of. Many of them are open-source, so if you see something that piques your interest, check out the code and contribute if you have ideas for how it can be improved.
Intransitive Tennis
A graph neural network (MagNet) for tennis match prediction that models matches as directed graphs to capture intransitive relationships (e.g., Federer beats Davydenko, Davydenko beats Nadal, Nadal beats Federer). Evaluated on ATP matches from 2025, the model achieved statistically significant betting performance, yielding a 3.9% Kelly ROI across more than 200 bets.
github.com
Forty Nine Prints
A full-stack web app that hosts my photography portfolio and lets users buy physical prints, as well as read the process behind (most of) my work. Built with React, Django and Tailwind CSS. Implemented a responsive gallery system and a secure e-commerce workflow. Integrated Stripe’s API for payment processing, checkout, and order tracking.
49prints.com
Spotify Rapped
A web app that allows users to visualize their personalized Spotify data, built with React and Styled Components. Anyone can view their top artists, top tracks, recently played tracks, as well as create and save new playlists of recommended tracks based on their existing playlists. Currently pending approval from Spotify, but I can grant you access if you send me your spotify username.
spotifyrapped.com
Grand Slam Predictor
An XGBoost model for Grand Slam tennis match prediction that considers 12 time- and surface-weighted player features (aces, double faults, winners, win streak, etc.). When evaluated on all four 2025 Grand Slams, it achieved 71% accuracy, beating IBM.
github.com
Buffet Indicating
A Python-based mean-reversion trading strategy that dynamically trades SPY using probabilistic extremes of the Buffett Indicator, achieving a Sharpe ratio of 1.53 and outperforming a yield-spread benchmark.
github.com