ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
Learn the streets and arrondissements of Lyon: find streets on a blank map, name highlighted streets, tap districts, with an optional timer.
EducationHTML · PythonGitHub @theo-mazarsOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗A map quiz for learning the streets and arrondissements of Lyon. Find a street on a blank map, name a highlighted street, tap the right district, or browse the city in Explore mode. An optional timer adds a speed bonus.
It's a single static page with no backend or tracking, and only one external request (Google Fonts). Progress is kept in each visitor's browser.
| Find mode | Points |
|---|---|
| Right street | 100 |
| Another street within 250 m | 50 |
| Wrong street, right arrondissement | 20 |
| Anywhere else | 0 |
Name and Districts modes score 100 for right and 0 for wrong.
With the timer on, an answer within 3 seconds keeps full points. After that, points slide gradually to 70% at the buzzer, so a right answer is always worth at least 70. Wrong answers get no speed bonus, and running out of time scores 0. A street counts as "known" when its last score is 70 or more.
You need Python 3.8 or later (standard library only):
python3 scripts/build.py # writes dist/index.html
python3 -m http.server -d dist # then open http://localhost:8000
You can also open dist/index.html directly in a browser.
The Dockerfile builds the page in a Python stage and serves it with nginx on port 80.
docker build -t lyon-streets .
docker run --rm -p 8080:80 lyon-streets # http://localhost:8080
Dokploy: create an Application from this GitHub repository (or upload a zip of it with the Drop option). Set the build type to Dockerfile, with Dockerfile path Dockerfile and context ., then add a domain on port 80.
Any static host (GitHub Pages, Netlify, an S3 bucket…): run scripts/build.py and upload dist/index.html. It's the only file needed.
src/template.html the page (HTML, CSS, JS) with a __DATA__ placeholder
data/lyon-data.json processed street and district data (~200 KB)
scripts/build.py template + data -> dist/index.html
scripts/process.py raw OpenStreetMap export -> data/lyon-data.json
deploy/nginx.conf nginx config used by the Dockerfile
Dockerfile two-stage build: Python builds the page, nginx serves it
The data comes from OpenStreetMap through the Overpass API. The current file was exported on 19 October 2026.
On overpass-turbo.eu, run this query:
[out:json][timeout:180];
area["name"="Lyon"]["admin_level"="8"]->.lyon;
(
way(area.lyon)["highway"~"^(trunk|primary|secondary|tertiary|residential|unclassified|living_street|pedestrian)$"]["name"];
relation(area.lyon)["boundary"="administrative"]["admin_level"="9"];
);
out geom;
If it fails with "error (0)", the server is busy: change the Overpass server in Settings, for example to https://overpass.kumi.systems/api/.
Export the raw data as JSON (the file with an elements list), not GeoJSON. Save it as export.json in the project folder; .gitignore keeps it out of the repository.
Process it and rebuild:
python3 scripts/process.py export.json
python3 scripts/build.py
The street count in the header and the date in the footer update automatically.
Check the map. The Rhône and Saône are drawn from the arrondissement borders that run down the rivers, plus a few border segments chosen by OpenStreetMap way ID (RIVER_EXTRA_WAYS in process.py). If OSM editors have split or renumbered those, the script prints a warning and that stretch of river goes missing; update the IDs to fix it.
localStorage, so they don't sync between devices and are lost if the browser's site data is cleared.The code (src/, scripts/, deploy/, Dockerfile) is released under the MIT Licence.
The street and district data in data/ is derived from OpenStreetMap and is available under the Open Database Licence (ODbL) 1.0. See data/LICENSE.md.
Map data © OpenStreetMap contributors. The page shows this credit in its footer; keep it if you reuse the data.