# ricardoarg23/moonset architecture

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

- Interactive diagram: https://gitdiagram.com/ricardoarg23/moonset
- Repository: https://github.com/ricardoarg23/moonset

## Overview

MoonSet helps users assess lunar surface lighting and direct-to-Earth visibility at a chosen site and date. The main workflow is site or coordinate selection, API evaluation, and visualization of the resulting horizon, status, timeline, and comparisons; the planner also exposes calculation parameters. The backend combines ephemerides, terrain horizon, and derived metrics. The README documents a no-server mode using precalculated results, but the sampled excerpts do not show its detailed loading path or all comparison behavior.

Main entry points: [`frontend/src/App.jsx`](https://github.com/ricardoarg23/moonset/blob/main/frontend/src/App.jsx) (MoonSet app), [`backend/app/servicio.py`](https://github.com/ricardoarg23/moonset/blob/main/backend/app/servicio.py) (Evaluation service), [`frontend/src/api/datos.js`](https://github.com/ricardoarg23/moonset/blob/main/frontend/src/api/datos.js) (Data client), [`frontend/src/componentes/VistaPanoramica.jsx`](https://github.com/ricardoarg23/moonset/blob/main/frontend/src/componentes/VistaPanoramica.jsx) (360° panorama)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_interaction["User interface"]
  node_app["MoonSet app<br/>[App.jsx]"]
  node_data_client["Data client<br/>[datos.js]"]
  node_site_picker["Site selector<br/>[SelectorSitio.jsx]"]
  node_panorama["360° panorama"]
  node_status["Status panel<br/>[PanelEstado.jsx]"]
  node_timeline["Timeline<br/>[LineaDeTiempo.jsx]"]
  node_comparison["Site comparison<br/>[Comparacion.jsx]"]
  node_canvas["Canvas sizing<br/>[useCanvas.js]"]
  node_time_utils["Time utilities<br/>[tiempo.js]"]
end

subgraph group_api["API and orchestration"]
  node_api_routes["HTTP API<br/>[main.py]"]
  node_site_catalog["Site catalog<br/>[sitios.py]"]
  node_evaluation["Evaluation service<br/>[servicio.py]"]
  node_config["Runtime configuration<br/>[config.py]"]
end

subgraph group_calculation["Lunar calculations"]
  node_ephemerides["Sun/Earth positions<br/>[efemerides.py]"]
  node_horizon["Terrain horizon<br/>[horizonte.py]"]
  node_metrics["Light/link metrics<br/>[metricas.py]"]
end

subgraph group_datasets["Mission data"]
  node_site_data["Curated sites<br/>[sitios.json]"]
  node_precomputed["Precomputed evaluations"]
end

node_user(("Mission user"))
node_jpl["JPL DE421 kernels"]
node_lola["LOLA terrain DEM"]

node_user -->|"chooses site"| node_app
node_app -->|"requests data"| node_data_client
node_app -->|"renders"| node_site_picker
node_app -->|"renders"| node_panorama
node_app -->|"renders"| node_status
node_app -->|"renders"| node_timeline
node_app -->|"renders"| node_comparison
node_panorama -->|"draws with"| node_canvas
node_timeline -->|"draws with"| node_canvas
node_panorama -->|"interpolates horizon"| node_time_utils
node_timeline -->|"formats dates"| node_time_utils
node_comparison -->|"formats values"| node_time_utils
node_data_client -->|"calls API"| node_api_routes
node_data_client -.->|"uses in no-server mode"| node_precomputed
node_api_routes -->|"loads sites"| node_site_catalog
node_api_routes -->|"evaluates request"| node_evaluation
node_site_catalog -->|"reads"| node_site_data
node_evaluation -->|"calculates positions"| node_ephemerides
node_evaluation -->|"gets horizon"| node_horizon
node_evaluation -->|"computes metrics"| node_metrics
node_metrics -->|"samples elevations"| node_horizon
node_ephemerides -->|"loads kernels"| node_jpl
node_horizon -->|"samples terrain"| node_lola

click node_app "https://github.com/ricardoarg23/moonset/blob/main/frontend/src/App.jsx"
click node_data_client "https://github.com/ricardoarg23/moonset/blob/main/frontend/src/api/datos.js"
click node_site_picker "https://github.com/ricardoarg23/moonset/blob/main/frontend/src/componentes/SelectorSitio.jsx"
click node_panorama "https://github.com/ricardoarg23/moonset/blob/main/frontend/src/componentes/VistaPanoramica.jsx"
click node_status "https://github.com/ricardoarg23/moonset/blob/main/frontend/src/componentes/PanelEstado.jsx"
click node_timeline "https://github.com/ricardoarg23/moonset/blob/main/frontend/src/componentes/LineaDeTiempo.jsx"
click node_comparison "https://github.com/ricardoarg23/moonset/blob/main/frontend/src/componentes/Comparacion.jsx"
click node_canvas "https://github.com/ricardoarg23/moonset/blob/main/frontend/src/componentes/useCanvas.js"
click node_time_utils "https://github.com/ricardoarg23/moonset/blob/main/frontend/src/utils/tiempo.js"
click node_api_routes "https://github.com/ricardoarg23/moonset/blob/main/backend/app/main.py"
click node_site_catalog "https://github.com/ricardoarg23/moonset/blob/main/backend/app/sitios.py"
click node_evaluation "https://github.com/ricardoarg23/moonset/blob/main/backend/app/servicio.py"
click node_config "https://github.com/ricardoarg23/moonset/blob/main/backend/app/config.py"
click node_ephemerides "https://github.com/ricardoarg23/moonset/blob/main/backend/app/efemerides.py"
click node_horizon "https://github.com/ricardoarg23/moonset/blob/main/backend/app/horizonte.py"
click node_metrics "https://github.com/ricardoarg23/moonset/blob/main/backend/app/metricas.py"
click node_site_data "https://github.com/ricardoarg23/moonset/blob/main/data/sitios.json"
click node_precomputed "https://github.com/ricardoarg23/moonset/tree/main/data/precalculado"

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_data_client,node_site_picker,node_panorama,node_status,node_timeline,node_comparison,node_canvas,node_time_utils,node_user toneBlue
class node_api_routes,node_site_catalog,node_evaluation,node_config toneAmber
class node_ephemerides,node_horizon,node_metrics toneMint
class node_site_data,node_precomputed toneRose
class node_jpl,node_lola toneIndigo
```

## Components

### User interface

- [MoonSet app](https://github.com/ricardoarg23/moonset/blob/main/frontend/src/App.jsx): `frontend/src/App.jsx`
- [Data client](https://github.com/ricardoarg23/moonset/blob/main/frontend/src/api/datos.js): `frontend/src/api/datos.js`
- [Site selector](https://github.com/ricardoarg23/moonset/blob/main/frontend/src/componentes/SelectorSitio.jsx): `frontend/src/componentes/SelectorSitio.jsx`
- [360° panorama](https://github.com/ricardoarg23/moonset/blob/main/frontend/src/componentes/VistaPanoramica.jsx): `frontend/src/componentes/VistaPanoramica.jsx`
- [Status panel](https://github.com/ricardoarg23/moonset/blob/main/frontend/src/componentes/PanelEstado.jsx): `frontend/src/componentes/PanelEstado.jsx`
- [Timeline](https://github.com/ricardoarg23/moonset/blob/main/frontend/src/componentes/LineaDeTiempo.jsx): `frontend/src/componentes/LineaDeTiempo.jsx`
- [Site comparison](https://github.com/ricardoarg23/moonset/blob/main/frontend/src/componentes/Comparacion.jsx): `frontend/src/componentes/Comparacion.jsx`
- [Canvas sizing](https://github.com/ricardoarg23/moonset/blob/main/frontend/src/componentes/useCanvas.js): `frontend/src/componentes/useCanvas.js`
- [Time utilities](https://github.com/ricardoarg23/moonset/blob/main/frontend/src/utils/tiempo.js): `frontend/src/utils/tiempo.js`

### API and orchestration

- [HTTP API](https://github.com/ricardoarg23/moonset/blob/main/backend/app/main.py): `backend/app/main.py`
- [Site catalog](https://github.com/ricardoarg23/moonset/blob/main/backend/app/sitios.py): `backend/app/sitios.py`
- [Evaluation service](https://github.com/ricardoarg23/moonset/blob/main/backend/app/servicio.py): `backend/app/servicio.py`
- [Runtime configuration](https://github.com/ricardoarg23/moonset/blob/main/backend/app/config.py): `backend/app/config.py`

### Lunar calculations

- [Sun/Earth positions](https://github.com/ricardoarg23/moonset/blob/main/backend/app/efemerides.py): `backend/app/efemerides.py`
- [Terrain horizon](https://github.com/ricardoarg23/moonset/blob/main/backend/app/horizonte.py): `backend/app/horizonte.py`
- [Light/link metrics](https://github.com/ricardoarg23/moonset/blob/main/backend/app/metricas.py): `backend/app/metricas.py`

### Mission data

- [Curated sites](https://github.com/ricardoarg23/moonset/blob/main/data/sitios.json): `data/sitios.json`
- [Precomputed evaluations](https://github.com/ricardoarg23/moonset/tree/main/data/precalculado): `data/precalculado`

### Other components

- **Mission user**
- **JPL DE421 kernels**
- **LOLA terrain DEM**

## Connections

- Mission user → MoonSet app: chooses site (evidence: `frontend/src/App.jsx`)
- MoonSet app → Data client: requests data (evidence: `frontend/src/App.jsx`)
- MoonSet app → Site selector: renders (evidence: `frontend/src/App.jsx`)
- MoonSet app → 360° panorama: renders (evidence: `frontend/src/App.jsx`)
- MoonSet app → Status panel: renders (evidence: `frontend/src/App.jsx`)
- MoonSet app → Timeline: renders (evidence: `frontend/src/App.jsx`)
- MoonSet app → Site comparison: renders (evidence: `frontend/src/App.jsx`)
- 360° panorama → Canvas sizing: draws with (evidence: `frontend/src/componentes/VistaPanoramica.jsx`)
- Timeline → Canvas sizing: draws with (evidence: `frontend/src/componentes/LineaDeTiempo.jsx`)
- 360° panorama → Time utilities: interpolates horizon (evidence: `frontend/src/componentes/VistaPanoramica.jsx`)
- Timeline → Time utilities: formats dates (evidence: `frontend/src/componentes/LineaDeTiempo.jsx`)
- Site comparison → Time utilities: formats values (evidence: `frontend/src/componentes/Comparacion.jsx`)
- Data client → HTTP API: calls API (evidence: `README.md`)
- Data client → Precomputed evaluations: uses in no-server mode (evidence: `README.md`)
- HTTP API → Site catalog: loads sites (evidence: `backend/app/main.py`)
- HTTP API → Evaluation service: evaluates request (evidence: `backend/app/main.py`)
- Site catalog → Curated sites: reads (evidence: `backend/app/sitios.py`)
- Evaluation service → Sun/Earth positions: calculates positions (evidence: `backend/app/servicio.py`)
- Evaluation service → Terrain horizon: gets horizon (evidence: `backend/app/servicio.py`)
- Evaluation service → Light/link metrics: computes metrics (evidence: `backend/app/servicio.py`)
- Light/link metrics → Terrain horizon: samples elevations (evidence: `backend/app/metricas.py`)
- Sun/Earth positions → JPL DE421 kernels: loads kernels (evidence: `backend/app/efemerides.py`)
- Terrain horizon → LOLA terrain DEM: samples terrain (evidence: `backend/app/horizonte.py`)
