A WebVR interactive of Marquez Jackson’s cell at the Bon Air facility.
Parts from the F-35 are sourced from over 250 locations around the globe, spanning 11 countries and, in the U.S., more than 90 congressional districts. Hover over any red dot to see a list of contractors.
The first map above (in green) shows per-capita military enlistments from 2000 to 2010, grouped by 3-digit zip code. The second (in red) shows the home towns of deceased soldiers from the Iraq and Afghanistan wars. Enlistment rates vary widely—in 2010, only 0.04 percent of the Upper East Side of Manhattan (zip code prefix 101) enlisted, while the U.S. Virgin Islands (prefix 008) had an enlistment rate of 0.98 percent. When it comes to lives lost, U.S. territories (particularly Guam) shoulder an outsized burden.
A 1939 Home Owners’ Loan Corporation “Residential Security Map” of Chicago shows discrimination against low-income and minority neighborhoods. The residents of the areas marked in red (representing “hazardous” real-estate markets) were denied FHA-backed mortgages.
Explore census data in Chicago on race, vacancy rates, and unemployment from 1950 to the present.
The Autograph chart editor
After uploading, users can review and edit their dataset
Autograph allows for basic regression analysis and normality testing
The interface for choosing the chart type and columns to use for the chart.
Bloom asset management, with multilingual full-text search
The overview screen of a text in the Bloom content repository
Editing a text in the Bloom content repository


Resume (PDF)



VR Interactive for “Virginia’s Juvenile Justice Reform”

Mar 2018
Skills used
Three.JS, Maya

In March 2018, the video team at The Atlantic produced a series of VR videos focusing on current and former residents of Bon Air, the last juvenile detention facility remaining in Virginia. In addition to building a custom landing page to showcase the video series, I modeled a resident’s cell in Maya 3D based on the footage shot inside it. I then exported it into a format usable by ThreeJS, to create a WebVR interactive that accompanies the documentary series.

NginxConf 2018

Oct 2018

Using NGINX for release automation at The Atlantic

In this talk I jointly gave with Mike Howsden, DevOps Lead at The Atlantic, I detailed the way we have used NGiNX, together with uWSGI, Phusion Passenger, and Jenkins, to build a continuous delivery pipeline for QA. Every pull request opened on our private GitHub repository provisions a full instance of our site’s stack, in as little as 10 minutes, using very few incremental resources.

EuroPython 2017

Jul 2017

2 + 2 = 5: Monkey-patching CPython with ctypes to conform to Party doctrine

While testing the limits of using ctypes to access CPython internals, I became interested in whether it would be possible to monkeypatch integer addition at runtime using only python (framing it around the trope of “2 + 2 = 5”). Surprisingly, this can be done (see python-doublescript), so I turned this experiment in monkey-patching python integer addition into a talk I gave at EuroPython 2017.

DjangoCon 2016

Jul 2016

High Availability Django

In this talk I discussed how we are using uWSGI at The Atlantic for zero-downtime deploys.

DjangoCon 2015

Sep 2015

Building theatlantic.com’s homepage WYSIWYG admin

This talk discussed how, in building a WYSIWYG interface for editing the homepage of theatlantic.com, we used Knockout for two-way data binding of django formsets to allow sorting with drag-and-drop functionality, inline editing of html, and image uploads and cropping.

Maps for “The Tragedy of the American Military”

Dec 2014
Skills used
d3, PostGIS, QGIS

Maps for “The Case for Reparations”

Jun 2014
Skills used
Tilemill, Leaflet, PostGIS, QGIS

Autograph, The Atlantic

Sep 2011
Skills used
Python, Django, MongoDB, Java

In September of 2011 The Atlantic launched a new sister-site—The Atlantic Cities (presently known as CityLab)—aimed at exploring urban issues and stories about life in cities for the people who research, manage, and live in them. One of the editorial goals of Cities is to place an emphasis on telling stories using a variety of media, from charts and maps to photos and video. To that end I was asked to revisit a prototype of a chart-building tool I had built and demoed several months prior for turning excel spreadsheets into interactive charts using the Highcharts javascript library.

That fall I turned my prototype into “Autograph,” a Django application for managing datasets, performing basic regression analysis, and building customized charts. While Autograph itself is not open-source several of its components are, including py4j-highcharts, a Java application that renders and rasterizes charts server-side for building previews and thumbnails. py4j-highcharts uses py4j, a library for bridging python and Java applications, to be able to take advantage of Java libraries such as Rhino and Batik.

Ted Deutch for Congress website, contract

Dec 2011
Skills used
HTML + JS, Python + Django, Facebook API, BSDAPI
tedforcongress.org screenshot

In the lead-up to the 2012 election I was contracted to design and build a new campaign website for Ted Deutch's re-election campaign in Florida’s 21st congressional district. The result, tedforcongress.com, is built in Django and allows campaign staff to update the site content, add pages, and even edit the site’s templates from the admin.

Bloom, The National Foreign Language Center

Dec 2009 – Sep 2010
Skills used
HTML + JS, XForms, PHP, Zend Framework, IBM DB2, XQuery
bloom interface screenshot

From December of 2009 to September 2010 I was the lead programmer on Bloom, a web-based CMS designed to meet the National Foreign Language Center's need for a flexible and modular authoring environment for creating language-related activities.

At the time I left, Bloom provided for the entry and storage of authentic source materials in 46 languages. These source materials, or "assets," are solicited from consultants across the globe who are charged with finding and uploading high-quality text and audio content. These "assets" are then sent through a rigorous QA process before eventually being used to create activities for language instruction and language proficiency assessment.