V.1 — cut the CDN tether. Vendored the exact pinned files the importmap used (three.module.js r170 + OrbitControls + CSS2DRenderer, ~1.29 MB) under vendor/three/, mirroring the package layout so the addons' bare `import from 'three'` resolves. Import graph verified shallow (addons import only 'three'; the bundle is self-contained). Both importmaps (index.html, verify.html) now point at ./vendor/three/… — zero jsdelivr/CDN URLs remain. MIT LICENSE + PROVENANCE.txt retained. V.2 — open deep time. EPOCH toggle (1800–2050 / 3000 BC–3000 AD) next to MEGA/TRUE; deep mode is a hash-carried page mode (&e=1) read before ephem/clock init → ephem.setExtendedRange(true) + CONFIG.time swaps to the deep bounds. Timeline end labels + scrub tooltip now read from CONFIG (were hardcoded 1800/2050). Toggle serializes current view and reloads with the flipped e token (orbit paths + element resolution are baked per-session). Appended 1 decade/s and 1 century/s rates. Hash e token added to applyHash/serializeHash. V.3 — appended verify gates (PERIHELION-V): Jupiter @1000 BC (extended 2a+2b) vs live Horizons barycenter tol 0.15 AU (Δ 0.0041); Mercury @2500 tol 0.02 AU (Δ 3e-5); Table 2b M-correction proven live (zeroing it worsens Jupiter@1000BC by 0.0214 AU). Core 13 gates untouched. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|---|---|---|
| assets | ||
| css | ||
| docs | ||
| js | ||
| vendor/three | ||
| .gitignore | ||
| CLAUDE.md | ||
| index.html | ||
| PERIHELION_BRIEF.md | ||
| README.md | ||
| serve.py | ||
| SOLARGOD_BRIEF.md | ||
| verify.html | ||
SOLARGOD ▸ Orrery
A standalone, browser-based 3D solar-system explorer — the interplanetary sibling of GODSIGH, which watches Earth. Float above a compressed-scale ("MEGA") solar system with every world visible at once, moving on real JPL ephemerides; scrub a time bar across centuries; fly the camera into orbit around any planet, its moons circling; toggle TRUE scale and watch the system animate out into its real, humbling emptiness. Live layers plot where Voyager 1, JWST and Parker Solar Probe are right now, plus real asteroids, comets and Earth close-approaches. Everything is client-side, free, and keyless.
Quickstart
python3 serve.py # stdlib only — no npm, no build step
# open http://127.0.0.1:8147
serve.py statically serves the app and proxies the JPL feeds a browser can't call
directly (Horizons / SBDB / CAD — no CORS), with a disk cache in cache/. Three.js
loads from a pinned CDN importmap. The deterministic core (Sun, planets, moons,
orbits, time travel) runs with zero network calls — positions are computed
locally from Keplerian elements; network layers are additive and fail soft.
Verify
Open http://127.0.0.1:8147/verify.html — an in-browser gate runner that checks the ephemeris against JPL Horizons ground truth (hard-coded checkpoints + live queries through the proxy). All 13 gates should read PASS, e.g.:
| Gate | Result |
|---|---|
| Mars / Jupiter / Earth @ 2026-07-15 (heliocentric ecliptic AU) | Δ ≤ 3.3e-4 / 2.9e-3 / 3.9e-5 AU |
| Kepler solver converges at e=0.97 · orbitPath closes · frame round-trips | exact |
| MEGA→TRUE preserves direction (unit dot ≈ 1) | 1.000000000000 |
| Mars @ J2000 · Jupiter @ 1900 vs live Horizons | Δ 4.8e-5 / 2.0e-3 AU |
| Main belt between Mars & Jupiter · Halley aphelion beyond Neptune | pass |
| Voyager 1 @ 2026-07-15 = (−32.07, −136.21, +98.55) AU · JWST hugs Earth | Δ 0.002 / 0.011 AU |
Layers
| Layer | Source | Default | Notes |
|---|---|---|---|
| Planets & orbits | JPL SSD approximate elements (Standish) | on | 8 planets + Pluto, textured, MEGA-compressed orbit paths |
| Body labels | — | on | names; the focused body's children also get distance labels |
| Moons | JPL satellite data | on | 21 moons, per-parent local compression, retrograde Triton |
| Rings | true km, scaled to parent | on | Saturn (textured annulus) · Uranus (schematic) |
| Spacecraft | JPL Horizons (proxy) | on | Voyager 1/2, New Horizons, JWST, Parker, Juno, Lucy, Psyche — live distance + one-way light-time |
| Main belt | JPL SBDB (proxy) | off | ~1500 main-belt asteroids, shared Kepler core |
| Comets | JPL SBDB (proxy) | on | 1P/Halley, 2P/Encke, 67P, 96P — full orbits + anti-sunward 1/r² tail |
| Close approaches | JPL CAD (proxy) | off | ±30-day NEO radar around Earth, miss distance in lunar distances |
Controls
- Focus — click any body (or use the Focus menu) → the camera flies into orbit
around it; breadcrumb
SOL ▸ JUPITER ▸ EUROPA;Escsteps out one level. - MEGA / TRUE — toggle the scale mode; the transition animates over ~2.5 s.
- Body scale — 1× / 100× / 1200× radius exaggeration.
- Time bar — NOW, play/pause, reverse, rate presets (
1× · 1 min/s … 1 yr/s), and a scrubbable 1800–2050 timeline. A LIVE / SCRUBBED chip mirrors GODSIGH. - Info panel — appears on focus: a grimoire card with a physical fact sheet, hand-written prose, a stylized portrait, and live computed facts (distance from Sun & Earth, sunlight age, orbital speed, day & year length). Focusing Earth reveals a link to the GODSIGH world view.
- Shareable URLs — the view serializes to the hash
(
#f=<body>&t=<time>&s=<mega|true>&L=<layers>&cam=…); paste one to reproduce a view. ?debug=1— frame-rate / scale readout.
Architecture
No build step, no framework, plain ES modules. One module owns the truth→view
transform (scale.js); every position is computed in real heliocentric J2000
ecliptic AU first (ephem.js) then compressed. A floating origin subtracts the
focused body's position in float64 before writing to the scene graph, so a focused
planet never jitters at close zoom.
index.html · serve.py · verify.html
css/style.css
js/ config lib ephem bodies scale ui main
js/layers/ planets moons rings spacecraft asteroids comets neos almanac
assets/textures/ (CC BY) · assets/art/grimoire/ (generated)
The full execution spec is SOLARGOD_BRIEF.md.
Credits
- Positions — JPL SSD approximate elements; live feeds via JPL Horizons / SBDB / CAD.
- Textures — Solar System Scope,
CC BY 4.0 (see
assets/textures/CREDITS.md). - Grimoire art — generated locally with MODELBEAST / FLUX (see
assets/art/PROMPTS.md); the aesthetic layer only — real worlds get real data textures. - Built on Three.js.
