Say what the project is, in the two places people arrive

The README opened without mentioning that the thing is deployed, and the HTML
document carried a title and nothing else — no description, no link preview.
Both matter more now that there is a public URL to land on.

README: the live link up top; the object card and the measured/derived split
from #3, which were built but never written down; `shared/format/`, `public/`
and `.github/workflows/` in the layout.

index.html: a description, a theme colour matching --color-void so the browser
chrome does not flash white around a black sky, and Open Graph/Twitter tags so
a shared link renders as something other than a bare URL. Those URLs are
absolute and name the deployment outright — a scraper has no document to
resolve a relative path against, so they cannot follow <base> the way the rest
of the app's paths do. A custom domain later means editing these three lines.

The preview image is the galactic view, copied into `public/` so it is served
by the site itself rather than linked out to raw.githubusercontent.

Verified: the built document keeps every tag, the base href still rewrites to
/star-map/, the image answers 200 at the path the og:image names, and both the
root and a deep link still render. 527 tests pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WaySiNst4HhDXBHnMy8p5G
This commit is contained in:
Claude
2026-08-07 14:22:29 +00:00
parent 433bcca8a2
commit 7d07921d69
3 changed files with 38 additions and 1 deletions
+21
View File
@@ -5,6 +5,10 @@ real astronomical data instead of fictional systems. Browse the solar neighbourh
star's system to see its planets on their real orbits, and drill into a single body for the star's system to see its planets on their real orbits, and drill into a single body for the
NASA figures behind it. NASA figures behind it.
**Live at <https://avalon-vanguard.github.io/star-map/>**, published from `main` by
[`.github/workflows/pages.yml`](.github/workflows/pages.yml). There is no backend — the whole
thing is static files and a few megabytes of baked catalogue.
The source of a small Claude Code plugin also lives here — see [Plugins](#plugins) below. The source of a small Claude Code plugin also lives here — see [Plugins](#plugins) below.
![The solar neighbourhood: 68 388 catalogued stars within 250 parsecs, on a polar grid lying in the galactic plane](docs/screenshots/galaxy-view.jpg) ![The solar neighbourhood: 68 388 catalogued stars within 250 parsecs, on a polar grid lying in the galactic plane](docs/screenshots/galaxy-view.jpg)
@@ -74,6 +78,20 @@ around it. Mercury's, three pixels wide at that range, does not survive either w
with real photography where NASA/ESA/USGS imagery exists, and a surface derived from the body's with real photography where NASA/ESA/USGS imagery exists, and a surface derived from the body's
own measurements where it does not. See "On surfaces that were never photographed" below. own measurements where it does not. See "On surfaces that were never photographed" below.
**Object card** — hovering a body in the system view raises its figures over the live scene and
clicking pins them, so two planets can be compared without flying out and back; **Full view**
opens the detail route when the close-up is wanted. The card and the detail panel are built from
one shared view model and one shared set of readouts, which is what stops the same planet reading
255 K in one and 254 K in the other.
**Measured against derived** — every figure is filed under the heading it earns. A published
radius is measured; an equilibrium temperature computed from the host star's luminosity is
derived, and says so. Orbital period is shown where it can honestly be had: for a heliocentric
orbit it follows exactly from the semi-major axis, because in these units the Sun's mass *is* the
unit of mass — Mars comes back 687.0 d against a published 686.98. It is deliberately absent for
moons, whose elements are relative to a parent planet the catalogue carries no mass for, and for
exoplanets, where assuming a solar-mass host would mis-state every planet around an M dwarf.
**Search** — name search across stars, solar-system bodies and exoplanets, navigating to the **Search** — name search across stars, solar-system bodies and exoplanets, navigating to the
same place an in-scene click would. same place an in-scene click would.
@@ -281,9 +299,12 @@ src/app/
Milky Way structure Milky Way structure
shared/models/ record contracts shared by the app and the ETL shared/models/ record contracts shared by the app and the ETL
shared/rendering/ skybox, glow sprites, texture catalog shared/rendering/ skybox, glow sprites, texture catalog
shared/format/ one formatter per physical quantity, precision following magnitude
shared/state/ navigation store (Angular signals) shared/state/ navigation store (Angular signals)
tools/etl/ build-time data pipeline tools/etl/ build-time data pipeline
e2e/ Playwright end-to-end tests e2e/ Playwright end-to-end tests
public/ files served at the site root (favicon, link-preview image)
.github/workflows/ CI, the Pages deploy, and an automated review pass
``` ```
The design document behind all of this is `.junie/plans/nasa-star-map.md`. The design document behind all of this is `.junie/plans/nasa-star-map.md`.
Binary file not shown.

After

Width:  |  Height:  |  Size: 242 KiB

+17 -1
View File
@@ -2,10 +2,26 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>Star Map</title> <title>Star Map — the real solar neighbourhood in 3D</title>
<!-- Overwritten at build time with the deploy's subpath (`ng build --base-href`). The app's
data fetches are relative, so this is what they resolve against. -->
<base href="/"> <base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="An interactive 3D star map built from real astronomical data: 68,388 catalogued stars out to 250 parsecs, planets on their measured orbits, and the NASA figures behind every body.">
<!-- Matches --color-void, so the browser chrome does not flash white around a black sky. -->
<meta name="theme-color" content="#05070d">
<link rel="icon" type="image/x-icon" href="favicon.ico"> <link rel="icon" type="image/x-icon" href="favicon.ico">
<!-- Link previews. These URLs must be absolute — a scraper resolves them against nothing — so
unlike everything else here they do not follow <base> and name the deployment outright. -->
<meta property="og:type" content="website">
<meta property="og:url" content="https://avalon-vanguard.github.io/star-map/">
<meta property="og:title" content="Star Map — the real solar neighbourhood in 3D">
<meta property="og:description" content="68,388 catalogued stars out to 250 parsecs, planets on their measured orbits, and the NASA figures behind every body.">
<meta property="og:image" content="https://avalon-vanguard.github.io/star-map/social-preview.jpg">
<meta property="og:image:alt" content="The Milky Way's bar, bulge and five spiral arms, with the Sun marked on the Orion Spur">
<meta name="twitter:card" content="summary_large_image">
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Orbitron:wght@500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Orbitron:wght@500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">