What it is
ATS Antiquity Atlas puts the Roman world on one dark, antique-tinted map: 7,748 road segments (3,450 major and 4,298 minor) from the DARMC digital Roman road network, 1,523 rank-1 places from the Digital Atlas of the Roman Empire (DARE), 37 legionary fortresses and 148 frontier fortification walls — all under a signature era toggle that crossfades the empire's boundary between 60 BC (the late Republic), AD 14 (the death of Augustus), and AD 117 (Trajan's territorial peak), while the road network simultaneously re-filters to segments already built by that era.
Everything is bundled. The GeoJSON ships with the app — rebuilt from the attributed academic originals after the hand-off copies proved to be stripped of their attributes — so the Atlas makes zero live requests and runs with an empty .env on the anonymous Esri dark-gray vector basemap. Type-ahead search works across Latin and modern names ("Londinium / London"), glass place cards decode DARE's numeric type codes and attestation years, and a Grand Tour pod glides Roma → Alexandria → Carthago → Londinium → Byzantium → Athenae.
The audience is educators, museums, digital-humanities teams, and — commercially — any prospect who needs to see time-aware filtering, data provenance work, and cartographic restraint applied to a real scholarly dataset.
The experience
The app boots over the Mediterranean at Trajan's peak: the AD 117 imperial-purple extent wash under a bronze road network, marble-white city dots waiting at higher zooms. Three era pods carry the story:
Like every app in the ATS branded line, the interface follows the house standard: React 19 and Tailwind 4 drive a dark glass shell, every control is a Lucide-iconed glass pod designed for this app, and there is no Esri widget chrome anywhere on screen. The map engine is Esri; the experience is ATS — designed, not assembled.
- The era toggle. Switching eras crossfades the empire boundary over 0.7 seconds while the road network thins or grows to match — 1,514 major segments in 60 BC, 3,025 by the Augustan era, 3,438 by AD 117. No flicker, no layer reloads; interrupting mid-fade is safe.
- Type-ahead search. Latin or modern names, top 8 matches, fully keyboard-driven; Enter flies to the place and opens its card.
- Glass place cards. Latin name in display type, Greek attestation where recorded, the modern name, the decoded DARE type (city or legionary fortress), and a first-attestation year formatted from the data's year sign — "750 BC", "AD 175".
- The Grand Tour. One pod cycles six great cities of the empire, five seconds per stop, with the detail card in tow.
- The military layer. A Castle pod reveals dark-red fortress squares (the 37 castra legionis — Vindonissa, Carnuntum, Bonna) and dashed frontier-wall lines: Hadrian's Wall, the limes.
- Zoom rewards. Past zoom 5, Latin labels in italic Noto Serif appear over the city dots and the 4,298 minor roads fade in.
The data — where it comes from
Every source is bundled with the app — the Atlas makes no live data requests at all. The basemap tiles are the only runtime dependency.
| Source | What it provides | Refresh | Cost | Attribution |
|---|---|---|---|---|
| DARMC Roman road network (via siriusbontea/roman-empire) | 3,450 major + 4,298 minor road segments and 148 frontier-wall features, with construction-era year buckets | Bundled snapshot | Free (public) | DARMC, Harvard (McCormick et al.); CC BY-NC-SA |
| DARE rank-1 places (via klokantech/roman-empire) | 1,523 places: Latin/Greek/modern names, type codes, attestation windows | Bundled snapshot | Free (public) | DARE, Johan Åhlfeldt, Lund University; CC BY-NC-SA |
| Empire extents (sfsheath/roman-maps) | Empire boundary polygons for 60 BC, AD 14, and AD 117 | Bundled snapshot | Free (public) | Sebastian Heath; AWMC-derived |
| Esri dark-gray vector basemap | Anonymous legacy vector basemap (dark ground for the antique palette) | Esri-hosted | Free (anonymous) | Esri |
How it was assembled
The application is a fully static single-page app — no backend, no database, no server-side rendering. The stack is the shared ATS Labs branded-app baseline:
Module map — the codebase is small and deliberate; each file owns one concern:
Key engineering decisions
- The bundled hand-off data was stripped — so it was rebuilt from the attributed sources. The delivered copies of the GeoJSON had their attributes removed (places carried only a type code; roads and extents carried almost nothing), which would have made search, cards, labels and the tour impossible. The team verified provenance and rebuilt public/data/ from the attributed originals — DARE rank-1 places from klokantech/roman-empire (1,523 features, byte-count match) and the DARMC road/wall set from siriusbontea/roman-empire (7,896 features split by CLASS) — confirming the geometry matches the stripped copies exactly.
- Era crossfade: per-layer opacity under one rAF loop, plus definitionExpression time-travel. All three extent layers are mounted at boot; switching eras runs a single requestAnimationFrame loop easing every layer's opacity to its target over 700 ms (ease-in-out) — a true crossfade with no layer add/remove. Simultaneously the roads and walls layers receive definitionExpression = "year <= <cutoff>", so the network itself time-travels. One data quirk is absorbed here: DARMC's year buckets jump from "60 B.C." straight to "A.D. 16", so the AD 14 era filters at cutoff 16 — otherwise it would be indistinguishable from the Republic.
- Decoding DARE's numeric type field. Only two values occur in this rank-1 extract: type 11 = city (1,486 — colonia and civitas capitals: Roma, Londinium, Athenae) and type 17 = legionary fortress (37 castra legionis). The startyear/endyear values are attestation-window buckets, not founding dates — the card deliberately says "attested from".
- The "forts" file is not forts. roman-forts.geojson turned out to be 148 MultiLineString fortification walls (DARMC class F — "VALLVM", Limes Alutanus, Hadrian's Wall). They render as dashed dark-red lines; the fortress squares the design called for come from the type-17 places instead, and one Castle pod toggles both together.
- Basemap locked to dark-gray-vector. The antique palette needs a dark ground: marble-white dots and bronze roads glow on dark gray but vanish on light parchment, and the imperial-purple wash reads as a regal tint rather than a bruise.