Falling Block Puzzle Game



I paired with ChatGPT (GPT-4) on making a clone of one of my favorite childhood games, Tetris! It took some nudging and back and forth, but I'm pretty pleased with how this turned out. I learned a lot about how Tetris is implemented and the subtle (but important!) differences between versions of the game.


Radiant Diamond



I saw this amazing demo of refraction in React Three Fiber and had to try it for myself. Works best in Safari.

ReactReact Three FiberViteVercel

Chinese Flashcard App: Web



A web version of my mobile flashcard experiments, built with modern web technologies.

ReactStitchesRadix UITypeScriptPrismaSupabaseNext.jsVercel

Personal Website v3



The third major iteration of this website, updated with a new technology stack to support a personal blog. If you want, you can still view the previous version.

This is my playground to experiment with new technologies and build smaller apps. Check out this stopwatch and this map of restaurants in San Francisco.

ReactTheme UIMDXReact Three FiberThree.jsTypeScriptNext.jsVercel

Custom Discord bot


I created a custom Discord bot for the private server I hang out in with some of my close friends. It's highly specific to how we interact in the server — mostly inside jokes and silly memes.

It's built with Discord's Message Command and Slash Command APIs.




Digestif shows me the most-liked Tweets from people I follow. It makes it easy to discover new Tweets or see what's going on at a glance. It started as a web app hosted from my Raspberry Pi, accessible only on my home network. Later, I made it post the best Tweets to my Discord server once a day.

ReactDjangoCeleryNext.jsRaspberry PiTwitterDiscord



Website · GitHub

OK.css is a classless CSS framework that adds sensible styling defaults to your web page. It's featured in this collection of minimal stylesheets.


Chinese Flashcard App


I've been learning Chinese, but wanted a more efficient way to review new vocabulary words. I shared a small prototype of what the frontend could look like in SwiftUI, and made some progress building a cross-platform client with React Native. As part of this project, I also researched spaced-repetition algorithms and local-first apps.

React NativeExpoSwiftUIsqlite

YouTube Silence Skipper



This is an experimental Chrome extension that shortens silences on YouTube, inspired by a similar feature in popular podcast apps. It works by sampling the loudness of the video and increasing the playback rate when the loudness drops under a pre-defined threshold.

JavaScriptChrome Extension

Tech Talks


Website · GitHub

Tech Talks was a place to discover and watch conference talks about web development. I had collected thousands of talks from a number of JavaScript conferences from 2017 through 2019 by looking up their associated conference playlists on YouTube. This project is no longer being actively developed.


Raspberry Pi Kiosk



I connected my Raspberry Pi to a display that shows the current time, news, stocks, and weather. Then I posted about it on Twitter.

ReactStyled ComponentsTypeScriptNodeExpressRaspberry Pi



Website · GitHub

Aurora is web-based synth that can be played with a computer keyboard and MIDI keyboard (Chrome only). It was inspired by professional software synths like Sylenth1, Massive, and Serum. I wanted to make exploring audio synthesis accessible and fun!

ReactReduxFlowStyled ComponentsVercelWeb MIDI APITone.js

Wi-Fi LED Lamp



Inspired by the Philips Hue and the LIFX bulbs, I created a lighting solution that can be controlled by a web browser and can be customized with software.

Made with Spark Core, IKEA Vidja lamp, and Neopixel light strip.


Algorithmic Music Generator


For my final project in my Computers and Music class, I wrote a program that generates music based on user input (key, tempo, etc.) and rules from classical music theory.

JavaScriptMax MSP