# SkyLumi — Image & Data Credits

SkyLumi composites publicly-licensed sky imagery and catalog data from
several sources. This page lists every external asset bundled with the app.

## Generated (stylized) mode visual retune (issue #326)

The Earthrise reference image (`docs/issue-assets/generated-mode-reference-earthrise.png`)
is a photographic/composite image used as a visual reference only. The
Generated sky look is recreated procedurally from the Brunier panorama, real
catalog data, and original shaders; no pixels or assets from the reference
are used, and the result is a stylistic approximation, not a reproduction —
never presented as this app's own astrophotography.

## Black-hole visualization provenance

The `sgr_a` hero scenario is clean-room application code. Its technique is
informed by **dgreenheck/webgpu-black-hole** (MIT) and **oseiskar/black-hole**
(MIT):

- <https://github.com/dgreenheck/webgpu-black-hole>
- <https://github.com/oseiskar/black-hole>

No upstream imagery or Shadertoy code is shipped. The scenario is a
Schwarzschild-geodesic visualization, not telescope imagery; the surrounding
sky is the Brunier panorama credited below.

## Planetary-nebula procedural rendering

The M57 scenario's volume and knot shaders are clean-room code using the
project's own DreamSky value-noise basis. The curl-noise technique follows the
mathematical description in Bridson, Hourihan & Nordenstam (2007),
<https://www.cs.ubc.ca/~rbridson/docs/bridson-siggraph2007-curlnoise.pdf>;
no Shadertoy or other CC BY-NC-SA shader code was copied. M57's bundled sprite
credit remains the NASA/ESA Hubble credit in `src/data/dsos.ts`.

## Sky background panorama

**"The Milky Way panorama"** by **Serge Brunier (ESO)**.
- Source: <https://www.eso.org/public/images/eso0932a/>
- Image: `assets/sky/sky_8k.jpg` (4000×2000 equirectangular JPEG, ~4.6 MB)
- License: **Creative Commons Attribution 4.0 International (CC BY 4.0)**
- Credit string (visible in app footer): `ESO / S. Brunier`

ESO's general copyright policy: <https://www.eso.org/public/copyright/>

## High-resolution sky tiles (HiPS) — Photographic mode only

The default **Stylized** sky background does not load any photographic
tiles — it is rendered from the Brunier panorama (above) plus the HYG
catalog (below) plus DSO sprites. The credits below apply when the user
enables the optional **Photographic** sky-style from the Settings panel.

In Photographic mode, SkyLumi streams progressively-detailed photographic
sky tiles from the Centre de Données astronomiques de Strasbourg (CDS)
Aladin HiPS service. Each tile tries:

1. **Pan-STARRS DR1** color-z-zg-g (Pan-STARRS1 Science Consortium, IfA Hawaii).
   - Source: <https://alasky.cds.unistra.fr/Pan-STARRS/DR1/color-z-zg-g/>
   - Coverage: north of Dec ≈ -30°.
   - Reference: Chambers et al. 2016, arXiv:1612.05560.
2. **DSS2 / DSSColor** (STScI Digitized Sky Survey, second epoch).
   - Source: <https://alasky.cds.unistra.fr/DSS/DSSColor/>
   - Coverage: full sky. Southern-sky fallback; also used for the low-res
     Allsky preview that paints in the first frame.
   - **STScI confirmed (2026-08-17):** free to use in SkyLumi while we do not
     charge for access to DSS data. Keep STScI and plate-holder (AAO/ROE,
     Caltech, AURA) attribution visible.
   - The Norder-3 Allsky preview specifically is self-hosted as a WebP
     re-encode (`public/assets/sky/dss2-allsky-n3.webp`,
     `scripts/build-dss2-allsky-preview.ts`, same source/license as above) —
     a same-origin perf optimization for the app's default view, not a
     separate work. Spectral-band Allsky mosaics (Hα/IR/X-ray) still stream
     live from CDS.

(SkyMapper DR1 was previously included in the chain but produced visible
colour-blown rectangular CCD-edge artefacts in many southern tiles; we
fall through to DSS2 instead. DSS2 has subtle photographic-plate brightness
steps but produces a uniformly continuous image.)

For tiles below Dec ≈ -30° we skip the PanSTARRS attempt and go straight
to DSS2 — saves one HTTP round-trip per tile.

Tiles are organised in the **HEALPix** "nested" scheme described by Górski
et al. (2005), ApJ 622, 759. All three surveys are made publicly available
via CDS and are credited per their respective terms (CDS attribution required;
STScI / Pan-STARRS / SkyMapper terms permit reuse with attribution).

The on-screen credit is `CDS / Pan-STARRS / SkyMapper / STScI DSS`.

