How this map is built
This page explains where the data comes from, how it's combined, and — just as important — where it's known to be wrong, approximate, or incomplete. Read this before citing anything here in a lesson plan or paper.
What this is
A personal passion project: a whole-world map of political boundaries for any year in history, with a year control to move through time. It's also meant to double as a free research/teaching resource for history classrooms — but it is not a peer-reviewed academic source. Verify anything load-bearing against a primary source.
The boundaries are drawn over today's coastlines and rivers, not the physical geography of the selected year — physical geography (coastlines, river courses, lake extents) does change over centuries, and this map doesn't attempt to model that. See "Known limitations" below.
Data sources
| Source | Covers | License | What it contributes |
|---|---|---|---|
| historical-basemaps (Ourednik et al.) | ~123,000 BCE – 1880 CE (43 snapshot years) | GPLv3 | The base boundary geometry for ancient through early-modern history. Community-maintained, explicitly labeled work-in-progress by its own authors. |
| CShapes 2.0 (Schvitz, Rüegger, Girardin, Cederman, Weidmann, Gleditsch — ETH Zürich) | 1886 – 2019 (134 snapshot years, one per calendar year) | CC BY-NC-SA 4.0 | Academic dataset, replaces historical-basemaps' sparser coverage of the same era. Adds capital city per country. |
| Wikidata | Modern countries only (matched by name, ~174 of 181) | CC0 | Replaces the derived existed-date-range with real recorded inception/dissolution dates, plus predecessor/successor links, wherever a confident name match exists. |
| OpenHistoricalMap | 233 entities, wherever community contributors have mapped them (very uneven — see below) | CC0 | Replaces the boundary shape itself (not just the date) with a more precise, real, day-dated version, for whichever specific entity/year combinations it covers. Shown with a gold outline on the map. |
How the sources are combined
Every year is one file with the whole world's boundaries for that year. The three map sources never overlap in which years they own — historical-basemaps covers up to 1880, CShapes takes over for 1886–2019 (its snapshots replace historical-basemaps' overlapping years outright, rather than showing both). OpenHistoricalMap is different: it doesn't own any years by itself. Instead, wherever it has a matching, date-accurate boundary for a specific country in a specific year, that one entity's shape is swapped in on top of whatever the base source already drew — everything else on the map for that year is untouched. That's why some countries get a gold outline and most don't: it reflects genuinely uneven real-world coverage, not a rendering choice.
Simplification: all geometry is simplified (fewer vertices) before shipping to the browser, to keep the map fast to load. One deliberate choice here: the pipeline does not run typical GIS "cleanup" that dissolves overlapping polygons or removes small/sliver shapes — overlapping claims and small polities are real, intentional features of pre-modern history in this data, not defects to clean up.
Known limitations
- Physical geography is modern, political geography is historical. The basemap shows today's coastlines/rivers. The Aral Sea, for instance, looked very different a few decades ago — the map won't show that.
- "Boundaries" are a modern concept. Before the Peace of Westphalia (1648), the idea of a fixed, linear national border doesn't really describe how pre-modern polities worked. Treat early borders as approximate zones of influence, not surveyed lines.
- Overlapping regions are intentional in ancient/pre-modern periods (competing or overlapping spheres of authority) — not a rendering bug.
- Existed-date ranges are usually derived, not verified. For any entity without a confident Wikidata match, the popup's date range is just the min/max year that exact name string happens to appear across this dataset's snapshots. Renames, splits, and mergers make this wrong in plenty of cases — a visible caveat appears when a name's appearances have a gap in the middle, which is the clearest sign the naive range is suspect.
- OpenHistoricalMap coverage is very uneven and reflects individual contributors' interests, not a systematic effort. Some entities (e.g. France) have decades of richly detailed, sourced boundary history. Most have none at all. A country having no gold outline says nothing about that country's actual history — only that nobody has mapped it there yet.
- Entity matching across sources is name-based and imperfect. Different sources call the same country different things (historical-lineage names vs. common names, local-script names vs. English), so a small number of matches are hand-corrected rather than fully automatic. Mismatches are possible and not always caught.
- A few entities are known to be missing outright due to broken source geometry rather than any historical reality — most notably Switzerland in the 1994/2000/2010 historical-basemaps-era snapshots (fixed everywhere CShapes/OHM cover instead).
Source code
The full data pipeline and front end are open — every step described above is a script, not a manual process, so it can be re-run, audited, or corrected. See the GitHub repository.
Support this project
This map is free, ad-free, and always will be — no account, no paywall, no tracking. If it's been useful for a lesson, a research rabbit hole, or just idle curiosity, you can buy me a coffee ☕ to help keep the data fresh and fund new features.