
Shuhul - A closure
Shuhul started with a fascination for Kashmiri architecture, an old green-roofing technique called Burze Pash, and a frustration with how we build our cities today. What began as an idea about where to plant trees became a tool for asking a harder question: when we build, what are we taking away, and how do we make up for it? This is the story of building Shuhul, the data problems, the failures, and what we learned trying to map the environmental cost of development in Kashmir.
The seed of this project was sown quite a few years ago, and only now has it materialised into something solid.
I have always loved architecture, from Soviet Brutalism to English Tudor and Victorian. Growing up in Kashmir, I have had a deep fascination with our own traditional architecture, its intricate work, its exceptionally complex roofs, and every little detail. Arguably, it is one of the best in the subcontinent for the absolute variety it holds, the materials it uses, and the purpose each element serves.
The variety runs from small structures that look like houses but are used to store and dry grain, sometimes two storeyed to accommodate cattle, and which still dot rural Kashmir, to lavish five to seven storeyed houses with panjrakari wood-lacing, paper mache walls and khatamband ceilings. The materials are wood, mud, stone, brick, birch bark and paper mache, brought together in ways that are both beautiful and practical.
And then there is the purpose behind each thing. From something as romantic as a zoon daeb, roughly a "moon-hanging room", a cantilevered balcony meant for looking at the moon, to the practical: the earthquake-resistant Dhajji Dewari, the Tak system, the floor-heating hamam, and wall braces for drying vegetables in the sun so they could be stored for winter.
Following this rabbit hole, I came across a roof style called Burze Pash in a very old book, The Valley of Kashmir (1895) by Walter R. Lawrence. It described how layers of birch bark, burze in Kashmiri, and mud were topped with wildflowers, irises and tulips, creating "miles of verdant roofing" across Srinagar. These roofs were sometimes even used as kitchen gardens.

Later I saw how Singapore and China were turning to eco-architecture, with green roofs an important part of it, and how Scandinavian countries build sod roofs with a very similar technique of soil and vegetation. Theirs usually grow grass. Ours grew flowers and kitchen gardens.
I asked my father about it, and the more I thought about it, the more interesting it became. Environmental challenges are a global issue, and Kashmir is an especially sensitive region. Yet we already had a native technique for building these beautiful green roofs.
It became quite clear that the people developing our streets did not fully understand what was at stake. Especially after the Smart City Srinagar project, where so many Chinar trees, trees that can take hundreds of years to grow, were cut down.
Recently, while discussing ideas for the hackathon, I sent an angry voice note to my teammate asking him to come up with some, and to review the ones I had sent. He replied with:
"Finding the most efficient tree placement in urban areas in order to maximize shade and minimize ambient temperature."
"Ya Zameen plotás manz kya chi best space utilisation"(Kashmiri)
Meaning, finding the best use of space in a plot of land.

All of this came together at once. The frustration over the awfully designed Smart City with little regard for green spaces, the Burze Pash, the way other countries were approaching urban planning, all of it merged, and we came up with the idea for Shuhul.
What Shuhul is
Shuhul is the Kashmiri word for shade.
It is a planning tool built around the question nobody seemed to ask before those Chinars came down: what will this cost in trees, water and heat, and how do we pay it back?
You pick two points on a map and say what matters to you. Shuhul draws three routes between them. For each one it counts the trees in the way, the water it crosses, the flood-prone ground it sits on, and how much hotter it leaves the surface. Then it shows where to plant trees, where to plant shrubs, and which roofs to turn green to repay that heat.
That last option is the Burze Pash, back in a planner's toolbox about 130 years after Lawrence wrote about it.
Around the route planner sit a few more tools that read the same map layers. You can draw any area and ask what happens if you plant it or build on it. There is a map of ecological stress in 500 m zones, and which of those zones need greening first. There is a finder for land that would cost the least to build on. And there is a watch page that sets local environmental news beside the satellite record of the place it names.
It covers all ten districts of the valley, with Srinagar city on its own. It is live at 13-204-178-165.sslip.io and the code is at github.com/hanaanllone/shuhul .

