notebooks

notebooks

This page contains interactive notebooks on numerical computing, computer graphics, and whatever else may have been on my mind at various times over the last decade. I’m pretty indifferent toward some, but there are a few I’ve really kinda poured my heart into. Maybe you’ll find something interesting!

The notebooks are built with Observable Notebook Kit. Most of them are migrated versions of original Observable notebooks or Idyll documents. I’ve been trying to pull these experiments together into a more coherent form though, so that’s why you’ll find links to earlier versions of many of the notebooks. You can read more about the migration process in Rewriting My Website in Observable Notebook Kit.

Comments? Questions? Contact me on Mastodon or Bluesky or on this site’s GitHub issue tracker.

2026 19 notebooks
JUL 21, 2026

Intentional Anonymity

Thoughts on anonymity, accidental and otherwise

JUL 14, 2026

Time Until Totality

A world map colored by how long until each location next sees totality

JUL 9, 2026

SmoothLife

Conway's Game of Life generalized to a continuous domain, computed in WebGPU

MAY 17, 2026

An Elastic Möbius Strip

Möbius strips as a test problem for doing some real linear algebra in the browser

APR 28, 2026

Zooming Aperiodic Monotile

A (sort of) infinite zooming spectre aperiodic monotile

APR 25, 2026

Rendering the Aperiodic Monotile

Rendering the spectre a chiral aperiodic monotile of Smith, Myers, Kaplan, and Goodman-Strauss

APR 19, 2026

Line-Sweep Terrain Lighting

Terrain shadowing and ambient occlusion for web maps using fast horizon visibility

MAR 17, 2026

Costa's Minimal Surface

Trying to untangle the parameterization of Costa's minimal surface

MAR 15, 2026

Geodesics in Kerr Spacetime

Plotting and raytracing geodesics around a spinning black hold

MAR 11, 2026

Rewriting My Website in Observable Notebook Kit

How I migrated this website from Idyll to Observable Notebook Kit

FEB 28, 2026

Boy's Surface

Boy's surface, an immersion of the real projective plane in three-dimensional Euclidean space

FEB 8, 2026

Denali Terrain

Cobbling together a 3D WebGPU terrain viewer

FEB 1, 2026

Visualizing Sloan Digital Sky Survey Data

Visualizing 3.3 million galaxies and quasars from the Sloan Digital Sky Survey

JAN 25, 2026

Hess-Smith Panel Method

Using the Hess-Smith panel method to compute the aerodynamic flow around an airfoil

JAN 20, 2026

Multi-Scale Turing Patterns in WebGPU

Interactive multi-scale Turing patterns in WebGPU

JAN 17, 2026

Strange Attractors in WebGPU

Integrating and rendering strange attractors in WebGPU from start to finish

JAN 16, 2026

WebGPU Instanced Lines

GPU-accelerated line rendering for WebGPU

JAN 13, 2026

Zoomable Multi-Layer Plots in Notebook Kit

Interactive mathematical plotting in Observable Notebook Kit

JAN 10, 2026

Simulating the 2D Kuramoto-Sivashinsky Equation in WebGPU

The 2D Kuramoto-Sivashinsky equation, a chaotic PDE modeling pattern formation in combustion fronts and thin films

2025 5 notebooks
DEC 31, 2025

Perfectly Matched Layers for the Wave Equation

An quick application of Perfectly Matched Layers for absorbing boundary conditions

DEC 27, 2025

Reflecting on Two Years of Yoga

Contemplating where we're at after attending yoga pretty consistently for a couple years

SEP 29, 2025

Of Noise and Neighbors

A brief window into two years of strife with a neighbor

AUG 3, 2025

Hello, Observable Notebooks 2.0!

Kicking the tires of Observable's new notebook tooling!

MAY 16, 2025

Clifford and de Jong Attractors

Clifford and de Jong strange attractors

2024 3 notebooks
AUG 7, 2024

Chaotic Magnetic Pendulum

Interactive visualization of a magnetic pendulum demonstrating chaotic dynamics

