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
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, Python
Web of corruption
Web of corruption

See how all the major players in San Francisco's ongoing city corruption scandal are connected.

Python, D3
Hill bomb arrests
Hill bomb arrests

Interactive timeline of the Dolores Park Hill Bomb, when 117 people were arrested during a purported riot.

Mapbox, JavaScript
Fatal SFPD shootings
Fatal SFPD shootings

An interactive database with details on everyone killed in San Francisco police shootings since 2000.

JavaScript, illustrations
How did your neighbors vote?
How 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, JavaScript
Crime change in 2022
Crime change in 2022

Maps and scrollytelling charts to show how different types of crime changed from 2017 to 2022.

Python, Illustrator, JavaScript
Bomb-armed police robots
Bomb-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
$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, D3
Weekly news quiz
Weekly news quiz

An interactive quiz format to recap the week's most interesting news nuggets, developed with Craig Mautner.

JavaScript, PHP
Boudin recall funding
Boudin recall funding

Interactive beeswarms and donut charts show donors for and against the recall of Chesa Boudin.

Python, D3, Illustrator
San Francisco budget
San Francisco budget

Created an interactive budget explorer for the 2023-25 period, with detailed explanations and breakdowns.

JavaScript, D3, Datawrapper
June 7 recall election
June 7 recall election

Maps and graphics showing precinct-level results of the recall of District Attorney Chesa Boudin.

Mapbox, JavaScript, CSS
Trip in a driverless car
Trip in a driverless car

Contributed a dynamic scrollytelling map to Yujie Zhou's story about a trip through SF in a driverless cab.

Mapbox, JavaScript
Mission Local crossword
Mission Local crossword

Created a New York Times-style crossword app and wrote a spooky(ish) puzzle for Halloween.

JavaScript
SF's redistricting debacle
SF's redistricting debacle

Deeply covered the city's redistricting process, and broke the news that Chair Townsend felt pressured by the mayor.

JavaScript, Mapbox
Rise in scooter collisions
Rise in scooter collisions

Interactive mapping and graphics to show the 31% increase in scooter collisions in the past year.

Mapbox, Python, Illustrator
Nov. 8 donor web
Nov. 8 donor web

An exploration and explanation of the complex web of donors giving millions in SF's local election.

Python, D3
State climate partisanship
State climate partisanship

In state climate votes, partisanship has been steadily increasing over the past five years. But why?

JavaScript, Altair, Datawrapper
Federal green policies
Federal green policies

Showed how legislators in Congress and the Senate often lag behind public opinion on environmental policies.

Python, Illustrator
Community internet networks
Community internet networks

When Covid struck, millions of children couldn't go to class. NYC community groups rushed to improve their access.

Python, Illustrator, JavaScript
Green roof policy
Green roofs in NYC

Green roofs have many benefits, but adoption has been slow. New NYC laws hope to change that.

Photography, QGIS