# avasyu-hub/nasa-spaceapp-challenge architecture

> Architecture diagram of the GitHub repository avasyu-hub/nasa-spaceapp-challenge, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-15). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/avasyu-hub/nasa-spaceapp-challenge
- Repository: https://github.com/avasyu-hub/nasa-spaceapp-challenge

## Overview

LunaWise compares lunar south-pole landing sites and mission dates by computing Sun/Earth visibility against terrain. Its documented workflow is offline ephemeris and horizon generation, export to static data, then browser-side mission evaluation and visualization. The repository also contains a 3D terrain-and-lander simulation and an independent ray-cast checker. Edges follow the README and shown source references; unsampled implementations and runtime wiring are not assumed.

Main entry points: [`Member4/src/simulation/LanderSimulation.js`](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member4/src/simulation/LanderSimulation.js) (Lander simulation), [`Member4/src/main.js`](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member4/src/main.js) (Simulation app), [`data_out`](https://github.com/avasyu-hub/nasa-spaceapp-challenge/tree/main/data_out) (Computed data), [`Member4/src/core/nasaTrekApi.js`](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member4/src/core/nasaTrekApi.js) (Moon Trek API)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ephemeris["Ephemeris pipeline"]
  node_spice["SPICE angles<br/>[spice_angles.py]"]
  node_horizons["Horizons client<br/>[horizons_client.py]"]
  node_angle_job["Angle generation<br/>[make_angles.py]"]
  node_angle_combine["Angle combine<br/>[combine.py]"]
  node_kernels["Kernel setup<br/>[get_kernels.py]"]
end

subgraph group_terrain["Terrain pipeline"]
  node_dem_horizon["Horizon calculator<br/>[horizon.py]"]
  node_site_pick["Site selection<br/>[site_from_illum.py]"]
  node_terrain_export["Terrain export<br/>[export.py]"]
  node_ray_worker["Ray-check worker<br/>[raycastWorker.js]"]
  node_raycast["Ray-cast checker<br/>[raycast.js]"]
end

subgraph group_data["Static data"]
  node_static_data[("Computed data")]
end

subgraph group_analysis["Mission analysis"]
  node_mission_logic["Mission metrics<br/>[missionLogic.js]"]
  node_web_math["Mission math<br/>[math.js]"]
end

subgraph group_visual["Browser visualization"]
  node_app_entry["Simulation app<br/>[main.js]"]
  node_lander_sim["Lander simulation"]
  node_terrain_mesh["Terrain rendering<br/>[TerrainMesh.js]"]
  node_celestial["Celestial bodies<br/>[CelestialBodies.js]"]
  node_horizon_overlay["Horizon overlay<br/>[HorizonOverlay.js]"]
  node_compass["Compass grid<br/>[CompassGrid.js]"]
  node_south_map["South-pole map<br/>[SouthPoleMap2D.js]"]
  node_data_loader["Data loader<br/>[dataLoader.js]"]
  node_fake_data["Fallback data<br/>[fakeData.js]"]
  node_nasa_api["Moon Trek API<br/>[nasaTrekApi.js]"]
  node_sim_math["Simulation math<br/>[math.js]"]
end

node_planner(("Mission planner"))
node_trek_service{{"NASA Moon Trek"}}
node_jpl_service{{"JPL Horizons"}}

node_planner -->|"uses"| node_app_entry
node_kernels -->|"supplies kernels"| node_spice
node_angle_job -->|"computes angles"| node_spice
node_angle_job -->|"cross-checks"| node_horizons
node_angle_combine -->|"uses client"| node_horizons
node_horizons -->|"queries"| node_jpl_service
node_terrain_export -->|"selects site"| node_site_pick
node_terrain_export -->|"computes profiles"| node_dem_horizon
node_site_pick -->|"uses sampler"| node_dem_horizon
node_terrain_export -->|"writes data"| node_static_data
node_angle_job -->|"exports angles"| node_static_data
node_static_data -->|"provides inputs"| node_mission_logic
node_planner -->|"compares windows"| node_mission_logic
node_app_entry -->|"creates simulation"| node_lander_sim
node_app_entry -->|"creates map"| node_south_map
node_app_entry -->|"evaluates expedition"| node_nasa_api
node_lander_sim -->|"renders terrain"| node_terrain_mesh
node_lander_sim -->|"renders bodies"| node_celestial
node_lander_sim -->|"uses overlay"| node_horizon_overlay
node_lander_sim -->|"uses grid"| node_compass
node_lander_sim -->|"loads data"| node_data_loader
node_lander_sim -->|"generates fallback"| node_fake_data
node_lander_sim -->|"fetches terrain"| node_nasa_api
node_lander_sim -->|"uses battery trace"| node_mission_logic
node_celestial -->|"uses vectors"| node_sim_math
node_horizon_overlay -->|"uses vectors"| node_sim_math
node_compass -->|"uses vectors"| node_sim_math
node_south_map -->|"uses terrain API"| node_nasa_api
node_nasa_api -->|"fetches terrain"| node_trek_service
node_ray_worker -->|"runs agreement"| node_raycast
node_ray_worker -->|"loads heightmaps"| node_static_data

click node_spice "https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member1/pipeline/spice_angles.py"
click node_horizons "https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member1/pipeline/horizons_client.py"
click node_angle_job "https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member1/pipeline/make_angles.py"
click node_angle_combine "https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member1/pipeline/combine.py"
click node_kernels "https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member1/pipeline/get_kernels.py"
click node_dem_horizon "https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member2/pipeline/horizon.py"
click node_site_pick "https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member2/pipeline/site_from_illum.py"
click node_terrain_export "https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member2/pipeline/export.py"
click node_ray_worker "https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member2/src/raycastWorker.js"
click node_raycast "https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member2/src/raycast.js"
click node_static_data "https://github.com/avasyu-hub/nasa-spaceapp-challenge/tree/main/data_out"
click node_mission_logic "https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/web/src/core/missionLogic.js"
click node_app_entry "https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member4/src/main.js"
click node_lander_sim "https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member4/src/simulation/LanderSimulation.js"
click node_terrain_mesh "https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member4/src/simulation/TerrainMesh.js"
click node_celestial "https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member4/src/simulation/CelestialBodies.js"
click node_horizon_overlay "https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member4/src/simulation/HorizonOverlay.js"
click node_compass "https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member4/src/simulation/CompassGrid.js"
click node_south_map "https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member4/src/simulation/SouthPoleMap2D.js"
click node_data_loader "https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member4/src/core/dataLoader.js"
click node_fake_data "https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member4/src/core/fakeData.js"
click node_nasa_api "https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member4/src/core/nasaTrekApi.js"
click node_sim_math "https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member4/src/core/math.js"
click node_web_math "https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/web/src/core/math.js"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_spice,node_horizons,node_angle_job,node_angle_combine,node_kernels toneBlue
class node_dem_horizon,node_site_pick,node_terrain_export,node_ray_worker,node_raycast toneAmber
class node_static_data toneMint
class node_mission_logic,node_web_math toneRose
class node_app_entry,node_lander_sim,node_terrain_mesh,node_celestial,node_horizon_overlay,node_compass,node_south_map,node_data_loader,node_fake_data,node_nasa_api,node_sim_math,node_planner,node_trek_service,node_jpl_service toneIndigo
```

## Components

### Ephemeris pipeline

- [SPICE angles](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member1/pipeline/spice_angles.py): `Member1/pipeline/spice_angles.py`
- [Horizons client](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member1/pipeline/horizons_client.py): `Member1/pipeline/horizons_client.py`
- [Angle generation](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member1/pipeline/make_angles.py): `Member1/pipeline/make_angles.py`
- [Angle combine](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member1/pipeline/combine.py): `Member1/pipeline/combine.py`
- [Kernel setup](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member1/pipeline/get_kernels.py): `Member1/pipeline/get_kernels.py`

### Terrain pipeline

- [Horizon calculator](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member2/pipeline/horizon.py): `Member2/pipeline/horizon.py`
- [Site selection](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member2/pipeline/site_from_illum.py): `Member2/pipeline/site_from_illum.py`
- [Terrain export](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member2/pipeline/export.py): `Member2/pipeline/export.py`
- [Ray-check worker](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member2/src/raycastWorker.js): `Member2/src/raycastWorker.js`
- [Ray-cast checker](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member2/src/raycast.js): `Member2/src/raycast.js`

### Static data

- [Computed data](https://github.com/avasyu-hub/nasa-spaceapp-challenge/tree/main/data_out): `data_out`

### Mission analysis

- [Mission metrics](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/web/src/core/missionLogic.js): `web/src/core/missionLogic.js`
- [Mission math](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/web/src/core/math.js): `web/src/core/math.js`

### Browser visualization

- [Simulation app](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member4/src/main.js): `Member4/src/main.js`
- [Lander simulation](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member4/src/simulation/LanderSimulation.js): `Member4/src/simulation/LanderSimulation.js`
- [Terrain rendering](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member4/src/simulation/TerrainMesh.js): `Member4/src/simulation/TerrainMesh.js`
- [Celestial bodies](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member4/src/simulation/CelestialBodies.js): `Member4/src/simulation/CelestialBodies.js`
- [Horizon overlay](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member4/src/simulation/HorizonOverlay.js): `Member4/src/simulation/HorizonOverlay.js`
- [Compass grid](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member4/src/simulation/CompassGrid.js): `Member4/src/simulation/CompassGrid.js`
- [South-pole map](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member4/src/simulation/SouthPoleMap2D.js): `Member4/src/simulation/SouthPoleMap2D.js`
- [Data loader](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member4/src/core/dataLoader.js): `Member4/src/core/dataLoader.js`
- [Fallback data](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member4/src/core/fakeData.js): `Member4/src/core/fakeData.js`
- [Moon Trek API](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member4/src/core/nasaTrekApi.js): `Member4/src/core/nasaTrekApi.js`
- [Simulation math](https://github.com/avasyu-hub/nasa-spaceapp-challenge/blob/main/Member4/src/core/math.js): `Member4/src/core/math.js`

### Other components

- **Mission planner**
- **NASA Moon Trek**
- **JPL Horizons**

## Connections

- Mission planner → Simulation app: uses (evidence: `README.md`)
- Kernel setup → SPICE angles: supplies kernels (evidence: `Member1/pipeline/spice_angles.py`)
- Angle generation → SPICE angles: computes angles (evidence: `Member1/pipeline/make_angles.py`)
- Angle generation → Horizons client: cross-checks (evidence: `Member1/pipeline/make_angles.py`)
- Angle combine → Horizons client: uses client (evidence: `Member1/pipeline/combine.py`)
- Horizons client → JPL Horizons: queries (evidence: `Member1/pipeline/horizons_client.py`)
- Terrain export → Site selection: selects site (evidence: `Member2/pipeline/export.py`)
- Terrain export → Horizon calculator: computes profiles (evidence: `Member2/pipeline/export.py`)
- Site selection → Horizon calculator: uses sampler (evidence: `Member2/pipeline/site_from_illum.py`)
- Terrain export → Computed data: writes data (evidence: `Member2/pipeline/export.py`)
- Angle generation → Computed data: exports angles (evidence: `README.md`)
- Computed data → Mission metrics: provides inputs (evidence: `web/src/core/missionLogic.js`)
- Mission planner → Mission metrics: compares windows (evidence: `README.md`)
- Simulation app → Lander simulation: creates simulation (evidence: `Member4/src/main.js`)
- Simulation app → South-pole map: creates map (evidence: `Member4/src/main.js`)
- Simulation app → Moon Trek API: evaluates expedition (evidence: `Member4/src/main.js`)
- Lander simulation → Terrain rendering: renders terrain (evidence: `Member4/src/simulation/LanderSimulation.js`)
- Lander simulation → Celestial bodies: renders bodies (evidence: `Member4/src/simulation/LanderSimulation.js`)
- Lander simulation → Horizon overlay: uses overlay (evidence: `Member4/src/simulation/LanderSimulation.js`)
- Lander simulation → Compass grid: uses grid (evidence: `Member4/src/simulation/LanderSimulation.js`)
- Lander simulation → Data loader: loads data (evidence: `Member4/src/simulation/LanderSimulation.js`)
- Lander simulation → Fallback data: generates fallback (evidence: `Member4/src/simulation/LanderSimulation.js`)
- Lander simulation → Moon Trek API: fetches terrain (evidence: `Member4/src/simulation/LanderSimulation.js`)
- Lander simulation → Mission metrics: uses battery trace (evidence: `Member4/src/simulation/LanderSimulation.js`)
- Celestial bodies → Simulation math: uses vectors (evidence: `Member4/src/simulation/CelestialBodies.js`)
- Horizon overlay → Simulation math: uses vectors (evidence: `Member4/src/simulation/HorizonOverlay.js`)
- Compass grid → Simulation math: uses vectors (evidence: `Member4/src/simulation/CompassGrid.js`)
- South-pole map → Moon Trek API: uses terrain API (evidence: `Member4/src/simulation/SouthPoleMap2D.js`)
- Moon Trek API → NASA Moon Trek: fetches terrain (evidence: `Member4/src/core/nasaTrekApi.js`)
- Ray-check worker → Ray-cast checker: runs agreement (evidence: `Member2/src/raycastWorker.js`)
- Ray-check worker → Computed data: loads heightmaps (evidence: `Member2/src/raycastWorker.js`)
