All projects Project 1 of 9

Launch windows

Finds every launch window from Spaceport Nova Scotia for a target orbit, timed to orbital injection, with a scored weather probability on each.

No.01
Versionv1.0.0
RoleDesigned the API contract, built the FastAPI service and the first frontend
Duration3 days
StatusStable
StackPython, FastAPI, JSON Schema, pandas, JavaScript, Leaflet

Pick a target orbit and the engine lists every launch window from the Canso pad in Nova Scotia. It solves for the moment the rocket reaches orbit rather than the moment it leaves the pad, then puts a weather probability on each window from two forecast ensembles.

I wrote the contract first: eight JSON Schemas, frozen and tagged before anyone wrote engine code, so the four parts could be built side by side and still fit. The engine reproduces four published SSO launch windows with an average miss of 1.3 minutes, and the weather forecast beats the seasonal average for five days, which is where the app switches over and says so.

The public view: Earth with the ascent from Canso drawn on it, a countdown to the next launch window and dials for azimuth and time to orbit.
Launch windows Preview
  1. 1
    Ascent from the pad The climb from Canso to orbit, drawn from the API's own ascent ephemeris.
  2. 2
    Live countdown Counts down to the next window and says plainly whether its weather is a go.
  3. 3
    Solved at injection Aim azimuth, time to orbit and reached inclination for the selected window.
  4. 4
    Every crossing in range A timeline of each window, scrubbable at up to 600x speed.

Overview

What I built

  • +Every launch window from Canso for LEO, polar, SSO or custom orbits, timed to injection rather than liftoff.
  • +A FastAPI service with a frozen /v1 contract, provenance on every response and a pip-installable Python client.

What I rebuilt

  • ~Restricted the viewing map to the ascent of the selected window, after two full orbits marked every city visible.
  • ~Moved the API's recorded ground tracks out of the shared fixtures, which the frontend owns, after the two collided.

Known limitations

  • !Sentinel-3A and 3B only reproduce after a 10 minute vehicle-profile correction fitted to those same launches.
  • !The weather forecast beats climatology out to day 5 only; days 6 to 10 fall back to the seasonal average.

Decisions

  1. 1.
    Freeze the contract first I chose eight JSON Schemas, tagged before any engine, weather or frontend code existed, Instead of letting the API shape follow whatever the engine happened to return, Because four people built in parallel against one interface, so an unannounced schema change would have broken three of them at once..
  2. 2.
    Unreachable is an answer I chose HTTP 200 with reachable false and the plane-change penalty in the body, Instead of a 4xx status for an orbit the pad cannot reach, Because the physics result is the useful part of the response, and 4xx stays reserved for input that is actually malformed..

Timeline

Version Date Description
v0.1.0 2026-10 API contract frozen: eight schemas, their examples and tests, tagged before other work began.
v0.2.0 2026-10 FastAPI service on an engine stub, with provenance, the error model and offline fixtures.
v0.3.0 2026-10 Weather, ephemeris, citation and caching endpoints, plus the launchwin Python client.
v0.4.0 2026-10 Frontend screens: countdown, trajectory map, weather panel, viewing map and an analysis view.
v1.0.0 2026-10 Live engine wired in, and the 24-check integration gate passing on a clean clone.