PRD-009 — Mars Surface Map
Orrery · Product Requirements · v0.1 · May 2026
Status: Draft Sources: PRD-006 (Moon Map) as the established pattern; mission catalogue Mars subset Audiences: curious learner, STEM student, space enthusiast (PA §audiences) Promises: real mission data fully attributed, educational at every level (PA §promises) Principles: physics first, attribution is design (PA §principles) Why this is a PRD: Orrery's thesis is "Mars" — and yet today the only Mars surface representation is a textual list inside the mission library. The Moon Map (PRD-006) proves the spatial-anchor pattern works. A peer Mars Map closes the loop: every artefact humanity has placed on Mars, situated on a 3D globe, with full mission context one click away.
A student rotating the 3D Mars globe finds Jezero Crater. The label reads: "Perseverance, 2021 — searching for biosignatures in an ancient lake delta." They click the site. The panel opens with the rover's payload, sample-cache locations, what's been found so far. They rotate west to find Curiosity at Gale Crater. The capability connection is written into the panels: each rover in the lineage extending what the previous one proved.
§why
The Moon Map gave Orrery a spatial home for the lunar artefact catalogue. Mars deserves the same. Today's /missions page lists every Mars mission as a card, but lists are not maps. The user cannot see at a glance:
- That every successful landing has been on the equatorial plain or near it (latitude bias of EDL physics).
- That Perseverance and Curiosity are <4000 km apart on a planet that's twice the size of the Moon.
- That every Soviet attempt landed in a tight band of equatorial longitudes.
- That the Phoenix and InSight landers sit far north of all the rovers — chosen for ice (Phoenix) and quiet seismology (InSight) respectively.
A spatial view makes the engineering history of Mars surface operations visible. It also gives the simulator a satisfying symmetry: same UX pattern, same data shape, same panel structure as Moon — but Mars-flavoured.
§audiences
The curious learner rotates the 3D globe to see where each rover landed and discovers Mars's geographic story (Tharsis, Hellas, Vastitas Borealis) by reading the labels of the artefacts placed within each region.
The STEM student uses the page to ground the orbital-arrival data on /fly + /missions in physical geography. "Curiosity arrived October 2012, landing site 4.59°S, 137.44°E" — the surface map shows them what those coordinates mean.
The space enthusiast uses it as a reference for the full landed inventory — every successful landing, every failed lander where the wreckage was located by orbiters, every active rover and its current location.
§promises
- Every artefact humanity has put on Mars is plotted. Successful landings, failed landings whose location is known, and inactive hardware that's still there. The data set is finite (currently ~30 entries) so completeness is achievable.
- Every site has a panel matching the Moon-site panel. OVERVIEW · GALLERY · LEARN tabs. Same component, same tokens, same accessibility contract.
- Every site cross-links to the mission card in
/missions. Tapping a site can navigate to the corresponding mission's detail. The site IS the mission's surface footprint. - 3D globe + 2D flat map. Same toggle pattern as
/moon. - Locale-aware per ADR-017.
§scope
In scope (V1)
Default view: 3D Mars globe.
- Mars textured sphere, slow rotation by default (matches /moon).
- Tilt: 25° axial tilt (matches actual Mars obliquity for educational accuracy).
- Landing sites as crosshair markers, agency-coloured.
- Hover: tooltip with mission name + year.
- Click: opens detail panel.
2D flat map toggle.
- Equirectangular projection of Mars, matching the prototype convention.
- Same markers, same panel.
- Reveals lat/lon clustering at a glance — the equatorial-EDL bias becomes visible.
V1 catalogue split into two layers:
- Surface layer — confirmed-location landers, rovers, and crashed-but-located vehicles. Marker on the globe.
- Orbital layer — currently-active orbiters and historical orbiters of historical interest. Slow-moving dot circling the Mars sphere at a representative altitude. Click → opens the same OVERVIEW · GALLERY · LEARN panel pattern as a surface site.
Surface sites (V1 list). All artefacts with confirmed surface locations:
| Mission | Year | Nation | Status | Lat / Lon |
|---|---|---|---|---|
| Mars 2 lander | 1971 | USSR | Crashed | 45°S 313°E (approx.) |
| Mars 3 lander | 1971 | USSR | Partial — 14.5 s of data | 45°S 158°W |
| Mars 6 | 1973 | USSR | Comm-loss before landing | 23.9°S 19.4°W |
| Viking 1 | 1976 | USA | Successful | 22.27°N 312.05°E |
| Viking 2 | 1976 | USA | Successful | 47.97°N 134.0°E |
| Mars Pathfinder + Sojourner | 1997 | USA | Successful (rover) | 19.13°N 33.22°W |
| Beagle 2 | 2003 | UK / ESA | Lost on landing; located 2015 by MRO | 11.53°N 90.43°E |
| Spirit | 2004 | USA | Successful (rover) | 14.57°S 175.47°E |
| Opportunity | 2004 | USA | Successful (rover) | 1.95°S 354.47°E |
| Phoenix | 2008 | USA | Successful (lander) | 68.22°N 234.25°E |
| Curiosity | 2012 | USA | Active (rover) | 4.59°S 137.44°E |
| Schiaparelli | 2016 | ESA / Roscosmos | Crashed | 2.07°S 6.21°E |
| InSight | 2018 | USA | Mission complete (lander) | 4.5°N 135.62°E |
| Perseverance + Ingenuity | 2021 | USA | Active (rover + helicopter) | 18.44°N 77.45°E |
| Tianwen-1 + Zhurong | 2021 | China | Mission complete (rover) | 25.1°N 109.93°E |
| ExoMars Rosalind Franklin | TBD (PLANNED) | ESA | Planned 2028+ | TBD |
≈ 16 surface sites for V1.
Orbital sites (V1 list). Active orbiters first, then historical orbiters worth surfacing:
| Spacecraft | Year | Nation | Status | Approx. altitude / orbit |
|---|---|---|---|---|
| Mars Odyssey | 2001 | USA | ACTIVE (longest-running interplanetary mission) | ~400 km, sun-synch |
| Mars Express | 2003 | ESA | ACTIVE | ~250 × 11,500 km elliptical |
| MRO (Mars Reconnaissance Orbiter) | 2006 | USA | ACTIVE | ~250 km, sun-synch |
| MAVEN | 2014 | USA | ACTIVE | ~150 × 6,200 km elliptical |
| Mangalyaan | 2014 | India | ENDED 2022 | ~370 × 80,000 km highly elliptical |
| TGO (ExoMars Trace Gas Orbiter) | 2016 | ESA | ACTIVE | ~400 km circular |
| Tianwen-1 orbiter | 2021 | China | ACTIVE | ~265 × 12,000 km elliptical |
| Hope (Al-Amal) | 2021 | UAE | ACTIVE | ~20,000 × 43,000 km elliptical |
| Mariner 9 | 1971 | USA | ENDED 1972 (still in orbit) | ~1,400 × 17,900 km |
| Viking 1 orbiter | 1976 | USA | ENDED 1980 | ~1,500 × 33,000 km |
| Mars 3 orbiter | 1971 | USSR | ENDED 1972 | ~1,500 × 211,000 km |
≈ 11 orbital sites for V1. Layer is toggleable from a "SURFACE / ORBITERS" pill cluster (matches /explore's layer chips pattern from v0.4).
Rover traverses (V1). For each successful rover with a meaningful track, render a single agency-coloured polyline clamped to the surface, fading in as the user zooms in past a threshold:
| Rover | Track length | Source |
|---|---|---|
| Curiosity | ~33 km (live) | NASA snapshot |
| Perseverance | ~30 km (live) | NASA snapshot |
| Opportunity | 45.16 km (final) | NASA archive |
| Spirit | 7.73 km (final) | NASA archive |
Sojourner (~100 m) and Zhurong (~2 km) tracks are too small to plot meaningfully — defer to V1.5.
Vendoring policy. Traverses are vendored as static GeoJSON-ish polylines into static/data/mars-traverses/[rover].json at build time, attribution captured per file. No real-time refresh in V1 — active rovers move ~50 m/sol on average, so a manually-refreshed snapshot at each release is good enough; live update plumbing deferred to V1.5+.
Panel structure (mirrors /moon):
- OVERVIEW — agency, mission name, year, lat/lon, outcome (
SUCCESS / CRASHED / LOST / ACTIVE / PLANNED), short description, capability-ladder line ("first to X"). - GALLERY — surface photos. Mars-mission photo manifests already exist (NASA's MSL/MER/Pathfinder image catalogues are vast). 4–8 photos per site.
- LEARN — INTRO / CORE / DEEP tiered links per ADR-017 / PRD-006 extension. NASA mission pages (core), Wikipedia primers (intro), peer-reviewed surface-science papers (deep).
- "Still on the surface" footer for inactive missions — what's physically left at the site (lander hull, descent stage, etc.).
- "FLY THIS MISSION" button when the mission has flight data (deep-link to
/fly?mission=[id]). Symmetric with /moon and /missions.
3D globe interaction.
- Single-finger drag → rotate.
- Two-finger pinch → zoom (clamped 0.6× → 4×).
- Tap a marker → opens panel.
- Pulsating ring around the active marker if a panel is open.
2D flat-map interaction.
- Tap a marker → opens panel.
- Pinch / scroll → zoom (clamped same range).
- Two-finger drag → pan (when zoomed).
Out of scope (V1)
- Mars regional features (Olympus Mons, Valles Marineris, etc.) as labelled features. They appear in the texture but aren't clickable.
- Real-time rover position or orbiter telemetry. Active rovers + orbiters render at their last-snapshot position, captured at the time of the release. Live refresh deferred — see §what-comes-after.
- Mission planning context (porkchop / arrival window) — that's
/plan's job. - Polar-projection toggle (the prototype experiments with this on Moon — defer for Mars V1).
- Failed missions whose location is not known (e.g. Mars Climate Orbiter — never reached the surface).
- Tiny-footprint rovers (Sojourner ~100 m, Zhurong ~2 km) — markers only, no traverse line.
§design hints
Layout. Same chrome as /moon:
- 3D / 2D toggle top-left (matches
/explorecluster after the v0.4 HUD reorganisation). - Layer chips beneath the mode toggle —
SURFACE·ORBITERS·TRAVERSES— same uniform-width chip styling as the/explorePLANETS / DWARFS / COMETS / ISM rail. All three on by default.TRAVERSESonly renders past a zoom threshold (rendering is no-op when zoomed out, so this is a "ready when you are" toggle rather than something the user must turn on). - Nation legend bottom —
USA · USSR/Russia · ESA · China · UAE · India · Japan · UKagency-coloured dots. Failed-attempt sites get a thin dashed outline so success/failure is visible without opening the panel. - Detail panel: bottom sheet on mobile, right drawer on desktop (per ADR-018).
Orbital ring rendering.
- Each orbiter is a small agency-coloured dot circling the Mars sphere on its own ring. Ring is a faint inclined
THREE.RingGeometryat the orbit's representative altitude; the dot moves slowly along the ring at a speed scaled-for-perception (NOT the orbit's true period — a 2 h orbit at 1× would just be a blur). - Click the dot or its ring → opens the orbiter's panel (same OVERVIEW · GALLERY · LEARN structure).
- Inactive / ended orbiters render in a dimmed colour with a smaller dot.
Traverse rendering.
- Polyline clamped to the Mars sphere (3D) and to the equirectangular map (2D), agency-coloured.
- Fades in past a zoom threshold so the global view stays clean. End-of-track marker shows the rover's last-known position from the snapshot.
- Active rovers render the line in a saturated colour; the small dot at the end has a 1 Hz pulse to read as "still moving."
Tokens.
- Mars texture: 2K equirectangular
2k_mars.jpg(already instatic/textures/, used by /explore). - Marker fill: agency-coloured 6 px disc + 1 px white outline for legibility on red terrain.
- Failed-site marker: same fill, dashed white outline (not striped — keeps the small disc readable).
- Orbiter dot: 4 px disc + faint 1 px ring outline showing the orbital path.
- Traverse polyline: 1.5 px stroke at full zoom, agency-coloured.
- Active mission badge in panel header: same green-tint pattern as /missions ACTIVE filter.
Data flow.
- New file
static/data/mars-sites.jsoncarries surface + orbital sites in a single array, withkind: 'surface' | 'orbiter'discriminator. Schema validated by ajv (RFC-002 / ADR-019 extension). - Traverses live as separate
static/data/mars-traverses/[rover].jsonpolylines so they're not loaded for the global view. - Locale overlays at
static/data/i18n/[locale]/mars-sites/[id].json. - Cross-link to mission cards via shared
mission_idfield — the same id appears in bothmars-sites.jsonanddata/missions/mars/.
Moon parity. This work also backfills missing orbiter sites on /moon — the rendering path already exists (type: 'orbiter' → hovering torus, src/routes/moon/+page.svelte:239) but no orbiter entries currently live in moon-sites.json. As part of the generic SurfaceMap refactor (RFC-012 OQ-1), we add LRO, Clementine, Chandrayaan-1, Chang'e 1, Chang'e 2, Lunar Prospector, SMART-1 to moon-sites.json so /moon has the same surface+orbital coverage Mars gets.
Mobile. 375 px width without horizontal scroll. 3D globe is full-bleed; layer chips + legend overlay.
§non-goals
- Not a Mars geography textbook. No labelled features beyond landing-site markers. Geography emerges from looking at where the markers cluster.
- Not a real-time rover dashboard. Static landing sites. (Real-time would require a NASA-API integration that is outside the static-asset model per ADR-016.)
- Not duplicating
/missions. A mission card in/missionsand a surface site here are two views of the same data. The site links to the card; the card may eventually link back to the site.
§technical considerations
- Schema reuse. Extend the existing
moon-site.tstype into a genericsurface-site.ts(lat, lon, nation, agency, mission_id, year, status, links, etc.). Mars-sites and Moon-sites both implement it. Reduces drift. - 3D rendering. Three.js r128 — same renderer the rest of the app uses. Sphere mesh + a thin
Groupof marker meshes layered on the sphere surface. CPU pick on click. - Texture. The existing
2k_mars.jpgis already cached at build per ADR-016. No new asset fetch. - Locale flow. ADR-017 applies as-is.
- Routing. New route
/mars(peer to/moon). URL params:?site=[id]deep-links open with the panel pre-opened. - Nav reorder. The current nav order (after the v0.4 update) is
EXPLORE → MISSIONS → PLAN → FLY → EARTH → MOON. Adding MARS could go either after MOON (preserves the "by destination" cluster) or before EARTH (preserves the "size order"). UXS-009 to settle.
§definition-of-done
A locale is considered "Mars-shipped" when:
- [ ] All ~16 surface sites listed in §scope render on both 3D globe and 2D map.
- [ ] All ~11 orbital sites render as moving dots on inclined rings around Mars.
- [ ] All 4 traverses (Curiosity · Perseverance · Opportunity · Spirit) render as polylines that fade in past the zoom threshold.
- [ ] Each surface and orbital site has OVERVIEW · GALLERY · LEARN tabs populated.
- [ ] Each site has at least one photo in GALLERY.
- [ ] Each site cross-links to the corresponding mission card if one exists.
- [ ] Failed-attempt sites are visually distinguishable from successful ones.
- [ ]
SURFACE/ORBITERS/TRAVERSESlayer chips toggle visibility correctly. - [ ] Moon parity: at least 5 lunar orbiter entries (LRO · Clementine · Chandrayaan-1 · Chang'e 1 · Chang'e 2) render as hovering tori on
/moon. - [ ] Mobile (375 px) renders without horizontal scroll.
- [ ] No console errors on /mars or any /mars?site=... deep-link.
- [ ] /mars is added to the nav bar in the agreed order.
- [ ] Lighthouse accessibility ≥ 95.
- [ ] E2e: click surface marker → panel opens; click orbiter dot → same panel pattern opens; deep-link
/mars?site=curiosityopens panel pre-selected; traverse polyline visible after zoom past threshold.
§what comes after
V1.5+: live-refresh of rover positions and orbital phase (would require a small NASA-Eyes / Horizons API shim that doesn't violate the offline-first promise per ADR-016 — TBD via a later RFC). V1.5 also covers tiny-footprint rovers (Sojourner, Zhurong) as zoom-in markers without lines, polar-projection toggle for /mars, and Mariner 4 / 6 / 7 flyby trajectories.
Orrery · PRD-009 · Draft v0.1 · Update when scope or definition-of-done changes.