Explore spacecraft missions through NASA JPL Horizons data, generated trajectory plots, and optional Gemini-powered mission summaries.
Trajectory setup · Interactive explorer · Tests
Existing generated trajectory output, not a live mission position or a benchmark.
This project earned 3rd place at the Turion Space Hackathon 2025. It makes real mission data easier to explore: enter a spacecraft or mission identifier, retrieve ephemeris data, visualize its path through the solar system, and read a concise background summary.
Status: hackathon prototype built around live JPL Horizons data, with optional Gemini-powered mission summaries.
- queries NASA's public JPL Horizons API for mission and planetary vectors
- discovers mission time ranges from returned ephemeris data
- generates dark-theme 3D trajectory plots with Matplotlib
- serves plots and mission search through a Flask interface
- optionally asks Gemini to summarize mission background and significance
- includes a Three.js mission explorer with searchable agency filters, launch sorting, and live dataset summaries
- Python 3.11+
- Flask
- NASA JPL Horizons API and Astroquery
- Matplotlib
- Google Gemini API through
google-genai - HTML, CSS, JavaScript, and an experimental Three.js interface
mission search
|
+--> JPL Horizons API --> mission dates and vector coordinates
| |
| +--> Matplotlib trajectory image
|
+--> Gemini (optional) --> background summary
|
v
Flask interface
The trajectory workflow is in Turion-Hackathon-2025/. The root backend/ and frontend/ folders form a separate interactive mission explorer with a searchable mission intelligence sidebar and simplified 3D positions.
cd Turion-Hackathon-2025
python -m venv .venvActivate it on Windows:
.\.venv\Scripts\Activate.ps1Or on macOS/Linux:
source .venv/bin/activateWith pip:
python -m pip install -e .The repository also includes uv.lock for reproducible installation with uv:
uv syncTrajectory generation uses JPL Horizons and does not require a Gemini key. AI summaries require:
$env:GEMINI_API_KEY = "your-key"On macOS/Linux:
export GEMINI_API_KEY="your-key"Do not commit an API key or .env file.
From the inner project directory:
python main.pyOpen http://localhost:3000, search for a mission, and wait while the application retrieves and plots remote ephemeris data.
Start its API from the repository root:
cd backend
python main.pyIn a second terminal, serve the browser files:
cd frontend
python -m http.server 8000Open http://localhost:8000. The sidebar summarizes the currently visible active missions and supports free-text search, agency filters, and launch-date sorting.
Deterministic tests cover mission-range parsing, date normalization, duplicate removal, and parser state reset. They do not make network or Gemini calls:
python -m unittest discover -s tests -vGitHub Actions runs these tests and compiles the Python modules on every push and pull request. test_turion.py remains an exploratory network script and is not part of the deterministic suite.
A complete validation requires network access plus a current JPL Horizons response. Gemini summary validation additionally requires GEMINI_API_KEY.
- external API formats and availability can affect mission parsing
- mission identification still relies on JPL-compatible search values
- generated plots are static rather than truly interactive
- some fallback dates and broad exception handling remain from the hackathon
- the Three.js explorer uses simplified mission positioning in several places
- network errors need clearer user-facing states
- cache remote responses and avoid repeating expensive queries
- validate mission input before generating a plot
- unify the trajectory and Three.js experiences around one API
- add loading, empty, and actionable error states
- capture a short, current demo after end-to-end validation
Built collaboratively for Turion Hackathon 2025. The commit history includes contributions from SimpleCaci and iansuuci, including commits credited to Ian Nakashima. See the contributors and history. Released under the MIT License.
