Projection
August 23, 2025
A static site generator for displaying my projects (the site you're on right now!).
Voronoi
August 21, 2025
An animated voronoi diagram where the centers move around and bounce off the walls. Also includes alternative distance functions.
General Complex Dynamics Visualizer
July 4, 2025
A general, interactive visualizer for complex dynamics, featuring the mandelbrot set, julia sets, newton's fractal, and more. This was vibe-coded.
Newton's Fractal
June 16, 2025
This visualizes newton's fractal, which is a root-finding algorithm. Inspired by 3blue1brown's great video on this fractal.
Image to Julia Set
June 14, 2025
Upload an image and see it get transformed into a julia set. This was vibe-coded using cursor and claude 3.7 sonnet.
Majority Cellular Automaton
June 14, 2025
A multi-state cellular automaton where the next value is determined by majority vote of the neighbors. This project was originally implemented by me (without AI), and it ran on the CPU, but I vibe-coded a GPU port using cline.
Fractal Curve Editor
June 7, 2025
Create a fractal curve from a seed pattern of line segments by replacing each segment with a scaled copy of the whole seed. This was vibe-coded.
Image → Conway's Game of Life on the GPU
June 6, 2025
A GPU-powered version for higher performance. This was vibe-coded using cline.
Complex Function Grid Transformation
May 23, 2025
This is an interactive visualization of functions on complex numbers. It shows how points along grid lines get transformed by the complex function. This was completely vibe-coded using ChatGPT.
Dependent Types
May 3, 2025
A dependently typed language supporting dependent products (functions), dependent sums (pairs), and booleans.
List monad-like DSL for Racket
April 12, 2025
Similar to for* loops in Racket, but more convenient syntax
Elastic Sphere Collisions
February 8, 2025
A bunch of balls (really circles) colliding with each other elastically, conserving kinetic energy and momentum like billiard balls.
2D Random Walkers
February 1, 2025
A bunch of random walkers animated with a trail. Each little walker randomly decides to move up, down, left, or right.
Raindrops
February 1, 2025
Inspired by watching raindrops drip down a car window and collide with each other. Raindrops move down, but their horizontal movement is random. When two drops collide, they combine and the survivor is randomly chosen.
Rock Paper Scissors Cellular Automaton
January 30, 2025
A cellular automaton based on rock paper scissors where if a neighboring cell beats this cell, this cell becomes the winner.
Double Slit Interference
December 7, 2024
A physics-simulation of waves powered by balls connected with springs, demonstrating diffraction and double-slit interference.
Rico Blaze
October 3, 2024
A hardware description language, and an (unfinished) CPU written in that language.
Monty Hall Game
September 20, 2024
Interactive game for the monty hall problem. Includes an explanation of the math.
Sand
September 18, 2024
Add sand, water, stone, acid, fire, and more to the screen and watch them interact. This is a cellular automaton where each "grain" interacts with its neighbors depending on what material it is.
SKI Combinator Calculus
September 18, 2024
A compiler from lambda calculus to SKI combinator calculus.
Unbounded Conway's Game of Life
March 30, 2024
Conway's game of life, but the size of the world is unlimited. Rather than storing a grid of cells, we store the positions of living cells and update those cells and their neighbors to compute the next generation.
Online Tic Tac Toe
February 28, 2024
multiplayer tic-tac-toe with a game server written from scratch
Dragon Curve
December 29, 2023
This is the dragon curve. It's the fractal generated by folding a piece of paper in half over and over again.
Delimited Continuations
October 1, 2023
A pre-processor for racket that transforms programs to continuation passing style supporting delimited continuations.
Async Await
September 20, 2023
An implementation of JavaScript-style promises and the desugaring of async/await to using promises in Racket.
Wave Equation
September 12, 2023
A numerical approximation of the wave equation, visualized as a heat map. It's like a simulation of the surface of a pond, starting off flat with a few splashes. An accumulating numerical error ends up producing an interesting pattern
Minimum Spanning Tree
September 12, 2023
This generates a minimum spanning tree of a random collection of points. You can add points to see how the MST changes.
Boids
August 19, 2023
A simulation of bird flocking behavior. The boids try to stay near the center of the flock, avoid getting too close to other boids, and try to head in the same direction and speed as nearby boids.
Pattern Matcher
March 18, 2023
Pattern matching DSL that allows case analysis and de-structuring data based on its shape.
Miniclass
March 7, 2023
An implementation of a basic class system for Racket using macros that compile to struct usages.
Functional Reactive Programming
December 17, 2022
A tiny functional reactive programming library/DSL. Like a spreadsheet where formula cells update automatically when dependencies change.
Syntax Spec
September 20, 2022
A meta language for creating sophisticated domain specific languages in Racket. Research project with Michael Ballantyne.
Pi Calculus
September 19, 2022
An implementation of the pi calculus. Like lambda calculus but for concurrent programming instead of functional programming.
Ocular Patdown
August 5, 2022
An optics library featuring a match-like DSL for deep immutable updates.
Mini Kanren
August 3, 2022
An implementation of mini kanren, a logic programming language like prolog. Includes a type checker implemented using mini kanren.
PongChamp
July 13, 2021
An imperative programming language with syntax inspired by JavaScript. Originally created as a scripting language for a game engine. I made this with my friend Ryan Mitchell.
Language with Lisp-like Macros
July 2, 2021
A little language with lisp-like macros and quasi-quoting in racket. An enriched lambda calculus with syntax-to-syntax transformations.
Freer Effects
June 23, 2021
A library for effect handling in Haskell based on the paper “Freer Monads, More Extensible Effects”
ContEffects
April 21, 2021
A tiny language with simple algebraic effects. Effects are treated as 'resumable exceptions' with handlers.
3 Point Perspective
January 21, 2021
3 point perspective is a drawing technique to draw realistic-looking objects in 3D. You can click and drag the 3 white perspective points and one of the vertices of the cube.
OCovid
January 17, 2021
An OCaml subset with algebraic data types, deep pattern matching, and type inference written in Haskell.
HCC
January 13, 2021
A C compiler written in Haskell. Supports functions, arrays, pointers, ints. Targets x86 assembly.
Funduce
December 11, 2020
A Haskell remake of subduce. An implementation of a subset of advanced student language with S-expression syntax.
JoJo Snake
September 3, 2020
A snake game with a JoJo's Bizarre Adventure theme. I made this with my friend Ryan Mitchell.
Magnet Pendulum
July 15, 2020
The fractal is generated from simulating a magnetic pendulum swinging over a table with three magnets on it. Each pixel is colored based on which magnet it ends up at and darkened based on how long it took to stop at a magnet.
Mandelbrot Set
July 13, 2020
Instead of coloring each pixel discretely based on the iteration count upon escape, this shader uses a continuous coloring which takes into account the iteration count as well as the modulus of the final value. Zoom by scrolling and pan the camera by clicking and dragging.
Julia Set
July 13, 2020
This shader uses the same coloring method as the Mandelbrot set shader, but you can select the c-value used to generate the julia set by clicking/dragging the mouse on the screen.
Reactive
July 13, 2020
An excel-like reactive programming language. Define 'cells' with formulas that reactively update when dependencies change.
MiniML
March 15, 2020
A small OCaml subset with type inference, arithmetic, boolean logic, and functions written in OCaml.
Subduce
February 10, 2020
The first programming language I made. A functional programming language based on Python and racket's advanced student language.
Brainfuck Compiler
January 29, 2020
A compiler for the Brainfuck programming language. Compiles to x86 assembly.
UpDown
December 1, 2019
A puzzle game based on switching the direction of gravity. I made this with two other students for a game design class.
Braille Dithering
August 23, 2019
Convert images to braille characters for text-based image display.
Kana Word Generator
July 12, 2019
This page randomly generates "Japanese-sounding" words using hiragana syllable rules.
Random Circles with No Overlap
July 5, 2019
Randomly placed circles that don't overlap with each other.
Random Squares with No Overlap
July 5, 2019
Randomly placed squares that don't overlap with each other.
Travelling Salesman Problem
July 5, 2019
This solves the travelling salesman problem for a random collection of points.
Snake AI
July 4, 2019
Neural network that learns to play Snake through the REINFORCE algorithm. Rewards getting food, punishes dying. Built with my friend Maggie Von Nortwick.
Asteroids
May 13, 2019
A clone of the classic arcade game Asteroids. Use WASD to move/rotate, click to shoot.
Polygon Fractals
May 7, 2019
Colorful polygon fractals. Click to iterate the fractal, press a key to switch between center mode and prism mode.
Rainbow Radiation
May 7, 2019
Colorful lines fly out of your mouse cursor. Move the mouse and click to make the lines fly out in a spiral.
CIFAR GAN
May 4, 2019
Generative Adversarial Networks trained on CIFAR dataset. Two neural networks compete - one generates fake images, another determines if images are real or fake.
UnCropper
April 6, 2019
A de-convolutional neural network that uncrops an image and generates the surrounding area. Trained on cropped images to guess the original.
Convolutional Autoencoder
April 6, 2019
Convolves an image to a small vector, then deconvolves it back. Can continuously morph between images by interpolating their compressed forms.
Conway's Game of Life
July 12, 2018
This is John Conway's game of life, a cellular automaton where cells live or die depending on the state of their neighbors. Click on the cells to toggle their life state and hit start to see what happens.
Ginchology
July 12, 2018
This randomly generates two ginchulates, which are a consonant sound, a vowel, and finally, an "nch". Ex: "dench". They just sound funny.
Magnetic Pendulum
July 12, 2018
This simulates three magnets on a table with a pendulum hanging a magnetic object above the center. Where the pendulum ends up is extremely sensitive to the initial dropping position.
Moving Minimum Spanning Tree
July 12, 2018
This generates a minimum spanning tree of a random collection of points that bounce around. You can add points by clicking on the screen.
Display Graph
July 12, 2018
This allows you to display any graph and then edit the locations of vertices by clicking and dragging. Currently, it randomly generates a graph.
Three Periods
June 7, 2018
Educational interactive math visualizations I made for my high school senior project.
Smart Rockets
March 22, 2017
There are two competing populations of rockets, each using genetics and evolution to try to learn to reach the target by applying a series of forces to themselves.