SvF

Case study 02 Mars Deck

Case study 02 · 2026

Mars Deck

The solar system, computed live in your browser. Correct enough for people who check.

Role
Product, design & engineering, solo with my agents
When
Aug 2026 – now
Status
Live · accounts and payments open
Scope
Orbital engine · interface · AI feature · payments
The Mars Deck interface: a dark solar-system map with orange orbits, readout panels and the Mars Deck logo.
Fig. 01 — The live deck. Every planet and 6,200 real asteroids, where they are right now.
Open marsdeck.net ↗

01 — The problem

Beautiful and wrong, or right and unusable.

Most solar-system apps pick one. The people who care about a road to Mars are space fans and engineers, and they check the numbers. One wrong figure and the whole thing loses them.

So Mars Deck had to be accurate enough to survive that audience, clear enough to share as a screenshot, and independent of anyone else's API, so it could never break because a service was switched off.

02 — The decisions, and what they cost

Five calls that shaped it.

  1. Compute it, don't fetch it.

    Every position is solved in the browser from orbital mechanics, including a solver for Earth-to-Mars transfer windows. Cost: weeks of verification, and an accuracy limit the page openly states. Gain: instant load, works offline, and no third party can break it.

  2. The AI talks, the engine does the maths.

    “Ask the Deck” answers questions in plain language through xAI's Grok, but the server computes the real positions first and the model may only use numbers it was given. Cost: shorter, less chatty answers. Gain: the AI can never contradict the numbers on screen.

  3. Show the caveats in the interface.

    The scale mode is always labelled, the star field is marked as decorative, and silent spacecraft are drawn as silent. Cost: visible fine print on a showcase product. Gain: nothing on the page can be disproved by an expert.

  4. One-off payments, no subscriptions.

    A lifetime tier and a 30-day pass that clearly says it does not renew. The server verifies every payment with PayPal itself. Cost: no recurring revenue yet. Gain: no promise about someone's bank account that the code can't keep.

  5. A separate page per planet.

    Instead of zooming from the whole system into one planet, each detailed body gets its own page and camera. Cost: a day of work thrown away. Gain: a view that actually holds still. More on that below.

An orange transfer arc from Earth to Mars drawn across the planets' orbits.
Fig. 02 — A transfer to Mars, solved in the browser.
Thousands of asteroid dots, with two dense clouds sharing Jupiter's orbit.
Fig. 03 — Jupiter's Trojan asteroids, from the real catalogue.

03 — What broke, and how I fixed it

The honest part.

Architecture

You couldn't hold on to Mars.

Zooming deep into Mars inside the main map meant every drag swung the camera around the Sun, 1.5 AU away, and Mars flew off screen.

Fix: after a second report I stopped patching. The camera was built around the Sun, so I reverted the zoom and gave each planet its own page with its own camera.

Delivery

A new page went black for returning visitors.

Scripts are cached for a week so the deck works offline. One new page loaded a script without a version stamp, so returning browsers got an old engine and drew nothing.

Fix: a deploy check that every page stamps every file. It immediately found two more live pages with the same problem.

Security

An admin screen was reachable without login.

Found on launch morning: the login worked, but two files behind it could be opened directly.

Fix: closed the same day. The cause was a pattern in my own CMS, so the fix went back into the product for every site that uses it.

04 — Results

Numbers anyone can check.

6,205real bodies on the map: 6,200 asteroids from NASA JPL plus 5 spacecraft
0network calls needed to draw the map
808automated checks run before every deploy
0.8 dlargest gap between computed and published Mars oppositions

Status, October 2026

Live at marsdeck.net with accounts and PayPal checkout. The payment path has been proven end to end with a live transaction. No framework, no build step: plain HTML, CSS and JavaScript on a 2D canvas, with my own PHP and SQLite CMS behind it.

05 — What I bring from this