✳ HELIOSReturn to observatory ↗

KNOW YOUR SIGNAL

Beautifully visualized.
Carefully interpreted.

HELIOS connects public space weather observations to an interactive three-dimensional story. The distinction between a measurement, a model and an illustration is part of the experience.

What is live?

The Fastify backend polls NOAA SWPC JSON feeds every 60 seconds, and asks NASA DONKI for coronal mass ejections from the last 21 days. The dashboard refreshes once per minute while the page is visible. A live label requires usable, fresh X-ray, planetary Kp, solar wind speed, interplanetary Bz and aurora inputs. The CME catalog has its own status and does not decide that label. Each feed retains its own observation time. The cadence of an instrument is separate from the app's refresh interval.

If only some observations are fresh, the dashboard is labelled partial. Previously received readings become delayed when the upstream fetch fails or their source times exceed the freshness window. If no observation can be retrieved, the app clearly shows an illustrative scenario. It never turns demo readings into live alerts.

Solar activity

GOES primary X-ray observations use the 0.1–0.8 nm channel, in watts per square metre. The chart contains up to six hours, with one-, three- and six-hour views. Class equivalents A, B, C, M and X express the observed flux; the highest point in this series is not a verified flare catalogue entry. A flare alone does not establish that a coronal mass ejection is Earth-directed.

Source: NOAA GOES X-ray flux documentation.

CME arrival forecasts

Earth-directed arrivals come from NASA DONKI. When a WSA-Enlil run lists an Earth impact, HELIOS shows that arrival time, whether it is a glancing blow, and the modelled Kp at Earth if DONKI published one. If Enlil has not run, a CME whose Stonyhurst longitude sits inside its half-angle, plus a 10 degree margin, gets a kinematic transit: one astronomical unit divided by the analysed speed. NOAA bulletins that mention a CME are listed beside those model rows. An empty 21-day window is not proof that the Sun is quiet.

Sources: NASA DONKI CME query and NOAA WSA-Enlil documentation.

Geomagnetic conditions and G-storm alerts

Planetary Kp is a geomagnetic activity index. The G-scale mapping in HELIOS follows the published NOAA thresholds: Kp 5, 6, 7, 8 and 9 correspond to G1 through G5. A Kp below 5 is below the G1 threshold, not proof that every local system is unaffected. The displayed solar wind speed is upstream at L1, and Bz is the interplanetary field's GSM z component, in nanotesla.

When Kp reaches G1 or higher, the observatory shows a storm banner and adds a derived notice to the signal log. With G-storm alerts enabled, a live crossing also raises an in-app toast and, if you allow it, a desktop notification. The same path carries a NOAA geomagnetic watch, warning or alert. The page has to be open. HELIOS does not send background push, email or SMS, and demo or delayed data never triggers these notices.

Source: NOAA space weather scales.

Aurora model intensity

The location selector finds the nearest retained OVATION grid cell, using wrapped longitude and latitude-weighted distance. The grid is thinned to reduce transfer size. A missing nearby cell is shown as unavailable. Its intensity value is not a local probability of seeing an aurora. Daylight, clouds, the horizon, and model uncertainty affect what a person can actually see.

The three-dimensional auroral curtain is an artistic schematic. Its shape does not reproduce the current forecast grid. The model readout and its forecast timestamp are the data-backed part of this view.

Source: NOAA OVATION forecast documentation.

Satellite risk and LEO drag

Orbital paths and satellite objects are schematic. HELIOS does not ingest orbital elements, propagate real spacecraft positions, or assess an individual vehicle. MEO and GEO labels remain qualitative context from planetary Kp. They are not outage probabilities or charging measurements.

The LEO table is a separate estimate. Quiet density at 400 km is fixed at 2.0×10⁻¹² kg/m³. A Kp multiplier and a southward-Bz multiplier raise that density, and the scale height is 48 + 5.5×Kp kilometres. Density at each altitude follows an exponential. Drag acceleration is ½ Cd (A/m) ρ v² for a circular orbit. The decay rate is 2 a r / v. The four rows use fixed, illustrative area-to-mass values for the ISS, Hubble, a Starlink-like shell and a 3U CubeSat. A row is elevated when its decay is at least 2.5 times the quiet baseline, or when Kp is already at G1. It is high at 5 times, or at G3. This is not NRLMSISE-00, not a tracked ephemeris, and not a lifetime or conjunction product.

Alerts and your privacy

Threshold preferences and the G-storm toggle are saved in this browser's local storage, not in an account. Rules and G-storm notices only notify on fresh live data while the page is open. Permission-based desktop notifications are optional. HELIOS does not provide background push, email or SMS delivery. Received NOAA bulletins are shown separately from your own threshold rules and from the Kp-derived G-scale. Use the test-alert control to preview the interface; it is always marked as a test.

No geolocation is requested. Location selection uses a short list of public city coordinates. Downloaded snapshots include the data source and observation timestamps.

Backend, history and deployment

The separate Node/Fastify service retrieves and normalizes the upstream feeds. Postgres keeps each live, partial, or delayed observation in weather_snapshots, then stores that observation's CME forecasts, geomagnetic storms, and LEO drag estimates in their own tables. Migrations 001 through 004 run in order on startup and through npm run db:migrate. Without a configured, reachable database, the API reports memory storage rather than claiming persistence. Demo data is never stored as a real observation.

SpinBuild runs the Astro frontend and Fastify API together, using a same-origin /v1 proxy. Postgres uses the managed database connection when available. If the frontend is exported to a standalone static host, deploy the backend separately and set PUBLIC_API_URL before building. Unavailable upstream feeds are always shown as labelled demo or delayed observations. The repository README contains the setup commands.

Rendering and accessibility

The 3D scene is loaded separately from the main interface. Its renderer caps resolution and frame rate on mobile, pauses when the tab is hidden, and respects the system's reduced-motion preference. A pause control stops ambient animation while scroll-driven scene changes remain available. Data, chart labels, tables and settings do not depend on WebGL being available.

← Back to the observatory
Edit with SpinBuild