Explore London's blue plaques on an interactive map. Discover famous writers, artists, scientists and cultural figures, find plaques near you and track what you've uncovered.
翻訳待ち
暮らしHTML · JavaScriptGitHub @nyatashaオンライン所有者未確認
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Interactive map of all English Heritage blue plaques across London, with iconic people highlighted by Wikipedia popularity.
翻訳待ち
Loading the full README. The saved excerpt is shown below.
A mobile-first London exploration game built on an interactive map of the
English Heritage blue plaque scheme. Explore the map, find plaques near you,
collect the discoveries you make, and watch your London fill in.
Discover the stories hiding around you.Read the full README ↗A mobile-first London exploration game built on an interactive map of the English Heritage blue plaque scheme. Explore the map, find plaques near you, collect the discoveries you make, and watch your London fill in.
Live site: https://nyatasha.github.io/blueplaques/
Discover the stories hiding around you.
Progress lives in this browser's localStorage. There are no accounts, no
backend and no tracking of your location.
No build step and no dependencies — it is static files plus Leaflet from a CDN.
python3 -m http.server 8000
# open http://localhost:8000
A server is required: the app uses native ES modules and fetch, neither of
which works from a file:// URL.
bash tests/run.sh
Three suites, all dependency-free:
| Suite | Runner | Covers |
|---|---|---|
tests/logic.test.mjs | JavaScriptCore (ships with macOS) | XP and levels, Haversine distances, localStorage robustness, derived progress, achievements, quests, recommendation ranking, dataset integrity |
tests/seo.test.py | Python 3 | slug stability and collisions, HTML and URL escaping, generated page content, canonical URLs, relative paths, the internal link graph (category, nearby, walks), category and walk page contents, walk definitions and derived distances, the plaque URL map, sitemap contents |
tests/smoke.html | headless Chrome via tests/cdp.py | boot, marker rendering, layout and touch targets at 390 px, search, the collect flow, tab navigation, filters, categories, reset, ?plaque= deep links |
tests/cdp.py is a small self-contained Chrome DevTools Protocol client; it
also takes screenshots:
python3 tests/cdp.py shot http://localhost:8000/ shot.png 390 844
Three scripts run in order. Each one reads and rewrites
data/plaques.geojson, so run them in sequence:
python3 scripts/fetch_plaques.py # OpenPlaques CSV → GeoJSON
python3 scripts/add_fame.py # + Wikipedia pageviews → fame 0–3
python3 scripts/classify_categories.py # + category + category_label
A fourth script turns the finished dataset into the crawlable half of the site — a page per plaque, a page per category, a page per curated walk, the URL map the app links with, and the sitemap. Run it whenever the data changes:
python3 scripts/generate_seo_pages.py # plaques/ + categories/ + walks/ + data/plaque-urls.json + sitemap.xml
The share card and app icons are generated too, and committed rather than built per deploy. The card carries the plaque count, which it reads from the dataset, so re-run it after a data refresh as well as after a branding change:
python3 scripts/make_social_image.py # assets/social/og-cover.png
fetch plaques → add fame → classify categories → data/plaques.geojson
↓
generate SEO pages → deploy
generate_seo_pages.py also rewrites the plaque count in index.html — in the
Twitter description, the JSON-LD and the <noscript> block — from the dataset
it just read. Those numbers live inside <!--gen:NAME-->…<!--/gen:NAME-->
regions and must not be edited by hand; a refresh would overwrite them anyway.
Every plaque in the OpenPlaques London
datapull of 14 December 2025 (accessed
2026-09-06) tagged into the scheme administered by English Heritage — 1,001
rows, whatever colour the plaque is. The scheme's early plaques are brown
terracotta, stone, bronze, black, grey, white and green, and selecting on
colour == "blue" used to discard 76 of them (decision-log #24).
This is the beginning of the README. Read the rest at the original. Read the full README ↗