Skip to content

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

  1. 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.
  2. Every site has a panel matching the Moon-site panel. OVERVIEW · GALLERY · LEARN tabs. Same component, same tokens, same accessibility contract.
  3. 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.
  4. 3D globe + 2D flat map. Same toggle pattern as /moon.
  5. 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:

MissionYearNationStatusLat / Lon
Mars 2 lander1971USSRCrashed45°S 313°E (approx.)
Mars 3 lander1971USSRPartial — 14.5 s of data45°S 158°W
Mars 61973USSRComm-loss before landing23.9°S 19.4°W
Viking 11976USASuccessful22.27°N 312.05°E
Viking 21976USASuccessful47.97°N 134.0°E
Mars Pathfinder + Sojourner1997USASuccessful (rover)19.13°N 33.22°W
Beagle 22003UK / ESALost on landing; located 2015 by MRO11.53°N 90.43°E
Spirit2004USASuccessful (rover)14.57°S 175.47°E
Opportunity2004USASuccessful (rover)1.95°S 354.47°E
Phoenix2008USASuccessful (lander)68.22°N 234.25°E
Curiosity2012USAActive (rover)4.59°S 137.44°E
Schiaparelli2016ESA / RoscosmosCrashed2.07°S 6.21°E
InSight2018USAMission complete (lander)4.5°N 135.62°E
Perseverance + Ingenuity2021USAActive (rover + helicopter)18.44°N 77.45°E
Tianwen-1 + Zhurong2021ChinaMission complete (rover)25.1°N 109.93°E
ExoMars Rosalind FranklinTBD (PLANNED)ESAPlanned 2028+TBD

≈ 16 surface sites for V1.

Orbital sites (V1 list). Active orbiters first, then historical orbiters worth surfacing:

SpacecraftYearNationStatusApprox. altitude / orbit
Mars Odyssey2001USAACTIVE (longest-running interplanetary mission)~400 km, sun-synch
Mars Express2003ESAACTIVE~250 × 11,500 km elliptical
MRO (Mars Reconnaissance Orbiter)2006USAACTIVE~250 km, sun-synch
MAVEN2014USAACTIVE~150 × 6,200 km elliptical
Mangalyaan2014IndiaENDED 2022~370 × 80,000 km highly elliptical
TGO (ExoMars Trace Gas Orbiter)2016ESAACTIVE~400 km circular
Tianwen-1 orbiter2021ChinaACTIVE~265 × 12,000 km elliptical
Hope (Al-Amal)2021UAEACTIVE~20,000 × 43,000 km elliptical
Mariner 91971USAENDED 1972 (still in orbit)~1,400 × 17,900 km
Viking 1 orbiter1976USAENDED 1980~1,500 × 33,000 km
Mars 3 orbiter1971USSRENDED 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:

RoverTrack lengthSource
Curiosity~33 km (live)NASA snapshot
Perseverance~30 km (live)NASA snapshot
Opportunity45.16 km (final)NASA archive
Spirit7.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 /explore cluster after the v0.4 HUD reorganisation).
  • Layer chips beneath the mode toggle — SURFACE · ORBITERS · TRAVERSES — same uniform-width chip styling as the /explore PLANETS / DWARFS / COMETS / ISM rail. All three on by default. TRAVERSES only 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 · UK agency-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.RingGeometry at 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 in static/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.json carries surface + orbital sites in a single array, with kind: 'surface' | 'orbiter' discriminator. Schema validated by ajv (RFC-002 / ADR-019 extension).
  • Traverses live as separate static/data/mars-traverses/[rover].json polylines 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_id field — the same id appears in both mars-sites.json and data/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 /missions and 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.ts type into a generic surface-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 Group of marker meshes layered on the sphere surface. CPU pick on click.
  • Texture. The existing 2k_mars.jpg is 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 / TRAVERSES layer 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=curiosity opens 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.

Orrery — architecture documentation · MIT · No tracking