# START — Software Transient Array Radio Telescope

Published 2026-10-03 UTC at https://sol.system42.one/start.

## Implementation and scope

The browser fetches real TART observations through `/api/start`. No synthetic observations or local fixture fallback are used in production. Ten stations are listed from the official OpenAPI server registry inspected on publication day. Availability varies independently of registry membership. Bangladesh is the initial selection because it returned current data during verification; Ghana, Kenya, and Rhodes also responded.

Static UI: `/home/david/random/www/start/{index.html,style.css,app.js}`.
Relay: `/home/david/random/bin/start_api.py`.
Service: `sol-start-api.service`, enabled in the user systemd manager, loopback port 8926.
Routing: existing `bin/Caddyfile.pkd_share`; exact `/start` serves the page, `/start/` redirects, `/api/start/*` strips the prefix and forwards to the relay. Root crawler spine and Sol Start menu link to START.

The relay allows fixed station codes and fixed upstream GET endpoints only. No arbitrary URL forwarding, telescope settings, credentials, account creation, or external writes. Metadata fetches run concurrently; each response is capped at 2 MB, with connect/read timeouts and redirects disabled. One response per station is shared in memory for 30 seconds, including errors. No continuous polling happens without viewers; active visible browser tabs poll every 60 seconds. Cache is ephemeral. Browser JSON downloads provide explicit durable snapshots with observation timestamp, retrieval time, upstream URL, raw visibility record, positions, info, calibration, and metadata errors.

The current visual preview supports station gain/phase correction and timestamp-matched object markers. See the object-observation update below. The original 2026-10-03 launch used an uncalibrated, geographically unvalidated preview; that original method has been superseded. Raw matrices remain available.

Freshness uses observation vs relay retrieval time plus browser elapsed time, avoiding dependence on a visitor's wall clock. Five minutes is the UI freshness threshold; future timestamps beyond 30 seconds and missing/invalid timestamps are not fresh. Failed updates retain the last observation visibly marked unavailable. Changing station clears the previous frame and all pair hover values.

## Operations

- Restart relay: `systemctl --user restart sol-start-api.service`
- Inspect: `journalctl --user -u sol-start-api.service -n 30 --no-pager`
- Health: `curl https://sol.system42.one/api/start/health`
- Registry: `curl https://sol.system42.one/api/start/stations`
- Observation: `curl https://sol.system42.one/api/start/observation/bd-iub`
- UI state checks: `node /home/david/random/docs/start/checks/check-state.cjs`
- Browser: https://sol.system42.one/start or local origin http://127.0.0.1:8888/start

Refresh the fixed registry against https://api.elec.ac.nz/docs/openapi.json when deployments change. Do not label listed stations as online without receiving their observations. Mauritius and several other sites timed out during initial checks.

Rollback: restore the pre-edit Caddy config from `/home/david/start-work/Caddyfile.before`, validate and reload Caddy, disable the relay, and remove only the START menu/index entries if retiring the page. Complete pre-edit snapshot `20261003T044551Z` reports 5137 items and `missing_sources: []`; restore root `/home/david/backups/sol37-runtime`. Retain new files for provenance rather than deleting them as part of routine rollback.

## Verification

- Caddy validation, Python compilation, JavaScript syntax: passed.
- Public HTTPS page and observation API: HTTP 200; live response had 276 baselines and all metadata endpoints succeeded.
- Real browser through local origin: fresh observation, rendered Fourier preview and matrix, phase selection, pause control, Ghana station switch, Mauritius timeout with empty plots, and recovery selection verified.
- Download button produced `/home/david/Downloads/start-bd-iub-2026-10-03T05-02-40-502488Z.json`; parsed and verified 276 rows, station, timestamps, positions, gain metadata, and source attribution.
- At 390 px viewport, DOM measured document and body width 375 px (scrollbar accounted for); no page horizontal overflow. Archive table scrolls within its container.
- State regression script covers fresh, stale, malformed timestamp, and failed-refresh retention without labeling retained data fresh.
- Unknown station returns 404. Relay health and Caddy service active.
- The in-app browser encountered QUIC/navigation errors on the public host during testing. Public HTTPS was verified with HTTP requests; interactive verification used the same files and relay through the local origin. No TLS/security settings were weakened.

