I'm a software developer, designer and journalist. I process, analyze and visualize data, design and build websites. Sometimes I make things just for fun.
For the D.C. mayoral and attorney general primaries, I built a precinct- and ward-level scraper for the Washington Post to map the results live on election night.
I designed and developed a scrollytelling map of the properties bought by a Reno developer for this ProPublica investigative project.
For STAT, I built a mobile app for iOS and Android to showcase their stories and better engage mobile readers. The app lets readers follow their favorite topics and reporters, save stories for later reading and login with their STAT+ account.
For fun, I built this interactive graphic to showcase data collected by an open source Big Local News project to scrape layoff notices from all 50 states. I contributed open source scrapers to the project for several states as a volunteer.
I contributed to this Knight-funded project to process TV data in real time. The Node.js framework ingests streaming TV feeds and processes it to extract captions and other data.
I made maps to show the states in the “red zone” of the coronavirus pandemic, the first time this White House metric was published as the president downplayed the pandemic.
To show the state of presidential money, I crunched the data behind this graphics story designed and developed by Julia Wolfe of FiveThirtyEight. The analysis used Python code and relied on a real-time SQL database of campaign finance information.
I released this set of flexible Node.js utilities designed to discover, convert and load raw Federal Election Commission filings into a database. This code, trusted by journalists at the Washington Post and New York Times, loads filing of unprecedented size with ease, allowing anyone to analyze FEC data in detail.
I built a tool that helped newsrooms compile databases of Trump officials' financial histories. This was used to report a daily story by the New York Times, to build ProPublica's Trump Town news app and to report an award-winning national radio story with Reveal from the Center for Investigative Reporting.
I analyzed more than 80 million records in a nearly unprecedented analysis of Congressional Democratic candidates' reliance on this fundraising platform as it became the de facto way Democrats raise money.
Released on April Fools' Day 2020, this browser extension replaced Gmail’s Smart Replies with lines of poetry. It was enjoyed by many, including Gmail project manager Paul Lambert, who wrote, “This is amazing. I wish we had thought of it!” It was mentioned on Lifehacker and The Verge.
Analyzed a universe of PACs that raised from small-dollar donors and spent mostly on themselves. Zeroed into one telemarketer's charitable solicitation operation with a reporter. Built graphics to tell the story.
Designed and developed the presentation for this series on the frightening near-misses in the nation's nuclear complex. Worked with an illustrator to develop a look and feel that helped tell the story.
This was an ambitious multi-part series on the places and people with little political clout. I designed and developed the presentation, as well as overseeing data analysis and graphics production.
Created a quick Serverless API and Observable notebook for this interactive knowledge test which asked users to point to Ukraine after a cabinet secretary asked an NPR anchor if she could. It received a million attempts, only 300,000 of which were from bots.
Designed the presentation for this striking story on a preventable death and what it says about workplace safety enforcement.
Helped a reporting team collect, track and input data from nearly every state legislator's financial disclosure in the country, then built an app using DocumentCloud to search and view the disclosures.
Designed and developed this Emmy-nominated multimedia presentation on miners dying in Africa for ICIJ.
Helped the ICIJ report on China phase of its Offshore Leaks investigation. Designed and developed a graphic to show the results, which was localized into half a dozen languages, embedded by Le Monde, El Pais, Süddeutsche Zeitung.