The Atlas · Colophon
How the Atlas is built
How this universe is made, and the numbers it is held to. Every figure says where it comes from: this build is computed while the site is built, code is read from the source, and measured comes from a dated run on a named build.
- First view
- 44.6KB · BrotliThis build · the home page before the scene
- Frame rate
- 59.9fps · p95 16.8 msMeasured 13 Oct 2026 · fc095d1 · mid tier
- Lighthouse
- 99· 100 · 100 · 100Measured 13 Oct 2026 · lowest of 4 routes · performance, accessibility, best practices, SEO · without a GPU, so the static chart
- Addresses
- 51each a prerendered pageThis build · the sitemap
https://the-atlas-3e2.pages.dev/colophon · built 21 Oct 2026
The numbers
Budgets come from the brief and are enforced by scripts in the repository. Each table says where its numbers come from.
Weight
| Item | Budget | This build |
|---|---|---|
| First view of the home page | 300 KB · held under 45 KB | 44.6 KB |
| All code and fonts, textures excluded | 1 MB (hard limit 1.2 MB) | 741.7 KB |
| Planet, Sun and sky textures, loaded after first paint | — | 5.1 MB |
| The title fonts, subset to the title’s letters | — | 5.1 KB |
This build · 21 Oct 2026 · Brotli, fonts as stored · the same measurement as npm run size
The first view breaks down as HTML with inlined CSS 21.2 KB, gate title fonts 5.1 KB, mono font 14.4 KB and entry script 4.0 KB. The 3D code is requested only once the browser reports its largest contentful paint, or after a short cap.
Loading
| Route | Performance | Accessibility | Best practices | SEO |
|---|---|---|---|---|
/ | 99 | 100 | 100 | 100 |
/work | 99 | 100 | 100 | 100 |
/work/rag-pipeline | 99 | 100 | 100 | 100 |
/list | 99 | 100 | 100 | 100 |
| Route | LCP | TBT | CLS |
|---|---|---|---|
/ | 1.35 s | not measured | not measured |
/work | 1.35 s | not measured | not measured |
/work/rag-pipeline | 1.65 s | not measured | not measured |
/list | 1.8 s | not measured | not measured |
Measured 13 Oct 2026 · build fc095d1 · Lighthouse 12.8.2 · mobile · simulated slow 4G · 4× CPU · median of 3 runs · npm run perf
Across these routes, total blocking time stays at or under 104 ms and layout shift at or under 0.003.
Lighthouse’s own Chrome has no GPU. Software renderers get the static chart, so these runs measure how fast pages load. The 3D path is measured on a real GPU below.
Frames
| Tier | Viewport | Mean | p95 | p99 | Worst frame | Measured |
|---|---|---|---|---|---|---|
| Mid | 1440×900 | 59.9 fps | 16.8 ms | 16.8 ms | 33 ms | 13 Oct 2026 · build fc095d1 |
| High | 1440×900 | 59.3 fps | 16.8 ms | not measured | 250 ms | 13 Oct 2026 · an earlier build, before fix rounds C–D |
Measured · each row names its date and build · npm run fps on a real GPU
Boot and memory
From navigation to a ready universe: 481 ms on the mid tier. Diving in and out 50 times grows the heap by 0.0 MB. A 30-minute session of random travel ends with the heap at 10.9 MB (from 9.8 MB), a p95 frame time of at most 16.8 ms and 0 errors.
Measured · boot 13 Oct 2026 · build fc095d1 · memory 13 Oct 2026 · before fix rounds C–D · session 13 Oct 2026 · before fix rounds C–D
Tests
| Suite | Result |
|---|---|
| Unit | 232 passed, 0 failed |
| End to end | 61 passed, 0 failed, 23 skipped, on Chrome at 1440×900 and 390×844 |
| Accessibility (axe) | 0 violations on 4 pages at 2 viewport sizes |
| Visual baselines | 14 |
| Prerendered pages | 52 HTML files, 51 addresses in the sitemap (this build) |
Measured 13 Oct 2026 · build fc095d1 · npm test, npm run e2e and npm run visual · prerendered pages: this build
Measured on Dell Latitude 5420 · Intel Core i7-10610U · Intel UHD Graphics (CML GT2) · 32 GB · Ubuntu 24.04 · Google Chrome 152, headless, ANGLE/Vulkan.
To reproduce: npm run size, npm run perf, npm run fps, npm test and npm run e2e. npm run record writes their results, with the date and the build, into the data this page is rendered from.
Hierarchy is scale
The site map is the universe: 4 galaxies are the sections, planets are pages, chapters are pins on a planet’s surface, and a chapter can hold single pages. How deep you are on screen is how deep you are in the site.
Each of the 46 objects has its own address and prerendered page: 4 galaxies, 15 planets, 21 chapters and 5 single pages under the universe.
Navigation is a pure state machine with three verbs: scroll steps one stop, drag orbits, click reads. Nothing opens by itself; a property test runs 2,000 random sequences to check it. Browser history mirrors the chain of ancestors, so Back always means one level up, exactly like Esc.
One camera, one path
The rig follows van Wijk and Nuij’s smooth and efficient zooming and panning (van Wijk & Nuij 2003): centre and view width move together along the optimal path in the space of views, so a long move zooms out, pans while it is far, and zooms back in. Its curvature ρ (rho) is 1.25.
Yaw and pitch are measured in the subject’s frame. Planets with chapters are tidally locked to their galaxy’s core with the chapters on the lit face.
One animation loop drives everything: GSAP’s ticker calls the frame. The engine and the interface announce what happens on window events: atlas:travelstart, atlas:arrive, atlas:travelcancel, atlas:introphase, atlas:panel, atlas:sound, atlas:motion, atlas:decade, atlas:pause, atlas:pref, atlas:soundcue, atlas:live, atlas:signal-open, atlas:downbeat, atlas:duck, atlas:form, atlas:list and atlas:caption. The landing title, the captions and the score subscribe to them; none of them reaches into the engine.
Scale hand-offs
One world, one continuous move, with no scene cuts. The layers fade as functions of one number, the camera’s distance from the Sun.
Windows
| Layer | Fades in | Fades out |
|---|---|---|
| The Milky Way, seen from outside | 250–900 | 4,500–8,000 |
| The SOL tag | 1,500–2,500 | 6,000–9,000 |
| The other universes | 853,546–2,845,153 | stays |
Code · WINDOWS in src/engine/intro.ts · distances from the Sun in world units · smooth steps in log distance
The scale is artistic. Around the Sun, the Sun is one world unit in radius, and our whole universe is 948,384 units in radius. The real observable universe is about 93 billion light-years across (Planck Collaboration 2020, A&A 641, A6; Lineweaver & Davis 2005, Scientific American), so the scene compresses reality about 6.7 × 10¹¹ times, measured in nominal solar radii (IAU 2015).
Beyond the wall the other universes are an artist’s impression, drawn with restraint: thin luminous membranes, a foam of many smaller ones around the nearest, and a few pairs whose walls cross on a collision ring, the kind of event sought in the first observational tests of eternal inflation (Feeney et al. 2011). The nearest neighbours’ interiors are cellular Worley webs (Worley 1996). Distance and angles run through timed knots on monotone cubic splines, which add no overshoot between knots (Fritsch & Carlson 1980).
Beyond our universe nothing is drawn with depth, so the scene needs neither a logarithmic depth buffer nor a floating origin.
Light and matter
Linear light, tone-mapped with AgX (Sobotka) on every tier that draws the scene; mipmap bloom and dithering on high and mid, neither on low.
Procedural galaxies: one spiral-arm model drives both the shader and the star sampler.
The sky: the Milky Way panorama by ESO / S. Brunier (CC BY, in the credits below) with point sources removed and its levels set for the sky shader, plus 8,000 crisp procedural stars on mid (4,000–12,000 by tier); until it has loaded, the Solar System Scope Milky Way map stands in. Star colours are blackbody colours from a fitted curve (Helland 2012).
The commit stars are DEMO DATA until a GitHub account is connected.
Planet maps arrive after first paint, one galaxy at a time, decoded off the main thread.
The score
There are no audio files. Sound stays off until you turn it on, and the audio context is created only inside that click or key press. The score is generated live with the Web Audio API (W3C 2021), in D Lydian.
Layers
- Drone
- Pads
- Solar wind: filtered pink noise (Kellet)
- Bells
- Whistlers: falling tones shaped like the radio whistlers that lightning sends through the magnetosphere (Storey 1953)
- Partials
The reverb’s impulse response is generated in idle time. Opening a reading panel ducks the score; a hidden tab suspends it.
Ways in
- Every page is text.
- The LIST (L), also at /list without JavaScript.
- Keyboard: the up and down arrows travel (tap or hold); Page Down/Up and Space glide a stop; Home and End go to the start of the path and to its last mapped stop; the left and right arrows turn the view; Enter reads the page in view or glides on; Esc closes; 1–4 jump to a section; W, A, S and D fly off the path and B returns to it; / searches; L lists; H hides the interface.
- Screen readers: arrivals are announced, and the panel heading takes focus.
- Reduced motion: travel becomes a cut, titles fade.
- No GPU: the static chart.
- No JavaScript: every page, the LIST, this page and both forms work.
- Contrast: the dim text colour on the page background measures 5.65:1, the muted one 7.30:1, computed from the tokens at build.
- Checked: axe reports 0 violations on 4 pages at 2 viewport sizes (measured 13 Oct 2026 · build fc095d1).
Four tiers
The tier is decided at boot from what the browser reports: no WebGL2 or a software renderer gets none; Save-Data, very little memory, very few cores or a weak mobile GPU get low; a touch screen gets mid; a discrete GPU gets high; an integrated one, like the Intel laptop these numbers come from, gets mid. Unknown means mid.
Any page takes ?tier=high, ?tier=mid, ?tier=low or ?tier=none to force one.
| Tier | Pixel ratio cap | MSAA | Bloom | Stars per galaxy | Commit stars | Sky stars | Textures | Idle frame cap |
|---|---|---|---|---|---|---|---|---|
high | 2 | 4× | yes | 16,000 | 6,000 | 12,000 | 2k | 60 fps |
mid | 1.5 | 2× | yes | 9,000 | 3,000 | 8,000 | 2k | 30 fps |
low | 1 | off | no | 4,500 | 1,200 | 4,000 | 1k | 30 fps |
none | A static SVG chart, full page content | |||||||
Code · TIERS in src/perf/tiers.ts and SKY in src/universe/sky.ts · stars per galaxy at density one
A frame monitor watches the p95 frame time: when it stays over budget the drawing buffer drops its resolution a step, and it climbs back once there is headroom.
How it is checked
Each check is a script in the repository:
npm run size: the transfer budget, the same measurement as the figures above.npm run perf: Lighthouse on the key routes, one at a time.npm run fps: a scripted journey on a real GPU, with the frame times’ p95 and p99.npm test: the unit tests, including the navigation law and this page’s own rules.npm run e2e: the browser tests on a desktop and a phone viewport, axe included.npm run visual: frozen screenshots against approved baselines.node scripts/qa-shots.mjs: deterministic screenshots for review (27 states at 5 sizes, 13 Oct 2026 · build fc095d1).npm run build:strict: the launch gate. It fails while a placeholder remains or a measurement on this page predates the code it describes.npm run record: writes the results above, with their date and build, into the data this page is rendered from.
No measurement on this page is typed in by hand.
Stack
- three.js r180, WebGL2, custom GLSL; postprocessing 6.39.5.
- GSAP 3.15.0, the one loop.
- Vite 6.4.4 and TypeScript 5.9.3, strict.
- Fastify 5.12.5 for the forms and the stars’ feed.
- Caddy with precompressed files and a hash-pinned CSP.
- Cormorant and IBM Plex Mono under the SIL OFL.
This build · versions from package-lock.json
References
- van Wijk, J. J. & Nuij, W. A. A. (2003). Smooth and efficient zooming and panning. IEEE Symposium on Information Visualization (InfoVis 2003).
- Fritsch, F. N. & Carlson, R. E. (1980). Monotone piecewise cubic interpolation. SIAM Journal on Numerical Analysis 17(2), 238–246.
- Sobotka, T. AgX. The picture formation used by Blender 4.0, as implemented in three.js and postprocessing.
- Helland, T. (2012). How to Convert Temperature (K) to RGB: Algorithm and Sample Code. Blog post.
- Worley, S. (1996). A cellular texture basis function. Proceedings of SIGGRAPH 96, 291–294.
- Feeney, S. M., Johnson, M. C., Mortlock, D. J. & Peiris, H. V. (2011). First observational tests of eternal inflation. Physical Review Letters 107, 071301.
- Storey, L. R. O. (1953). An investigation of whistling atmospherics. Philosophical Transactions of the Royal Society A 246, 113–141.
- Kellet, P. Pink noise filter. The “refined” method. musicdsp.org archive.
- W3C (2021). Web Audio API. W3C Recommendation. www.w3.org/TR/webaudio (opens in a new tab)
- Ewen, H. I. & Purcell, E. M. (1951). Observation of a Line in the Galactic Radio Spectrum: Radiation from Galactic Hydrogen at 1,420 Mc./sec.. Nature 168, 356.
- Hellwig, H., Vessot, R. F. C., Levine, M. W., Zitzewitz, P. W., Allan, D. W. & Glaze, D. J. (1970). Measurement of the unperturbed hydrogen hyperfine transition frequency. IEEE Transactions on Instrumentation and Measurement 19(4), 200–209. The line at 1 420.405 751 768 MHz.
- Cocconi, G. & Morrison, P. (1959). Searching for Interstellar Communications. Nature 184, 844–846. The proposal to listen near 1 420 Mc/s.
- Kraus, J. D. (1979). We Wait and Wonder. Cosmic Search 1(3), 31–34. The Ohio State “Wow!” signal of 15 August 1977.
- International Astronomical Union (2015). Resolution B3 on recommended nominal conversion constants. The nominal solar radius; with IAU 2012 Resolution B2, the astronomical unit.
Credits
Designed and built by Arun Singh in New Delhi.
- Images and maps — planets and the Sun: Solar System Scope (opens in a new tab) (CC BY 4.0 (opens in a new tab)), via Wikimedia Commons, resized, converted to WebP and re-tinted in the shaders; the Milky Way band: ESO/S. Brunier (CC BY 4.0 (opens in a new tab)), eso0932a, point sources removed, resized and re-tinted in the shaders (the Solar System Scope map stands in until it loads); galaxy photographs and other images from NASA, ESA, ESO and the EHT Collaboration, under open licences or in the public domain, each credited on screen while it fills the view and in full on How the Atlas is built. The section galaxies sit at their real relative positions in the Local Group and the catalogued neighbours in their real directions; the rest are generated to follow the cosmic web. The Ceres, Haumea, Eris and Makemake maps are artistic impressions.
- Type — Cormorant by Christian Thalmann and IBM Plex Mono by IBM, both under the SIL Open Font License (opens in a new tab).
- Built with — Three.js (opens in a new tab), GSAP (opens in a new tab), postprocessing (opens in a new tab), Vite (opens in a new tab) and Fastify (opens in a new tab).
- The section galaxies up close, the Sun’s corona and the atmospheres are procedural shaders, generated from a fixed seed.
- Stars are plotted from GitHub activity, one per commit or deploy. Currently DEMO DATA: the counts and timestamps are seeded until the live feed is connected.
Not affiliated with NASA, ESA, ESO or CelesTrak. Images and data are used under their licences.
Phase 2 sources
The living-universe pieces cite these on their cards. They are the sources of the real numbers; the simulated and fictional pieces say so wherever they appear.
Pulsars
Periods and positions of the pulsars come from this catalogue.
Satellites
Live orbits are drawn from the latest element sets and propagated with SGP4.
- CelesTrak (T.S. Kelso), GP element sets, https://celestrak.org/NORAD/elements/ (fetched once every 12 hours, within its usage policy)
- Vallado, Crawford, Hujsak and Kelso, "Revisiting Spacetrack Report #3", AIAA 2006-6753 (SGP4; computed with satellite.js, MIT)
- NASA, "Webb Orbit" (Webb orbits the Sun 1.5 million kilometres from the Earth at L2)
Simulated transients
Supernovae, novae, radio bursts, gamma-ray bursts and kilonovae in the endless field are SIMULATED. The real phenomena they are drawn after are cited here.
- Conley et al. 2006, “The Rise Time of Type Ia Supernovae from the Supernova Legacy Survey”, AJ 132, 1707 (rest-frame B rise 19.1 d at high redshift)
- Bazin et al. 2009, “The core-collapse rate from the Supernova Legacy Survey”, A&A 499, 653 (the light-curve parametrisation used for the shape)
- Lorimer et al. 2007, “A bright millisecond radio burst of extragalactic origin”, Science 318, 777 (30 Jy, under 5 ms, first FRB)
- Kouveliotou et al. 1993, ApJ 413, L101 (short and long bursts, divided at T90 = 2 s), as summarised in Horváth 2002, arXiv:astro-ph/0205004
- Valenti et al. 2017, “The discovery of the electromagnetic counterpart of GW170817: kilonova AT 2017gfo/DLT17ck”, ApJ 848, L24
Black holes and jets
The distances and sizes on the active-galaxy cards.
- Event Horizon Telescope Collaboration 2019, ApJL 875, L1
- Schmidt 1963, Nature 197, 1040
- NASA/ESA Hubble, Picture of the Week 1346a
- Harris, Rejkuba & Harris 2010, PASA 27, 457 (via Wikipedia, Centaurus A)
- NASA 2011; Astronomy Picture of the Day 2011 (via Wikipedia, Centaurus A)
- Wikipedia, Cygnus A (NED values), read 2026-10-18
Mergers and nebulae
The distances and sizes behind the merger simulations (an ARTIST’S IMPRESSION of the encounter) and the nebula clouds.
- NED values via Wikipedia, NGC 4676, read 2026-10-18
- Wikipedia, Arp 273, read 2026-10-18
- Wikipedia, Cartwheel Galaxy, read 2026-10-18
- Kounkel et al. 2017 (Gaia/VLBA, 1 267 ± 5 ly) (via Wikipedia, read 2026-10-18)
- Kuhn et al. 2019 (≈ 8 500 ly); radius ≈ 230 ly (Atlas of the Universe) drawn 1.6× (via Wikipedia, read 2026-10-18)
- Arias et al. 2006 (≈ 4 100 ly) (via Wikipedia, read 2026-10-18)
- Kuhn et al. 2018 (5 700 ± 400 ly) (via Wikipedia, read 2026-10-18)
Laniakea
The flow of galaxies toward the Great Attractor is an ARTIST’S IMPRESSION built from these cited numbers.
- Tully, Courtois, Hoffman & Pomarède 2014, "The Laniakea supercluster of galaxies", Nature 513, 71
- Great Attractor: galactic l ≈ 307°, b ≈ +9°, 150–250 million ly; Norma Cluster ≈ 220 million ly (Wikipedia, Great Attractor, read 2026-10-18)
- Laniakea mass ≈ 10¹⁷ suns (Tully et al. 2014, Nature 513, 71; the same paper as above)
- Laniakea ≈ 400 million ly across (Dupuy & Courtois 2023, Nature Astronomy, as given in Wikipedia, Laniakea Supercluster, read 2026-10-18); the galaxy count is left out: it has no primary source