The code was the easy part
Shuhul is close to ninety commits made over three days. Almost none of the hard ones were about code. They were about data.
Ten sources, one grid
Vegetation and wetness from Sentinel-2. Surface temperature from Landsat 8 and 9. Land cover from ESA WorldCover. A canopy height layer for trees. Thirty-seven years of water history from the JRC Global Surface Water record. Building footprints from Microsoft. Roads and named buildings from OpenStreetMap. An elevation model for slope and flood. Weather and air from Open-Meteo.
Every one of them arrives in its own projection, its own resolution, its own tiles and its own idea of what "no data" looks like. Before any two could be compared, each had to be cut to a district, reprojected and snapped onto one ten-metre grid. For Baramulla that grid is about 55 million cells, per layer.
And every one of those files first had to come down a Kashmiri internet connection. [Add your own line here: how long the downloads took, how often they dropped, what you did while waiting.]
Clouds
Kashmir is a bowl with mountains for a rim, and cloud likes to sit in it. A single satellite pass is almost never clean, so every layer is a composite: all the passes of a season, the cloud masked out, the median kept.
Even that is not always enough. For the year-by-year record we count how many clear looks each pixel got in a summer. In 2021, 77% of Srinagar district had three or more. In 2019, 22%.
A vegetation index that will not sit still
In Kashmir the land is under snow, then bare, then a flooded paddy in June, then at its greenest in August, then harvested. Compare April of one year with August of another and you have measured the calendar, not the change.
So we only took the middle of the growing season: May to July for the ten-metre vegetation layer, and June to August for the yearly record. Our first attempt at a yearly series for Srinagar city had one usable image for 2017 and four for 2018, against thirty-six or more for every year after. With one image, the median and the maximum of a year are the same picture.
Water that is not water, and water that is not there
The usual way to find water from space is an index of green light against infrared. It works beautifully on a clear lake. It also lights up on snow and glaciers, and Kashmir has plenty of both.
Then there is the opposite problem. Many of our lakes carry a skin of weed and algae. To a satellite that is vegetation, so only patches of the lake read as water.
The OpenStreetMap detour
We thought OpenStreetMap would rescue us. People have drawn the lakes and rivers there by hand, so we could offer "avoid lakes" and "avoid rivers" as separate choices and let a bridge cross a canal but not a lake.
The public query servers were overloaded, so we pulled the whole regional extract and built the layer from that. It looked right until we checked it against places we know. It had water where there is none. It had canals drawn thinner than they are, thin enough that spots where real bridges stand no longer showed as crossings at all.
We tore it out and went back to the satellite. A bridge in Shuhul still cannot tell a canal from a lake. I would rather say that than draw a river that is not there.
Buildings older than the city
The open building footprints were traced by a model from imagery that is several years old, and Srinagar has not waited for it. Newer colonies are simply missing.
We used them for what they are still good at, the share of each ten-metre cell that sits under a roof, added schools and hospitals from the buildings people have named on OpenStreetMap, and wrote the limit down.
Every threshold is an opinion
Above what value of the index is a cell "green"? When is ground "wet"? How steep is too steep for a road? How small a change counts as no change?
None of these has a right answer. We picked a number, looked at the map over a place we know, and picked again. Being from here was the only ground truth we had. For Urban areas like Srinagar City, we used a different NDVI threshold as the area is smaller and the greenery is mostly small trees and grass. We also checked whether the changes we were seeing in NDVI matched what was actually happening on the ground. For example, we compared areas showing loss or gain in NDVI with news reports about deforestation and afforestation drives. For Budgam, we also compared our values with those reported in the research paper Geospatial Tools for Assessing Land Degradation in Budgam District, Kashmir Himalaya, India by Mehnaz Rashid, Mahjoor Ahmad Lone, and Shakil Ahmad Romshoo.
These checks helped us decide whether the thresholds we picked made sense beyond just what looked right on a map.
Failures that made no noise
The data problems at least announced themselves. These did not.
It worked on my laptop. The first live release failed every single route. One script looked for the data in a folder beside the code, which is where it sits on my machine and not where it sits on a server.
The rectangle. A district is an irregular shape, but its grid is a rectangle, and rectangles overlap their neighbours. Srinagar city has no heat model of its own and borrows one. After we built models for every district, it started borrowing Budgam's, whose rectangle covers the city and holds no data there. The result was a file full of "not a number", which a browser cannot read. Routes computed, then never appeared, with no error anywhere. Our own server check passed, because it only checked that a file had been written.
The slider that did nothing. "Ease of construction" sat on the screen from the first day. The code never read it.
The flattering number. Planting trees in a half-built cell was quietly shrinking the buildings in the model, so the cooling looked better than it was. Once fixed, the share of a road's heat that mitigation repays fell from about 50% to about 38%. The smaller number is the honest one.
AWS, on a brand-new account
Everything runs in the Mumbai region. One CloudFormation template creates the lot: an EC2 instance, its address, its firewall and its role. On the instance, Docker Compose runs four containers: Caddy serves the site over HTTPS, a Flask API answers the map, a worker takes the heavy route and heat jobs from a queue, and PostgreSQL keeps the projects. The map layers and every release live in S3, and the instance pulls from there on its own every three minutes. Systems Manager is how we reach the machine. A budget alert watches the spend.
A new account shaped the design more than we did. The instance type we first asked for was refused, so Shuhul runs on a c7i-flex.large with under 4 GB of memory. CloudFront would not create a distribution, so Caddy fetches its own certificate. The Watch agent is written with the Strands Agents SDK for Amazon Bedrock, but Bedrock was not open to us, so on the live site the report summaries are written by rules instead of a model.
Closure
The last thing we built, a few hours before the deadline, was the one we needed for ourselves.
We cut Srinagar city into 1,406 blocks of 300 m and read nine summers of vegetation and surface temperature for each, from 2017 to 2025.
The city is less green than it was. Green cover fell from 76.0% of the city in 2017–19 to 67.5% in 2023–25. Of 1,284 blocks of land, 595 lost green. A separate run of ours on Sentinel-2 images points the same way, with a different sensor and a different threshold: 61.6% in 2018, 55.1% in 2024.
Greener blocks are cooler, and not by a little: about 2.2 °C of surface temperature for every 0.1 of the vegetation index.
Then came the number we did not want. Across all the blocks, losing green and gaining heat do not line up at all. Farmland and wetland lose their green to water and wet fields, which cools them.
The link shows where you would expect it, in the 723 blocks that began part green and part built, where green is lost to construction:
Part-built blocks that | Blocks | Heat moved |
|---|---|---|
Lost green | 356 | +0.39 °C |
Stayed the same | 344 | −0.02 °C |
Gained green | 23 | −1.37 °C |
The data cannot tell us which tree was cut for which project, and blocks that move together do not prove a cause. What it can tell us is that the city we grew up in is measurably less green than it was nine summers ago, and that in its neighbourhoods, where the green went, the heat followed.
That is closure enough.
What is still broken
The stress map and the area summary for a whole large district need about 4 GB of memory, and the server has less. They work for Srinagar, and for any shape you draw anywhere, and fail for the biggest districts taken whole. We know why, and the fix is next.
What I would tell myself on day one
Look at a place you know before you trust a number about it. The OpenStreetMap water looked fine in a table. It took one look at a canal I have crossed a hundred times to see it was wrong.
Run it where it will live. Two of our worst bugs could not happen on my laptop.
Check the result that flatters you twice. The cooling figure was wrong in our favour, and those are the errors nobody goes looking for.
Kashmir is a hard place to do this. The ground data is thin, the sky is rarely clear and the land changes character every month. If Shuhul works here, it will work better wherever the data is kinder.
Shuhul was built for Environmental Hacks by WeMakeDevs and AWS, by team Henz te Gruse: Hanaan Lone and Sayan Qadri.
[AI was used to fix the grammar]
Enjoyed reading this content? Let the author know!
Your likes, comments, shares, and saves help creators reach more builders.
Loading recommendations
Loading article