# D-DAY: THE LONGEST MORNING — Provenance

## Overview

**D-DAY: THE LONGEST MORNING** is a static-website-friendly interactive map built to present the Normandy landings as a public-facing, time-binned narrative map. The design follows a 70% wartime newspaper front-page / 30% operations-room intelligence-map aesthetic. It is intended as a readable historical map experience, not a unit-by-unit tactical simulation.

Cartographer: [Ian Muehlenhaus](https://www.muehlenhaus.com)  
Project link: [WebMapGPT](https://www.webmapgpt.com)

## Source package used

The map was built from the project source files and pilot CSV datasets supplied for the D-Day interactive map project. The governing design files defined the title, tone, visual palette, mobile behavior, timeline bins, channels, perspectives, data schemas, and interaction rules.

The pilot data package provided point-based timeline events, beachhead records, movement-route-ready records, German defensive reference points, unit references, and source metadata. These CSV files were used as the primary structured data inputs for the web map.

## Main data inputs

Primary CSV inputs included:

- `timeline_events_all_pilot.csv`
- `timeline_events_schema_compatible_points.csv`
- `dday_major_events.csv`
- `dday_airborne_events.csv`
- `dday_naval_bombardment_events.csv`
- `dday_german_defense_events.csv`
- `dday_utah_beach_events.csv`
- `dday_omaha_beach_events.csv`
- `dday_gold_beach_events.csv`
- `dday_juno_beach_events.csv`
- `dday_sword_beach_events.csv`
- `german_defensive_positions_reference.csv`
- `movement_routes_point_ready.csv`
- `beachheads.csv`
- `units_reference.csv`
- `data_dictionary.csv`

The original CSV files are bundled in the site under `data/csv/`.

## Historical source anchors

The data and narrative copy used the following source anchors where applicable:

- The D-Day Story: D-Day timeline — https://theddaystory.com/discover/d-day-timeline/
- Eisenhower Presidential Library: World War II D-Day Invasion of Normandy — https://www.eisenhowerlibrary.gov/research/online-documents/world-war-ii-d-day-invasion-normandy
- National WWII Museum: D-Day Fact Sheet — https://www.nationalww2museum.org/media/press-releases/d-day-fact-sheet-0
- National WWII Museum: D-Day Timeline — https://www.nationalww2museum.org/d-day-timeline
- U.S. Army: Operation Overlord Heritage Site — https://www.army.mil/d-day/
- National Archives: D-Day lesson resources — https://www.archives.gov/education/lessons/d-day
- Reuters: D-Day anniversary key facts — https://www.reuters.com/world/d-day-anniversary-key-facts-allied-normandy-landings-2024-06-03/

## Processing steps

1. **CSV inspection and normalization**  
   The pilot CSV files were inspected for fields matching the project schema. The schema-compatible event table was used as the master timeline-event layer.

2. **GeoJSON conversion**  
   Point records with longitude and latitude fields were converted to GeoJSON. The resulting web map layers include:
   - `data/timeline_events.geojson`
   - `data/defensive_features.geojson`
   - `data/beachheads.geojson`
   - `data/movement_routes.geojson`
   - `data/route_arrowheads.geojson`
   - `data/epilogue_lodgment.geojson`

3. **Timeline binning**  
   Events were assigned to 3-hour bins beginning with `5 Jun / Evening — Final Loading` and ending with `6 Jun / Evening — Line Holds`. A separate epilogue state represents `30 Jun 1944`.

4. **Generalized geometry**  
   Where exact positions were uncertain, the map uses schematic points, uncertainty halos, generalized route lines, and simplified beachhead polygons. High-uncertainty locations should not be interpreted as surveyed coordinates.

5. **Movement-route construction**  
   Route-ready origin and destination records were converted into stylized, smoothed line features. Route arrowheads were generated as small polygon overlays at route endpoints. Seaborne route lines were removed during visual refinement because they cluttered the early map view.

6. **Epilogue lodgment construction**  
   The June 30 Allied extent is represented as a generalized schematic polygon, not a surveyed operational boundary.

7. **Symbology updates**  
   Unit icons for infantry, armor, ships, and aircraft were replaced with user-supplied SVGs. The SVGs use CSS variables for background, foreground, and outline colors so the app can dynamically recolor them by side/channel. German infantry symbols are flipped to face right-to-left.

8. **Interaction design**  
   The app supports a time scrubber, play/pause animation, channel buttons, a perspective toggle, event hover popups, dispatch-panel updates, uncertainty halos, and an attribution/information modal.

## APIs, libraries, and external services

The site uses:

- **MapLibre GL JS** for web map rendering.
- **OpenStreetMap raster tiles** as the muted contextual basemap.
- **MapLibre demo glyph endpoint** for map-label glyphs.
- **Google Fonts** for newspaper and dispatch typography.

The web map itself is static and uses local GeoJSON overlays. It does not require a live server-side API, database, or OpenAI API call to run.

## Design and historical handling notes

- The map intentionally avoids Nazi-glamor, decorative Nazi iconography, and swastika symbology.
- German defensive information is treated as sober intelligence-map context.
- Allied movement and beachhead information is presented in a more headline-driven wartime newsprint style.
- The map uses uncertainty halos to indicate approximate or generalized locations.
- Casualty fields and exact tactical details are deliberately sparse unless directly supported by the dataset.
- The project is designed to scale as richer CSV, GeoJSON, PMTiles, or vector-tile layers are added later.

## Build notes

This version was assembled as a static site with:

- `index.html`
- `styles.css`
- `app.js`
- local `data/` GeoJSON and JSON files
- local `data/csv/` source CSV files
- local `assets/` SVG unit icons
- this `PROVENANCE.md` file

To run locally:

```bash
python3 -m http.server 8000
```

Then open:

```text
http://localhost:8000
```

Opening the HTML file directly with `file://` may fail because most browsers block local file fetches for GeoJSON and JSON assets.
