For a full list of my projects, see my GitHub page. To see details about my work for NY Times, Khmer Times, Charlotte Magazine, and others, check out my resume on Dropbox. And you have my permission to follow me on Twitter.


I’m addicted to building graphs with D3 and making maps with Leaflet. You can see the terrible consequences of my addiction here. Titles are links to the visualizations.

Dynamic weather graph

A React app that populates a select box with the list of cities from Weather Underground’s autocomplete API. When a city is selected the app makes another AJAX call to Weather Underground, then generates a D3 line graph of the hourly forecast for that city for the next three days, as well as historical high and low temperatures.

Source on GitHub.

Austin restaurant health scores

A LeafletJS map with marker clusters and search functionality that plots the locations and scores of all the establishments (restaurants, hotels, and schools) in the city’s health inspection database. I obtained the data from data.austintexas.gov, cleaned it with OpenRefine, geocoded the addresses, and converted it to JSON with a Python script.
Source on GitHub.

How does movie quality correlate with box office gross?

An interactive bubble scatterplot with data about some of the big-budget movies of 2013. The x, y, and radius of each bubble encodes the movie’s Rotten Tomatoes score, worldwide gross, and budget. Hover over one of the bubbles to see the movie’s title. The data was provided as part of the Information is Beautiful contest.
Source on GitHub

Minimum wage by state

A sortable D3 bar chart that uses a linear scale to programatically set the color of each of the bars, and features nice, smooth transitions from sorted to unsorted.
Source on GitHub

Number of masted warships active in British Royal Navy

I’m currently reading Patrick O’Brian’s magnificent Aubrey-Maturin series, and wanted to graph the rise and fall of the man of war as the workhorse of the British navy. Using data I scraped from this site, I filtered out all the ships with fewer than 5 guns, and plotted the resulting numbers of ships on a line graph. The data I used to plot this graph was collected by an enthusiast, not a professional, so take it with a grain of salt.
Source on GitHub

NASA yearly budget since 1960

An interactive line graph built with D3 that creates a tooltip with information about the datapoint closest to the user’s mouse.
Source on GitHub

Possible tax revenue from gambling in GA

A set of HTML sliders built with D3. Each of the sliders uses D3’s linear scale to show the value encoded by the handle’s position. The script uses D3’s dispatch() event listeners, as well as the useful drag() function, to change the labels and the position of the slider handles.
Source on GitHub


I’ve built a number of projects using a Postgres - Django Rest Framework - React stack, as well as a couple Chrome extensions and a chat bot powered by NodeJS and Socket.io.


A single-page application built with Django Rest Framework and React that allows users to create flight price alerts and emails them when the price of a flight drops below the price they’ve set. Features live updates, a management command to get pricing from Google’s QPX cheap flights API, and a user authentication system that uses react-router to control access to certain pages.

Elizabethan Insult Bot

A simple chat bot with an Express server that uses Socket.io to listen for messages, and quickly updates the page with the user’s message and a response that’s automatically generated by the server: in this case a randomly-generated insult composed of popular Elizabethan phrases.

Sun Never Sets on Us

An imprecise location-sharing app built with Django that allows users to share which city they’re in with friends, and sends them weekly email updates about where their friend group has moved. It’s linked to a chrome extension that gets the user’s location with the HTML5 navigator API, and uses Google’s reverse-geocoding API to find the city name. The app features a system for creating “friendships” between users, and sends friend requests via AJAX without a page refresh.

Wikipedia Hummingbird

A chrome extension that pulls data from Wikipedia. The user highlights a term, hits a keyboard shortcut, and the extension pops up a modal with the first paragraph of the first article on that subject from the Wikipedia search results, as well as a link to the full article.

Django Adventure

A simple framework for building adventure games with Django.

Three Digit

An app that scrapes story view counts from khmertimeskh.com and uses the data to track reporters’ views. It uses pattern-matching to get story urls from the front page, and parses each story for the reporter’s name, headline, and view count. The data is served from a Django Rest Framework backend and displayed by a ReactJS frontend.


Gotta love maps. I used CartoDB to create a map of all the drunk driving arrests in the city of Charlotte in 2013/4, using data I obtained from the police department and cleaned using OpenRefine. I also made a map of which countries the most popular TV shows in Cambodia come from.