## Sources and access corrections

TART: https://tart.elec.ac.nz/ and https://api.elec.ac.nz/docs/.
NRAO: https://science.nrao.edu/observing/policies/docs/manuals/users-policy/referencemanual-all-pages permits unauthenticated non-proprietary data access. Do not say all NRAO downloads require an account. ALMA identities/proprietary access can be separate.
LOFAR: https://science.astron.nl/telescopes/lofar/access-to-lofar-data/lofar-data-archive/ distinguishes public metadata from staging/downloading with LTA privileges.
SARAO: https://archive.sarao.ac.za/docs/Group_Management_Guide.pdf documents project group permission requirements.
CASDA: https://astroquery.readthedocs.io/en/latest/casda/casda.html requires OPAL authentication to stage data, but documents unauthenticated retrieval of staged download URLs.

## Final backup coverage

Post-deployment runtime snapshot `20261003T050517Z`: 5148 items, `missing_sources: []`. This snapshot contains START web assets but the backup's fixed source list does not include the new relay script and service unit. A separate verified restore bundle covers those new dependencies plus the UI, runbook, active Caddy config, and pre-edit Caddy config:
`/mnt/sol-data/archives/start/start-20261003T0506Z.tar.gz`.
Restore only reviewed paths from this bundle; validate Caddy before any reload. Avoid replacing unrelated subsequent site changes.


## Object-observation update — 2026-10-03

User-requested prominent targets: Orion Nebula (M42) and the Sun. Additional common targets: Moon, Jupiter, Saturn, Crab Nebula, Andromeda Galaxy, Cassiopeia A, Cygnus A, Centaurus A. Satellites remain available through category selection. `/start#objects` links directly to the object desk.

New backend module `bin/start_objects.py` uses installed Astropy 6.1.7, fixed SIMBAD ICRS positions, and builtin solar-system ephemerides. Telescope location and visibility timestamp are mandatory; missing coordinates never default to an invented observing site. Atmospheric refraction is disabled. IERS auto-download is disabled; dates outside bundled Earth-rotation coverage use Astropy's degraded transformation, reported in JSON warnings and the UI. Suitable for the preview's low angular resolution; not precision astrometry.

`objects_for` adds common positions and the external TART satellite catalogue at the exact observation timestamp. A satellite catalogue failure does not remove common celestial targets or prevent real visibility display. Object source references are included per target. TART's placeholder Sun range and model flux fields are deliberately not shown as observations.

`www/start/science.js` implements the shared numerical functions. The new synthesis convention uses `Re[V exp(-i k (ri-rj).s)]`, with `s=(sin(az)cos(el), cos(az)cos(el), sin(el))` in ENU. This corrects the initial exploratory image's inverse-phase convention and establishes north-up/east-right plotting. It matches TART's analytic simulated visibility convention. Station alignment still depends on upstream geometry.

Station gain/phase correction is `V * gi * gj * exp(-i(phi_i-phi_j))`. Zero-gain antennas and explicitly flagged baselines are excluded. Invalid gain metadata produces labeled raw mode. This does not certify calibration freshness or produce flux-calibrated images. The display labels the actual number of baselines used separately from raw baselines received.

`www/start/objects.js` provides favourite buttons, search, category and horizon filters, selectable position overlays, selected-direction magnification, and a normalized signed directional-response trace. Normalization is the sum of visibility magnitudes, yielding -1..+1; it is not Jy, SNR, detection probability, or isolated source flux. No measurement is made below the horizon. The sky may contain strong satellite/RFI/sidelobe contributions at a celestial direction.

Trace samples are actual distinct visibility timestamps, not interpolation or simulation. Each station/target/calibration/geometry configuration has a separate bounded trace (120 samples, up to 20 histories in the current tab). CSV includes timestamp, station, target, mode, elevation, azimuth, normalized response, mean response, and baseline count. Reloading closes the in-memory observing session; export first.

