What it is
ATS Heritage Atlas puts the entire UNESCO World Heritage List on an interactive map: all 1,154 cultural, natural and mixed properties from the official 2021 syndication snapshot, rendered as a client-side feature layer over a light gray vector basemap. Sites are colored by category — Cultural in gold, Natural in green, Mixed in cyan — and the 52 properties currently on the List of World Heritage in Danger carry a pulsing red ring that makes the world's most threatened places impossible to miss.
Exploration works along every axis the list itself is organized by: free-text search over names and countries, region and category filters, a clickable inscription-decade histogram spanning 1978–2021, and a Danger List toggle. Opening any site reveals a glass detail card with its inscription criteria (for example "(i)(iv)"), the official syndication description, danger status, and a deep link to its listing at whc.unesco.org. A one-click Journey mode tours eight icons — Machu Picchu, Petra, Serengeti, Angkor, Venice, Galápagos, the Great Barrier Reef and the Taj Mahal — at five seconds per stop.
The application is fully static and runs with an empty .env: the dataset is bundled, the basemap is anonymous, and there is no server, key or account anywhere in the stack. One honest caveat is stated in the app itself: the data is the official 2021 snapshot, so sites inscribed after 2021, boundary modifications, and later danger-list changes are not reflected.
The experience
The boot view is the whole list at once — gold, green and cyan dots across every continent, with red rings pulsing over clusters in Ukraine, Syria and Libya. From there the interaction model is deliberately simple:
- Filter along the list's own axes. Name/country search, region and category pickers, and a clickable decade histogram drawn on a canvas bucket the 1978–2021 inscription years into six decades. Result counts update live, and the site list stays fast under any filter combination by capping rendered items at the first 400 — while the map always shows every match.
- See the Danger List properly. A dedicated toggle isolates the 52 currently-listed sites; their pulsing red rings live on a separate graphics layer so the effect stays cheap and never interferes with selection.
- Open a site. From the list or by clicking its dot: a glass detail card presents the danger banner when applicable, the inscription criteria and year, the states party, the 2021 syndication description, and a launch link to the official UNESCO page.
- Take the Journey. Eight world icons, resolved by name search at boot and toured at five seconds per stop — and any user click, selection or card close hands control straight back.
The data — where it comes from
One bundled authoritative dataset and one anonymous basemap — no live dependency at all.
| Source | What it provides | Refresh | Cost | Attribution |
|---|---|---|---|---|
| UNESCO World Heritage Centre syndication snapshot (bundled unesco-whs.json) | All 1,154 properties: name, description, inscription year and criteria, category, states party, region, danger flag, coordinates | Static — 2021 snapshot; post-2021 inscriptions and danger changes not reflected | Free | © UNESCO World Heritage Centre |
| Esri gray-vector basemap (anonymous) | Light world basemap under the site layer | Vendor-managed | Free (no API key) | Esri attribution renders in-map automatically |
How it was assembled
The application is a fully static single-page app — no backend, no database, no server-side rendering. The stack: TypeScript, ArcGIS Maps SDK for JavaScript 5.0.x, Calcite Design System 5.0.x, and Vite 8.
Module map — the codebase is small and deliberate; each file owns one concern:
Key engineering decisions
- A client-side FeatureLayer, filtered without mutation. The 1,154 sites are built into an in-memory FeatureLayer (objectIdField "oid" = array index) with a UniqueValueRenderer on category. There is deliberately no clustering — 1,154 points render fine, and individual sites are the product. Filtering never rebuilds the layer: the layer view receives a FeatureFilter with an "oid IN (…)" where-clause, which applies instantly with no source mutation.
- Danger is a string, not a boolean. The syndication field carries values like "Y 2003" (currently on the Danger List — 52 sites) and "P 1997-2005" (formerly listed — 36 sites), with null meaning never listed. The red rings and the toggle use only the Y set, keeping the pulsing overlay at or under 52 graphics, animated by a 90 ms interval that assigns one shared marker symbol per tick.
- The data needed decoding — once. Names, descriptions and states contain HTML entities (é, &, –…), decoded a single time at load. Transboundary sites carry comma-joined regions ("Asia and the Pacific,Europe and North America"), so the region filter matches by substring and the detail card shows the first region only.
- SDK 5.x and Calcite 5 specifics. ui.components no longer accepts "attribution" (it renders regardless) — empty components list plus explicit Zoom/Home widgets; the click handler needs an explicit { x, y } type under strict TypeScript; Calcite's asset path must be set before defineCustomElements(); dialogs are calcite-dialog (calcite-modal no longer exists); and the histogram canvas scales by devicePixelRatio and measures its width at draw time.