This app is called canopy, a proprietary model for helping trees in various cities grow and keeping populations happy. All of the data included is free.
Inspiration
It started with a simple question: who decides which tree gets saved?
In Chicago, street trees are critical infrastructure. They reduce heat, absorb stormwater, and improve public health. Yet tree maintenance is largely driven by 311 complaints, meaning neighborhoods that call more often receive more attention while underserved communities can be overlooked.
We imagined a smarter system: one that dispatches arborist crews like ambulances, prioritizing need instead of complaint volume. That became Canopy.
What it does
Canopy transforms Chicago’s live 311 tree-service data into a real-time dispatch dashboard.
Each of Chicago’s 77 community areas receives a Canopy Stress Index (CSI), a score from 0–100 that estimates how urgently a crew is needed. CSI combines six factors: service pressure (42%), community vulnerability (18%), time since last service (15%), complaint trends (13%), unresolved requests (8%), and drought conditions (4%).
An interactive map highlights priority neighborhoods while a live dispatch queue ranks where crews should go next. Users can sort by urgency, neglect, or complaint trends, search any neighborhood, and open a field briefing showing service history, complaint trends, repeat-request locations, and canopy information from OpenStreetMap and iNaturalist. An equity mode recolors the map using Chicago’s Hardship Index, helping prioritize neighborhoods with the greatest need rather than the loudest voices.
How we built it
Canopy is built entirely with HTML, CSS, JavaScript, and Leaflet. Data comes from Chicago Open Data (311 requests and service history), Open-Meteo, the Chicago Hardship Index, OpenStreetMap, and iNaturalist. AI-generated dispatch briefings are produced using Groq running Llama 3.3 70B through a secure serverless function. The project is deployed on Vercel using only free services.
Challenges
Our biggest obstacle was discovering that Chicago does not publish a neighborhood-level tree inventory. Instead, we estimated tree age using OpenStreetMap trunk measurements and species data from iNaturalist.
Deployment also proved difficult when Vercel repeatedly failed to detect the correct build configuration. Explicitly configuring static assets and serverless functions solved the issue.
Late in development, a hover-state bug caused AI briefings to display the wrong neighborhood. Restoring the selected area after mouse-out fixed the issue.
Finally, our first CSI rewarded neighborhoods with the highest complaint volume. Incorporating Chicago’s Hardship Index shifted the focus toward equitable resource allocation.
Accomplishments
We are most proud of the equity map, which reveals neighborhoods with the greatest need instead of simply the most complaints.
The project is also practical and accessible. Every data source is public or free, making Canopy inexpensive to deploy and easy to adapt for other cities. Small touches like onboarding, AI-generated field briefings, and clear CSI explanations make it intuitive for users.
What we learned
Open data rarely fits together cleanly. Building Canopy required combining 311 requests, historical service records, weather, socioeconomic data, and community tree information into one unified system.
We also learned that constraints often drive innovation. The missing tree inventory ultimately led to one of the project’s most creative solutions.
What’s next
Next, we plan to expand Canopy beyond Chicago, allow dispatchers to assign and track crews directly, refine CSI weights with arborists and city foresters, and use historical data to predict where tree-service demand will emerge before complaints are filed.
A tree planted today provides shade for someone tomorrow. Canopy helps cities decide which trees to save first.