Skip to main content
INDEX / PROJECTS / 2015–2026

Selected Work

I love making computers do things no one's seen before. For people I think are trying to make the world a better place. My freelance work pays for my journalism habit. I take on 3 projects at a time, and 2 slots are open→ grab a slot

Last updated 2026-05-27 · Pixel Canvas
NBC NewsGothamist / WNYCKnight FoundationGlobal Energy Monitor24 projects · 2015–202617 shipped since 202475 technologies
neo4j · sqlite · gephi · network analysis · cypher

In 2021, WNYC/Gothamist got the NYPD's full civilian-complaint dataset through a FOIL request and handed it to me — every complaint and every officer since 2000, including officers named only as witnesses and complaints the CCRB never substantiated. Noisier than the data ProPublica had published a year earlier, but for mapping a network that noise is the signal: being named on a complaint alongside another officer, even an unfounded one, means the two of them interacted in a way the public noticed.

Clusters of NYPD Misconduct screenshot 1Clusters of NYPD Misconduct screenshot 2

NBC News Big BoardNBC News

clienthuman-only
d3.js · javascript · touch interface · election data

It started as a prototype I made in January — a touchscreen way to explore county-level election results — that I demoed to Adam, then to Steve, then to Marc, until it got the budget and became the real thing: the "Big Board" Steve Kornacki wields on air, live, in front of ten to nineteen million people. (NewscastStudio wrote up a later update.)

NBC News Big Board screenshot 1NBC News Big Board screenshot 2NBC News Big Board screenshot 3NBC News Big Board screenshot 4

Scrapbook Core

personalai-assisted ↗
javascript

I have gotten pretty good at saving interesting things that I see on the internet. Anytime I read something I think I might want to reference, show someone, or think about later, I chuck it into my bookmarks. I've done this for over 10 years now, making little notes of my favorite things while wading through the ever-expanding deluge of "content." Now I want to take a step back and map the constellations that emerge.

Scrapbook Core screenshot 1

Connectology

collaborativeai-assisted ↗
nuxt 3 · vue 3 · d3 · graphology · sqlite · clerk

Connectology is for me — a custom front-end replacement for Gephi or a raw D3 force layout: build graphs of nodes and links, then analyze the resulting structure with force-directed layout and graph metrics. The v2 rebuild adds AI-powered node generation and multiple import formats (Obsidian, Mermaid, CSV).

Connectology screenshot 1Connectology screenshot 2

Paramilitary Leaks

collaborativeai-assisted
nuxt · vue · search · data visualization

I was perusing Mastodon, as one does, and noticed a post from journalist Micah Lee saying he was exploring a 200GB dump from American paramilitary groups — a leak made possible through the incredible bravery of John Williams, who infiltrated these groups and exfiltrated the data. I hadn't heard of the dump before, and immediately sent Micah an email offering to help with any dataviz.

Paramilitary Leaks screenshot 1

Pixel Canvas

personalai-assisted
esp32-s3 · arduino · lovyangfx · bash · rest api

I spend all day looking at screens that want something from me. Pixel Canvas is a screen that doesn't — a networked 320×240 display that sits on my desk and quietly shows me my own life in the Vulpes palette.

Pixel Canvas screenshot 1Pixel Canvas screenshot 2Pixel Canvas screenshot 3Pixel Canvas screenshot 4Pixel Canvas screenshot 5
+ 2 more →

Dataproofer

collaborativehuman-only ↗
javascript · electron · data quality · csv

Along with Gerald Rich and the Vocativ data team, I received a Knight Prototype Fund grant to create Dataproofer - an open source tool to check data for reliability, missing data, and outliers. Built as an Electron desktop app for journalists.

Dataproofer screenshot 1

Flipper Generative Art

personalai-assisted ↗
flipper zero · c · floyd–steinberg dithering · embedded

I often just leave the Flipper on my desk below my monitor, and my feeling was: why not have it show me little evolving art pieces instead of just the time? What would that look and feel like? Is generative art even possible within the constraints of the Flipper's screen and processor? What does 1-bit generative art feel like? How can it evolve over the course of a day?

Flipper Generative Art screenshot 1Flipper Generative Art screenshot 2Flipper Generative Art screenshot 3Flipper Generative Art screenshot 4Flipper Generative Art screenshot 5

I Ching Motion Graphics

personalai-assisted
python · manim · motion graphics

3Blue1Brown-style animated explainers of the I Ching — the 64 hexagrams, the binary structure Leibniz saw in them, the coin-toss probabilities — rendered as precise mathematical motion graphics in the vulpes monochrome palette with Manim.

I Ching Motion Graphics screenshot 1I Ching Motion Graphics screenshot 2I Ching Motion Graphics screenshot 3

Journalism

2
COVIDcast screenshot
clienthuman-only· data visualization · javascript · covid-19 data
NBC News Specials screenshot
NBC Newshuman-only· javascript · d3 · longform design

Art

3
Subway Builder screenshot
ai-assisted· javascript · simulation · transit
Hand-Tracking & Generative Art screenshot
ai-assisted· computer vision · midi · webgl
Motorcycle.p8 screenshot
collabhuman-only· pico-8 · lua

Hardware

2
WebSDR VCV screenshot
ai-assisted· c++ · vcv rack · cardinal
Flipper Space Calculators screenshot
ai-assisted· flipper zero · c · embedded

Apps

1
MorningRadio screenshot
ai-assisted· swift · ios · audio streaming

Tools

7
vulpes.nvim screenshot
ai-assisted· lua
Smallbot MCP screenshot
ai-enhanced· mcp · ai · web generation
Cloudinary Backup Tool screenshot
· tauri · rust · typescript
showtouch screenshot
ai-assisted· python · ascii art · terminal
smallweb-starter screenshot
ai-assisted· typescript · deno · smallweb
EXIF Printer screenshot
ai-assisted· photography · exif · print design
Coach Artie screenshot
collabai-enhanced· node.js · discord.js · openai api