# Replace external map tiles with self-hosted satellite-provider **Task**: AZ-498_satellite_tile_swap **Name**: Self-hosted satellite tiles + drop map-type toggle **Description**: Replace OpenStreetMap (classic) and Esri (satellite) tile sources with the suite's own `satellite-provider /tiles/{z}/{x}/{y}` endpoint, drop the classic/satellite toggle (satellite-provider serves satellite imagery only), and wire cookie-based authentication for tile fetches. **Complexity**: 5 points **Dependencies**: AZ-450 (Externalize map tile URLs). Cross-workspace prerequisite — satellite-provider must publish a cookie-auth variant of `/tiles/{z}/{x}/{y}` before this task can be merged. The user files that ticket separately on the satellite-provider workspace. **Component**: 05_flights (with adjustments to 10_app-shell and the e2e harness) **Tracker**: AZ-498 **Epic**: AZ-497 ## Problem `src/features/flights/types.ts` (post AZ-450) reads two tile-URL env vars and exposes them to `FlightMap` and `MiniMap` via a `{ classic, satellite }` shape. Today those URLs resolve to external providers (OpenStreetMap, Esri ArcGIS World Imagery). This: - Sends pilot flight-area coordinates to third-party CDNs (privacy/operational risk for sensitive missions). - Adds an external network dependency the air-gap NFR (NFT-RES-03 / restriction E1) was meant to eliminate — the e2e profile only papers over it via the `tile-stub`. - Wastes bandwidth re-downloading tiles that the suite's own `satellite-provider` service already caches on disk (`./tiles/{z}/{x}/{y}.jpg`). The suite already runs a `satellite-provider` .NET service that exposes a slippy-tile XYZ endpoint (`GET /tiles/{z}/{x}/{y}`) backed by an on-disk cache plus on-demand Google Maps download, with `Cache-Control` and `ETag` headers wired. The UI does not consume it. ## Outcome - The SPA's map renders satellite tiles served by the suite's own `satellite-provider`, on the same origin as the SPA in production. - The classic/satellite toggle is removed; the map is satellite-only. - Tile fetches authenticate via a same-origin cookie, not via an `Authorization: Bearer …` header (Leaflet `` requests cannot send the header). - Air-gap restriction E1 is satisfied for tiles in production without requiring a stub. - `_docs/02_document/contracts/satellite-provider/tiles.md` documents the contract both sides commit to. ## Scope ### Included - Collapse `TILE_URLS` in `src/features/flights/types.ts` to a single URL string read from `import.meta.env.VITE_SATELLITE_TILE_URL`. - Remove the classic/satellite toggle from `FlightMap.tsx`: the `mapType` state, the toggle `