> ## Documentation Index
> Fetch the complete documentation index at: https://docs.valar.space/llms.txt
> Use this file to discover all available pages before exploring further.

# Ground Stations

> Create and edit ground stations with a coordinate minimap and one exclusive coverage-definition choice

> For the complete documentation index, see [llms.txt](/llms.txt).

The **Stations** page is where you manage the ground stations your organization tracks passes against. Each station has a fixed location and one coverage definition — either a constant minimum elevation or an uploaded elevation mask — that determines when a spacecraft counts as visible from it.

**Route:** `/passes/stations`

Open the page via the **Stations** tab in the Passes area's tab bar, alongside the **Table**, **Timeline**, and **Coverage Map** tabs.

## Page Layout

<img src="https://mintcdn.com/valar-8bbb18b5/MxSxnOfMLfnKzay2/images/ground-stations-list.png?fit=max&auto=format&n=MxSxnOfMLfnKzay2&q=85&s=04cf290e6fc0a2cd6143ce5e8f32992e" alt="Stations page with the station list on the left and a selected station's details on the right" width="1681" height="1252" data-path="images/ground-stations-list.png" />

The page is a two-pane layout. The left pane lists every station in your organization; the right pane shows the details of whichever station is selected. Click a row in the list to select it — its coordinates, reference frame, and applied horizon appear on the right (see [Viewing a Station's Applied Horizon](#viewing-a-stations-applied-horizon) below).

Click **New Station** in the top-right corner to open the [ground-station creation modal](#creating-or-editing-a-ground-station). Selecting a station and opening its kebab menu (**⋮**) offers **Edit Station** and **Delete Station**.

When your organization has no stations yet, the page shows **No ground stations configured** with an **Add Ground Station** button that opens the same modal.

## Viewing a Station's Applied Horizon

Selecting a station shows its **applied horizon** on the right — the composed curve pass computation actually uses, alongside the raw survey behind it and your configured minimum elevation as a reference line. See [Elevation Masks](/features/passes/elevation-masks) for how these combine.

| Situation                                        | What you see                                                                                                                                                                                   |
| ------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **A surveyed elevation mask is on file**         | Two curves: the applied horizon (dominant) and the raw survey behind it. Wherever the two coincide exactly, a note confirms it, so a single visible curve is never mistaken for a missing one. |
| **No elevation mask is on file**                 | A single curve at your configured minimum elevation.                                                                                                                                           |
| **This station's stored horizon cannot be read** | **No horizon available for this station** — no chart is drawn, and no engine-applied curve can be shown until the survey is re-uploaded.                                                       |
| **The station's details failed to load**         | **Failed to load this station's horizon**, with a **Retry** button.                                                                                                                            |

Beneath the chart, two rows describe the horizon in force:

| Row                  | What it tells you                                                                                                                                                                                                                                                |
| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Horizon in force** | The angle currently governing this station. If your minimum elevation is what's actually binding — the survey would have allowed lower access but your policy floor doesn't — this is called out explicitly rather than left for you to work out from the chart. |
| **Horizon basis**    | Where the applied horizon comes from: **Surveyed** (from an uploaded elevation mask), **Platform default** (no survey on file; a uniform horizon derived from your minimum elevation), or **Unspecified** (see note below).                                      |

<Note>
  **Unspecified** does not mean something is wrong with the station. It means the station was configured before VALAR began recording where a horizon comes from, so its provenance was never captured — not that a survey is missing or that the platform is guessing.
</Note>

A line beneath these rows may also state whether the horizon has been applied yet: for a station whose survey was just uploaded but hasn't yet been used in a pass computation, it reads **This horizon is on file but has not yet been applied to any pass computation.** Once it has been used, the same line instead reads **Horizon in force since \<date>**.

## Creating or Editing a Ground Station

<img src="https://mintcdn.com/valar-8bbb18b5/MxSxnOfMLfnKzay2/images/ground-station-modal-constant-elevation.png?fit=max&auto=format&n=MxSxnOfMLfnKzay2&q=85&s=be79532f04d578301e5748c190bb45bf" alt="New Ground Station modal showing the site-location column with a populated minimap, and the coverage-definition column in constant minimum elevation mode" title="New Ground Station — constant minimum elevation" className="mx-auto" style={{ width:"92%" }} width="1681" height="1252" data-path="images/ground-station-modal-constant-elevation.png" />

Creating or editing a station opens a single modal — **New Ground Station** or **Edit Ground Station** — with no next/back steps to move through. Every field for the station lives on one scrollable surface, arranged in two columns: **Site location** on the left and **Coverage definition** on the right. On narrower screens the two columns stack into one, so nothing here requires horizontal scrolling at any supported window size.

### Site Location

| Field               | Description                                                                                                                |
| ------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| **Station name**    | Free-text identifier for the station.                                                                                      |
| **Latitude**        | Geodetic latitude in degrees, `-90` to `90`.                                                                               |
| **Longitude**       | Geodetic longitude in degrees, `-180` to `180`.                                                                            |
| **Altitude (m)**    | Station altitude in meters.                                                                                                |
| **Reference Frame** | Shown as a fixed `ITRF2020` badge next to the section heading — every station uses this frame; there is nothing to choose. |

Below the coordinate fields is a compact 16:9 minimap that places a marker at the entered latitude and longitude as soon as both are valid. It is a location check only — it confirms the point on the globe you meant, not terrain suitability, antenna readiness, or coverage.

| Situation                                                | What you see                                                                                            |
| -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| **Latitude and longitude are both valid**                | A marker appears at the entered coordinates.                                                            |
| **Coordinates are blank or incomplete**                  | No marker; the map reads **Enter the station coordinates**.                                             |
| **A coordinate is out of range**                         | No marker for that value; the field itself shows an inline error (see [Validation](#validation) below). |
| **The map cannot load** (no token, or WebGL unsupported) | The frame reads **Map preview unavailable**; the coordinate fields stay usable regardless.              |

### Coverage Definition

<Note>
  The two coverage forms are alternatives, not two limits you combine — choose the one that describes this station's horizon and the modal shows only the fields that choice needs.
</Note>

The right column holds one exclusive choice between two coverage definitions:

| Option                         | Description                                                                                      |
| ------------------------------ | ------------------------------------------------------------------------------------------------ |
| **Constant minimum elevation** | One policy floor around the station — the same minimum elevation angle applies at every azimuth. |
| **Elevation mask**             | A surveyed horizon that changes by azimuth, supplied as a CSV file.                              |

Switching between the two clears whatever you had entered for the other — a mask you uploaded does not reappear if you switch back to it after selecting constant minimum elevation, and vice versa.

#### Constant Minimum Elevation

Enter a single **Minimum elevation (degrees)** value between `0` and `90`. A new station starts at `10.0` degrees by default.

#### Elevation Mask (CSV Upload)

Choose a CSV file under **Elevation mask CSV**. Each row is one `azimuth,elevation` pair:

```
azimuth,elevation
0,10
90,15
180,12
270,8
```

<Info>
  **Each row applies from its azimuth boundary until the next boundary** — a row does not describe a single point, it describes an interval. For example, `0,10` followed by `90,15` means 10 degrees applies from azimuth 0 up to (but not including) 90 degrees, where the 15-degree value takes over. The final interval wraps around from 360 degrees back to 0 degrees, so the last row's value also covers the gap back to the first row's azimuth.
</Info>

| Requirement                               | Detail                                                                                                              |
| ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| **Columns**                               | `azimuth,elevation`, in that order.                                                                                 |
| **Header row**                            | Optional — a first row that contains the word "azimuth" is detected and skipped automatically.                      |
| **Azimuth range**                         | `0°` up to (not including) `360°`. Any spacing between rows is accepted — the rows do not need to be evenly spaced. |
| **Elevation range**                       | `0°` to `90°`, inclusive.                                                                                           |
| **Repeated azimuth, same elevation**      | Accepted — the repeat is redundant and simply collapses to one point.                                               |
| **Repeated azimuth, different elevation** | Rejected — an azimuth cannot carry two conflicting elevation values.                                                |

If a row fails validation, the upload is rejected with a message naming the offending row or azimuth, and whatever mask you had previously uploaded successfully stays in place — a bad file never clears a good one. Activating the upload without choosing a file first shows **Choose a CSV before it can be previewed**.

### Applied Horizon Preview

<img src="https://mintcdn.com/valar-8bbb18b5/MxSxnOfMLfnKzay2/images/ground-station-modal-elevation-mask.png?fit=max&auto=format&n=MxSxnOfMLfnKzay2&q=85&s=f4babd5d5a01eee05e221ae7fac12595" alt="New Ground Station modal in elevation mask mode, showing an uploaded CSV file and the resulting applied-horizon radar preview" title="New Ground Station — elevation mask" className="mx-auto" style={{ width:"92%" }} width="1681" height="1252" data-path="images/ground-station-modal-elevation-mask.png" />

Below the coverage controls, a radar-style chart shows the **applied horizon** — the server-evaluated result of your coverage definition, redrawn shortly after you stop typing or a file finishes uploading. This is the same interpretation the platform uses to compute passes; you review the result rather than calculating it yourself.

<Note>
  The minimum elevation value carries over as a floor beneath an elevation mask too: for any azimuth where the mask specifies a lower elevation than the current minimum-elevation value, the higher of the two is what the preview (and the saved station) actually applies. If you intend a mask value to take effect exactly as surveyed, make sure the minimum elevation is set at or below it.
</Note>

| Situation                                                                 | What you see                                                                                                                                   |
| ------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| **Nothing entered yet**                                                   | **Enter a coverage definition to preview the applied horizon.**                                                                                |
| **A value just changed and the new preview hasn't returned yet**          | The previous chart dims and reads **Preview is out of date**.                                                                                  |
| **The preview request is in flight**                                      | A loading placeholder replaces the chart — no stale result is shown as current.                                                                |
| **The server cannot evaluate the current draft**                          | **Horizon could not be evaluated**, with guidance to adjust the minimum elevation or the uploaded survey. Saving is blocked until this clears. |
| **Constant minimum elevation, valid**                                     | A uniform circle at the chosen elevation.                                                                                                      |
| **Elevation mask, valid**                                                 | A shape that varies by azimuth, reflecting the uploaded survey (composed with the minimum-elevation floor above).                              |
| **Editing an existing station whose stored profile can't be interpreted** | **Applied horizon unavailable** — every other field on the station stays editable regardless.                                                  |

### Validation

Every field is checked as you type; a required field only shows as missing after you attempt to save.

| Field                           | Error shown                                                                    |
| ------------------------------- | ------------------------------------------------------------------------------ |
| **Station name**                | Enter a station name                                                           |
| **Latitude**                    | Enter a latitude / Latitude must be between -90 and 90 degrees                 |
| **Longitude**                   | Enter a longitude / Longitude must be between -180 and 180 degrees             |
| **Altitude (m)**                | Enter an altitude / Altitude must be a number                                  |
| **Minimum elevation (degrees)** | Enter a minimum elevation / Minimum elevation must be between 0 and 90 degrees |

If saving fails after every field validates, the modal stays open, every value you entered is preserved, and a banner explains what went wrong so you can retry without re-entering anything.

Click **Cancel** to close without saving, or **Create station** (**Save changes** when editing) to save. The button reads **Saving...** while the request is in flight.

## Editing or Deleting a Station

Select a station in the list, open its kebab menu (**⋮**), and choose **Edit Station** to reopen the same modal pre-filled with that station's values, or **Delete Station** to remove it. Deleting asks you to confirm first — **Are you sure you want to delete \<station name>? This action cannot be undone.**

## Related Pages

* [Passes Overview](/features/passes/overview) — the Passes area's landing page and a map of where each Passes page fits.
* [Elevation Masks](/features/passes/elevation-masks) — what a station's elevation mask is and how it combines with its minimum elevation.
* [Timeline](/features/passes/timeline) — what each station's outcome on the timeline means, including what to do about it.
* [Coverage Map](/features/passes/coverage-map) — a read-only geographic view of every station's coverage footprint at a shared reference altitude.
