Most of us grew up in the GTA and have never seen the Milky Way from home. Toronto's sky is rated Bortle 8 to 9, which means on a clear night you can count about 35 stars where you should see a couple thousand. That is skyglow, light thrown sideways and upward from millions of fixtures and scattered back down by the atmosphere. Light pollution is one of the fastest growing forms of pollution on Earth. The night sky has been brightening close to 10 percent a year, and it disrupts migrating birds, pollinating insects, and human sleep while burning electricity for nothing. It is also the only major form of pollution you can reverse overnight. Swap the fixture and the sky comes back. We could not find a single tool that goes from a satellite's view of the glow all the way down to the individual streetlight causing it. Heat maps exist. Star apps exist. Nothing connects the two. So we built it.
Starry Night is the first tool we know of that diagnoses light pollution from orbit to the streetlight. It opens on a globe lit with real satellite night light data so you can see where on Earth the night is disappearing. It then flies into Toronto and cuts the city into 250 metre cells coloured by measured sky brightness, each with its Bortle class and the number of stars you can actually see from it. A second layer shows how every cell's light has changed since 2013 from VIIRS satellite data, and our forecast model runs the trend out to 2030 so you can watch the glow spread block by block.
Click any hotspot and the app explains it. It pulls Street View images aimed at the real streetlight poles from Toronto's open pole census, runs our fixture detector to find every light and label it shielded or unshielded, and counts the poles in that cell out of the city's 220,000. Unshielded fixtures are the ones sending light into the sky, so the app tells you how much of that block's glow is fixable, what a retrofit saves in electricity and CO2 each year, how fast it pays for itself, and how many stars come back. Then it shows you, with the same street rendered at night today and after the fix, and a street level panorama where every detected fixture is highlighted. There are four layers, each one real. The measurement layer grids the Falchi World Atlas of Artificial Night Sky Brightness to 250 metre cells and converts each to a Bortle class and visible star count, then adds EOG VIIRS annual night light composites from 2013 to 2024 for the growth layer. The forecasting layer fits a regression on twelve years of radiance per cell with an XGBoost residual model on top, which beat the plain trend by 26 percent on a 2022 to 2024 holdout with an R squared of 0.94.
The computer vision layer is two models we trained during the hackathon. First a MobileNetV3 classifier on 551 fixture images we gathered the first night, then a YOLOv11 detector fine tuned on 775 images we auto labeled from three sources, including Edmonton's open LED conversion dataset, with the origin of every label recorded in a provenance file. We aim the Street View camera at each pole by computing bearings from the City of Toronto pole dataset, 305,237 poles with about 220,000 that emit light, so the detector is looking at actual fixtures rather than random street scenes.
The generative layer uses Gemini image editing to render the real daytime Street View photo as the street at night today and after the retrofit, and Claude writes a two sentence diagnosis that is only allowed to use numbers we computed. The site itself is Next.js with Mapbox GL and three.js for the globe, the 3D city, and the panorama viewer. An offline Python pipeline produces everything the site displays, and the savings are plain arithmetic from public constants like wattage, burn hours, Toronto Hydro rates, and Ontario grid intensity, each with a citation. Measuring light pollution at the block level is hard. The best sky brightness atlas is a decade old and coarse, and satellites see light going up without seeing where it came from, so we had to combine orbital glow with ground level fixture data to say anything about causes. Data access ate most of the first day. Wikimedia Commons rate limited our cloud GPU and we lost hours before switching sources, and the 2012 VIIRS composite only covers part of a year so we dropped it. Street View is daytime only, which is a real obstacle for a project about the night, so the night views had to be generated from daytime photos and took many prompt iterations before they looked like photographs. Aiming the camera at actual fixtures needed bearing math from each panorama to each pole, and our first version was off by 90 degrees, which we only caught by looking at the images. The hardest problem was labels. Cities publish where their poles are but not whether the fixture is shielded, so we mapped Edmonton's LED versus non LED field onto shielded versus unshielded and accepted noisy labels. We report the detector honestly at 64 percent mAP50 on held out data rather than hiding it.
We shipped an idea that creates impact, a pipeline from satellite to streetlight, with every stage working end to end. Every number in the app traces back to a measurement, a public dataset, or a cited constant, and the glow map is what the satellite saw rather than a score we invented. We trained two working models in under 36 hours on data we collected and labeled ourselves and documented where every label came from. Our forecast validates on years it never saw. We did not fake the demo. All ten hotspots are computed identically, so a judge can click any of them and get a real diagnosis. And the moment we set out to build on day one, zooming from the globe down to a Toronto street and watching the stars come back over it, is in the app.
Light pollution is a design problem, not a quantity problem. Toronto does not need less light on its roads, it needs light that stays on the roads, and the difference between a shielded and an unshielded fixture is most of the story. The data to prove this is mostly public if you go looking, and the piece missing everywhere is fixture type, which is exactly what our detector fills in. We also learned that precomputing everything and serving static files let four people work in parallel with nothing able to break live, and that the environmental case lands hardest when the stars, the electricity, and the birds are shown together.
The pipeline is city agnostic and the glow and growth layers already cover the whole globe, so the immediate next step is running five more cities with open pole data. We want to put this in front of Toronto Hydro and the City's Transportation Services, who own the streetlights, with a one page export that a resident or councillor can attach to a 311 report or a council motion. We will work with the Royal Astronomical Society of Canada's dark sky program to check our Bortle estimates against ground readings, get real fixture type labels from a lighting department to retrain the detector properly, and bring back the phone app we started with as a citizen reporting layer, where a photo of a bad fixture gets classified and pinned to the map so the dataset grows every time someone looks up.
Built With
- claude
- nasa-coordinated-data-analysis-system-(cdas)
- worldlabs

Log in or sign up for Devpost to join the conversation.