Back

Launch Parameters

Orbital Mechanics / Data Viz | 2023

Launch Parameters
https://launch-parameters.local
+
Overview

Launch parameters in one click from Earth.

My Role
Solo Engineer · Product Designer

Sole engineer and product designer, responsible for the orbital physics engine, TypeScript web rebuild, 3D globe interaction, dashboard-ready exports, visualization layer, and Power BI support package.

Team
Solo

Concept originally prototyped as a Python CLI toolkit in 2022 during undergrad. Reconstructed, expanded, and ported to a full interactive web app in 2026. Current status: shipped locally, ready for GitHub publication.

Stack
React · TypeScript · Three.js · Python · Open-Meteo · Nominatim

React + Vite web app backed by a TypeScript physics engine. The globe is rendered with Three.js / react-three-fiber / drei using a NASA Blue Marble texture. Live elevation comes from the Open-Meteo Elevation API; reverse geocoding from OpenStreetMap Nominatim. The v1 toolkit is pure Python with matplotlib and Power BI export support.

Timeline
2022 prototype → 2026 web rebuild

Launch Parameters is an interactive launch-planning tool where a user clicks any point on Earth and gets mission parameters for reaching orbit or departing toward another planet. It estimates launch azimuth, rotation assist, delta-v, launch windows, propellant mass, and trajectory geometry from the chosen location, payload, destination, and vehicle configuration. The project started as a dashboard-style analytics concept and became a hostable web app because the key experience needed to be spatial: pick a real place, see the Earth, and understand why geography changes the launch.

Highlights

Any point on Earth, a live orbital estimate.

Launch Parameters turns an arbitrary point on Earth into a live orbital mission estimate, combining a physics engine, 3D globe, dashboard charts, and open geospatial data. Click a coordinate, get launch azimuth, rotation assist, delta-v budget, propellant mass, and launch window, without touching a form.

102
Validated calculations
46 Python + 56 TypeScript tests
Any
lat/lon point
No predefined site list required
6 CSVs
+ 4 chart types
Dashboard-ready Power BI exports
102 tests across two runtimes.
46 Python tests cover the v1 computation toolkit: Earth rotation assist, vis-viva, Hohmann transfers, launch windows, rocket equation staging, and CSV export validation. 56 TypeScript tests cover the web app engine, globe helpers, mission solver, analysis charts, and live data logic.
Any lat/lon point, computed in-place.
The final web app is not limited to predefined launch sites. It computes launch parameters for the exact clicked coordinate (with elevation from Open-Meteo and place name from Nominatim) while still showing the nearest cataloged site as reference.
6 CSV datasets, 4 static chart types.
The v1 export layer supports dashboard workflows with scenario summaries, launch windows, payload sweeps, site comparisons, planetary data, and launch-site catalogs. Four matplotlib chart types: delta-v budget, payload curve, site comparison, and transfer geometry. All data is Power BI–ready.
Launch Parameters: selected location with trajectory and full dashboard
2.0A clicked point becomes a full mission briefing: pin, orbit, azimuth, delta-v, propellant, launch window.SCREENSHOT
Context

Geography is the missing variable in launch math.

Before this project, the original dashboard idea had a common problem: the analysis could work, but the interface was too abstract. A launch site is not just a dropdown. Latitude, longitude, elevation, Earth rotation, orbit inclination, and destination geometry all matter. A static dashboard can show the outputs, but it does not make the user feel the geography. The gap was an interface that connected the physical Earth to the math.

NASA JPL Horizons API documentation
Horizons provides programmatic access to solar-system ephemerides, which validates the need for public planetary data in mission-planning tools.
Validates open planetary data as a foundation
Open-Meteo Elevation API
The API accepts latitude/longitude and returns terrain elevation, directly matching the project need to enrich arbitrary click points with elevation data.
Exact API match for the any-point requirement
OpenStreetMap Nominatim Reverse API
Nominatim finds a nearby suitable OSM object rather than a perfect address for the coordinate, shaping the 'rough demographic area name' behavior.
Drove the graceful place-name fallback design
NASA SRTM / OpenTopography
Near-global elevation datasets like SRTM show that terrain-aware launch estimates can be built on open data instead of proprietary map services.
Confirmed open-data viability
Real user feedback from build review
I don't just need the lat and long; I also need the rough demographic area name. The elevation also matters.
Directly drove live elevation + place-name lookup into v2
1.0Demand signals.DIAGRAM
The Problem

Five constraints, one spatial product.