Validation:
- Analytic point-source tests verify synthesis phase sign, ENU cardinal projection, inverse gain/phase correction, flagged/zero-gain exclusion, raw fallback, missing geometry, below-horizon suppression.
- Backend test verifies the common catalogue survives satellite API failure and missing location returns no fabricated positions.
- Existing freshness/failure-retention tests still pass.
- Browser verified Sun from Bangladesh (~62 degrees elevation), Orion below Bangladesh's horizon (no sample), Orion above Ghana's horizon (~73 degrees) with real response, raw/corrected mode changes, and above-horizon filtering.
- Browser-exported `start-ghana-orion-trace.csv` parsed with 7 distinct real frames, from 05:37:04 to 05:43:17 UTC on 2026-10-03.
- 390 px responsive viewport: body/document both 375 px, no horizontal overflow.
- Public page and API verified over HTTPS/IPv4. This workstation's unconstrained connection attempts can time out; browser testing uses the local origin as before.

Tests:
`node /home/david/random/docs/start/checks/check-science.cjs`
`node /home/david/random/docs/start/checks/check-state.cjs`
`python3 /home/david/random/docs/start/checks/check-objects.py`

Coordinate provenance: live SIMBAD TAP query on 2026-10-03, archived in `simbad-coordinates.json`. Formula references:
https://github.com/tmolteno/TART/blob/master/software/python_modules/tart/tart/simulation/antennas.py
https://github.com/tmolteno/TART/blob/master/software/python_modules/tart/tart/imaging/calibration.py
https://tart.elec.ac.nz/catalog/openapi.json

Pre-update runtime snapshot `20261003T051529Z`, missing_sources empty; explicit full START bundle `/mnt/sol-data/archives/start/start-before-objects-20261003T051720Z.tar.gz` also covers backend and service files. Final object-capable restore bundle: `/mnt/sol-data/archives/start/start-with-objects-20261003.tar.gz`. These explicit bundles cover new files outside the runtime backup's fixed source list.

## Visual observatory redesign — 2026-10-03

START now opens on the radio reconstruction and physical array, with Observe / Inspect / Data / Export navigation. The existing relay, station registry, visibility acquisition, math helper, predicted-target calculation, target traces, raw matrix and educational content are retained. No backend service restart or route change was needed.

### Working visual path

- Real station ENU positions drive the SVG antenna layout. The default network shows a short-baseline subset. One selected element reveals its correlations; two elements select a unique measured pair. Pair selectors provide large touch/keyboard alternatives. The all-pairs control is deliberate, not a default spiderweb.
- The inspector shows raw real/imaginary values, amplitude, phase, measured timestamp, and derived baseline length. Local spatial frequency is `(r_i-r_j)/lambda` with all three ENU coordinates retained. The plotted east/north plane and mirrored mathematical conjugates are explicitly zenith-referenced, not celestial UV coverage for an arbitrary target.
- A 240-pixel one-baseline fringe shows that measured pair's contribution using the same inverse phase sign as the main synthesis. Its independent color scale is not flux or a detection. The 180×180 full reconstruction remains the existing equal-weight Fourier sum.
- Raw/uncalibrated is now the default. Optional upstream gain/phase application remains available and changes the primary title and layer processing state. No new calibration solver, flux calibration, primary-beam correction, deconvolution, transient detector, or source identification is introduced.
- Radio layer visibility and opacity work on the reconstruction. Predicted markers have their own control. The local horizon coordinate system, frame-relative display mapping and independent layer provenance are retained.
- Selecting stages in the pipeline highlights the corresponding visual component and explains what is measured versus derived. Sun, Orion/M42 and the other target tools remain available below.

### Provider / observation / renderer boundaries

`www/start/model.js` owns the provider registry, TART acquisition adapter, normalization and capability flags. It preserves `originalData` unchanged while rejecting invalid or duplicate rows from the rendering view. Reversed baseline order is canonicalized with complex conjugation. `radioView()` is a compatibility adapter so the tested radio math and object tools do not require a rewrite. The renderer registry dispatches the normalized observation to `observatory.js`; the network payload is not read directly by that visual renderer.

