Max Silverstein

York St Vector

An enforcement PWA that checks an odor complaint against live wind data before it is filed.

Live

Visit site
Wind status panel showing an ordinance heading, Denver household ordinance reference, wind direction dial with REPORT ODOR control, and live wind speed/direction readout.

Screenshot · Wind & status · captured 2026-09-05

Built
Jun 2026 – Jul 2026
Role
Solo
Stack
Next.js · Supabase · PostGIS · NOAA NWS API
Status
deployed
Published figures as of
2026-09-04

A pet-food plant in Denver produces an odor. The city’s enforcement mechanism runs on complaints, and a complaint that cannot place itself downwind of the source is easy for a regulator to discount. This checks the physics before the complaint is sent, not after.

Problem and failure definition

An odor complaint is a claim about air that has already dispersed. Without a wind check, it is a resident’s word against a plant’s, and the plant has an incentive structure the resident does not. The failure mode is a complaint that is true but unverifiable, filed into a process that treats unverifiable the same as false.

The ordinance also does not count raw complaint volume. It triggers on complaints from separate households inside a rolling 30-day window. A tool that only counts complaints, without tracking which household each one came from, would overstate progress toward the trigger and understate what is actually required.

System

Meteorological wind direction is reported as the direction wind comes from, not the direction it blows toward. A downwind dispersion check has to invert that before it means anything, so the bearing from plant to reporter is compared against (dir + 180) % 360, and distance is computed with the Haversine formula. The reporter’s geolocation passes the check if it falls inside a 45° cone along that inverted bearing.

Verification does not trust a single reading. NOAA NWS reports are noisy at the timescale of a single observation, and a single instant is also exactly the kind of evidence a regulator can wave off as a momentary gust. The check instead pulls a 90-minute lookback from two NWS stations bracketing the plant and requires consensus across both before a complaint is marked wind-supported.

Complaints are attributed to households, not devices or sessions, so the 30-day window tracks distinct households against the ordinance’s actual trigger condition rather than against complaint count.

When a complaint clears the wind check, the app pre-composes an evidence-backed complaint — timestamp, geolocation, station consensus, computed bearing — ready to send.

Verification

The wind-direction inversion and the Haversine cone test are the two places a sign error or a unit error would silently produce a plausible-looking but wrong result, so both are covered by tests against known bearing/distance pairs. The two-station consensus logic is tested against synthetic station disagreement to confirm it withholds support rather than defaulting to a single station when they disagree, tested to the same bar described in the site’s method.

No comparison between the city’s own determination and the app’s wind analysis has been collected or published. That outcome data would depend on the city’s enforcement process, which is outside this system’s visibility.

Result

The app is deployed and computes the wind check, the household-window tracking, and the pre-composed complaint against live NOAA data. It has been used to file real complaints.

Limits

There is no public submission API for the city’s enforcement process, so filing is assisted, not automated — the app prepares the evidence and a human still sends it. The app has no visibility into the regulator’s own determination once a complaint is filed, so it cannot verify whether the city agreed the odor was plant-sourced, only that the wind analysis supported the claim at submission time. There is no measurement of how many filed complaints were accepted, and none is claimed.

The cone test also requires the complaint to be observed from a location that falls inside city boundaries; a real exposure just outside that boundary does not count toward the ordinance’s trigger, regardless of what the wind data shows.