JUN 8, 2024

Spring Training on the Treadmill

Quantifying treadmill efforts (to the point of injury)

MAY 3, 2024

Speed Climbing World Record Progression

Plotting and extrapolating trends in competitive speed climbing

2023 4 notebooks
NOV 28, 2023

Sliced Optimal Transport

Approximate pixel redistribution between images using sliced optimal transport

SEP 23, 2023

Series Acceleration with Shanks Transformation

The Shanks transformation for series acceleration, applied to the arctangent formula for π

MAY 13, 2023

Cubic basis vs. Hermite interpolation

Comparing cubic interpolation using different basis functions

JAN 6, 2023

Bicubic Texture Interpolation using Linear Filtering

Smooth bicubic texture filtering using the GPU's built-in bilinear interpolation

2022 4 notebooks
NOV 16, 2022

Knocking Down the Gates with our Friend Jacobi

Using Jacobi elliptic functions to solve an optimization problem about falling poles and large-amplitude pendulum dynamics

OCT 24, 2022

Night and Day

Earth's solar terminator on a Mapbox map using NASA Black Marble imagery and WebGL shaders

SEP 7, 2022

Fast Generalized Winding Numbers in 2D

Fast generalized winding numbers in 2D for robust inside-outside queries on arbitrary polygons

FEB 26, 2022

HTML+CSS Periodic Three-Body Orbits

Animating periodic three-body orbits using pure CSS keyframe animations generated from Fourier decomposition

2021 4 notebooks
SEP 18, 2021

Lawson's Klein Bottle

Lawson's Klein bottle, a generalization of the Clifford torus in 4D space

MAY 24, 2021

Computing π with the Bailey-Borwein-Plouffe Formula

Computing hexadecimal digits of π at arbitrary positions using the Bailey-Borwein-Plouffe formula

MAY 14, 2021

The Double Pendulum Map

Visualizing the phase space of simple and compound double pendulums

FEB 13, 2021

Malkus Waterwheel

A chaotic mechanical system whose dynamics map to the Lorenz attractor

2020 6 notebooks
DEC 8, 2020

Selecting the Right Opacity for 2D Point Clouds

An opacity formula for consistent visual appearance in brute-force point cloud rendering

NOV 21, 2020

Adaptive Contouring in Fragment Shaders

Adaptive contour rendering in fragment shaders using screen-space derivatives for smooth, resolution-independent contour lines

JUL 9, 2020

WebGPU Voronoi Diagrams using the Jump Flooding Algorithm

Computing Voronoi diagrams and distance fields on the GPU using the Jump Flooding Algorithm

JUN 29, 2020

Sphere Eversion

The Bednorz and Bednorz analytic sphere eversion, a continuous deformation turning a sphere inside out without creasing or tearing

JUN 13, 2020

Transparency for 3D Surfaces

A comparison of three approaches to rendering transparent 3D surfaces in WebGPU

MAY 1, 2020

Toiletpaperfullerenes and Charmin Nanotubes

Constructing fullerenes with toilet paper tubes

2019 3 notebooks
NOV 3, 2019

Particle-Mesh Gravity in WebGPU

2D gravitational N-body simulation using the particle-mesh method

SEP 1, 2019

Periodic Planar Three-Body Orbits

A catalog of periodic three-body orbits with topological classification via free group words

MAR 15, 2019

Multi-Scale Turing Pattern Gallery 2

Another gallery of multi-scale Turing patterns

2018 2 notebooks
OCT 19, 2018

Multi-Scale Turing Pattern Gallery 1

A gallery of multi-scale Turing patterns

JUL 28, 2018

Aligning 3D Scans

Automatically orienting 3D scans by computing principal axes from surface normals

2016 1 notebook
MAY 5, 2016

Things I Learned the Hard Way Using React Native

An obsolete collection of lessons learned from eight months of React Native development

2015 1 notebook
MAR 16, 2015

A Series of Unfortunate Things I Programmed One Time

Reflections on a decade of programming projects