Projection

August 23, 2025

A static site generator for displaying my projects (the site you're on right now!).

webutilityvibe-coded

Voronoi

August 21, 2025

An animated voronoi diagram where the centers move around and bounce off the walls. Also includes alternative distance functions.

shadervibe-codedweb

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.

fractalshadervibe-codedweb

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.

cellular-automatashadervibe-codedweb

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.

fractalvibe-codedweb

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.

cellular-automatashaderconwayvibe-codedweb

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.

vibe-codedweb

List monad-like DSL for Racket

April 12, 2025

Similar to for* loops in Racket, but more convenient syntax

programming-languagesracketdslmacros

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.

physicsweb

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.

prettyweb

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.

cellular-automataweb

Double Slit Interference

December 7, 2024

A physics-simulation of waves powered by balls connected with springs, demonstrating diffraction and double-slit interference.

physicsweb

Launder

October 6, 2024

A DSL/tool for tracking work hours and payment

racketdslutility

Monty Hall Game

September 20, 2024

Interactive game for the monty hall problem. Includes an explanation of the math.

educationweb

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.

cellular-automatagameweb

SKI Combinator Calculus

September 18, 2024

A compiler from lambda calculus to SKI combinator calculus.

programming-languagesracketcompiler

Word Hunt Bot

August 22, 2024

A bot for cheating at word hunt.

AIracket

Anagrams Bot

August 22, 2024

A bot for cheating at anagrams.

AIracket

Seam Carving

August 8, 2024

Shrinking an image by removing the "least interesting" seams of pixels.

upload-imagealgorithmsfunnyweb

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.

cellular-automataconwayweb

Sudoku

March 22, 2024

Sudoku, implemented using React.

gameweb

Student GUI DSL

February 28, 2024

An elm-like GUI DSL for computer science students.

programming-languagesracketdslmacroseducation

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.

fractalweb

Delimited Continuations

October 1, 2023

A pre-processor for racket that transforms programs to continuation passing style supporting delimited continuations.

programming-languagescontinuationsracket

Async Await

September 20, 2023

An implementation of JavaScript-style promises and the desugaring of async/await to using promises in Racket.

programming-languagesracketdslmacrosconcurrency

ZFC++

September 16, 2023

An implementation of ZFC++, an esoteric language that operates on sets.

programming-languagesracketdslesolang

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

physicscellular-automataweb

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.

algorithmsweb

Counter Machine Language

September 8, 2023

An assembly-like language for counter machines.

programming-languagesracket

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.

programming-languagesracketmacrosdsl

Miniclass

March 7, 2023

An implementation of a basic class system for Racket using macros that compile to struct usages.

programming-languagesracketmacrosdsl

Functional Reactive Programming

December 17, 2022

A tiny functional reactive programming library/DSL. Like a spreadsheet where formula cells update automatically when dependencies change.

dslreactiveprogramming-languagesracketmacros

Actor Model

October 13, 2022

An implementation of the actor model in Racket.

programming-languagesracketdslmacrosconcurrency

Pi Calculus

September 19, 2022

An implementation of the pi calculus. Like lambda calculus but for concurrent programming instead of functional programming.

dslracketprogramming-languagesmacrosconcurrency

Ocular Patdown

August 5, 2022

An optics library featuring a match-like DSL for deep immutable updates.

programming-languagesracketdslmacrosoptics

Mini Kanren

August 3, 2022

An implementation of mini kanren, a logic programming language like prolog. Includes a type checker implemented using mini kanren.

programming-languageslogicracketdslmacros

Command-Line Solitaire

July 25, 2021

A command-line solitaire game written in Haskell.

haskellgame

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.

programming-languageshaskell

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.

programming-languagesracketmacros

Freer Effects

June 23, 2021

A library for effect handling in Haskell based on the paper “Freer Monads, More Extensible Effects”

programming-languageshaskell

ContEffects

April 21, 2021

A tiny language with simple algebraic effects. Effects are treated as 'resumable exceptions' with handlers.

programming-languagesalgebraic-effectshaskell

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.

Moon Dithering

January 21, 2021

Similar to braille dithering, but uses moon phase emojis.

upload-imageweb

OCovid

January 17, 2021

An OCaml subset with algebraic data types, deep pattern matching, and type inference written in Haskell.

programming-languageshaskelltype-system

HCC

January 13, 2021

A C compiler written in Haskell. Supports functions, arrays, pointers, ints. Targets x86 assembly.

programming-languageshaskellcompiler

Funduce

December 11, 2020

A Haskell remake of subduce. An implementation of a subset of advanced student language with S-expression syntax.

programming-languageshaskell

JoJo Snake

September 3, 2020

A snake game with a JoJo's Bizarre Adventure theme. I made this with my friend Ryan Mitchell.

gamewebfunny

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.

physicsshaderfractalweb

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.

fractalshaderweb

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.

fractalshaderprettyweb

Reactive

July 13, 2020

An excel-like reactive programming language. Define 'cells' with formulas that reactively update when dependencies change.

programming-languagesreactivedsl

Tetris

June 25, 2020

Guideline-compliant Tetris with an AI that plays better than me!

AIgame

2048

June 24, 2020

An AI that plays 2048 almost perfectly.

AIgame

MiniML

March 15, 2020

A small OCaml subset with type inference, arithmetic, boolean logic, and functions written in OCaml.

programming-languagestype-system

Haskell Parsing Library

March 5, 2020

A little parsing library written in Haskell.

programming-languageshaskell

Subduce

February 10, 2020

The first programming language I made. A functional programming language based on Python and racket's advanced student language.

programming-languages

Brainfuck Compiler

January 29, 2020

A compiler for the Brainfuck programming language. Compiles to x86 assembly.

programming-languagescompileresolangocaml

Braille Dithering

August 23, 2019

Convert images to braille characters for text-based image display.

upload-imageweb

Genetic Steering

July 12, 2019

Creatures evolve to seek food and avoid poison.

AIgenetic-algorithmweb

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.

algorithmsweb

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.

gameAIneural-networks

Asteroids

May 13, 2019

A clone of the classic arcade game Asteroids. Use WASD to move/rotate, click to shoot.

gamewebunity

Anagrams

May 10, 2019

A word game where you have to find anagrams of a given word.

gamewebunity

Polygon Fractals

May 7, 2019

Colorful polygon fractals. Click to iterate the fractal, press a key to switch between center mode and prism mode.

fractalweb

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.

Anime Face GAN

May 6, 2019

GAN trained to generate anime faces.

AIneural-networks

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.

AIneural-networks

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.

AIneural-networks

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.

AIneural-networks

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.

cellular-automataconwayweb

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.

funnyweb

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.

physicsweb

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.

algorithmsweb

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.

educationweb

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.

AIwebgenetic-algorithm