**Rubin Observatory First Look** (sparse overlay, story-gated) — not part of
the full-sky chain. While the "Rubin's first look" story is open, the app
composites PNG HiPS tiles from CDS `P/Rubin/FirstLook`
(<https://alasky.cds.unistra.fr/Rubin/CDS_P_Rubin_FirstLook/>) over the
existing map. Coverage is 29 square degrees (Virgo Cluster mosaic + Trifid
and Lagoon mosaic). A missing tile is a 404, never a DSS2 fallback. HiPS
packaging: ODbL-1.0. Images: CC BY 4.0. Credit: NSF–DOE Vera C. Rubin
Observatory/NOIRLab/SLAC/AURA. `obs_copyright` on the HiPS properties file:
`RubinObs/NOIRLab/SLAC/NSF/DOE/AURA`.

**Static default-view preview** (`public/assets/sky/default-view-preview.webp`,
~48KB) — a real screen capture of the app's own default launch view
(Orion, DSS2 survey, real constellation lines, no synthetic content). It
depicts the same DSS2 DSSColor imagery as the Allsky preview above; the same
STScI free-use confirmation and attribution requirements apply to this derivative.
Shown as an instant full-viewport backdrop while the JS bundle
downloads/parses (index.html's inline bootstrap script,
`src/lib/defaultViewPreview.ts`), then removed once the live WebGL scene
paints its first real frame. Captured manually via the app's own
`capturePngBlob()` API at RA 84.23°, Dec −3.25°, FOV 28° (the default
view — `ORION_DEFAULT_RA/DEC` in `src/state/store.ts`,
`LIFE_SIZE_FOV_DEG` in `src/controls/zoomDetent.ts`), downscaled to
1280×720 and re-encoded to WebP q88. Regenerate if the default view ever
changes: load the app with a clean `localStorage` at that RA/Dec/FOV,
run `await window.skyAtlas.capturePngBlob({})` in the console, downscale
and re-encode (`sharp(...).webp({quality:88})`), and replace the file —
there's no automated build script for this one step, since it requires an
actual running browser/WebGL session to capture from.

## Wavelength bands (issue #290) — Photographic mode only

The Wavelength picker next to the image-source picker (Photographic mode)
lets you REPLACE the visible-light survey above with a whole-sky imaging
survey at a different wavelength. These are full-sky HiPS surveys streamed
from CDS, same as the visible-light chain above, but each is its own
self-contained dataset — never blended with the optical imagery.

1. **Hα (hydrogen-alpha)** — Finkbeiner (2003/2004) all-sky Hα composite,
   built from SHASSA, VTSS, and WHAM survey data.
   - Source: <https://alasky.cds.unistra.fr/FinkbeinerHalpha/>
   - Coverage: full sky, galactic frame. Native resolution ≈ 6 arcmin —
     shown Allsky-only (no deep zoom) since that's already close to native.
   - Reference: Finkbeiner, D. P. 2003, ApJS, 146, 407.
2. **Infrared** — 2MASS (Two Micron All Sky Survey) J/H/Ks color.
   - Source: <https://alasky.cds.unistra.fr/2MASS/Color/>
   - Coverage: full sky, equatorial frame. Pixel scale ≈ 2 arcsec.
   - Credit: University of Massachusetts and IPAC/Caltech (funded by NASA
     and NSF).
3. **X-ray** — ROSAT All-Sky Survey (RASS).
   - Source: <https://alasky.cds.unistra.fr/RASS/>
   - Coverage: full sky, equatorial frame. Angular resolution ≈ 2 arcmin.
   - Credit: Max Planck Institute for Extraterrestrial Physics (MPE).

All three are HEALPixed and served by CDS (same mirror/attribution terms as
the visible-light chain above; CDS attribution required).

## Star catalog

**AT-HYG Database v3.3** (HYG: Hipparcos / Yale / Gliese — extended with
**Tycho-2** and **Gaia DR3**) by David Nash.
- Source: <https://github.com/astronexus/ATHYG-Database> (and the original
  <https://github.com/astronexus/HYG-Database>); downloaded via the project's
  Codeberg mirror, <https://codeberg.org/astronexus/athyg>.
- License: **Creative Commons Attribution-ShareAlike — CC BY-SA 4.0**.
  ShareAlike applies to the derived `.bin` data file (attribute + link license +
  note the magnitude-filter/binary conversion); it does **not** extend to the
  app code. Underlying Gaia data: © ESA/Gaia/DPAC — the Gaia DR3
  documentation requires credit to "ESA/Gaia/DPAC"; ESA's Gaia data licence
  page currently states distribution under CC BY-NC 3.0 IGO (it stated
  "open and free to use, provided credit is given to 'ESA/Gaia/DPAC'" until
  early 2025). Tycho-2 is public.
- Used to build the binary star catalog `assets/stars/hyg_mag10.bin`
  (~328k stars to apparent magnitude ≤ 10, from the `athyg_33_reduced_m10`
  subset). These are real measured positions and populate both sky-styles.
  Since issue #289 the binary also carries each star's measured Gaia
  DR3/Hipparcos proper motion (mas/yr) in a trailing v2 block, used only by
  the opt-in "Proper motion" Hero Scenario (linear extrapolation of real
  measured motion, never invented) — inert everywhere else in the app. The
  per-star magnitude is kept on the GPU so the **Star density** slider can
  reveal or hide fainter stars at render time (default cutoff magnitude 8.5 ≈
  150k stars, a rich photographic-looking field; lower toward 6 for the
  recognizable naked-eye sky, or raise to 10 for the full catalog). The renderer
  additionally fades sub-pixel-size stars to alpha 0 via shader so the catalog
  never degenerates into screen-pixel noise. (Smaller `hyg_mag6.bin` /
  `hyg_mag7.5.bin` / `hyg_mag9.bin` binaries are also emitted by the build
  script.)

The brightest ~50 stars (apparent magnitude ≤ 2) are drawn with an
additional softer additive halo via `BrightStarBloom`, so prominent
stars like Sirius, Vega and Betelgeuse visibly **bloom** instead of
looking like generic dots.

When **Landscape** mode is enabled, the star shader applies a simple
atmospheric extinction curve — stars within ~25° of the horizon dim and
redden, below the horizon fade out. Off by default in equatorial mode.

## City lookup

**GeoNames** `cities15000` dataset (all cities with population > 15,000, plus
every national/first-order-administrative capital regardless of population)
and the `admin1CodesASCII` state/province name table, by the GeoNames
contributors.
- Source: <https://www.geonames.org/>, downloaded from
  <http://download.geonames.org/export/dump/>.
- License: **Creative Commons Attribution 4.0 — CC BY 4.0**.
- Used to build `assets/cities.json` (~34k cities: name, ASCII name, country
  code, state/province, coordinates, population — see
  `scripts/build-cities.ts`). Powers the location popover's "near you" default
  and live city search (issue #594); raw latitude/longitude entry remains
  available as an advanced fallback for dark-sky sites away from any city.
  A short hand-curated list of native-spelling / English-exonym alternate
  names (e.g. "München" ↔ "Munich", "Köln" → "Cologne") is layered on for
  ~25 iconic world cities so common searches in either spelling resolve;
  it is not an exhaustive translation of the source's `alternatenames`
  column, which was intentionally dropped to keep the shipped asset small
  (~2.2 MB raw / ~880 KB gzipped) and free of transliteration noise.

## Constellations

**Stellarium "Western" sky culture** — star pair indices for connecting Hipparcos stars into constellation figures.
- Source: <https://github.com/Stellarium/stellarium-skycultures>
- License: the Western/"Modern" sky culture's text and line data are **CC BY-SA**
  (per the culture's `description.md`); the repo's AGPL-3.0 file covers tooling
  only, not the data — the earlier "GPL-2.0" label was wrong. We use only the
  line-pair data (HIP-number pairs), not Johan Meuris's Free-Art-License
  illustrations. The 88 IAU constellations/boundaries are themselves public
  domain; Stellarium maintainers have explicitly OK'd commercial reuse with
  attribution. ShareAlike applies to the derived `constellations.json`, not the
  app code.

**CDS/VizieR catalog VI/49** — "Constellation Boundary Data" (Davenhall &
Leggett 1989), transcribing the official 1930 Delporte IAU boundary
delimitation, used for point-in-constellation lookup (which constellation a
given sky position is actually inside) rather than for drawing lines. VI/49's
own ReadMe recommends its companion catalog, VI/42 (Roman 1987), for that
exact purpose and describes VI/49 itself as better suited to chart/atlas
construction — this app uses VI/49 anyway, for its machine-readable polygon
corners, and independently cross-checked the result against ~400k probe
points using Roman's own VI/42 algorithm as an oracle (zero disagreements
beyond quantization noise).
- Source: <https://cdsarc.cds.unistra.fr/ftp/VI/49/>
- License: the underlying 1930 Delporte boundary delimitation, formalized by
  the IAU, is public domain. VizieR's own site-wide terms
  (<https://cds.unistra.fr/vizier-org/licences_vizier.html>) ask that
  original authors and publication references be cited for scientific use
  and that a VizieR acknowledgment "would be appreciated" — CDS/VizieR is
  credited here on that basis, the same as the CDS Aladin HiPS credit above.
  See docs/LICENSING-AND-ASSETS.md §3.4a.

## Landscape panorama

**Stellarium "Guereins" landscape** (TBD — to be downloaded in Phase 6).
- Source: <https://github.com/Stellarium/stellarium-skycultures>
- License: CC BY-SA, attribution to original photographer (Stellarium contributors).

**"Sentinel Dome Panorama"** by AWBridges, via Wikimedia Commons — the
optional "Yosemite" landscape style's horizon strip
(`assets/landscape/yosemite-panorama-alpha.webp`).
- Source: <https://commons.wikimedia.org/wiki/File:Sentinel_Dome_Panorama.jpg>
- License: CC BY-SA 3.0 Unported (<https://creativecommons.org/licenses/by-sa/3.0/>).
- Modifications: cropped to a horizon band, sky removed (alpha), darkened to a
  night rendition. The derived image file remains CC BY-SA 3.0; pipeline:
  `scripts/build-yosemite-horizon.mjs`.

## Deep-sky catalog — bulk NGC/IC tier (issue #1514)

**OpenNGC**, by Mattia Verga and contributors.
- Source: <https://github.com/mattiaverga/OpenNGC>, `database_files/NGC.csv`,
  pinned commit `da90466031b0372c896588b85be6016c617e205b` (2026-07-26).
- License: **Creative Commons Attribution-ShareAlike 4.0 International — CC
  BY-SA 4.0**. ShareAlike applies to the derived
  `assets/dso/ngc_bulk.bin` + `ngc_bulk_names.json` files (attribute + link
  the license + note the magnitude/major-axis filter and binary conversion —
  see `scripts/build-ngc.ts`); it does **not** extend to the app code.
- Used to build a bulk deep-sky tier (~11,231 galaxies/clusters/nebulae —
  everything OpenNGC catalogues with both a measured magnitude and major
  axis, minus the 137 objects already in the curated catalog below) — see
  `docs/LICENSING-AND-ASSETS.md` §3.4c for the full funnel and current
  wiring status.

**d3-celestial**, by Olaf Frohn — credited here for the first time (2026-08-20,
issue #1514): the curated 137-object catalog immediately below was originally
built from d3-celestial's Messier list and this credit had been missing.
- Source: <https://github.com/ofrohn/d3-celestial>.
- License: **BSD-3-Clause**. Copyright (c) 2015, Olaf Frohn.

## DSO sprites

All deep-sky-object sprites are hand-curated from the following sources. **All are
CC BY 4.0 and require visible attribution with the exact, unaltered per-image
credit string** (a flat "ESO" / "ESA/Hubble" is not compliant). Note: ESA/Hubble
images via `cdn.esahubble.org` are **CC BY 4.0, NOT public domain** — the earlier
"public domain" note for Hubble sprites was wrong. No institution logos.

- ESO image archive (CC BY 4.0): <https://www.eso.org/public/copyright/>
- NASA / ESA Hubble — ESA/Hubble distribution (CC BY 4.0): <https://esahubble.org/copyright/>
- NASA / ESA / CSA JWST image gallery (CC BY 4.0): <https://webbtelescope.org/copyright>
- NOIRLab Image Gallery (CC BY 4.0): <https://noirlab.edu/public/copyright/>

Per-sprite credit, source URL, and license details are exposed in the in-app
**Object Info** card. See `src/data/dsos.ts` for the machine-readable catalog.

**Folder split (2026-08-06) — astrometric, not licensing.** The 53 sprites live
in `enabled/` (5) or `disabled/` (48) under `public/assets/sprites/`. Only the
`enabled/` ones have a verified sky footprint and are drawn as celestial
overlays; the rest are shown as photographs in Object Info, the hover card and
search. **All 53 still ship and every credit above still applies to all of
them** — nothing here is affected by which folder a file sits in.

## Storybook imagery (issue #1145)

The storybook asset directory contains 64 local WebPs used by the "Tonight's
Wonders" stories: 51 fetched photographs/artist impressions, 9 computed
figures, and 4 generated illustrations. The fetched photo/artist-impression
rows follow the same attribution rules as the DSO sprites above: **exact,
unaltered per-image credit strings**, no institution logos.

- ESO image archive (CC BY 4.0): <https://www.eso.org/public/copyright/>
- NASA / ESA Hubble — ESA/Hubble distribution (CC BY 4.0): <https://esahubble.org/copyright/>
- NASA / ESA / CSA Webb — ESA/Webb distribution (CC BY 4.0): <https://esawebb.org/copyright/>
- NOIRLab Image Gallery (CC BY 4.0): <https://noirlab.edu/public/copyright/>
- NASA image archives (free use with credit): <https://www.nasa.gov/nasa-brand-center/images-and-media/>

Current split: **35 CC BY 4.0, 15 NASA, 1 public-domain (CC0 1.0)**. The machine-readable record — direct
source URL, verbatim credit, licence, and kind — is
`scripts/storybook-image-manifest.ts` (the curated, human-reviewed input) and the
generated `src/data/storybook/images.ts`. Per-image credit is shown on the story
card itself.

**Nothing here is DSS2-derived, deliberately.** Two natural picks were rejected
on exactly that ground: ESO's large Virgo cluster mosaic (`eso0919c`, credited
"ESO/Digitized Sky Survey 2") and the Hubble press image for the Methuselah star
(`opo1308a`, credited to the DSS). DSS2 is cleared for the free app (STScI
2026-08-17); storybook still avoids it for cleaner per-card licences. See
`docs/LICENSING-AND-ASSETS.md`.

**Honesty flags are data, not convention.** Ten images are artist's impressions
— every exoplanet (none has ever been photographed), plus Voyager 1 in flight,
Gaia BH1's invisible companion, and Tabby's Star — and each is badged as art on
the card. Four more are stand-ins that illustrate a story rather than portray its
subject, and each carries its own disclosure line. This is what the storybook's
opening promise ("when something is an artist's guess, I'll say so") costs in
practice.

**Starman/Roadster photograph.** The card uses [Elon Musk's Tesla Roadster
(40143096241).jpg](https://commons.wikimedia.org/wiki/File:Elon_Musk%27s_Tesla_Roadster_(40143096241).jpg),
an image by **SpaceX** sourced from the Falcon Heavy Demo Mission Flickr page.
Wikimedia Commons records SpaceX's public-domain dedication and CC0 1.0 status;
the original is a 1,920×1,080 JPEG. The direct downloaded source and exact
attribution are pinned in `scripts/storybook-image-manifest.ts`.

## DSO add-on images

**None are currently active (2026-08-06).** The one add-on ever built, M31 below,
is switched off via `enabled: false` in `src/data/dso-addons.ts` — Andromeda
already reads well straight from the survey imagery, so a second Andromeda on
top of it only risked doubling the disk. The asset still ships and its credit
below still applies if it is ever switched back on.

**M31 / Andromeda Galaxy add-on prototype** (inactive)
- Source: NASA SVS, <https://svs.gsfc.nasa.gov/10485>
- Source asset: `M31_Wide.jpg`
- Credit: Swift image: NASA/Swift/Stefan Immler (GSFC) and Erin Grand (UMCP);
  Optical image: Bill Schoening, Vanessa Harvey/REU program/NOAO/AURA/NSF.
- Processing: local deterministic alpha extraction and color grade via
  `scripts/build-dso-addons.mjs`.

**Resolved (2026-06-11):** the former DSS2-sourced `smc` sprite (AAO/ROE
non-commercial restriction) has been replaced with ESO's VISTA VMC survey image
(`eso1714a`, CC BY 4.0). No DSS2-derived base SMC sprite remains.

**AI-generated sprite (2026-06-11): `m42` (Orion Nebula).** The M42 sprite is an
**AI-generated artistic reconstruction** (Google Gemini image model), digitally
re-rendered from CC BY 4.0 reference imagery: ESO/Igor Chekalin (`eso1103a`),
ESO/VISTA (`eso1625a`), and NASA/ESA Hubble heic0601a (M. Robberto / HST Orion
Treasury Project Team). It is an illustration of the full ~85'×60' nebula fan,
not a calibrated photograph. Workflow: `scripts/generate-m42-sprite.mjs`.

**Synthetic 3D volume, close-zoom only (2026-07-13, issue #291): `m42`
(Orion Nebula).** At tight FOV (photographic-style close zoom, stylized mode)
M42 crossfades from the flat sprite above into a raymarched volumetric
effect. The density field is a DETERMINISTIC, DISCLOSED ARTISTIC
EXTRAPOLATION baked offline from the sprite above (`scripts/build-m42-volume.ts`)
— a single 2D image carries no true depth information, so this is an artistic
derivative of an artistic derivative, not a measurement of M42's real 3D
structure. See that script's and `src/scene/effects/m42Volume.ts`'s doc
comments for the full method (brightness-weighted synthetic z-thickness +
noise, renormalized per column so it crossfades seamlessly with the flat
sprite). Disclosed in-app via the same `m42` credit string above.

**AI star-removal overlays (2026-06-23, issue #103): 17 DSO sprites.** These
sprites are real CC BY 4.0 astrophotos processed through the Google Gemini image
model (`gemini-3.1-flash-image`) to remove foreground/background **stars and the
sky background**, leaving only the object isolated on pure black so it composites
via the DSOSprites SCREEN blend. The structure, colour and detail of the object
are the **original photograph's** — only stars were removed. This is disclosed
per-object in the in-app Object Info card (`credit` = "AI star-removal (Google
Gemini) from <source>"). Workflow: `scripts/dso-overlays.mjs` (star-removal) →
`scripts/build-sprites-clean.ts --overlays` (falloff + WebP). Per-object base
sources (all CC BY 4.0):

- ESO (CC BY 4.0): `m16` (eso0926a), `m1` (eso9948f), `m33` (eso1424a),
  `m17` (eso1119a), `helix` (eso0907a), `eta-car` (eso0905a)
- NASA/ESA Hubble — ESA/Hubble (CC BY 4.0): `m57` (heic1310a), `m104` (opo0328a),
  `m101` (heic0602a), `m82` (heic0604a)
- NSF NOIRLab (CC BY 4.0): `m8` (noao-m8), `m20` (m20johnson, Adam Block),
  `m27` (noao-m27), `m51` (noao0124a, T. Rector), `m45` (noao-m45),
  `m81` (noao-m81, T. Rector), `ngc2237` (noao-rosette, T. A. Rector)

**DSS2-derived overlays — `m31` and `ngc7000`.**
The star-removal pipeline also produced overlays for M31 (from `heic1112f`'s
DSS2-derived context) and NGC 7000 (from a CDS DSS2 4° cutout). Provenance is
attributed to STScI and the plate holders (AAO/ROE, Caltech, AURA). STScI
confirmed (2026-08-17) that SkyLumi may use DSS data while access is not
charged for. Reassess before any paid/paywalled reuse. M42
keeps its owner-approved bespoke sprite (not the overlay) — see
`OVERLAY_KEEP_EXISTING`.

## Chandra "Galactic Gems" companion imagery (issue #1999)

**Five objects** — M82, M104 (Sombrero), M106, M33 (Triangulum), and
Centaurus A (NGC 5128) — show a second, explicitly captioned image on their
Object Info card: a NASA/CXC "Galactic Gems" press composite released
2026-08-25, combining Chandra X-ray data with optical (and, for some objects,
infrared or ultraviolet) imagery from other observatories. **These are
false-colour, multi-wavelength composites, never a photograph of what the
object looks like to the eye** — each carries structure (X-ray superwinds,
haloes, polarimetry) invisible in real starlight. Every card caption states
the real wavelength layers and observatories for THAT object and says
plainly that it is not the true-color view; source data and full per-object
provenance are in `assets-src/chandra-gems/` (acquired PR #2000). Licence
basis: the [CXC image use policy](https://chandra.harvard.edu/photo/image_use.html)
— NASA/CXC/SAO material carries no copyright claim, free use with credit
requested; every third-party layer used below is an institutional NASA/ESA/
ESO/NOIRLab credit, never a named individual/amateur rights holder. This
composite imagery is strictly SECONDARY: it is never the card's primary hero
image, and it is never drawn on the sky — see `src/data/chandra-companion-images.ts`'s
doc comment for why that module deliberately carries no ra/dec/fov/rotation.

- **M82** — Credit: X-ray: NASA/CXC/SAO; Optical: NASA/ESA/STScI; Infrared: NASA/ESA/CSA/STScI; Image Processing: NASA/CXC/SAO/L. Frattare, J. Major, and K. Arcand
  Source: <https://chandra.si.edu/photo/2026/galaxies/#m82>
- **M104 (Sombrero)** — Credit: X-ray: NASA/CXC/SAO; Optical:NASA/Hubble Heritage Team/AURA/STScI; Infrared: NASA/ESA/CSA/STScI; Image Processing: NASA/CXC/SAO/L. Frattare
  Source: <https://chandra.si.edu/photo/2026/galaxies/#m104>
- **M106** — Credit: X-ray: NASA/CXC/SAO; Optical: NASA/ESA/STScI; Infrared: NASA/ESA/CSA/STScI; Image Processing: NASA/CXC/SAO/L. Frattare
  (Release page labels this object "NGC 4258"; M106 is its Messier designation.)
  Source: <https://chandra.si.edu/photo/2026/galaxies/#ngc4258>
- **M33 (Triangulum)** — Credit: X-ray: NASA/CXC/SAO; Optical: ESO/VLT; UV: NASA/Swift; Image Processing: NASA/CXC/SAO/L. Frattare
  ESO imagery is CC BY 4.0.
  Source: <https://chandra.si.edu/photo/2026/galaxies/#m33>
- **Centaurus A (NGC 5128)** — Credit: X-ray: (Chandra) NASA/CXC/SAO, X-ray (IXPE): NASA/MSFC; Optical: ESO; Infrared: NASA/ESA/CSA/STScI; Image Processing: NASA/CXC/SAO/L. Frattare, K. Arcand, and J. Major
  ESO imagery is CC BY 4.0.
  Source: <https://chandra.si.edu/photo/2026/galaxies/#cena>

The remaining six freely-usable images from this release (NGC 1672, NGC 660,
NGC 1385, Arp 143, II Zw 096, NGC 3256) have no curated catalog entry yet and
are not surfaced anywhere in the app.

## Deep-sky tile enhancements — AI-composited nebula cores (issue #1439, attribution corrected #1744)

**Twenty-seven deep-sky objects** render with an AI-composited core over DSS2
survey imagery in Photographic survey mode, gated by the Sky-tab **"Deep sky
overlays"** switch (default on). This is a different product from the DSO
sprites/overlays above: it composites onto the live HiPS survey tile itself
(`CleanedPatchLayer`), not a separate sprite layer. What renders is decided by the rows in
`src/data/cleaned-patches.ts`, NOT by `review` in `shared/tile-blends.json`
— those two sets are related but have drifted apart before, so this list is
derived from the rows. Today twenty-seven objects render; the registry holds
seventy-one entries, the rest being candidates with no rows. `m42` was
re-approved by the owner on 2026-08-30 and renders; `ngc7000` is parked
(`review: 'todo'`) and its rows were removed 2026-08-28, so it no longer
renders; `ngc891` was registered 2026-08-28 and renders. Ten more (M33, M81,
NGC 5128, M83, M17, NGC 6946, NGC 7635, M78, M100, M110) were approved in-app
by the owner on 2026-09-02 and render. Every object that renders is credited
below, whatever its review state — the licence obligation follows the pixels
a visitor actually sees, not the workflow status.

- **What the model is instructed to touch:** the DSS2 plate's overexposed,
  detail-less white core only. The prompt (`docs/prompts/dso-blend.txt`)
  directs the model to leave everything outside that core untouched — see
  `docs/dso-tile-blend-pipeline.md` §8 for the verification method and its
  known failure modes (the pipeline has caught the model deviating from this
  instruction before — stylization drift and fabricated structure on M27's
  first pass, §3).
- **The background tile the core is composited onto is always DSS2** —
  the same DSS2/STScI provenance already disclosed above under "DSO sprites"
  ("DSS2-derived overlays"). DSS2 is cleared for this free app (STScI
  confirmed 2026-08-17, see above).
- **Reference imagery and its license, per object — this is NOT uniform.** A
  real photograph of the same object guides what the AI model (Google Gemini,
  "nanobanana") composites into the core. Each credit below is copied
  verbatim from that object's `assets-src/tile-blends/<slug>/
  reference-PROVENANCE.md` record — the sole source of truth for this
  section (never inferred, never carried over from a different image's
  credit):
  (Credit text below is kept unwrapped/verbatim on one line per object — even
  where long — because it must match `referenceCredit` in
  `shared/tile-blends.json` character-for-character; see
  `blendCreditCoverage.issue1744.test.ts`.)

  - **Lagoon Nebula (M8)** — ESO/VPHAS+ team. Licence: CC BY 4.0. <https://www.eso.org/public/images/eso1403a/>
  - **Dumbbell Nebula (M27)** — Radan Mitrović (Радан Митровиќ), CC BY-SA 4.0, via Wikimedia Commons. <https://commons.wikimedia.org/wiki/File:Планетарна_маглина_Ѓуле_М27.jpg>
  - **Helix Nebula (NGC 7293)** — ESO. Licence: CC BY 4.0. <https://www.eso.org/public/images/helix/>
  - **Crab Nebula (M1)** — ESO / Manu Mejias. Licence: CC BY 4.0. <https://www.eso.org/public/images/potw1523a/>
  - **Trifid Nebula (M20)** — NSF–DOE Vera C. Rubin Observatory/NOIRLab/SLAC/AURA. Licence: CC BY 4.0. <https://noirlab.edu/public/images/noirlab2521b/>
  - **Eagle Nebula (M16, Pillars of Creation)** — ESO. Licence: CC BY 4.0. <https://www.eso.org/public/images/eso1719a/>
  - **Orion Nebula (M42)** — Astro.sin, CC BY-SA 4.0, via Wikimedia Commons. <https://commons.wikimedia.org/wiki/File:Orion_nebula_and_Running_Man_nebula.jpg>
  - **Rosette Nebula (NGC 2237)** — Mystery Ray, CC BY-SA 4.0, via Wikimedia Commons. <https://commons.wikimedia.org/wiki/File:The_Rosette_Nebula,_otherwise_known_as_NGC_2244.jpg>
  - **Whirlpool Galaxy (M51)** — K. Rhode, M. Young and WIYN/NOIRLab/NSF/AURA. Licence: CC BY 4.0. <https://noirlab.edu/public/images/noao1309a/>
  - **Sunflower Galaxy (M63)** — Taavi Niittee (CC0 — attribution not required). Licence: CC0 1.0. <https://commons.wikimedia.org/wiki/File:M63_final.jpg>
  - **Black Eye Galaxy (M64)** — KPNO/NOIRLab/NSF/AURA/Brandon Chadwell/Flynn Haase. Licence: CC BY 4.0. <https://noirlab.edu/public/images/noao-m64chadwell/>
  - **Sculptor Galaxy (NGC 253)** — ESO/INAF-VST Acknowledgement: A. Grado/L. Limatola/INAF-Capodimonte Observatory. Licence: CC BY 4.0. <https://www.eso.org/public/images/eso1152a/>
  - **Cigar Galaxy (M82)** — KPNO/NOIRLab/NSF/AURA/Steve Peterson/Katy Garmany. Licence: CC BY 4.0. <https://noirlab.edu/public/images/noao-m82final/>
  - **Needle Galaxy (NGC 4565)** — Ken Crawford, CC BY-SA 3.0. <https://commons.wikimedia.org/wiki/File:Needle_Galaxy_4565.jpeg>
  - **M106 (NGC 4258)** — KPNO/NOIRLab/NSF/AURA; Ack: PI M.T. Patterson (NMSU); processing T.A. Rector (UAA), M. Zamani, D. de Martin. Licence: CC BY 4.0. <https://noirlab.edu/public/images/noirlab2112b/>
  - **Silver Sliver Galaxy (NGC 891)** — KPNO/NOIRLab/NSF/AURA; Ack: PI M.T. Patterson (NMSU); processing T. Rector (UAA), M. Zamani, D. de Martin. Licence: CC BY 4.0.
  - **North America Nebula (NGC 7000)** — Giuseppe Donatiello (CC0 — attribution appreciated, not required). Licence: CC0 1.0. <https://commons.wikimedia.org/wiki/File:NGC_7000_-_IC_5070_-_Deneb_(Alpha_Cygni)_-_Flickr_-_gjdonatiello.jpg> *(no longer renders — rows removed 2026-08-28; credit retained for prior releases)*
  - **Sombrero Galaxy (M104)** — NASA and The Hubble Heritage Team (STScI/AURA). Licence: STScI/HubbleSite material — usable without fee with credit (hubblesite copyright notice); **not CC-licensed**. <https://stsci-opo.org/STScI-01EVT8YKVEYX7FZC7AM76BPYHZ.tif>
  - **Triangulum Galaxy (M33)** — ESO. Licence: CC BY 4.0. <https://www.eso.org/public/images/eso1424a/>
  - **Bode's Galaxy (M81)** — Ken Crawford, CC BY-SA 4.0, via Wikimedia Commons. <https://commons.wikimedia.org/wiki/File:M81.jpg>
  - **Centaurus A (NGC 5128)** — ESO. Licence: CC BY 4.0. <https://www.eso.org/public/images/eso0315a/>
  - **Southern Pinwheel (M83)** — ESO. Licence: CC BY 4.0. <https://www.eso.org/public/images/eso0825a/>
  - **Omega Nebula (M17)** — ESO/INAF-VST/OmegaCAM. Acknowledgement: OmegaCen/Astro-WISE/Kapteyn Institute. Licence: CC BY 4.0. <https://www.eso.org/public/images/eso1119a/>
  - **Fireworks Galaxy (NGC 6946)** — KPNO/NOIRLab/NSF/AURA/T.A. Rector (University of Alaska Anchorage)/H. Schweiker (WIYN). Licence: CC BY 4.0. <https://noirlab.edu/public/images/noao-ngc6946kpno/>
  - **Bubble Nebula (NGC 7635)** — T.A. Rector (University of Alaska Anchorage), WIYN ODI team & WIYN/NOIRLab/NSF/AURA. Licence: CC BY 4.0. <https://noirlab.edu/public/images/noao1207a/>
  - **NGC 2068 Reflection Nebula (M78)** — T. A. Rector/University of Alaska Anchorage, H. Schweiker/WIYN and NOIRLab/NSF/AURA. Licence: CC BY 4.0. <https://noirlab.edu/public/images/noao-m78/>
  - **Pinwheel Spiral (M100)** — N.A.Sharp/NOIRLab/NSF/AURA. Licence: CC BY 4.0. <https://noirlab.edu/public/images/noao-m100/>
  - **M31 Companion (M110)** — NOIRLab/NSF/AURA. Licence: CC BY 4.0. <https://noirlab.edu/public/images/noao-m110/>

  Five of the twenty-seven (Dumbbell/M27, Rosette/NGC 2237, Needle/NGC 4565,
  Orion/M42, Bode's/M81) are credited under **CC BY-SA**, not CC BY — a ShareAlike term, distinct from
  the plain-attribution CC BY 4.0 that covers most of the rest. This section
  states that fact; whether/how ShareAlike applies to the derived blend
  artifact is a separate legal question the owner has not yet resolved
  (tracked on #1744). A fourth (Sombrero/M104) carries a different, non-CC
  Hubble Heritage/STScI copyright notice — stated above exactly as its
  provenance file states it, with no CC label invented for it.
- **Independent of "Show repaired tiles":** the Debug-tab repair toggle
  governs only genuine survey-defect repairs (reflections, bad tiles,
  streaks) — a separate class inside the same renderer. Full pipeline:
  `docs/dso-tile-blend-pipeline.md`.

**Source corrections (2026-06-11), with per-image credit lines verified 2026-09-01:**
several sprites previously pointed at wrong archive subjects (finder charts,
comparison strips, observatory photos) and were replaced with NSF NOIRLab / ESO
images (CC BY 4.0). Full URL list in `scripts/build-sprites-clean.ts`.

⚠️ **NOIRLab states the full credit line is MANDATORY for fee-free use**, so each
line below is reproduced exactly as that image's own page gives it — including
`m97`'s missing space in "NRCof", which is NOIRLab's own rendering and not a typo
to fix here. These are the strings `src/data/dsos.ts` carries and the Object Info
card shows; the two must not drift.

| object | image | credit line, verbatim from the licensor's page |
|---|---|---|
| `m11` | ESO `eso1430a` | ESO |
| `m13` | `noao0103a` | N.A.Sharp, REU program/NOIRLab/NSF/AURA |
| `m22` | `noao-m22` | N.A.Sharp, REU program/NOIRLab/NSF/AURA |
| `m27` | `noao-m27` | REU program/NOIRLab/NSF/AURA |
| `m57` | `noao-m57` | N.A.Sharp, REU program/NOIRLab/NSF/AURA |
| `m63` | `noao-m63` | N.A.Sharp/NOIRLab/NSF/AURA |
| `m87` | `noao-m87block` | KPNO/NOIRLab/NSF/AURA/Adam Block |
| `m94` | `noao-m94` | Hillary Mathis, N.A.Sharp/NOIRLab/NSF/AURA |
| `m97` | `geminiann10008a` | International Gemini Observatory/NOIRLab/NSF/AURA/Émilie Storer (Collège Charlemagne, QUE)/André-Nicolas Chéné (HIA/NRCof Canada)/T. Rector (U.Alaska, Anchorage). |
| `hperchi` | `noao-hcper` | N.A.Sharp/NOIRLab/NSF/AURA |
| `ngc6888` | `noao-04494` | T.A. Rector (NRAO/AUI/NSF and NOIRLab/NSF/AURA) |
| `smc` | ESO `eso1714a` | ESO/VISTA VMC |

**What was wrong before this pass.** Six of these read `"Source TBD"` in the
catalog (`m11`, `m22`, `m63`, `m87`, `m94`, `m97`) and three carried an
attribution belonging to a *different institution and a different image* than the
sprite actually shown — `m13` credited "ESA / Hubble / NASA" with a `creditShort`
of "ESO/VLT" for an NSF NOIRLab image, `m57` credited Hubble for a NOIRLab image,
and `m27` had NOIRLab credit text pointing at an eso.org URL. The earlier note
here said only "credit per image page — KPNO/NOAO/AURA/NSF", which described none
of them exactly and let the drift sit unnoticed. CC BY 4.0 requires attribution to
the actual licensor, so a confidently wrong credit is worse than a missing one.

⚠️ **`m31` and `m45` are NOT part of this batch, and this file used to say they
were.** The list above previously named both, but neither appears in the
source-URL list in `scripts/build-sprites-clean.ts` — which is the authority for
what was actually re-fetched. `m31` appears in that file only as a command-line
*example* (`build-sprites-clean.ts m42 m31`), which is easy to misread as a source
entry. Their sprites are therefore NOT the `noao-m31`/`noao-m45` images, their
existing credits stand, and an attribution was **not** rewritten for them on the
strength of this file's own prose. Corroboration that they differ: the `noao-m31`
page credits "T.A.Rector and B.A.Wolpa", while this file's old note said "Bill
Schoening/Vanessa Harvey" — two different photographers for one supposed image,
which is the tell that the prose list was never verified against the script.

**`m42`** is not from this batch: its sprite is a COMPOSITE of three CC BY 4.0
images (`scripts/generate-m42-sprite.mjs`) and now credits all three — ESO/Igor
Chekalin (`eso1103a`, WFI base); NASA, ESA, M. Robberto (STScI/ESA) and the Hubble
Space Telescope Orion Treasury Project Team (`heic0601a`, core); ESO/H. Drass et
al. (`eso1625a`, HAWK-I infrared). It previously named only two of the three and
linked a fourth page.

⚠️ **`m83` is an OPEN LICENCE QUESTION, deliberately left as `"Source TBD"`.** It
is one of the five sprites DRAWN ON THE SKY (`public/assets/sprites/enabled/`),
yet no source is recorded for it anywhere in this repo: it is absent from
`scripts/build-sprites-clean.ts`, absent from this file, and its only file history
is #1025 moving it into `enabled/`. A credit was NOT invented for it. It needs
either a sourced provenance or a move back to `disabled/` until one exists — a
displayed image whose licence nobody can state is the risk here, and guessing
would only hide it.

**5 previously-missing sprites added (2026-07-17, issue #450):** `ngc7662`,
`m67`, `m34`, `m110`, and `m35` had `sprite` references in `src/data/dsos.ts`
pointing at `.webp` files that didn't exist, so their stylized-mode photo
overlay silently failed. Sourced real astrophotos and ran them through the
standard `scripts/build-sprites-clean.ts` pipeline:

- **NGC 7662 (Blue Snowball Nebula)** — NASA/ESA Hubble, CC BY 4.0.
  Credit: Bruce Balick and Jason Alexander (University of Washington), Arsen
  Hajian (US Naval Observatory), Yervant Terzian (Cornell University), Mario
  Perinotto (University of Florence), Patrizio Patriarchi (Arcetri
  Observatory) and NASA/ESA. Source: <https://esahubble.org/images/opo9738c20/>
- **M67 (King Cobra Cluster)** — NSF NOIRLab, CC BY 4.0. Credit: Nigel Sharp,
  Mark Hanna/NOIRLab/NSF/AURA. Source: <https://noirlab.edu/public/images/noao-m67pump/>
- **M34** — NSF NOIRLab, CC BY 4.0. Credit: REU program/NOIRLab/NSF/AURA.
  Source: <https://noirlab.edu/public/images/noao-m34/>
- **M110 (NGC 205)** — NSF NOIRLab, CC BY 4.0. Credit: NOIRLab/NSF/AURA.
  Source: <https://noirlab.edu/public/images/noao-m110/>
- **M35 (Shoe-Buckle Cluster)** — NSF NOIRLab, CC BY 4.0. Credit: N.A.
  Sharp/NOIRLab/NSF/AURA. Source: <https://noirlab.edu/public/images/noao-m35/>
  (the source frame also shows NGC 2158, a fainter, unrelated background
  cluster in the same field — cropped out before processing so the M35
  sprite shows only M35 itself).

All 5 ids were also added to `src/data/sprite-manifest.ts`'s
`AVAILABLE_SPRITE_IDS` (the runtime gate `DSOSprites.add()`/`hasSprite()`
checks before ever attempting to load a sprite texture — without this, the
`.webp` files alone would not have been enough to make the photos appear).

## Planet surface maps (Stylized mode)

The realistic planet-systems layer (Stylized mode "Planets & moons" toggle)
renders textured spheres from cylindrical surface maps, downscaled/re-encoded
for the web (orientation unchanged; see `scripts/fetch-planet-textures.mjs`
for the exact pipeline). Per-file source + license:

### Planet globes — Mercury → Neptune (Solar System Scope, CC BY 4.0)

Replaced (#166, 2026-06-25) with the **Solar System Scope** 2k map set — a
coherent, high-quality, correctly-lit set built from **NASA elevation + imagery**
and published by Solar System Scope under **Creative Commons Attribution 4.0
International (CC BY 4.0)** — commercial use OK *with* attribution; **not** NC.
This fixed the artificial look (the old maps were tiny/low-res, and Venus was a
radar *surface* map rather than its cloud-tops). Downloaded at 2048×1024 and
re-encoded for the web (orientation unchanged; sources kept in gitignored
`assets-src/planets/`).

- Source: **Solar System Scope** — <https://www.solarsystemscope.com/textures/>
  (License: CC BY 4.0). Required credit: *"Textures by Solar System Scope
  (solarsystemscope.com), CC BY 4.0."*
- `assets/planets/mercury.jpg` — `2k_mercury.jpg`.
- `assets/planets/venus.jpg` — `2k_venus_atmosphere.jpg` (cloud-tops, so Venus
  shows its true featureless golden cloud disk + lit crescent, not radar terrain).
- `assets/planets/mars.jpg` — `2k_mars.jpg`.
- `assets/planets/jupiter.jpg` — `2k_jupiter.jpg`.
- `assets/planets/saturn.jpg` — `2k_saturn.jpg`.
- `assets/planets/uranus.jpg` — `2k_uranus.jpg` (a clearly-licensed CC BY 4.0
  Uranus map, replacing the prior Stellarium one; CelestiaContent's CC BY-**NC**
  Uranus remains excluded).
- `assets/planets/neptune.jpg` — `2k_neptune.jpg`.

### Jupiter's moons (CelestiaProject / CelestiaContent)

Sourced from the **CelestiaProject / CelestiaContent** repository — community
processings built on **NASA / JPL-Caltech / USGS** public-domain imagery —
under **Creative Commons Attribution (CC BY)** licenses.

- Source repo: <https://github.com/CelestiaProject/CelestiaContent> (`textures/hires`)
- `assets/planets/io.jpg` — **CC BY 4.0**. NASA/JPL-Caltech/ASI/USGS;
  NASA/JPL/SwRI/MSSS/G. Eichstädt/J. Perry/J. Rogers; ItzImcool; AstroChara.
- `assets/planets/ganymede.jpg` — **CC BY 3.0**. © Askaniy Anpilogov;
  NASA/JPL-Caltech/ASI/USGS; NASA/JPL-Caltech/Björn Jónsson; NASA/JPL-Caltech/SwRI/MSSS/B. Swift.
- `assets/planets/europa.jpg`, `assets/planets/callisto.jpg` — from the same
  CelestiaContent `textures/hires` set (CC BY family, NASA/JPL-Caltech/USGS base).
  **TODO before commercial release:** confirm the exact per-file CC BY author
  strings for these two (their REUSE `.license` sidecars were absent at fetch time).

### Saturn ring profile (procedural — no asset)

The ring radial color/alpha profile is **generated procedurally at runtime**
(`makeRingProfileTexture` in `src/scene/PlanetSystem.ts`): band radii (C/B/
Cassini division/A/Encke gap) are the real values, but the fine-scale banding
is synthesized — a deliberately **stylized** profile, used because no
clearly-licensed Cassini-derived radial scan was available. No third-party
ring imagery is bundled.

### Moons & ephemerides

The non-Galilean moons (Phobos/Deimos, Saturn's seven majors, the five
Uranian moons, Triton) render as tinted spheres — no textures bundled.
Moon positions/orbits use `astronomy-engine` for the Galileans and
mean-element Keplerian orbits for the rest (JPL-derived elements as compiled
in CelestiaContent `data/solarsys.ssc`; orbital elements are facts/data —
see `src/astronomy/planetMoons.ts` for the per-system citations). Planet
poles/rotation come from `astronomy-engine` (IAU rotation models). No bundled
ephemeris data.

## Satellite orbital elements (TLEs)

**TLE data: CelesTrak (celestrak.org)** — maintained by Dr. T.S. Kelso.
- Source: <https://celestrak.org/NORAD/elements/> (GP API, `stations` and
  `visual` groups, OMM/JSON format), fetched at runtime and cached locally.
- CelesTrak data is free to use; credit "TLE data: CelesTrak (celestrak.org)".
- A small bundled fallback set of TLEs (`src/data/satellite-seed.ts`) derives
  from the same source; the app age-gates it and labels it as non-live.
- Satellite positions are propagated in-browser with **satellite.js** (MIT) —
  <https://github.com/shashwatak/satellite-js>. Displayed brightnesses are
  estimates from standard-magnitude values (McCants/CelesTrak compilation
  convention) and are labeled as estimates in the UI.

## Satellite standard magnitudes (issue #962)

**Standard-magnitude data: Mike McCants** (`quicksat.mag`, bundled in
`quicksat.zip`).
- Source: <https://www.mmccants.org/programs/quicksat.zip>, fetched
  2026-08-07. Dated 2010-06-04 in the archive.
- No explicit license is stated anywhere on mmccants.org or in the bundled
  files. This is the same compilation Stellarium, Guide, and Heavensat all
  redistribute without a documented written grant; bundled here on that
  community-norm basis, an owner-reviewed decision — see
  `docs/LICENSING-AND-ASSETS.md` §3.4b for the full writeup.
- Stored locally as generated `src/data/satellite-stdmag-table.ts`
  (`scripts/build-satellite-stdmag.ts`).

## ISS 3D model (issue #524)

At deep zoom, aimed directly at the ISS, the generic satellite dot is
replaced by NASA's real ISS 3D model.

- Source: **NASA Visualization Technology Applications and Development
  (VTAD)**, published at
  <https://science.nasa.gov/resource/international-space-station-3d-model/>
  (glTF, `ISS_stationary.glb`, originally ~42 MB).
- License: **U.S. Government work — public domain** (17 U.S.C. §105; no
  copyright is asserted on works of the U.S. federal government). No
  attribution is legally required, but NASA is credited here per its own
  media usage guidelines, which also ask that use of NASA material **not
  imply or state that NASA endorses** a commercial product, service, or
  activity — this app makes no such claim.
- The bundled file (`public/assets/satellites/iss.glb`, ~1.1 MB) is a
  re-encoded, decimated, and compressed derivative of NASA's original —
  not the original file. Pipeline (via `@gltf-transform/cli`, a dev
  dependency): duplicate-resource dedup, mesh simplification
  (meshoptimizer), Draco geometry compression, and WebP texture
  re-encoding at 256×256 (down from the source's 1024×1024 JPEGs) — the
  model never fills more than a small on-screen icon at the zoom level
  where it renders, so this loses no perceptible detail there. Geometry
  and materials are otherwise NASA's own modeling, unmodified in content.
- The Draco decoder (`public/assets/satellites/draco/`, ~750 KB) is
  **Three.js's own vendored copy** (`node_modules/three/examples/jsm/libs/
  draco/gltf/`, Google's Draco project, Apache 2.0) — bundled locally so
  decoding never depends on a third-party CDN.
- The model is not rendered at true angular scale (real ISS ≈ 1 arcminute,
  a few px even at this zoom) — like the point-sprite dot it replaces, its
  on-screen size is floored to a fixed legible size (see
  `src/scene/IssModel.ts`).

## Satellite card images (issue #1724)

The ISS, Tiangong, and generic-satellite Object Info cards each show a hero
image above the identity sentence.

- **AI-generated illustrations** (Google Gemini image model,
  `gemini-3.1-flash-image`, "nanobanana") — pure text-to-image generation,
  not derived from any specific source photograph. Unlike the DSO sprite
  overlays above, these are UI card art only: they are never placed on the
  sky as a scaled overlay, since (per this file's DSO sprite section) that
  would need a measured footprint this artwork doesn't have.
- Workflow: `scripts/generate-satellite-images.mjs`. Raw generations live in
  `assets-src/satellite-images/raw/` (gitignored); the shipped files are
  `public/assets/satellites/{iss,tiangong,generic-satellite}-card.webp`.
- The ISS and Tiangong images are artistic reconstructions depicting each
  station's real, distinctive silhouette (ISS's long truss with paired
  solar-array wings; Tiangong's T-shaped core-and-labs layout) — not
  calibrated photographs. The generic-satellite image is a representative
  illustration, not any specific real spacecraft.

## Fonts

The Aurora UI typeface set is self-hosted (issue #243 Phase 0 — no external
font CDN dependency, so a future Capacitor-wrapped native app shell can render
its core UI offline). All four are **SIL Open Font License 1.1** (confirmed
via the `ofl/` directory of the google/fonts repo), Latin subset only, and
trimmed to only the weights actually used (verified against every
`font-display` / `font-mono` / Tailwind font-weight utility in `src/`, and the
`@font-face` block at the top of `src/site/site.css`):

- **Space Grotesk** (weight 600 only) — Florian Karsten,
  <https://github.com/floriankarsten/space-grotesk>
- **Outfit** (weights 300, 400, 500, 600, 700) — Rodrigo Fuenzalida,
  <https://github.com/Outfitio/Outfit-Font>
- **IBM Plex Mono** (weight 400 only) — IBM,
  <https://github.com/IBM/plex>
- **Sora** (variable, weights 400-700) — Jonathan Barnbrook / Soar Communications
  Group, <https://github.com/wearesora/sora> — the marketing site's display face
  and the app's splash lockup. Two files: the Latin subset plus `latin-ext`.

Files: `public/fonts/*.woff2` (~132 KB total), referenced via `@font-face` at
the top of `src/index.css` (app) and `src/site/site.css` (marketing site).
Bodoni Moda was the site's display face until 2026-08-23 and its files were
removed when Sora replaced it — recover them from git history if it ever
returns. No attribution string is required by the OFL for
using the fonts as intended (unlike the CC BY-licensed imagery elsewhere on
this page), but author/source credit is kept here for provenance.

## Libraries

- **Three.js** (MIT) — <https://threejs.org/>
- **React** (MIT) — <https://react.dev/>
- **Zustand** (MIT) — <https://github.com/pmndrs/zustand>
- **astronomy-engine** (MIT) — <https://github.com/cosinekitty/astronomy>
- **satellite.js** (MIT) — <https://github.com/shashwatak/satellite-js>
- **Fuse.js** (Apache 2.0) — <https://www.fusejs.io/>
- **Tailwind CSS** (MIT) — <https://tailwindcss.com/>

## SkyLumi code

**Proprietary — © Kiruna Labs. All rights reserved.** This is a private,
closed-source project; no license to reuse the application code is granted.
The third-party data and imagery above retain their own licenses (see each
section), and their attribution obligations are honored independently of the
application code.
