All work
Live/2026

Scanopy

Turning raw aerial imagery into a scored, mapped lead product.

A geospatial computer-vision pipeline that analyzes county imagery to measure tree canopy over structures, scores properties by hazard and ownership signals, and ships the result as a live, filterable map of prioritized leads for tree-service companies.

3,500+
Properties scored
7 (metro)
Counties
NDVI canopy
Detection
Live map
Delivery

The problem

Tree-service companies waste enormous effort on blind prospecting — knocking doors and buying generic mailers with no idea which properties actually have hazardous, billable tree work. The signal they need is literally visible from above, but it's buried in raw satellite and aerial imagery that no busy owner-operator has time to process.

Scanopy extracts that signal automatically: it identifies properties where tree canopy overhangs structures, ranks them by risk, layers in ownership data, and turns a city's worth of imagery into a clean, prioritized lead list.

What I built

  • Remote-sensing pipeline: ingests county GIS parcels and high-resolution aerial/NAIP imagery, computes NDVI-based canopy detection, and measures overhang area over building footprints.
  • Handles real geospatial complexity — multi-CRS reprojection across UTM-zone-straddling counties, raster/vector spatial joins, and per-county imagery sourcing at the best available free resolution.
  • Scoring model ranks ~3,500+ properties into hazard tiers and cross-references ownership (absentee / LLC / investor) to surface the highest-conversion segments.
  • Storm Tracker: fuses the hazard model with live severe-weather data — pulling NWS thunderstorm and tornado warning polygons and intersecting them with ranked properties to surface homes that *just took a storm*, ranked by hazard × storm severity × recency.
  • Shipped as a live product: a fast, mobile-first interactive map (Leaflet) on Cloudflare Pages, with filtering by county, tier, and property type, plus a server-side blacklist backed by Cloudflare KV.
  • Productionized end-to-end — automated multi-county batch rendering, a deploy pipeline, and real users in mind from data ingestion to the pixels on screen.

Architecture

  1. 1County GIS parcels + aerial / NAIP imagery → ingestion
  2. 2CRS reprojection + raster/vector spatial join
  3. 3NDVI canopy detection → overhang-over-structure measurement
  4. 4Hazard-tier scoring + ownership distress signals
  5. 5Storm layer: NWS severe-weather polygons (IEM archive) → buffered spatial intersect → urgency-ranked storm-hit leads
  6. 6Per-county batch render → Cloudflare Pages (Leaflet map)
  7. 7Server-side blacklist via Cloudflare KV + Pages Functions

Storm Tracker — real-time severe-weather targeting

Storm Tracker layers live weather onto the hazard list: it pulls NWS thunderstorm/tornado warning polygons from the IEM archive, intersects them with ranked properties, and surfaces homes that just took a storm — scored by hazard × severity × recency, with a toggleable warning overlay on the map.

What it demonstrates

Scanopy is data engineering and computer vision applied to a messy real-world domain: heterogeneous imagery sources, coordinate-system headaches, and the gap between a raster of pixels and a ranked business decision.

It also shows product thinking — identifying who pays for a signal, then building the whole pipeline that delivers it, from satellite imagery down to a tappable map a non-technical user actually wants to open.

Stack

Pythonrasterio / GDALGeoPandasNDVI / Remote SensingLeafletCloudflare Pages / KVWrangler