The coolest route is the shadiest one — sun-smart streets for smarter walkers.
UmbraCity is a real-time, 3D pedestrian navigation system that routes you through the shadiest streets in the city. It uses actual building heights, tree canopy data, and live sun geometry to calculate where shadows fall right now — and colors every road by how comfortable (or dangerous) it is to walk on.
Built for FutureHacks 2026 — Build the city of tomorrow, today.
🔗 GitHub: github.com/PoseidonProMax/UmbraCity-Paris
| Feature | Description |
|---|---|
| 🗺️ Live Heat Map | Every pedestrian road color-coded by shade comfort in real time |
| 🧭 Coolest vs Fastest Route | Shade-optimized routing using a modified Dijkstra's algorithm |
| 🌳 Urban Shade Planner | Place virtual trees and canopies, watch shadows update live |
| 💡 Smart Suggest | Auto-detects the 6 hottest exposed road segments and recommends tree placements |
| 🏛️ Landmark Explorer | Interactive 3D markers for Notre-Dame, Pont Neuf, Sorbonne, and more |
| ⏱️ Time Slider | Scrub through the day and watch sun shadows sweep across the city |
| 🌤️ Live Weather | Real-time weather from Open-Meteo API synced to the 3D scene |
| 🎵 Ambient Audio | Procedurally synthesized soundscape — zero audio files |
- Node.js (v18 or higher) — nodejs.org
That's it. No Python, no database, no cloud setup required to run the app.
- Go to github.com/PoseidonProMax/UmbraCity-Paris
- Click Code → Download ZIP
- Extract the ZIP to a folder of your choice
- Open a terminal in that folder and run:
npm install
npm run dev- Open your browser and go to
http://localhost:5173
✅ The preprocessed map data is already included in
public/data/— no extra steps needed.
git clone https://github.com/PoseidonProMax/UmbraCity-Paris.git
cd UmbraCity-Paris
npm install
npm run devThen open http://localhost:5173.
UmbraCity-Paris/
├── src/
│ ├── main.js # App entry point & orchestration
│ ├── shadow-engine.js # Sun position, shadow projection & comfort scoring
│ ├── router.js # Dijkstra's pathfinding (fastest & coolest routes)
│ ├── planner.js # Shade placement tool & AI smart suggestions
│ ├── three-layer.js # Three.js 3D buildings, trees, water & lighting
│ ├── ui.js # All UI panels, modals & interactions
│ └── audio-engine.js # Procedural ambient audio synthesizer
├── scripts/
│ └── preprocess.py # (Optional) OSM GeoJSON → optimized JSON pipeline
├── data/
│ └── osm/paris/ # Raw OpenStreetMap source exports
├── public/
│ └── data/ # ✅ Pre-built data — ready to use, no setup needed
│ ├── buildings.json
│ ├── trees.json
│ ├── roads.json
│ ├── parks.json
│ └── water.json
├── index.html
├── style.css
├── package.json
└── vite.config.js
For any given time of day, UmbraCity computes sun position using the SunCalc library and projects shadows from every building and tree:
All shadows are indexed in a 15×15 spatial grid for fast O(1) lookup, making real-time road analysis possible at 60fps.
| Score | Label | Condition | Color |
|---|---|---|---|
| 3 | Comfortable | Shaded by building or tree | 🟢 |
| 2 | Warm | In a park, unshaded | 🟡 |
| 1 | Hot | Exposed, sun altitude ≤ 50° | 🟠 |
| 0 | Dangerous | Exposed, sun altitude > 50° | 🔴 |
Dijkstra's algorithm with a custom edge weight:
The 7× penalty on exposed segments steers routes through shade — even if the path is slightly longer.
| Layer | Technology |
|---|---|
| Language | JavaScript (ES Modules), Python |
| Build Tool | Vite |
| Map Engine | MapLibre GL JS |
| 3D Rendering | Three.js |
| Geospatial | Turf.js |
| Sun Position | SunCalc |
| Weather API | Open-Meteo |
| Audio | Web Audio API |
| Data Source | OpenStreetMap |
The public/data/ files are already included so you don't need to do this. But if you want to update the OSM data:
- Make sure you have Python 3 installed
- Create a virtual environment and install nothing (only built-in libraries used):
python scripts/preprocess.pyOr use the npm shortcut (requires .venv to be set up):
npm run preprocess- Export OSM layers for your city from overpass-turbo.eu
- Place the
.geojsonfiles indata/osm/<your-city>/ - Update the
BBOXinscripts/preprocess.pyto your city's bounding box - Run
python scripts/preprocess.py - Update
PARIS_CENTERinsrc/main.jswith your city's coordinates - Add your city to the
citieslookup ingetCityFromCoordinates()
MIT © 2026 UmbraCity
- OpenStreetMap contributors for open geodata
- SunCalc by Vladimir Agafonkin
- MapLibre GL JS — open-source map renderer
- Turf.js — geospatial analysis
- Three.js — WebGL 3D rendering
- Open-Meteo — free weather API
Heat doesn't discriminate, but survival does. The least we can do is make the street a little cooler.
Follow the shadows, not the sun. 🌿