1
Static hosting
The portfolio version needed to run as a client-side app without a custom backend. All computation runs in the browser.
2
Real physics, readable UI
The math needed to be defensible, but the interface still had to feel like a dashboard, not a physics textbook.
3
Any-point selection
The project could not depend only on famous launch sites. Clicked coordinates needed meaningful outputs computed in-place.
4
Open-data only
Google Earth-style data was desirable, but the implementation had to avoid paid or fragile APIs. Open-Meteo and Nominatim fit.
5
Visual density
Labels, panels, charts, Earth texture, trajectory, and mission controls all had to coexist without hiding each other.
North-star principles
Make geography first-class.
The user starts by choosing a place, not by filling out a form. The Earth is the UI.
Show the budget, not just the answer.
Delta-v, fuel, launch window, and trajectory all explain the result. The output is a mission briefing, not a number.
Use honest approximations.
Simplify where needed, but name the simplification and keep the calculations defensible: educational, not flight-certified.
Process

Five iterations to make geography feel like physics.

Iteration 1

The computation core (Python v1).

The first rebuild focused on the engine rather than visuals: Python modules for Earth rotation assist, vis-viva, Hohmann transfers, launch windows, rocket equation staging, validation, CLI output, CSV exports, and matplotlib charts. The weakness was obvious: it was accurate and dashboard-ready, but it did not yet feel like the spatial product the concept needed.

Iteration 2

Web foundation and the first globe.

The physics was ported to TypeScript and wrapped in a React/Vite app. The first globe was too plain, almost a blue sphere with dots. That changed after feedback: "I don't see Earth, I only see a blue colored globe." The fix was a real NASA Blue Marble texture, launch site labels, country/region/city labels, collision spacing, and a click-to-pin interaction.

Default globe state — rotating Earth, grating, labeled launch sites
3.2Iteration 2 result: NASA Blue Marble texture, graticule, launch-site + region labels.SCREENSHOT
Iteration 3

Exact-point mission planning.

Initially the globe mostly showed the nearest launch site. That missed the core idea. The pivot was to compute launch parameters for the exact clicked coordinate, while still showing the nearest cataloged site as reference. Any coordinate now drives the full physics engine.

Iteration 4

Usability polish: labels vs panels.

Several visual bugs came from the Three.js/drei HTML label layer fighting with the HUD panels. Labels covered controls, panels looked missing, and the pin scaled oddly at different zoom levels. The fix was stacking-context isolation, opaque panels, click-vs-drag detection, constant screen-size pin scaling, and label collision filtering.

Iteration 5

Dashboard completion.

Mission controls, trajectory rendering, analysis charts, live elevation, place-name lookup, and hosting setup were added as feature branches. At that point the app stopped being a globe demo and became a usable launch dashboard.

The hardest bug

The surprising part was that the hardest polish work was not orbital mechanics. It was interface layering: drei HTML labels, WebGL canvas transparency, panel stacking, and label collision all made the app feel either broken or polished depending on z-index. Several hours of debugging were spent on rendering, not physics.

Globe appearance
Before: generic sphere

A plain blue sphere with dot markers. No texture, no labels, no sense of actual Earth geography.

After: NASA Blue Marble

Real NASA Blue Marble texture, graticule, launch site labels, country/region names, and collision-filtered city labels.

3.0DIAGRAM
Mission computation target
Before: nearest site readout

Clicked point mostly referenced a nearby cataloged launch site. The selected coordinate itself was not the computation input.

After: exact coordinate input

The clicked lat/lon drives the full physics engine. Live elevation and place name enrich the point. Nearest site shown as reference only.

3.1DIAGRAM
HUD / label layering
Before: labels over panels

Drei HTML labels leaked over the mission control panels. Controls were partially hidden and the layout felt broken.

After: clean stacking

Labels live behind the HUD via stacking-context isolation. Label collision logic thins out crowded areas. Panels are fully opaque and always accessible.

3.2DIAGRAM
Visual Design

Mission control HUD over a real Earth.

The key branded moment is a grey mission-control HUD over a real Earth, with a small pin, graticule, labels, and trajectory overlay. It should feel operational and technical, not like a landing page. Dark panels with monospace readouts, a real Earth texture, and muted accent colors keep the aesthetic grounded in aerospace tooling.

System architecture flow
Click Earth point
Live data lookup (elevation · place name)
Mission config (payload · destination · vehicle)
Physics engine (azimuth · delta-v · window · mass)
Outputs (trajectory · charts · CSVs)
5.0Architecture flow: click → enrich → configure → compute → output.DIAGRAM
Physics pipeline
Inputs
  lat · lon · elevation
  payload · vehicle
  destination

