> ## 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

> Manage ground stations and inspect their spacecraft pass geometry, coverage, and applied horizon

The **Stations** page is where you manage the ground stations your organization tracks passes against. Each station has a fixed location and can retain up to ten named elevation masks. A mask uses either the station’s constant minimum elevation or an uploaded horizon profile. Choose one mask per station when configuring a pass calculation.

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

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

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/6vb3axcORVXT2Ny4/images/ground-stations-list.png?fit=max&auto=format&n=6vb3axcORVXT2Ny4&q=85&s=f862bc0c3032638b0a63a10a9d4fca4e" alt="Ground Stations page showing the station list and a selected station overview" width="1440" height="1000" data-path="images/ground-stations-list.png" />

The page is a two-pane layout. The main area shows the selected station's overview — its code, name, the subtitle **Ground station overview and current pass opportunities**, a row of pass summary cards (see [Station Status and Pass Summary](#station-status-and-pass-summary) below), and the station's applied horizon (see [Viewing a Station's Applied Horizon](#viewing-a-stations-applied-horizon) below). The right pane lists your stations. Search by name or code and filter by Active or Inactive status. Click a row to select it; the selection stays in the URL when you reload or share the page. Use the list toggle in the top bar to give the overview more room. On narrow screens, the station list stacks below the overview instead of forcing horizontal scrolling.

Each row in the station list also carries a quick summary: every spacecraft with a recorded pass at that station appears as a pill with a satellite icon, and a field on the right names the spacecraft from the station's most recent pass — or reads **No passes** if it has none yet. A station with no associated spacecraft shows a dash instead of pills. Each row also states whether the station is **Active** or **Inactive** (see [Active and Inactive Stations](#active-and-inactive-stations) below). Spacecraft pills wrap beneath the station name so the summary fits within the list pane.

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**, **Deactivate station** (or **Activate 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.

## Optional RF-band and direction labels

When optional mask labels are available to your account, open **Edit Station** or
**Edit masks**, choose a mask, and enter **RF bands (optional)**. Separate custom
labels with commas, for example `S, X`. **Link direction (optional)** accepts
**Uplink**, **Downlink**, **Both**, or **Unspecified**. You can leave either field
empty or clear it later. The same controls are available in Mission Analysis's
station editor. Provider-owned masks remain read-only.

Labels appear beside mask names in station details and calculation selectors.
You still choose the mask explicitly; a label does not change visibility
calculations or establish RF or regulatory suitability. Existing masks work without
labels. Results retain the classification saved with their calculation, so later
station edits do not relabel past work. Previously calculated results may have no
classification. Seasonal validity is not inferred from these labels.

## Station Status and Pass Summary

Beneath the selected station's name, a row of summary cards recaps the station at a glance:

| Card | What it shows |
| - | - |
| **Status** | Whether the station is currently **Active** or **Inactive** (see [Active and Inactive Stations](#active-and-inactive-stations) below). |
| **Next pass** | A live countdown to the station's next pass, reading `In 2h 15m 30s` style, **Now** once the pass time has arrived, or **—** when no next pass is scheduled. |
| **Overflights · 7 days** / **Contact windows · 7 days** | Distinct overflights when that count is available; otherwise contact windows, within the same seven-day window as the heatmap. **—** means no count is available. When overflights are shown, a separate caption gives the number of contact windows. |

The **Status** card is always present. The **Next pass** and seven-day count cards appear together with the station pass opportunities panel, and show a loading placeholder while their summary is being fetched. Several contact windows can belong to one overflight, so these counts are not interchangeable.

## Active and Inactive Stations

Every station is either **Active** or **Inactive**. The station's **Status** card states which, and each row in the station list carries the same word — the state is always written out, never indicated by color alone.

Active stations take part in pass computation as normal. An inactive station stays listed and selectable; it only stops contributing new pass work, so no new passes are computed for it. Passes it already has remain in place, and you can still select the station, edit it, and review its recorded passes. Deactivation is not deletion, and it asks for no confirmation.

To deactivate a station, select it, open its kebab menu (**⋮**), and choose **Deactivate station**. The menu item reads **Deactivating...** while the change is in flight. Once the station is inactive, the same menu offers **Activate station**, which restores full participation in pass computation — no other changes are needed.

## Importing KSAT antennas

For workspaces with KSAT enabled, an administrator can open **Settings → Integrations**
and configure the KSAT account. Where the modal setup is available, choose **Connect**
or **Manage**, select Test or Production, and verify a service API key. Map your VALAR
spacecraft to their KSAT counterparts; **Add spacecraft mapping** lets you configure
several mappings before saving, including inactive or archived VALAR spacecraft.

Choose antennas from the list grouped by site, then save the mappings and antenna
selection. A new account starts with no antennas selected. **Select all** is optional;
saving an empty selection imports no stations. All mappings for the same KSAT account
share the selected antennas. If a later mapping fails to save, the modal identifies
how many succeeded so you can review and retry the remainder.

Newly imported antennas appear as **Inactive** stations. VALAR retains KSAT's receive
and transmit elevation masks separately; provider geometry and orbit readiness must
be qualified before operational use. Importing or mapping an archived spacecraft
does not activate it or establish booking readiness.

Use **Manage** to review mappings and readiness or to disconnect. Disconnecting keeps
station identities and history; disconnecting the account or its last spacecraft
removes the saved key and deactivates imported antennas. Existing reservations remain
in KSAT. Reconnect retained mappings by verifying the account and selecting the
spacecraft to reconnect. Closing setup discards unsaved credentials and choices.

## Inspecting a Station Opportunity

When a selected station has pass opportunities, the **Station pass opportunities** panel appears beside the antenna constraints. It shows a seven-day heatmap divided into 24-hour columns. An empty hour is labelled **No opportunities in this hour.** when the current result is known; if no current result exists, it is labelled **No current pass result is available.**

When the result covers several spacecraft, the panel header carries an **AGGREGATE** badge, with a coverage line beneath it. The line reads **N of M spacecraft covered** — for example, **2 of 3 spacecraft covered** — followed by **· missing:** and the names of any spacecraft without opportunities, or **· complete coverage** when every requested spacecraft is covered.

An empty panel distinguishes why it is empty. A genuinely empty seven-day window reads **No pass opportunities in this seven-day window.** When some covered spacecraft returned no opportunities, it reads **No pass opportunities returned for the covered spacecraft; this result is incomplete.** When the underlying spacecraft data is stale or the result is degraded, it reads **Opportunities are unavailable because the spacecraft data is stale; refresh and retry.** or **Opportunities are limited because the current result is degraded; refresh and retry.**, with a **Refresh** button — a stale or degraded result is not the same as an empty window.

Click a populated hour to select that time bucket. The page shows a compact list of the passes in that hour. Each pass includes its UTC acquisition time, spacecraft name, and **CANDIDATE** or **BOOKED** disposition. Click a pass to open its read-only pass geometry below the station overview.

The opportunity panel can also show the current result's state:

| Status | What you see |
| - | - |
| **Current result** | The current pass result is available for inspection. |
| **No current result** | No current result is available for the selected station and spacecraft. |
| **No pass opportunities in this window** | The seven-day window was evaluated and contains no pass opportunities. |
| **Stale current result** | The displayed result is older than the current result. |
| **Partial current result** | A combined result covers some, but not all, of the requested spacecraft. |
| **Degraded current result** | The result is available with reduced quality information. |

## Pass Geometry Inspector

After you select an opportunity, the **Pass geometry** section appears below the station overview. It reads **Predicted geometry for the selected station opportunity** and keeps every panel tied to the same selected prediction epoch.

| Panel | What you see and do |
| - | - |
| **Track map** | A window-only map with **Track** and **Station** markers. The map shows the predicted ground track and the station location; it is not a precise station-capability footprint. |
| **Prediction playback** | A **Prediction epoch** slider, the selected UTC epoch, and a **Play** or **Pause** control. Moving the slider or starting playback changes the selected epoch. |
| **Elevation profile** | Predicted elevation in degrees across the pass, with computed event markers and a line identifying the selected epoch. |
| **Azimuth profile** | Predicted azimuth in degrees across the pass, with the same event markers and selected-epoch line. |
| **Computed geometry markers** | Small marker dots on both profiles at the pass's event epochs — acquisition of signal, maximum elevation, and loss of signal. The computed causes behind each event are not displayed in this view. |
| **Provenance** | Freshness and quality badges, sampling outcome, revision, digest, source, frame/datum, and sample count. |

The selected epoch is synchronized across the map marker, both profiles, and the playback control. All displayed epochs and times use UTC.

## Pass Geometry States

The inspector keeps loading, valid empty, restricted, invalid, and unavailable results distinct. It never shows partial track data or raw error details.

| State | What you see | What it means |
| - | - | - |
| **Preparing geometry for this opportunity…** | A loading card under **Pass geometry**. | The selected opportunity's geometry is being prepared. No map, profiles, readout, or playback controls are shown yet. |
| **No pass window is available.** | The empty-state message plus the provenance context. | The opportunity has no usable pass window, so no track or prediction controls are drawn. |
| **Station geometry is restricted for your role.** | A restricted-state message with no geometry details. | The station's capability geometry is not exposed in this view. |
| **Couldn't load pass geometry. Please try again.** | A failure message without raw service details. | A temporary or terminal service failure prevented the geometry from being displayed. Temporary failures are retried automatically within the active prediction window; no redrive control is shown for a terminal failure. |
| **Pass geometry is unavailable for this opportunity.** | An unavailable-state message. | No usable geometry is available for the selected opportunity. |
| **Pass geometry is unavailable because its data is invalid.** | An invalid-data message. | The returned geometry could not be interpreted safely, so it is not drawn. |

When a displayed result is stale or degraded, the **Provenance** dialog shows the corresponding **STALE** or **DEGRADED** badge and the message **Geometry is informational and non-authoritative until the current result is refreshed.** Treat that geometry as review context rather than current authoritative coverage.

For a legacy station with unrestricted azimuth and an unknown elevation mask, the coverage card shows a **Mask unknown** badge instead of a bounded-coverage figure — the inspector does not display a precise footprint for this state.

## Viewing a Station's Applied Horizon

Selecting a station shows its **applied horizon** in the overview — 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.

The applied-horizon panel is rolling out gradually — until it reaches your account, the station overview shows the coverage chart without the rows described below.

| 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/6vb3axcORVXT2Ny4/images/ground-station-modal-constant-elevation.png?fit=max&auto=format&n=6vb3axcORVXT2Ny4&q=85&s=18e3bbf1e98a70e47a2ac0ac7cd7be95" 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="980" height="734" 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/6vb3axcORVXT2Ny4/images/ground-station-modal-elevation-mask.png?fit=max&auto=format&n=6vb3axcORVXT2Ny4&q=85&s=34d227e41142a5517d260ff7139ea6df" 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="980" height="758" 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. The same menu also offers **Deactivate station** (or **Activate station** on an inactive station) — see [Active and Inactive Stations](#active-and-inactive-stations). 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.
* [Sensors](/features/tracking-sensors) — managing the tracking sensor configurations alongside your ground stations.
* [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.

## Booking and past events

The next upcoming pass is selected automatically when results are available. Use the **Spacecraft** filter to narrow opportunities, or select a populated heatmap hour and then a pass in that hour. Times use 24-hour UTC throughout the inspector.

Click **Book event** in the selected pass inspector to save it in one step. No additional fields are required. The saved event includes the geometry, coverage, plots and provenance available in that inspector. Later recomputations do not replace this saved information.

Open **Booked events** in the top bar to browse **Past** or **Upcoming** bookings. Select a booking to inspect it and replay its saved geometry. The timestamp labelled **Saved at booking** identifies when the information was preserved. Bookings remain available when the original computation is superseded.

Older bookings are also listed. If a booking predates saved inspectors, its retained timing and measurements remain available, with a clear note that its original geometry and plots were not retained. A booking made from the Timeline saves the timing and measurements available there.

The current inspector presents data freshness compactly. Select **provenance** below the map to open the same dialog presentation used by AOI, including revision identifiers, sampling details and the source record. The opportunity selector appears directly below **Pass geometry**.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.