Hello!
I'm Will. I tell stories with data. If you have any questions about my journalism, editing, or coding experience, download my CV or drop me a message.
Your neighborhood in data
A JavaScript web app that allows users to compare data on a custom area in San Francisco with the city at large.
JavaScript, Mapbox, PythonWeb of corruption
See how all the major players in San Francisco's ongoing city corruption scandal are connected.
Python, D3Hill bomb arrests
Interactive timeline of the Dolores Park Hill Bomb, when 117 people were arrested during a purported riot.
Mapbox, JavaScriptFatal SFPD shootings
An interactive database with details on everyone killed in San Francisco police shootings since 2000.
JavaScript, illustrationsHow did your neighbors vote?
An interactive that shows users how their neighborhood voted on Nov. 8 compared to the rest of the city.
Mapbox, Google API, JavaScriptCrime change in 2022
Maps and scrollytelling charts to show how different types of crime changed from 2017 to 2022.
Python, Illustrator, JavaScriptBomb-armed police robots
Broke the news that SFPD was planning to explicitly authorize robot lethal force. The policy was reversed after protests.
Plain old reporting$70 million in cop settlements
Explore the cash that has been paid out in all the San Francisco law enforcement settlements since 2010.
Python, Illustrator, D3Weekly news quiz
An interactive quiz format to recap the week's most interesting news nuggets, developed with Craig Mautner.
JavaScript, PHPBoudin recall funding
Interactive beeswarms and donut charts show donors for and against the recall of Chesa Boudin.
Python, D3, IllustratorSan Francisco budget
Created an interactive budget explorer for the 2023-25 period, with detailed explanations and breakdowns.
JavaScript, D3, DatawrapperJune 7 recall election
Maps and graphics showing precinct-level results of the recall of District Attorney Chesa Boudin.
Mapbox, JavaScript, CSSTrip in a driverless car
Contributed a dynamic scrollytelling map to Yujie Zhou's story about a trip through SF in a driverless cab.
Mapbox, JavaScriptMission Local crossword
Created a New York Times-style crossword app and wrote a spooky(ish) puzzle for Halloween.
JavaScriptSF's redistricting debacle
Deeply covered the city's redistricting process, and broke the news that Chair Townsend felt pressured by the mayor.
JavaScript, MapboxRise in scooter collisions
Interactive mapping and graphics to show the 31% increase in scooter collisions in the past year.
Mapbox, Python, IllustratorNov. 8 donor web
An exploration and explanation of the complex web of donors giving millions in SF's local election.
Python, D3State climate partisanship
In state climate votes, partisanship has been steadily increasing over the past five years. But why?
JavaScript, Altair, DatawrapperFederal green policies
Showed how legislators in Congress and the Senate often lag behind public opinion on environmental policies.
Python, IllustratorCommunity internet networks
When Covid struck, millions of children couldn't go to class. NYC community groups rushed to improve their access.
Python, Illustrator, JavaScriptGreen roofs in NYC
Green roofs have many benefits, but adoption has been slow. New NYC laws hope to change that.
Photography, QGIS