# luismar-ing/lunav architecture

> Architecture diagram of the GitHub repository luismar-ing/lunav, 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/luismar-ing/lunav
- Repository: https://github.com/luismar-ing/lunav

## Overview

LuNAV is a browser-based lunar landing-site planner backed by an offline Python data pipeline. Users select a site, arrival date, and stay; the app presents sunlight and Earth-visibility conditions, supports plan comparison, and can show a selected mission in a 3D scene or panorama. Educator chapters and challenge experiences are additional product paths. The README documents pipeline outputs and the browser workflow; some internal pipeline and view connections are not shown in the sampled source, so those links are omitted or marked unverified.

Main entry points: [`pipeline/build_all.py`](https://github.com/luismar-ing/lunav/blob/main/pipeline/build_all.py) (Data build orchestration), [`web/src/views/PlannerView.tsx`](https://github.com/luismar-ing/lunav/blob/main/web/src/views/PlannerView.tsx) (Mission planner), [`web/src/App.tsx`](https://github.com/luismar-ing/lunav/blob/main/web/src/App.tsx) (Application shell), [`web/src/store/appStore.ts`](https://github.com/luismar-ing/lunav/blob/main/web/src/store/appStore.ts) (App state)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["App and planning"]
  node_app["Application shell<br/>[App.tsx]"]
  node_planner["Mission planner<br/>[PlannerView.tsx]"]
  node_sitepanel["Site assessment<br/>[MissionSidebar.tsx]"]
  node_compare["Plan comparison<br/>[CompareView.tsx]"]
  node_educator["Educator chapters<br/>[EducatorView.tsx]"]
  node_challenge["Mission challenge<br/>[Challenge.tsx]"]
  node_calendar["Date calendar<br/>[Calendar.tsx]"]
  node_state["App state<br/>[appStore.ts]"]
end

subgraph group_analysis["Mission analysis"]
  node_data["Browser data loader<br/>[data.ts]"]
  node_planlogic["Plan calculations<br/>[mission.ts]"]
  node_brief["Site metrics<br/>[siteBrief.ts]"]
  node_constraints["Plan constraints<br/>[constraints.ts]"]
end

subgraph group_scene["Mission visualization"]
  node_scenehost["Scene host<br/>[SceneHost.tsx]"]
  node_renderer["3D renderer<br/>[renderer.ts]"]
  node_terrain["Lunar terrain<br/>[terrain.ts]"]
  node_launch["Launch animation<br/>[launch.ts]"]
  node_panorama["Horizon panorama<br/>[Panorama.tsx]"]
end

subgraph group_pipeline["Offline data pipeline"]
  node_build["Data build orchestration<br/>[build_all.py]"]
  node_sites["Candidate sites<br/>[regions.py]"]
  node_dem["Elevation model<br/>[dem.py]"]
  node_features["Site features<br/>[site_features.py]"]
  node_ephemeris["Sun and Earth positions<br/>[ephemeris.py]"]
  node_visibility["Visibility analysis<br/>[visibility.py]"]
  node_windows["Mission windows<br/>[windows.py]"]
  node_trajectories["Mission trajectories<br/>[trajectory.py]"]
end

subgraph group_contract["Data validation"]
  node_contracts["Data schemas<br/>[contract.ts]"]
  node_validator["Dataset validator<br/>[validate.py]"]
end

node_visitor(("Planner or learner"))
node_spice["NASA/JPL SPICE kernels"]
node_lola["LRO LOLA terrain data"]
node_output[("Precomputed app data")]

node_visitor -->|"opens"| node_app
node_app -->|"routes to"| node_planner
node_app -->|"routes to"| node_educator
node_app -->|"routes to"| node_challenge
node_app -->|"loads core"| node_state
node_planner -.->|"selects plans"| node_state
node_planner -.->|"chooses dates"| node_calendar
node_planner -.->|"shows assessment"| node_sitepanel
node_sitepanel -->|"uses metrics"| node_brief
node_planner -->|"pins plans"| node_compare
node_state -->|"loads data"| node_data
node_data -->|"validates data"| node_contracts
node_state -->|"builds windows"| node_constraints
node_state -->|"tracks mission"| node_planlogic
node_planner -.->|"opens site view"| node_scenehost
node_scenehost -.->|"mounts scene"| node_renderer
node_renderer -->|"loads terrain"| node_terrain
node_renderer -->|"uses launch state"| node_launch
node_planner -->|"opens panorama"| node_panorama
node_build -->|"generates data"| node_output
node_dem -.->|"reads elevation"| node_lola
node_ephemeris -->|"reads kernels"| node_spice
node_build -.->|"builds site data"| node_sites
node_build -.->|"builds terrain data"| node_dem
node_build -.->|"builds features"| node_features
node_build -.->|"builds positions"| node_ephemeris
node_build -.->|"builds visibility"| node_visibility
node_build -.->|"builds windows"| node_windows
node_build -.->|"builds trajectories"| node_trajectories
node_build -.->|"validates output"| node_validator
node_validator -->|"checks schema"| node_contracts

click node_app "https://github.com/luismar-ing/lunav/blob/main/web/src/App.tsx"
click node_planner "https://github.com/luismar-ing/lunav/blob/main/web/src/views/PlannerView.tsx"
click node_sitepanel "https://github.com/luismar-ing/lunav/blob/main/web/src/components/MissionSidebar.tsx"
click node_compare "https://github.com/luismar-ing/lunav/blob/main/web/src/views/CompareView.tsx"
click node_educator "https://github.com/luismar-ing/lunav/blob/main/web/src/views/EducatorView.tsx"
click node_challenge "https://github.com/luismar-ing/lunav/blob/main/web/src/views/Challenge.tsx"
click node_calendar "https://github.com/luismar-ing/lunav/blob/main/web/src/views/Calendar.tsx"
click node_state "https://github.com/luismar-ing/lunav/blob/main/web/src/store/appStore.ts"
click node_data "https://github.com/luismar-ing/lunav/blob/main/web/src/lib/data.ts"
click node_contracts "https://github.com/luismar-ing/lunav/blob/main/web/src/lib/contract.ts"
click node_planlogic "https://github.com/luismar-ing/lunav/blob/main/web/src/lib/mission.ts"
click node_brief "https://github.com/luismar-ing/lunav/blob/main/web/src/lib/siteBrief.ts"
click node_constraints "https://github.com/luismar-ing/lunav/blob/main/web/src/lib/constraints.ts"
click node_scenehost "https://github.com/luismar-ing/lunav/blob/main/web/src/scene3d/SceneHost.tsx"
click node_renderer "https://github.com/luismar-ing/lunav/blob/main/web/src/scene3d/renderer.ts"
click node_terrain "https://github.com/luismar-ing/lunav/blob/main/web/src/scene3d/terrain.ts"
click node_launch "https://github.com/luismar-ing/lunav/blob/main/web/src/scene3d/launch.ts"
click node_panorama "https://github.com/luismar-ing/lunav/blob/main/web/src/views/Panorama.tsx"
click node_build "https://github.com/luismar-ing/lunav/blob/main/pipeline/build_all.py"
click node_sites "https://github.com/luismar-ing/lunav/blob/main/pipeline/regions.py"
click node_dem "https://github.com/luismar-ing/lunav/blob/main/pipeline/dem.py"
click node_features "https://github.com/luismar-ing/lunav/blob/main/pipeline/site_features.py"
click node_ephemeris "https://github.com/luismar-ing/lunav/blob/main/pipeline/ephemeris.py"
click node_visibility "https://github.com/luismar-ing/lunav/blob/main/pipeline/visibility.py"
click node_windows "https://github.com/luismar-ing/lunav/blob/main/pipeline/windows.py"
click node_trajectories "https://github.com/luismar-ing/lunav/blob/main/pipeline/trajectory.py"
click node_validator "https://github.com/luismar-ing/lunav/blob/main/pipeline/validate.py"
click node_output "https://github.com/luismar-ing/lunav/tree/main/web/public/data"

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_app,node_planner,node_sitepanel,node_compare,node_educator,node_challenge,node_calendar,node_state toneBlue
class node_data,node_planlogic,node_brief,node_constraints,node_output toneAmber
class node_scenehost,node_renderer,node_terrain,node_launch,node_panorama toneMint
class node_build,node_sites,node_dem,node_features,node_ephemeris,node_visibility,node_windows,node_trajectories toneRose
class node_contracts,node_validator,node_visitor,node_spice,node_lola toneIndigo
```

## Components

### App and planning

- [Application shell](https://github.com/luismar-ing/lunav/blob/main/web/src/App.tsx): `web/src/App.tsx`
- [Mission planner](https://github.com/luismar-ing/lunav/blob/main/web/src/views/PlannerView.tsx): `web/src/views/PlannerView.tsx`
- [Site assessment](https://github.com/luismar-ing/lunav/blob/main/web/src/components/MissionSidebar.tsx): `web/src/components/MissionSidebar.tsx`
- [Plan comparison](https://github.com/luismar-ing/lunav/blob/main/web/src/views/CompareView.tsx): `web/src/views/CompareView.tsx`
- [Educator chapters](https://github.com/luismar-ing/lunav/blob/main/web/src/views/EducatorView.tsx): `web/src/views/EducatorView.tsx`
- [Mission challenge](https://github.com/luismar-ing/lunav/blob/main/web/src/views/Challenge.tsx): `web/src/views/Challenge.tsx`
- [Date calendar](https://github.com/luismar-ing/lunav/blob/main/web/src/views/Calendar.tsx): `web/src/views/Calendar.tsx`
- [App state](https://github.com/luismar-ing/lunav/blob/main/web/src/store/appStore.ts): `web/src/store/appStore.ts`

### Mission analysis

- [Browser data loader](https://github.com/luismar-ing/lunav/blob/main/web/src/lib/data.ts): `web/src/lib/data.ts`
- [Plan calculations](https://github.com/luismar-ing/lunav/blob/main/web/src/lib/mission.ts): `web/src/lib/mission.ts`
- [Site metrics](https://github.com/luismar-ing/lunav/blob/main/web/src/lib/siteBrief.ts): `web/src/lib/siteBrief.ts`
- [Plan constraints](https://github.com/luismar-ing/lunav/blob/main/web/src/lib/constraints.ts): `web/src/lib/constraints.ts`

### Mission visualization

- [Scene host](https://github.com/luismar-ing/lunav/blob/main/web/src/scene3d/SceneHost.tsx): `web/src/scene3d/SceneHost.tsx`
- [3D renderer](https://github.com/luismar-ing/lunav/blob/main/web/src/scene3d/renderer.ts): `web/src/scene3d/renderer.ts`
- [Lunar terrain](https://github.com/luismar-ing/lunav/blob/main/web/src/scene3d/terrain.ts): `web/src/scene3d/terrain.ts`
- [Launch animation](https://github.com/luismar-ing/lunav/blob/main/web/src/scene3d/launch.ts): `web/src/scene3d/launch.ts`
- [Horizon panorama](https://github.com/luismar-ing/lunav/blob/main/web/src/views/Panorama.tsx): `web/src/views/Panorama.tsx`

### Offline data pipeline

- [Data build orchestration](https://github.com/luismar-ing/lunav/blob/main/pipeline/build_all.py): `pipeline/build_all.py`
- [Candidate sites](https://github.com/luismar-ing/lunav/blob/main/pipeline/regions.py): `pipeline/regions.py`
- [Elevation model](https://github.com/luismar-ing/lunav/blob/main/pipeline/dem.py): `pipeline/dem.py`
- [Site features](https://github.com/luismar-ing/lunav/blob/main/pipeline/site_features.py): `pipeline/site_features.py`
- [Sun and Earth positions](https://github.com/luismar-ing/lunav/blob/main/pipeline/ephemeris.py): `pipeline/ephemeris.py`
- [Visibility analysis](https://github.com/luismar-ing/lunav/blob/main/pipeline/visibility.py): `pipeline/visibility.py`
- [Mission windows](https://github.com/luismar-ing/lunav/blob/main/pipeline/windows.py): `pipeline/windows.py`
- [Mission trajectories](https://github.com/luismar-ing/lunav/blob/main/pipeline/trajectory.py): `pipeline/trajectory.py`

### Data validation

- [Data schemas](https://github.com/luismar-ing/lunav/blob/main/web/src/lib/contract.ts): `web/src/lib/contract.ts`
- [Dataset validator](https://github.com/luismar-ing/lunav/blob/main/pipeline/validate.py): `pipeline/validate.py`

### Other components

- **Planner or learner**
- **NASA/JPL SPICE kernels**
- **LRO LOLA terrain data**
- [Precomputed app data](https://github.com/luismar-ing/lunav/tree/main/web/public/data): `web/public/data`

## Connections

- Planner or learner → Application shell: opens (evidence: `README.md`)
- Application shell → Mission planner: routes to (evidence: `web/src/App.tsx`)
- Application shell → Educator chapters: routes to (evidence: `web/src/App.tsx`)
- Application shell → Mission challenge: routes to (evidence: `web/src/App.tsx`)
- Application shell → App state: loads core (evidence: `web/src/App.tsx`)
- Mission planner → App state: selects plans
- Mission planner → Date calendar: chooses dates
- Mission planner → Site assessment: shows assessment
- Site assessment → Site metrics: uses metrics (evidence: `web/src/components/MissionSidebar.tsx`)
- Mission planner → Plan comparison: pins plans (evidence: `README.md`)
- App state → Browser data loader: loads data (evidence: `web/src/store/appStore.ts`)
- Browser data loader → Data schemas: validates data (evidence: `web/src/lib/data.ts`)
- App state → Plan constraints: builds windows (evidence: `web/src/store/appStore.ts`)
- App state → Plan calculations: tracks mission (evidence: `web/src/lib/mission.ts`)
- Mission planner → Scene host: opens site view
- Scene host → 3D renderer: mounts scene
- 3D renderer → Lunar terrain: loads terrain (evidence: `web/src/scene3d/renderer.ts`)
- 3D renderer → Launch animation: uses launch state (evidence: `web/src/scene3d/renderer.ts`)
- Mission planner → Horizon panorama: opens panorama (evidence: `README.md`)
- Data build orchestration → Precomputed app data: generates data (evidence: `README.md`)
- Elevation model → LRO LOLA terrain data: reads elevation
- Sun and Earth positions → NASA/JPL SPICE kernels: reads kernels (evidence: `pipeline/ephemeris.py`)
- Data build orchestration → Candidate sites: builds site data
- Data build orchestration → Elevation model: builds terrain data
- Data build orchestration → Site features: builds features
- Data build orchestration → Sun and Earth positions: builds positions
- Data build orchestration → Visibility analysis: builds visibility
- Data build orchestration → Mission windows: builds windows
- Data build orchestration → Mission trajectories: builds trajectories
- Data build orchestration → Dataset validator: validates output
- Dataset validator → Data schemas: checks schema (evidence: `pipeline/validate.py`)