`www/start/observation-types.d.ts` documents the common metadata, arbitrary instrument elements, independently identifiable layers, and distinct radio / optical / photon-event / GW / catalogue payloads. Geometry can describe other instruments through element type, coordinates, labels, receiver association, state, orientation, band and metadata. The TART adapter's instrument geometry is actual supplied data. The SOL local provider has no adapter or measurements: no coherent house array or local observatory hardware is claimed.

Future provider definitions carry `not-integrated` status and null/unknown access and product capabilities. They are research entry points, not live connectors, account requirements or assertions that all products are public. No frontend credentials exist. New adapters should query metadata first, use previews/cutouts/tiles, bound product size, and defer large raw downloads to explicit requests/server-side processing. The current bounded relay/cache and visibility-driven 60-second refresh are unchanged.

Composite and Event views are explicitly schematic capability explanations. `assessComposite()` rejects fewer than two distinct observation IDs, missing celestial WCS, unvalidated reprojection, or mismatched registered frames. It is an eligibility gate, not a coordinate registration implementation. Current TART images fail eligibility. No images are falsely aligned, no synthetic timeline is displayed, and no non-radio observations are claimed. An eventual event adapter must supply actual event epochs, uncertainties, localization products and evidence-qualified associations; a GW localization remains probability, not image brightness.

### Export and retention

Raw snapshot JSON exports the preserved original upstream response plus processing context. Observation-package JSON additionally retains normalized geometry, products, capabilities, layer display settings, source identifiers and original data. Existing target CSV remains unchanged. Export metadata distinguishes measured products from the derived visualization and does not claim a celestial WCS.

### Verification and deployment evidence

- Regression checks: `check-science.cjs`, `check-state.cjs`, `check-objects.py` all pass. The state check now invokes the real provider adapter with a failed fetch, ensuring errors preserve the previous frame and explicit warning.
- `check-export.cjs` verifies the actual raw-download handler preserves original pair ordering, complex values, extra upstream fields, and selected-pair/target processing context.
- New `check-model.cjs`: baseline reversal/conjugation, deduplication, original payload retention, ENU length/u/v/w calculations, partial/missing geometry gates, unknown provider access and registration eligibility.
- Live browser: 24 elements / 276 pairs; A0–A4 selection links the array, raw measurement, local sample and fringe. Upstream correction switches the title and excludes flagged/zero-gain pairs (231 in the verified frame). Sun has a real directional response; Orion below the Bangladesh horizon has none. No browser warnings/errors in the checked session.
- Phone-sized 390×844 browser: viewport content width 375 including scrollbar allowance, document width 375 (no horizontal overflow); antenna dropdown selection and show-all interaction verified. Visual inspection performed at desktop and phone widths.
- Public page and observation API verified through Cloudflare with certificate validation. Workstation split DNS resolves `sol.system42.one` to `10.0.1.13`, where HTTPS times out. Public DoH resolves `104.21.84.168` / `172.67.195.80`; `curl --resolve sol.system42.one:443:104.21.84.168` succeeds and public HTML matches the served source byte-for-byte. No DNS/router configuration was changed. Interactive browser checks used the real local origin on port 8888.
- Evidence and live JSON: `/mnt/sol-data/archives/start/visual-work/`. Pre-change runtime snapshot `20261003T054638Z` verified 5155 items, no missing sources. Explicit rollback bundle: `/mnt/sol-data/archives/start/start-before-visual-20261003T054640Z.tar.gz`. The bundle includes frontend, backend scripts, checks/docs and service definition; runtime backup's fixed source list is not sufficient for every new script.

Final runtime snapshot: `20261003T064547Z`, 5161 items, `missing_sources: []`. Complete START final bundle: `/mnt/sol-data/archives/start/start-visual-final-20261003T0647.tar.gz`. Public asset equality results are saved in `visual-work/public-verification.json`.