↓
Rotation assist
  (Earth surface speed)
Launch azimuth
  (orbital inclination)
Orbit velocity
  (vis-viva equation)
Ascent losses
  (gravity + drag est.)
Transfer delta-v
  (Hohmann)
Propellant mass
  (Tsiolkovsky / staging)
Data flow
Static catalogs
  planetary data
  launch site list

Open-Meteo API
  elevation lookup

Nominatim API
  place name lookup

↓ TypeScript mission solver ↓

UI panels
  location · mission · analysis

Globe overlays
  pin · trajectory · labels

Export
  CSV · Power BI
UI state machine
No selection
  globe idle · labels visible

Click detected
  pin dropped
  live data loading

Earth orbit selected
  orbit ring rendered
  budget computed

Interplanetary selected
  escape path rendered
  transfer window shown

Live data unavailable
  fallback gracefully
  mission still computes
5.1Physics pipeline · data flow · UI states.DIAGRAM

The Analysis panel surfaces the physics pipeline as a readable briefing: a delta-v budget bar, the liftoff-mass breakdown by stage, and a propellant-vs-payload sweep. Every value traces back to the same engine that the v1 Python toolkit validates against its 46-test suite.

Final Designs

What shipped: orbit and interplanetary, in two frames.

The product shipped as a hostable single-page web app. The earlier sections already covered the default globe, the selected-location dashboard, the analysis panel, and the mission-control panel; what follows are the two frames that close the story: a trajectory close-up and the interplanetary mode.

Launch Parameters — trajectory globe detail view
7.0Trajectory detail — orbit ring rendered on the rotated globe; pin stays screen-size stable.SCREENSHOT
Launch Parameters — interplanetary target (Mars) selected
7.1Interplanetary mode — Mars target: 13.04 km/s delta-v, 1,360,228 kg propellant, launch window Nov 2026.SCREENSHOT
Edge cases handled
Equatorial launch windows. An equatorial orbit launched from the equator produces a degenerate plane-crossing calculation. The solver handles that case explicitly instead of dividing by zero.
Click vs drag detection. The globe only drops a pin on a clean click — dragging to rotate does not accidentally change the launch point. Movement threshold is tracked per-pointer-down event.
Unavailable live data. If Open-Meteo elevation or Nominatim reverse-geocoding fails, the app falls back gracefully (zero elevation, coordinate string as name) instead of blocking the mission calculation.
102
Total tests
46 Python + 56 TS
1.04 MB
JS bundle
Production build
2.57 MB
Earth texture
NASA Blue Marble
6 CSVs
Export datasets
Power BI ready
Retrospective

What worked, what I'd ship differently.

Worked

v1 Python → v2 TypeScript split.

Keeping the Python toolkit as the validated analytics base while building the TypeScript web app as a separate product meant both could evolve independently. The v1 tests validated the physics before anything was rendered.

Globe-first interaction.

Starting with 'pick a place on Earth' instead of 'fill out a form' made the project far more memorable than a normal dashboard. Geography as the primary UI was the right call.

Feature-branch workflow.

Foundation → globe → mission controls → trajectory → charts → live data → hosting → visual fixes. Each branch was reviewable on its own and kept the rebuild readable even as scope grew.

Would change

Design the HUD layout earlier.

Panels accumulated around the globe organically, which caused the layering bugs in Iteration 4. A HUD layout spec from the start would have prevented several hours of z-index debugging.

Decide on map tiles vs texture earlier.

A single Earth texture works well and avoids paid API dependencies, but it is not Google Earth-level zoom. That trade-off should be a day-one decision, not a late discovery.

Separate rendering diagnostics from product logic.

Several bugs were caused by WebGL/HTML layering rather than physics. A dedicated rendering-debug mode from the start would have surfaced those faster.

The biggest surprise

The hardest part was not orbital mechanics. It was interface layering. Drei HTML labels, WebGL canvas transparency, panel stacking, and label collision made the app feel either broken or polished, and the difference between the two was entirely in rendering code, not physics. The math was the easy part.

StatusShipped locally. All tests passing. Production build verified at 1.04 MB JS. Ready for GitHub publication (no third-party API keys required for core physics; live elevation and place-name lookups degrade gracefully if APIs are unavailable).

Not claimedThis is an educational / analytical tool. The physics is defensible but not aerospace-certified. No claims of mission-grade accuracy, live JPL Horizons integration, or Google Earth-level map tiles.