Projects

Things other people use

Things that run themselves

Things to click on

Background

Senior editor on CNN's visuals team, in Los Angeles, where I edit as often as I build.

I've written, coded and edited data-driven and visual stories at NPR, The Texas Tribune, The Wall Street Journal and the Los Angeles Times. Read my stories and graphics.

In 2012 I founded The Daily Viz, a now-retired site of data stories. The software grew out of the reporting rather than alongside it, mostly in Python and JavaScript: packages that pull records out of government GIS portals and flight databases, scrapers that map a company's footprint, pipelines that keep publishing after a story is filed, and a map of 1.6 million Los Angeles street trees.

Let's talk

Have a question, a tool that's broken, or something you want built? Send me a message.

The ezesri web app, with a field for pasting an Esri REST layer URL

ezesri

pip install ezesri

Pulls data and metadata out of Esri REST endpoints — the format most government GIS portals publish in — and writes it to GeoJSON, Shapefile, GeoPackage or GeoParquet.

  • Data extraction
  • Government data

Built with Python, CLI, GeoPandas

Street View panorama of the Sixth Street Viaduct in Los Angeles

streetview-dl

pip install streetview-dl

Finds and downloads full-resolution Google Street View panoramas from a URL or a pair of coordinates, including historical captures of the same spot.

  • Data extraction

Built with Python, CLI

A pyfr24 plot tracing a single flight path

pyfr24

pip install pyfr24

A Python client and command-line tool for the Flightradar24 API. Start with a flight number, end with a plotted track and a table you can analyze.

  • Data extraction
  • Mapping
  • Aviation

Built with Python, CLI, matplotlib

Map tracing five United Airlines flight paths across the United States

flight-tracer

pip install flight-tracer

Fetches, stores and maps aircraft positions from ADS-B Exchange, built for following one tail number over weeks rather than watching a single flight.

  • Data extraction
  • Mapping
  • Aviation

Built with Python

County-level choropleth map of farmland as a share of county land area, densest across the Plains

chorokit

pip install chorokit

Makes a clean choropleth in a few lines, with defaults for projection, layout and legend chosen so the map is publishable on the first render.

  • Data viz
  • Mapping

Built with Python, matplotlib, GeoPandas

Terminal output from a hangarbay registry lookup, listing the owner, model and airworthiness dates for an LAPD helicopter

hangarbay

pip install hangarbay

A reproducible workflow for the FAA aircraft registry: download the raw files, normalize them into typed tables and find out who owns a tail number.

  • Data extraction
  • Analysis
  • Aviation

Built with Python, CLI

The Chartfeed gallery, with a search box and category filters above a dark grid of chart thumbnails

chartfeed

A responsive gallery of your Datawrapper charts that rebuilds itself every day through GitHub Actions.

  • Data viz

Built with Svelte, GitHub Actions

An LA Street Names Jupyter notebook, with its summary cell above Python import and pandas display settings

notebooks

Hundreds of worked Jupyter notebooks for analysis, charts and maps in Python. This is the reference I actually send people who ask how to start.

  • Reference
  • Analysis

Built with Python, Jupyter, pandas

Terminal output from a utilityman game, showing the play-by-play, a compact scoreboard and scoring plays as they happen

utilityman

pip install utilityman

Follows a live MLB game in your terminal — play-by-play, a compact scoreboard and scoring plays as they happen — without opening a browser.

  • Data extraction
  • Baseball

Built with Python, CLI

The DodgersData.bot dashboard, showing a run differential chart and the season record

DodgersData.bot

An automated pipeline that tracks Dodgers standings and game-by-game performance against every season back to 1958, and publishes the whole thing to a live dashboard each morning.

  • Data viz
  • Analysis
  • Baseball

Built with Python, pandas, D3

A screenshot of the Trump Truth Social archive, showing a post and its engagement metrics.

Now maintained by CNN

Trump Truth Social archive

An auto-updating archive of President Trump's Truth Social posts, built when there was no reliable public record of them.

  • Data extraction
  • Politics

Built with Python

Dot density map of the United States showing thousands of retail locations

Locations

Scrapers that gather store and restaurant locations for major US chains, so you can map a company's footprint without asking the company for its data.

  • Data extraction
  • Mapping
  • Retail

Built with Python, GeoPandas

An LAPD helicopter over the Los Angeles skyline

LAPD Choppers

Tracks LAPD helicopter flights and maps patrol intensity by division, reporting district and neighborhood, so you can see which parts of the city get flown over and how often.

  • Mapping
  • Analysis
  • Los Angeles

Built with Python, GeoPandas

North Korean leader Kim Jong-un is seated in a room with other North Korean leaders, according to KCNA.

North Korea trackers

Two pipelines running side by side: one archives hundreds of provocative actions, from missile launches to nuclear tests, and the other scrapes state media headlines as they publish.

  • Data extraction
  • Foreign affairs

Built with Python

A screenshot of an object from the database's contestant table showing the first US winner, Richard Hatch.

survivoR2py

Converts an R-only archive of every Survivor castaway, challenge and vote into CSV and JSON on a daily schedule, so the show's full record is usable without knowing R.

  • Data extraction
  • Television

Built with Python, GitHub Actions

Map of central Los Angeles with purple dots marking jacaranda trees

JacarandaMap

I've collected more than 1.6 million geocoded street trees across 40-plus Los Angeles-area municipalities from dozens of separate agencies. I put the iconic purple ones on this map.

  • Mapping
  • Los Angeles

Built with Mapbox GL, Python

Calendar heat map of US birth frequency for every day of the year

BirthdayRank

An interactive look at which birthdays are common in the United States and which are rare, and why the pattern is stranger than you'd guess.

  • Data viz
  • Demographics

Built with Svelte, D3

The What's My LA home page, with an address search field

What's My LA

Type an address and see which Los Angeles you actually live in — neighborhood, council district, school zone and the rest of the overlapping boundaries.

  • Mapping
  • Los Angeles

Built with Svelte, Mapbox GL