Credits and attribution

Every third-party asset used by every project, with its license. Each project's repo carries its own ATTRIBUTION.md.

Landing page

AssetAuthorSourceLicenseChanges
Michroma 400 (latin subset, woff2)Vernon Adamshttps://fontsource.org/OFL-1.1none
Cormorant Garamond 700 (latin subset, woff2)Christian Thalmann (The Cormorant Project)https://fontsource.org/OFL-1.1none
Fraunces 700 (latin subset, woff2)Undercase Type (Phaedra Charles, Flavia Zimbardi)https://fontsource.org/OFL-1.1none
Big Shoulders Stencil Display 700 (latin subset, woff2)Patric King, XO Type Cohttps://fontsource.org/OFL-1.1none
Playfair Display 700 (latin subset, woff2)Claus Eggers Sørensenhttps://fontsource.org/OFL-1.1none

Project posters are screenshots of each project's own 3D scene; their assets are credited in the project sections below.

Lunar Field Expedition

AssetAuthorSourceLicenseChanges
LROC NAC DTM "NAC_DTM_APOLLO15" (2 m/px digital terrain model of the Apollo 15 site)NASA / GSFC / Arizona State Universityhttps://pds.lroc.im-ldi.com/data/LRO-L-LROC-5-RDR-V1.0/LROLRC_2001/DATA/SDP/NAC_DTM/APOLLO15/NAC_DTM_APOLLO15.TIF (product page: http://wms.lroc.asu.edu/lroc/view_rdr_product/NAC_DTM_APOLLO15)Public domain (NASA data; credit requested)Cropped to the play area, resampled and exported as three 16-bit heightmap LODs (30/10/5 m per px) plus derived normal maps by `scripts/process-terrain.sh` + `scripts/build-tiles.mjs`. No vertical exaggeration. Raw DTM not committed.
NASA SVS CGI Moon Kit — LROC WAC Hapke-normalized color mosaic ("lroc_color_2k.jpg")NASA's Scientific Visualization Studio (LROC WAC data)https://svs.gsfc.nasa.gov/4720Public domain (NASA; credit requested)Used whole as the global Moon color map (Module 1); cropped to the play area for the local terrain albedo (`albedo-wac.png`).
NASA SVS CGI Moon Kit — LOLA elevation map ("ldem_16_uint.tif")NASA's Scientific Visualization Studio (LOLA data)https://svs.gsfc.nasa.gov/4720Public domain (NASA; credit requested)Downsampled to a 1024x512 16-bit PNG displacement map (`public/assets/globe/displacement-1k.png`, half-metres vs 1727400 m, encoded in the sidecar meta).
Apollo 15 photograph AS15-89-12100, "Telephoto view across Hadley Rille photographed during Apollo 15 EVA" (2 Aug. 1971)NASA (Johnson Space Center)https://images.nasa.gov/details/as15-89-12100Public domain (NASA media usage guidelines: https://www.nasa.gov/nasa-brand-center/images-and-media/; credit requested)None (displayed as-is in the Apollo 15 comparison view).
Blue Marble: land surface, shallow water and shaded topography ("land_shallow_topo_2048.jpg")NASA Goddard Space Flight Center (Visible Earth)https://eoimages.gsfc.nasa.gov/images/imagerecords/57000/57752/land_shallow_topo_2048.jpgPublic domain (NASA media usage guidelines: https://www.nasa.gov/nasa-brand-center/images-and-media/; credit requested)Downscaled from 2048x1024 to 1024x512 (`earth-bluemarble-1k.jpg`) and applied to the Earth disc in the site sky.
three.js 0.186.1three.js authorshttps://github.com/mrdoob/three.jsMITNone; bundled by Vite. No Draco/Basis decoders are shipped, because the project loads no compressed models or textures.
Favicon (`public/favicon.svg`)This project (original work)—CC BY 4.0 (with the rest of the content)Original icon: cratered Moon disc.
Moon Rock 01 (`public/assets/models/moon_rock_01-cb2290c4.glb`)Greg Zaal, Rico Cilliers, Jenelle van Heerden, Dario Barresihttps://polyhaven.com/a/moon_rock_01CC0 1.0 (Poly Haven, https://polyhaven.com/license)Converted to a self-contained GLB with resized JPEG textures; file renamed with a content hash. Scattered as close-range boulders on the real terrain (v2.0.0).
Moon Rock 02 (`public/assets/models/moon_rock_02-72b3b793.glb`)Rico Cilliers, Greg Zaal, Jenelle van Heerdenhttps://polyhaven.com/a/moon_rock_02CC0 1.0 (Poly Haven, https://polyhaven.com/license)Converted to a self-contained GLB with resized JPEG textures; file renamed with a content hash. Scattered as close-range rocks (v2.0.0).
Moon Rock 03 (`public/assets/models/moon_rock_03-9d1ae442.glb`)Greg Zaal, Rico Cilliers, Jenelle van Heerdenhttps://polyhaven.com/a/moon_rock_03CC0 1.0 (Poly Haven, https://polyhaven.com/license)Converted to a self-contained GLB with resized JPEG textures; file renamed with a content hash. Scattered as close-range rocks (v2.0.0).
Michroma (Latin 400 WOFF2, via `@fontsource/michroma`; v2 only, not loaded from v3.0.0)Vernon Adamshttps://fonts.google.com/specimen/MichromaSIL OFL 1.1Self-hosted Latin WOFF2 subset for display headings.
IBM Plex Sans (Latin 400/600 WOFF2, via `@fontsource/ibm-plex-sans`)IBM Corp. (Mike Abbink, Bold Monday)https://github.com/IBM/plexSIL OFL 1.1Self-hosted Latin WOFF2 subsets for body copy, instructions and controls.
IBM Plex Mono (Latin 400/600 WOFF2, via `@fontsource/ibm-plex-mono`; v2 only, not loaded from v3.0.0)IBM Corp. (Mike Abbink, Bold Monday)https://github.com/IBM/plexSIL OFL 1.1Self-hosted Latin WOFF2 subsets for in-world tooltips, sample tags and telemetry.
Lunar Module descent stage, Lunar Roving Vehicle, flag and suited crew figures (v2.0.0 scene props)This project (original work)—MIT (code) / CC BY 4.0 (content)Built procedurally in three.js from public-domain NASA Apollo 15 surface photographs (Apollo Lunar Surface Journal image library, https://www.hq.nasa.gov/alsj/a15/images15.html); no third-party model files are used. Simplified, approximate geometry. The crew figures were rebuilt in the G2 fix round (2026-11-07, `src/lunar/astronaut.js`): A7L-B suit details, procedural fabric textures, foot IK on the terrain; still own procedural work, not a scan.
LROC NAC DTM "NAC_DTM_APOLLO15", v3 streamed near terrain (`public/assets/terrain-v3/near/`)NASA / GSFC / Arizona State Universityhttp://wms.lroc.asu.edu/lroc/view_rdr_product/NAC_DTM_APOLLO15Public domain (NASA data; credit requested)Averaged from 2 m to 5 m on a local grid centred on the LM, gaps filled from SLDEM2015 (row 16), lunar curvature applied, cut into a 3D Tiles quadtree of meshopt-compressed GLB tiles by `scripts/build-v3-terrain.mjs`. No vertical exaggeration.
SLDEM2015 LOLA + Kaguya TC merged DEM, 512 px/deg (`public/assets/terrain-v3/far/`, and the gap fill of the near tiles)NASA LOLA Team and JAXA SELENE/Kaguya Team (Barker et al. 2016, Icarus 273); distributed by NASA PDS / USGS Astrogeologyhttps://astrogeology.usgs.gov/search/map/moon_lro_lola_selene_kaguya_tc_dem_merge_60n60s_59m (tile from https://pds-geosciences.wustl.edu/lro/lro-l-lola-3-rdr-v1/lrolol_1xxx/data/sldem2015/tiles/float_img/)Public domain (USGS Astropedia; please cite the authors)Window 24.75-27.5 N, 2.1-5.17 E read by HTTP range requests; resampled to 80 m over an 81.92 km square, shifted +0.25 m onto the NAC datum, curvature applied, 3D Tiles quadtree by `scripts/build-v3-terrain.mjs`.
Clementine UVVIS 750 nm global mosaic v2.1, 118 m (`public/assets/v3/terrain/albedo-clementine-750nm-1024.ktx2`)USGS Astrogeology Science Center; Clementine mission (BMDO/NASA)https://astrogeology.usgs.gov/search/map/moon_clementine_uvvis_global_mosaic_118mPublic domain (USGS Astropedia)Window cut with GDAL, reprojected onto the far terrain square at 80 m/px (cubic), encoded as grey KTX2. Used as relative albedo, not colour.
Poly Haven texture "Moon 01" (`public/assets/v3/regolith/regolith-meso-*`)Greg Zaal, Rico Cilliers, Jenelle van Heerden, Dario Barresihttps://polyhaven.com/a/moon_01CC0 1.0 (Poly Haven, https://polyhaven.com/license)2k JPG maps resized to 1024 and 512 px; AO, roughness and displacement packed into one map; encoded as KTX2 (ETC1S / UASTC) by `scripts/build-v3-textures.mjs`.
Poly Haven texture "Moon Dusted 02" (`public/assets/v3/regolith/regolith-macro-*`)Greg Zaal, Rico Cilliers, Jenelle van Heerdenhttps://polyhaven.com/a/moon_dusted_02CC0 1.0 (Poly Haven, https://polyhaven.com/license)As row 18.
Poly Haven texture "Moon Footprints 01" (`public/assets/v3/decals/bootprints-*`)Greg Zaal, Rico Cilliers, Jenelle van Heerden, Dario Barresihttps://polyhaven.com/a/moon_footprints_01CC0 1.0 (Poly Haven, https://polyhaven.com/license)2k maps resized to 1024 px wide, packed and encoded as KTX2. Used as an illustrative bootprint patch for the fictional crew (labelled).
Poly Haven texture "Moon Track 04" (`public/assets/v3/decals/rover-track-*`)Greg Zaal, Rico Cilliers, Jenelle van Heerdenhttps://polyhaven.com/a/moon_track_04CC0 1.0 (Poly Haven, https://polyhaven.com/license)2k maps resized to 512 px wide, packed and encoded as KTX2. Used as an illustrative rover-track strip (labelled) until S5 pass 2; since then the scene draws both wheel tracks with own-work procedural textures (`src/lunar/surface.js`) and this file is no longer loaded.
Poly Haven model "Moon Rock 04" (`public/assets/v3/models/moon-rock-04.glb`)Greg Zaal, Rico Cilliers, Jenelle van Heerdenhttps://polyhaven.com/a/moon_rock_04CC0 1.0 (Poly Haven, https://polyhaven.com/license)1k glTF wrapped in a root node, textures resized to 512 px and encoded as KTX2, meshopt-compressed by `scripts/build-v3-models.mjs`.
Poly Haven model "Moon Rock 05" (`public/assets/v3/models/moon-rock-05.glb`)Greg Zaal, Rico Cilliers, Jenelle van Heerdenhttps://polyhaven.com/a/moon_rock_05CC0 1.0 (Poly Haven, https://polyhaven.com/license)As row 22.
Poly Haven model "Moon Rock 06" (`public/assets/v3/models/moon-rock-06.glb`)Greg Zaal, Jenelle van Heerden, Rico Cilliershttps://polyhaven.com/a/moon_rock_06CC0 1.0 (Poly Haven, https://polyhaven.com/license)As row 22.
Poly Haven model "Moon Rock 07" (`public/assets/v3/models/moon-rock-07.glb`, `public/assets/v3/models/genesis-rock-reconstructed.glb`)Greg Zaal, Rico Cilliers, Jenelle van Heerdenhttps://polyhaven.com/a/moon_rock_07CC0 1.0 (Poly Haven, https://polyhaven.com/license)As row 22. The Genesis Rock copy is scaled to 7.5 cm and its colour map turned white-grey (anorthosite tone); labelled reconstructed, not the real shape of sample 15415.
Blue Marble: land surface, shallow water and shaded topography, 2048 px (`public/assets/v3/sky/earth-day-2048.ktx2`)NASA Goddard Space Flight Center (Visible Earth)https://eoimages.gsfc.nasa.gov/images/imagerecords/57000/57752/land_shallow_topo_2048.jpgPublic domain (NASA media usage guidelines: https://www.nasa.gov/nasa-brand-center/images-and-media/; credit requested)Encoded as KTX2 (ETC1S sRGB) for the Earth close-up.
Blue Marble: clouds, 2048 px (`public/assets/v3/sky/earth-clouds-2048.ktx2`)NASA Goddard Space Flight Center (Visible Earth)https://eoimages.gsfc.nasa.gov/images/imagerecords/57000/57747/cloud_combined_2048.jpgPublic domain (NASA media usage guidelines; credit requested)Converted to grey and encoded as single-channel KTX2 for the moving cloud layer (time-lapse).
Yale Bright Star Catalogue, 5th revised ed. (preliminary), HEASARC table BSC5P (`public/assets/v3/sky/stars-bsc5p.bin`)D. Hoffleit and W. H. Warren Jr. (Yale University Observatory); table by NASA HEASARChttps://heasarc.gsfc.nasa.gov/W3Browse/star-catalog/bsc5p.htmlPublic domain (U.S. Government work; https://data.nasa.gov/dataset/bright-star-catalog lists https://www.usa.gov/government-works)9,000+ stars converted to J2000 unit vectors, V magnitude and B-V colour, packed as int16 (`scripts/build-v3-textures.mjs`).
ALSEP instrument set and sample bag (`public/assets/v3/models/alsep-set.glb`) with procedural foil, paint, Teflon and corner-cube texturesThis project (original work)—MIT (code) / CC BY 4.0 (content)Modelled in code by `scripts/build-v3-models.mjs` from the published dimensions in research/apollo15-facts.md (v3 S4 table); simplified geometry, sizes partly approximate. No third-party model files.
Colour grade LUT "hadley-ektachrome-33" (`public/assets/v3/grade/hadley-ektachrome-33.png`, source `design/grade/hadley-ektachrome-33.cube`)This project (original work)—MIT (code) / CC BY 4.0 (content)Generated by `scripts/build-v3-textures.mjs` (33^3 grade: gentle S-curve, warm highlights, cool shadows).
Jost (Latin 600 WOFF2, `src/styles/fonts/jost-latin-600-normal.woff2`)The Jost Project Authorshttps://github.com/indestructible-type/JostSIL OFL 1.1 (`src/styles/fonts/LICENSE-Jost.txt`)Unmodified Latin subset (copied from the S0 font pack `repos/immersive/_direction/_fonts/jost`). v3 display face: title screen, chapter cards, in-world labels (S0 pair A).
Inter (Latin 400/600 WOFF2, `src/v3/fonts/`)The Inter Project Authorshttps://github.com/rsms/interSIL OFL 1.1 (`src/v3/fonts/LICENSE-Inter.txt`)Unmodified; shipped by the shared v3 template as its fallback face. The lunar case sets IBM Plex Sans as the body face, so Inter downloads only if Plex fails.
Posters (`public/poster-3.0.1.webp`, `.jpg`)This project (original work)—CC BY 4.0 (with the rest of the content)Headed-GPU screenshot of the v3 orbit view (overlay hidden), 1200 × 630; the Moon imagery in it is the NASA public-domain data credited above. Replaces the v2 posters.

The Object Detective

AssetAuthorSourceLicenseChanges
3D scan: Morse-Vail Telegraph Key (NMAH, EM.181411)Smithsonian National Museum of American History (3D: Smithsonian Digitization Program Office)https://3d-api.si.edu/voyager/3d_package:ed99f44d-3c60-4111-b666-e2908e1b64efCC0 1.0Unmodified std Draco GLB (2048 px) and 150k-4096 GLB, renamed with a content hash
3D scan: Davenport electric motor, US patent #132 (NMAH, EM.252644)Smithsonian National Museum of American History (3D: Smithsonian Digitization Program Office)https://3d-api.si.edu/voyager/3d_package:a18922b9-a00f-4c9e-988a-f526382b15ccCC0 1.0Unmodified std Draco GLB (2048 px), renamed with a content hash
3D scan: Henry trough battery (NMAH, EM.181178)Smithsonian National Museum of American History (3D: Smithsonian Digitization Program Office)https://3d-api.si.edu/voyager/3d_package:1f7d20f0-6b3f-4780-b754-91c2f9f91602CC0 1.0Unmodified std Draco GLB (2048 px) and 150k-4096 GLB, renamed with a content hash
3D scan: Chester telegraph relay (NMAH, EM.335588)Smithsonian National Museum of American History (3D: Smithsonian Digitization Program Office)https://3d-api.si.edu/voyager/3d_package:d44e9327-834b-47b7-aad6-6c416c9e1cbbCC0 1.0Unmodified std Draco GLB (2048 px) and 150k-4096 GLB, renamed with a content hash
3D scan: Page induction coil patent model, US #76654 (NMAH, EM.309254)Smithsonian National Museum of American History (3D: Smithsonian Digitization Program Office)https://3d-api.si.edu/voyager/3d_package:40cf5b52-0b21-4063-95fc-aa07998eb4ddCC0 1.0Unmodified std Draco GLB (2048 px) and 150k-4096 GLB, renamed with a content hash
3D scan: Western Electric tangent galvanometer (NMAH, EM.332099)Smithsonian National Museum of American History (3D: Smithsonian Digitization Program Office)https://3d-api.si.edu/voyager/3d_package:b8360103-172b-4ab2-a6ac-ab7ee9786876CC0 1.0Unmodified std Draco GLB (2048 px), renamed with a content hash; used for photos in the transfer task
Object record metadata (6 records above)Smithsonian Institutionhttps://api.si.edu/openaccess/api/v1.0/ (Open Access API)CC0 1.0Excerpts quoted verbatim in content/objects.json and case archives
HDRI: Brown Photostudio 02 (1k)Sergej Majborodahttps://polyhaven.com/a/brown_photostudio_02CC0 1.0None (renamed with a content hash)
Texture: Wood Floor 043 (1K)ambientCG (Lennart Demes)https://ambientcg.com/view?id=WoodFloor043CC0 1.0Colour, NormalGL, Roughness maps resized to 1024 px, re-encoded JPEG
Texture: Plaster 001 (1K)ambientCG (Lennart Demes)https://ambientcg.com/view?id=Plaster001CC0 1.0Colour, NormalGL, Roughness maps resized to 512 px, re-encoded JPEG; tinted in-engine
Texture: Fabric 026 (1K)ambientCG (Lennart Demes)https://ambientcg.com/view?id=Fabric026CC0 1.0Colour, NormalGL, Roughness maps resized to 512 px, re-encoded JPEG; tinted in-engine
3D model: Chandelier 01Kirill Sannikovhttps://polyhaven.com/a/Chandelier_01CC0 1.0GLB re-encoded (resized textures); ceiling light prop
3D model: Vintage Grandfather Clock 01Yann Kervran, James Ray Cockhttps://polyhaven.com/a/vintage_grandfather_clock_01CC0 1.0GLB re-encoded; pendulum animated in-engine
3D model: Wooden Bookshelf WornUlan Cabanillahttps://polyhaven.com/a/wooden_bookshelf_wornCC0 1.0GLB re-encoded; archive corner shelving
3D model: Drawer CabinetUlan Cabanillahttps://polyhaven.com/a/drawer_cabinetCC0 1.0GLB re-encoded; archive corner cabinet
3D model: Desk Lamp Arm 01Yann Kervran, Kuutti Siitonenhttps://polyhaven.com/a/desk_lamp_arm_01CC0 1.0GLB re-encoded; inspection desk lamp (lit)
3D model: Ceramic Vase 01James Ray Cockhttps://polyhaven.com/a/ceramic_vase_01CC0 1.0GLB re-encoded; shelf dressing
3D model: Lantern 01Rajil Jose Macatangayhttps://polyhaven.com/a/Lantern_01CC0 1.0GLB re-encoded; shelf dressing
Font: Libre Baskerville (700) — v3 display face (S0 pair A)Pablo Impallari, Rodrigo Fuenzalida (The Libre Baskerville Project Authors)https://github.com/impallari/Libre-BaskervilleSIL Open Font License 1.1Latin subset WOFF2 from @fontsource/libre-baskerville 5.x, self-hosted (src/styles/fonts)
Font: Source Sans 3 (400, 600) — v3 body and UI face (S0 pair A)Paul D. Hunt (Adobe)https://github.com/adobe-fonts/source-sansSIL Open Font License 1.1Latin subset WOFF2 from @fontsource/source-sans-3 5.x, self-hosted (src/styles/fonts)
Text-mode photo sets (public/assets/photos)Rendered by this project from the CC0 scans abovescripts/render-views.mjsCC0 1.0 (derived from CC0 scans)Renders of the scans in the game's inspection lighting
Draco and Basis decodersGoogle (Draco), Binomial (Basis Universal), via three.js 0.186.1https://github.com/mrdoob/three.js/tree/r186/examples/jsm/libsApache-2.0Copied unmodified into dist/decoders at build time
Gallery architecture, display cases, inspection table, sweep, reference ruler/coin/card models, faviconBuilt for this project (procedural)This repositoryMIT (code) / CC BY 4.0 (content)Original
3D scan: Abraham Lincoln's Patent Model (NMAH, PL.031940) — v3 neighbouring exhibitSmithsonian National Museum of American History (3D: Smithsonian Digitization Program Office)https://3d-api.si.edu/voyager/3d_package:9172faae-dbbe-424a-a9e7-56f4428a06ddCC0 1.0Unmodified std Draco GLB (2048 px), renamed with a content hash (public/assets/v3/exhibits)
3D scan: Refrigerator patent model made by Thomas Elkins (NMAAHC, 2012.113.2) — v3 neighbouring exhibitSmithsonian National Museum of African American History and Culture (3D: Smithsonian Digitization Program Office)https://3d-api.si.edu/voyager/3d_package:b91a2ad6-f8dd-4903-a084-90f5c5c8b9e8CC0 1.0Unmodified std Draco GLB (2048 px), renamed with a content hash (public/assets/v3/exhibits)
3D scan: Stereoscope, A. Mattey, Paris (NMAAHC, 2017.111.16, gift of Alan Laird) — v3 neighbouring exhibitSmithsonian National Museum of African American History and Culture (3D: Smithsonian Digitization Program Office)https://3d-api.si.edu/voyager/3d_package:0f4ebbe5-7f32-4792-933c-296f328df4c5CC0 1.0Unmodified std Draco GLB (2048 px), renamed with a content hash (public/assets/v3/exhibits)
Object record metadata (3 v3 neighbouring exhibits above)Smithsonian Institutionhttps://api.si.edu/openaccess/api/v1.0/ (Open Access API)CC0 1.0Facts paraphrased or quoted in content/objects.json (catalog "objects")
Painting image: Susan Walker Morse (The Muse), Samuel F. B. Morse, ca. 1836–37 (Met 45.62.1, Bequest of Herbert L. Pratt, 1945)The Metropolitan Museum of Art (Open Access)https://www.metmuseum.org/art/collection/search/11605CC0 1.0Resized to 1024 and 2048 px (long edge), KTX2 ETC1S with mipmaps (public/assets/v3/paintings)
Painting image: Mathew B. Brady, Charles Loring Elliott, 1857 (Met 96.24, Gift of the Friends of Mathew Brady, 1896)The Metropolitan Museum of Art (Open Access)https://www.metmuseum.org/art/collection/search/10850CC0 1.0Resized to 1024 and 2048 px (long edge), KTX2 ETC1S with mipmaps (public/assets/v3/paintings)
3D model: Ottoman 01 (v3 gallery bench)Caspian Fortunehttps://polyhaven.com/a/Ottoman_01CC0 1.01k glTF re-packed as GLB: meshopt + quantization, textures KTX2 (colour 1024 px ETC1S, normal 512 px UASTC)
3D model: Security Camera 01Alexander Otterbeck, Yann Kervranhttps://polyhaven.com/a/security_camera_01CC0 1.01k glTF re-packed as GLB: meshopt + quantization, textures KTX2 (colour 1024 px ETC1S, normal 512 px UASTC)
3D model: Magnifying Glass 01Nazar Borodavkahttps://polyhaven.com/a/magnifying_glass_01CC0 1.01k glTF re-packed as GLB: meshopt + quantization, textures KTX2 at 512 px
Texture: Wood 051 (1K)ambientCG (Lennart Demes)https://ambientcg.com/view?id=Wood051CC0 1.0Colour and Roughness 1024 px KTX2 ETC1S, NormalGL 512 px KTX2 UASTC (public/assets/v3/textures)
Texture: Marble 012 (1K)ambientCG (Lennart Demes)https://ambientcg.com/view?id=Marble012CC0 1.0Colour and Roughness 1024 px KTX2 ETC1S, NormalGL 512 px KTX2 UASTC
Texture: Cork 002 (1K)ambientCG (Lennart Demes)https://ambientcg.com/view?id=Cork002CC0 1.0Colour, NormalGL, Roughness at 512 px, KTX2
Texture: Metal 048 A (1K)ambientCG (Lennart Demes)https://ambientcg.com/view?id=Metal048ACC0 1.0Colour, NormalGL, Roughness, Metalness at 512 px, KTX2
Texture: Fabric 085 (1K)ambientCG (Lennart Demes)https://ambientcg.com/view?id=Fabric085CC0 1.0Colour, NormalGL, Roughness at 512 px, KTX2; to be tinted in-engine
Texture: Fingerprints 002 (1K)ambientCG (Lennart Demes)https://ambientcg.com/view?id=Fingerprints002CC0 1.0Roughness map only, 1024 px KTX2 (glass smudges)
Texture: Paper 004 (1K)ambientCG (Lennart Demes)https://ambientcg.com/view?id=Paper004CC0 1.0Colour, NormalGL, Roughness at 512 px, KTX2
Textures: exit sign face, night facade across the streetBuilt for this project (scripts/fetch-v3-assets.mjs; exit-sign lettering set in Source Sans 3, SIL OFL 1.1)This repositoryCC BY 4.0 (content)Original, generated with ImageMagick; KTX2 (public/assets/v3/own)
Posters (`public/poster-3.0.1.webp`, `.jpg`)This project (original work)This repositoryCC BY 4.0 (content)Headed-GPU screenshot of the v3 inspection table (overlay hidden), 1200 × 630; the object in it is the Smithsonian CC0 scan credited above. Replaces the v2 posters.

Hazard Hunt

AssetAuthorSourceLicenseChanges
Empty Warehouse 01 (HDRI, 1k .hdr)Sergej Majborodahttps://polyhaven.com/a/empty_warehouse_01CC0 1.0None. Used for image-based lighting and reflections only (not shown as a background). File renamed with a content hash. Licence re-checked for v3 on 2026-10-30.
Concrete Floor Worn 001 (1k JPG: color, normal GL, roughness)Dimitrios Savva, Rico Cilliershttps://polyhaven.com/a/concrete_floor_worn_001CC0 1.0None to pixels. Tiled across the floor; files renamed with content hashes. v3 (2026-10-30): 2k colour and ARM maps and a 1k normal map re-encoded to KTX2 in `public/assets/v3/tex/`.
Blue Metal Plate (1k JPG: normal GL, roughness)Rob Tuytelhttps://polyhaven.com/a/blue_metal_plateCC0 1.0Only the normal and roughness maps are used, on the painted rack uprights; the color map was not kept. Files renamed with content hashes. v3 (2026-10-30): normal and ARM maps re-encoded to KTX2 in `public/assets/v3/tex/`, and embedded at 256 px in the own-work props as the painted-steel surface.
Wood Planks Grey (1k JPG: color, normal GL, roughness)Rob Tuytelhttps://polyhaven.com/a/wood_planks_greyCC0 1.0None to pixels. Used on pallets; files renamed with content hashes.
Wet Floor Sign 01 (`WetFloorSign_01-d4a94c3c.glb`)Fran Calventehttps://polyhaven.com/a/WetFloorSign_01CC0 1.0Converted to self-contained GLB with resized JPEG textures for warehouse environment dressing. v3 (2026-10-30): re-processed from the same Poly Haven source into `public/assets/v3/models/` (meshopt + quantization, KTX2 textures) by `scripts/process-assets.mjs`.
Cardboard Box 01 (`cardboard_box_01-34708497.glb`)Rahul Chaudharyhttps://polyhaven.com/a/cardboard_box_01CC0 1.0Converted to self-contained GLB with resized JPEG textures for warehouse environment dressing. v3 (2026-10-30): re-processed from the same Poly Haven source into `public/assets/v3/models/` (meshopt + quantization, KTX2 textures) by `scripts/process-assets.mjs`.
Barrel 01 (`Barrel_01-9611019b.glb`)Jorge Camachohttps://polyhaven.com/a/Barrel_01CC0 1.0Converted to self-contained GLB with resized JPEG textures for warehouse environment dressing. v3 (2026-10-30): re-processed from the same Poly Haven source into `public/assets/v3/models/` (meshopt + quantization, KTX2 textures) by `scripts/process-assets.mjs`.
Wooden Crate 01 (`wooden_crate_01-1d3c029f.glb`)James Ray Cockhttps://polyhaven.com/a/wooden_crate_01CC0 1.0Converted to self-contained GLB with resized JPEG textures for warehouse environment dressing. v3 (2026-10-30): re-processed from the same Poly Haven source into `public/assets/v3/models/` (meshopt + quantization, KTX2 textures) by `scripts/process-assets.mjs`.
Korean Fire Extinguisher 01 (`korean_fire_extinguisher_01-79e1e9ff.glb`)UM JOORINhttps://polyhaven.com/a/korean_fire_extinguisher_01CC0 1.0Converted to self-contained GLB with resized JPEG textures for warehouse environment dressing. v3 (2026-10-30): re-processed from the same Poly Haven source into `public/assets/v3/models/` (meshopt + quantization, KTX2 textures) by `scripts/process-assets.mjs`.
Hanging Industrial Lamp (`hanging_industrial_lamp-c4f36443.glb`)Kuutti Siitonenhttps://polyhaven.com/a/hanging_industrial_lampCC0 1.0Converted to self-contained GLB with resized JPEG textures for high-bay overhead lighting. v3 (2026-10-30): re-processed from the same Poly Haven source into `public/assets/v3/models/` (meshopt + quantization, KTX2 textures) by `scripts/process-assets.mjs`.
Tool Cart (`tool_cart-4bc2c4e8.glb`)Savva Zakharovhttps://polyhaven.com/a/tool_cartCC0 1.0Converted to self-contained GLB with resized JPEG textures for maintenance bay dressing. v3 (2026-10-30): re-processed from the same Poly Haven source into `public/assets/v3/models/` (meshopt + quantization, KTX2 textures) by `scripts/process-assets.mjs`.
Ladder Sectioned 01 (`ladder_sectioned_01-87f86eeb.glb`)MPhttps://polyhaven.com/a/ladder_sectioned_01CC0 1.0Converted to self-contained GLB with resized JPEG textures for warehouse environment dressing. v3 (2026-10-30): re-processed from the same Poly Haven source into `public/assets/v3/models/` (meshopt + quantization, KTX2 textures) by `scripts/process-assets.mjs`.
Big Shoulders Stencil Display (Latin 700 WOFF2, via `@fontsource/big-shoulders-stencil-display`)Patric King, XO Type Cohttps://github.com/xotypeco/big_shouldersSIL OFL 1.1Self-hosted Latin WOFF2 subset for display headings.
Barlow (Latin 400/600/700 WOFF2, via `@fontsource/barlow`)Jeremy Tribbyhttps://github.com/jpt/barlowSIL OFL 1.1Self-hosted Latin WOFF2 subset for body copy and controls.
Share Tech Mono (Latin 400 WOFF2, via `@fontsource/share-tech-mono`)Carrois Apostrophehttps://fonts.google.com/specimen/Share+Tech+MonoSIL OFL 1.1Self-hosted Latin WOFF2 subset for in-world telemetry, tags, and tooltips.
Medical Box (`assets/v3/models/medical_box-*.glb`)Ulan Cabanillahttps://polyhaven.com/a/medical_boxCC0 1.0v3 (S4). First-aid kit on the safety wall. 1k glTF from Poly Haven converted by `scripts/process-assets.mjs` (meshopt + quantization, textures resized to 512 px and encoded to KTX2); file renamed with a content hash.
Hand Truck (`hand_truck-*.glb`)Mutanzom3Dhttps://polyhaven.com/a/hand_truckCC0 1.0v3 (S4). Receiving-area dressing. 1k glTF from Poly Haven converted by `scripts/process-assets.mjs` (meshopt + quantization, textures resized to 512 px and encoded to KTX2); file renamed with a content hash.
Plastic Crate 03 (`plastic_crate_03-*.glb`)Pacific Penguinhttps://polyhaven.com/a/plastic_crate_03CC0 1.0v3 (S4). Tote crates on the conveyor and packing bench. 1k glTF from Poly Haven converted by `scripts/process-assets.mjs` (meshopt + quantization, textures resized to 512 px and encoded to KTX2); file renamed with a content hash.
Wall Clock (`wall_clock-*.glb`)PierreB3Dhttps://polyhaven.com/a/wall_clockCC0 1.0v3 (S4). Clock over the supervisor desk. 1k glTF from Poly Haven converted by `scripts/process-assets.mjs` (meshopt + quantization, textures resized to 512 px and encoded to KTX2); file renamed with a content hash.
Power Box 01 (`power_box_01-*.glb`)Rico Cilliers, Yann Kervranhttps://polyhaven.com/a/power_box_01CC0 1.0v3 (S4). Isolator box beside the battery charger. 1k glTF from Poly Haven converted by `scripts/process-assets.mjs` (meshopt + quantization, textures resized to 512 px and encoded to KTX2); file renamed with a content hash.
Utility Box 01 (`utility_box_01-*.glb`)James Ray Cockhttps://polyhaven.com/a/utility_box_01CC0 1.0v3 (S4). Electrical cabinet in the charging area. 1k glTF from Poly Haven converted by `scripts/process-assets.mjs` (meshopt + quantization, textures resized to 512 px and encoded to KTX2); file renamed with a content hash.
Metal Office Desk (`metal_office_desk-*.glb`)Ulan Cabanillahttps://polyhaven.com/a/metal_office_deskCC0 1.0v3 (S4). Shift supervisor desk. 1k glTF from Poly Haven converted by `scripts/process-assets.mjs` (meshopt + quantization, textures resized to 512 px and encoded to KTX2); file renamed with a content hash.
Metal Stool 01 (`metal_stool_01-*.glb`)Ulan Cabanillahttps://polyhaven.com/a/metal_stool_01CC0 1.0v3 (S4). Stool at the packing bench. 1k glTF from Poly Haven converted by `scripts/process-assets.mjs` (meshopt + quantization, textures resized to 512 px and encoded to KTX2); file renamed with a content hash.
Security Light (`security_light-*.glb`)Maximilian Schusterhttps://polyhaven.com/a/security_lightCC0 1.0v3 (S4). Floodlight over the dock apron. 1k glTF from Poly Haven converted by `scripts/process-assets.mjs` (meshopt + quantization, textures resized to 512 px and encoded to KTX2); file renamed with a content hash.
Industrial Wall Lamp (`industrial_wall_lamp-*.glb`)Kuutti Siitonenhttps://polyhaven.com/a/industrial_wall_lampCC0 1.0v3 (S4). Perimeter wall lights. 1k glTF from Poly Haven converted by `scripts/process-assets.mjs` (meshopt + quantization, textures resized to 512 px and encoded to KTX2); file renamed with a content hash.
Mounted Fluorescent Lights (`mounted_fluorescent_lights-*.glb`)Ulan Cabanillahttps://polyhaven.com/a/mounted_fluorescent_lightsCC0 1.0v3 (S4). Ceiling light over the supervisor desk. 1k glTF from Poly Haven converted by `scripts/process-assets.mjs` (meshopt + quantization, textures resized to 512 px and encoded to KTX2); file renamed with a content hash.
Metal Toolbox (`metal_toolbox-*.glb`)Mateusz Sadekhttps://polyhaven.com/a/metal_toolboxCC0 1.0v3 (S4). Maintenance dressing. 1k glTF from Poly Haven converted by `scripts/process-assets.mjs` (meshopt + quantization, textures resized to 512 px and encoded to KTX2); file renamed with a content hash.
Worn Metal Rack (`worn_metal_rack-*.glb`)Luca Bhttps://polyhaven.com/a/worn_metal_rackCC0 1.0v3 (S4). Shelving at the PPE station. 1k glTF from Poly Haven converted by `scripts/process-assets.mjs` (meshopt + quantization, textures resized to 512 px and encoded to KTX2); file renamed with a content hash.
Plastic Bottle Gallon (`plastic_bottle_gallon-*.glb`)Rahul Chaudharyhttps://polyhaven.com/a/plastic_bottle_gallonCC0 1.0v3 (S4). Spill-kit and eyewash refill dressing. 1k glTF from Poly Haven converted by `scripts/process-assets.mjs` (meshopt + quantization, textures resized to 512 px and encoded to KTX2); file renamed with a content hash.
Concrete Block Wall (1k: colour, normal GL, ARM)Charlotte Baglionihttps://polyhaven.com/a/concrete_block_wallCC0 1.0v3 (S4). Lower perimeter walls; normal map also used faintly on the PPE board. Encoded to KTX2 (normal maps at 512 px) in `public/assets/v3/tex/`; resized copies are embedded in the own-work props that use them.
Corrugated Iron 02 (1k: colour, normal GL, ARM)Jenelle van Heerden, Sergej Majborodahttps://polyhaven.com/a/corrugated_iron_02CC0 1.0v3 (S4). Upper wall cladding. Encoded to KTX2 (normal maps at 512 px) in `public/assets/v3/tex/`; resized copies are embedded in the own-work props that use them.
Box Profile Metal Sheet (1k: colour, normal GL, ARM)Amal Kumarhttps://polyhaven.com/a/box_profile_metal_sheetCC0 1.0v3 (S4). Roof sheeting. Encoded to KTX2 (normal maps at 512 px) in `public/assets/v3/tex/`; resized copies are embedded in the own-work props that use them.
Metal Plate (1k: colour, normal GL, ARM)Rob Tuytelhttps://polyhaven.com/a/metal_plateCC0 1.0v3 (S4). Tread plate on the dock leveller, forklift floor plate and reach-truck step; normal map on bare steel. Encoded to KTX2 (normal maps at 512 px) in `public/assets/v3/tex/`; resized copies are embedded in the own-work props that use them.
Raw Plank Wall (1k: colour, normal GL, ARM)Dimitrios Savvahttps://polyhaven.com/a/raw_plank_wallCC0 1.0v3 (S4). Pallet boards, packing-bench top and trailer floor. Encoded to KTX2 (normal maps at 512 px) in `public/assets/v3/tex/`; resized copies are embedded in the own-work props that use them.
Painted Metal Shutter (1k: normal GL, ARM; colour map also shipped)Dario Barresi, Rico Cilliers, Charlotte Baglionihttps://polyhaven.com/a/painted_metal_shutterCC0 1.0v3 (S4). Trailer body panels. Encoded to KTX2 (normal maps at 512 px) in `public/assets/v3/tex/`; resized copies are embedded in the own-work props that use them.
MakeHuman system assets (skins, eyes, eyebrows, eyelashes, hair, clothes, shoes; the exact list is in `scripts/assets/third-party.json`)MakeHuman Community (makehuman_system asset repo)https://static.makehumancommunity.org/assets/assetpacks/makehuman_system_assets.htmlCC0 1.0v3 (S4). Fitted to the five characters in `public/assets/v3/characters/` with MPFB in Blender; textures resized to 1024 px or less and encoded to KTX2. Each used asset's CC0 status was checked in the pack metadata and in the file header by `scripts/fetch-assets.mjs`.
MPFB 2.0.18 bundled assets (base mesh, macro targets, `game_engine` rig)MakeHuman Communityhttps://github.com/makehumancommunity/mpfb2/blob/master/LICENSE.mdCC0 1.0v3 (S4). Body shapes for the five characters. The MPFB add-on code (GPL-3.0-or-later, https://extensions.blender.org/add-ons/mpfb/) is a build tool only; nothing from it ships, and its licence states that MPFB output is not covered by the code licence.
Barlow Condensed Bold (TTF, baked into sign and label textures)Jeremy Tribbyhttps://github.com/google/fonts/tree/main/ofl/barlowcondensedSIL OFL 1.1v3 (S4). Rendered into the PNG/KTX2 sign textures by `scripts/make-decals.mjs`; the font file itself is not shipped.
Inter (variable TTF, baked into sign and label textures)Rasmus Anderssonhttps://github.com/google/fonts/tree/main/ofl/interSIL OFL 1.1v3 (S4). Small print on signs and carton labels, rendered by `scripts/make-decals.mjs`; the font file itself is not shipped.
three.js 0.186.1three.js authorshttps://github.com/mrdoob/three.jsMITNone. Bundled by Vite.

Field Ecologist: Sampling the Meadow

AssetAuthorSourceLicenseChanges
Fraunces (Latin 600/700 WOFF2, `src/styles/fonts/`)Undercase Type (Phaedra Charles, Flavia Zimbardi)https://github.com/undercasetype/FrauncesSIL OFL 1.1Self-hosted Latin WOFF2 subset (via @fontsource); display headings
Nunito Sans (Latin 400/600/700 WOFF2, `src/styles/fonts/`)Vernon Adams, Jacques Le Bailly, Manvel Shmavonyan, Alexei Vanyashinhttps://github.com/googlefonts/NunitoSansSIL OFL 1.1Self-hosted Latin WOFF2 subset (via @fontsource); body copy, instructions and controls
Caveat (Latin 600 WOFF2, `src/styles/fonts/`)Impallari Typehttps://github.com/googlefonts/caveatSIL OFL 1.1Self-hosted Latin WOFF2 subset (via @fontsource); in-world field-notebook accents (tooltips, notebook labels) only
Draco decoder + Basis/KTX2 transcoder (`dist/decoders/`, served by `vite-plugin-decoders.js` from the pinned three package)Google / Binomial LLCvia three.js `examples/jsm/libs` (Apache-2.0)Apache-2.0Unmodified copies, self-hosted so no CDN requests
v3: Wooden Table 02 (`public/assets/v3/models/station-table-cd1ca3ec.glb`)Serhii Khromovhttps://polyhaven.com/a/wooden_table_02CC0 1.01k glTF -> GLB; textures resized to 512 px and KTX2-encoded; meshopt + quantization; Field station table by the south gate
v3: Clipboard (`public/assets/v3/models/clipboard-66cb1fb3.glb`)ProgrammerOnCoffeehttps://polyhaven.com/a/clipboardCC0 1.01k glTF -> GLB; textures resized to 512 px and KTX2-encoded; meshopt + quantization; The learner's clipboard; the data sheet texture is drawn over it at run time
v3: Magnifying Glass 01 (`public/assets/v3/models/hand-lens-8707a7a7.glb`)Nazar Borodavkahttps://polyhaven.com/a/magnifying_glass_01CC0 1.01k glTF -> GLB; textures resized to 512 px and KTX2-encoded; meshopt + quantization; Hand lens on the station table; opens the close-up mode
v3: Binder Notebook (`public/assets/v3/models/field-guide-be1aafd6.glb`)DaDroodhttps://polyhaven.com/a/binder_notebookCC0 1.01k glTF -> GLB; simplified 18077 -> 8998 triangles (meshoptimizer); textures resized to 512 px and KTX2-encoded; meshopt + quantization; Field guide on the station table
v3: Plastic Thermos (`public/assets/v3/models/flask-69e13b4d.glb`)PierreB3Dhttps://polyhaven.com/a/plastic_thermosCC0 1.01k glTF -> GLB; textures resized to 256 px and KTX2-encoded; meshopt + quantization; Flask on the station table
v3: Folding Wooden Stool (`public/assets/v3/models/stool-391de913.glb`)Ulan Cabanillahttps://polyhaven.com/a/folding_wooden_stoolCC0 1.01k glTF -> GLB; textures resized to 512 px and KTX2-encoded; meshopt + quantization; Folding stool beside the table
v3: Stationery Supplies (`public/assets/v3/models/pencils-bf4e078c.glb`)Mateusz Sadekhttps://polyhaven.com/a/stationery_suppliesCC0 1.01k glTF -> GLB; textures resized to 256 px and KTX2-encoded; meshopt + quantization; Pencils and eraser on the station table
v3: Boulder 01 (`public/assets/v3/models/boulder-4141703d.glb`)Rico Cilliershttps://polyhaven.com/a/boulder_01CC0 1.01k glTF -> GLB; simplified 66122 -> 7996 triangles (meshoptimizer); textures resized to 512 px and KTX2-encoded; meshopt + quantization; Boulders (about 1.8 m, real scan size) at the field corners, outside the sampling area
v3: Fern 02 (`public/assets/v3/models/fern-50759382.glb`)Rob Tuytel, Rico Cilliershttps://polyhaven.com/a/fern_02CC0 1.01k glTF -> GLB; textures resized to 512 px and KTX2-encoded; meshopt + quantization; Ferns on the stream banks beyond the field
v3: Flower Gazania (`public/assets/v3/models/margin-gazania-05d8859b.glb`)James Ray Cock, Jenelle van Heerdenhttps://polyhaven.com/a/flower_gazaniaCC0 1.01k glTF -> GLB; simplified 14340 -> 11993 triangles (meshoptimizer); textures resized to 512 px and KTX2-encoded; meshopt + quantization; Orange margin flowers in front of the wall, outside the field
v3: Celandine 01 (`public/assets/v3/models/margin-celandine-dd470fb4.glb`)Rob Tuytel, Rico Cilliershttps://polyhaven.com/a/celandine_01CC0 1.01k glTF -> GLB; textures resized to 512 px and KTX2-encoded; meshopt + quantization; Low celandine clusters at the hedge foot, outside the field
v3: Periwinkle Plant (`public/assets/v3/models/margin-periwinkle-c50c6f30.glb`)Amal Kumarhttps://polyhaven.com/a/periwinkle_plantCC0 1.01k glTF -> GLB; simplified 34350 -> 11993 triangles (meshoptimizer); textures resized to 512 px and KTX2-encoded; meshopt + quantization; Pink periwinkle clusters along the margins, outside the field
v3: Dead Tree Trunk (`public/assets/v3/models/fallen-log-5f990f7e.glb`)Rob Tuytelhttps://polyhaven.com/a/dead_tree_trunkCC0 1.01k glTF -> GLB; simplified 101802 -> 11998 triangles (meshoptimizer); textures resized to 512 px and KTX2-encoded; meshopt + quantization; Fallen log beyond the east boundary
v3: Nettle Plant (`public/assets/v3/models/hedge-nettle-d0edd600.glb`)Rob Tuytel, Rico Cilliershttps://polyhaven.com/a/nettle_plantCC0 1.01k glTF -> GLB; simplified 31304 -> 11995 triangles (meshoptimizer); textures resized to 512 px and KTX2-encoded; meshopt + quantization; Nettles at the hedge foot, outside the field
v3: Shrub 04 (`public/assets/v3/models/hedge-undergrowth-e7d1d89a.glb`)Rico Cilliershttps://polyhaven.com/a/shrub_04CC0 1.01k glTF -> GLB; simplified 27327 -> 11968 triangles (meshoptimizer); textures resized to 512 px and KTX2-encoded; meshopt + quantization; Undergrowth at the hedge foot, outside the field
v3: Tree Stump 01 (`public/assets/v3/models/woodland-stump-c0b78cbf.glb`)Rob Tuytelhttps://polyhaven.com/a/tree_stump_01CC0 1.01k glTF -> GLB; simplified 41046 -> 10000 triangles (meshoptimizer); textures resized to 512 px and KTX2-encoded; meshopt + quantization; Tree stump at the woodland edge
v3: Dry Branches Medium 01 (`public/assets/v3/models/woodland-branches-5c37b91a.glb`)Rico Cilliershttps://polyhaven.com/a/dry_branches_medium_01CC0 1.01k glTF -> GLB; simplified 16803 -> 7995 triangles (meshoptimizer); textures resized to 512 px and KTX2-encoded; meshopt + quantization; Fallen branches on the woodland floor
v3: Lilienstein (`public/assets/v3/hdri/sky-lilienstein-1k-07edff9b.hdr`)Andreas Mischokhttps://polyhaven.com/a/liliensteinCC0 1.0Unmodified 1k HDR (renamed copy); Early-morning sky and image-based lighting on Low/Medium (Takram atmosphere replaces the visible sky on High/Ultra)
v3: Grass 004 (`public/assets/v3/textures/ground-dry-color-58911e7f.ktx2, ground-dry-normal-cd7c06ad.ktx2, ground-dry-rough-ae63196f.ktx2`)ambientCGhttps://ambientcg.com/a/Grass004CC0 1.01K JPG maps -> KTX2 (color 1024 px ETC1S, normal 512 px UASTC, rough 512 px ETC1S); Dry-rise sward (paler, firmer ground away from the stream)
v3: Grass 003 (`public/assets/v3/textures/ground-wet-color-cb29bb02.ktx2, ground-wet-normal-13fb2187.ktx2, ground-wet-rough-248dbb8f.ktx2`)ambientCGhttps://ambientcg.com/a/Grass003CC0 1.01K JPG maps -> KTX2 (color 1024 px ETC1S, normal 512 px UASTC, rough 512 px ETC1S); Streamside sward (darker, lusher ground)
v3: Rock 064 (`public/assets/v3/textures/wall-stone-color-c0013543.ktx2, wall-stone-normal-d60b1afc.ktx2, wall-stone-rough-05af37d6.ktx2`)ambientCGhttps://ambientcg.com/a/Rock064CC0 1.01K JPG maps -> KTX2 (color 512 px ETC1S, normal 512 px UASTC, rough 256 px ETC1S); Mossy stones of the dry-stone wall
v3: Foliage 001 (`public/assets/v3/textures/grass-blades-color-99a31e5f.ktx2`)ambientCGhttps://ambientcg.com/a/Foliage001CC0 1.01K JPG maps -> KTX2 (color 1024 px ETC1S); opacity merged into the colour alpha; Grass-blade cards for the wind-blown sward outside the field
v3: Ground 036 (`public/assets/v3/textures/stream-mud-color-01123f8a.ktx2, stream-mud-normal-134d6898.ktx2, stream-mud-rough-7ba784f5.ktx2`)ambientCGhttps://ambientcg.com/a/Ground036CC0 1.01K JPG maps -> KTX2 (color 512 px ETC1S, normal 512 px UASTC, rough 256 px ETC1S); Muddy stream banks seen up close
v3: Ground 048 (`public/assets/v3/textures/soil-color-d90361de.ktx2, soil-normal-a7ec5f89.ktx2, soil-rough-66022137.ktx2`)ambientCGhttps://ambientcg.com/a/Ground048CC0 1.01K JPG maps -> KTX2 (color 512 px ETC1S, normal 512 px UASTC, rough 256 px ETC1S); Topsoil in the cut stream bank
v3: ambientCG Bark012 (baked into `public/assets/v3/models/woodland-trees-7ce6d68b.glb`)ambientCGhttps://ambientcg.com/a/Bark012CC0 1.0Colour 512 px ETC1S + NormalGL 256 px UASTC, embedded as the bark material
v3: ambientCG LeafSet024 (baked into `public/assets/v3/models/woodland-trees-7ce6d68b.glb`)ambientCGhttps://ambientcg.com/a/LeafSet024CC0 1.0Leaves cut from the atlas and composited (320 per card, recoloured, with drawn twigs) into a 512 px leaf-cluster card, ETC1S + alpha
v3: woodland-trees (`public/assets/v3/models/woodland-trees-7ce6d68b.glb`)Field Ecologist project (own procedural work)https://github.com/iwyusdaz/field-ecologist/blob/v3/scripts/build-v3-own-assets.mjsOwn work (MIT)Generated by scripts/build-v3-own-assets.mjs; Three broadleaf forms (tall tree, small tree, hedge shrub), each LOD0 (<= 8k triangles) + LOD1 (<= 150 triangles), same pivot at the trunk base; impostors are baked from LOD0 at run time
v3: survey-stake (`public/assets/v3/models/survey-stake-ab589cf5.glb`)Field Ecologist project (own procedural work)https://github.com/iwyusdaz/field-ecologist/blob/v3/scripts/build-v3-own-assets.mjsOwn work (MIT)Generated by scripts/build-v3-own-assets.mjs; Numbered survey stake with flagging tape; the number plate takes a run-time canvas texture
v3: cloud-sprites (`public/assets/v3/sprites/cloud-sprites-9b47bd89.ktx2`)Field Ecologist project (own procedural work)https://github.com/iwyusdaz/field-ecologist/blob/v3/scripts/build-v3-own-assets.mjsOwn work (MIT)Generated by scripts/build-v3-own-assets.mjs; Four soft cloud billboards (2x2 atlas) for the Medium/High sky fallback
v3: ashcombe-dawn-33 (`public/assets/v3/lut/ashcombe-dawn-33-eea64172.png`, source `assets-src/lut/ashcombe-dawn-33.cube`)Field Ecologist project (own procedural work)https://github.com/iwyusdaz/field-ecologist/blob/v3/scripts/build-v3-own-assets.mjsOwn work (MIT)Generated by scripts/build-v3-own-assets.mjs; Case LUT grade (33^3) in display space after AgX; .cube source in assets-src/lut/, PNG strip shipped
Posters (`public/poster-3.0.1.webp`, `.jpg`)Field Ecologist project (original work)This repositoryCC BY 4.0 (content)Headed-GPU screenshot of the v3 meadow (overlay hidden), 1200 × 630. Replaces the v2 posters.

Glacier Time Machine

AssetAuthorSourceLicenseChanges
Copernicus DEM GLO-30 Public, tiles N58 W136, N58 W137, N59 W136, N59 W137 (30 m digital surface model)Copernicus WorldDEM-30 © DLR e.V. 2010-2014 and © Airbus Defence and Space GmbH 2014-2018 provided under COPERNICUS by the European Union and ESA; all rights reservedhttps://registry.opendata.aws/copernicus-dem/ (bucket s3://copernicus-dem-30m, licence terms: https://dataspace.copernicus.eu/explore-data/data-collections/copernicus-contributing-missions/collections-description/COP-DEM)Copernicus DEM licence (GLO-30: free licence, attribution notice required)"produced using Copernicus WorldDEM-30 © DLR e.V. 2010-2014 and © Airbus Defence and Space GmbH 2014-2018 provided under COPERNICUS by the European Union and ESA; all rights reserved". Mosaicked, cropped to Muir Inlet, reprojected to UTM zone 8N (EPSG:32608), resampled and encoded as a 16-bit PNG heightfield by `scripts/process-dem.sh`. No vertical exaggeration. Raw tiles not committed.
Photograph "Muir and Riggs Glaciers, Muir Inlet, Alaska - 1941" (photo A, August 13, 1941)William O. Field (USGS)https://www.usgs.gov/media/images/muir-and-riggs-glaciers-muir-inlet-alaska-1941Public domain (USGS page: "Public Domain.")Resized and recompressed to a web JPEG by `scripts/process-photos.sh`. No retouching.
Photograph "Muir and Riggs Glaciers, Muir Inlet, Alaska - 1950" (photo B, August 4, 1950)William O. Field (USGS)https://www.usgs.gov/media/images/muir-and-riggs-glaciers-muir-inlet-alaska-1950Public domain (USGS page: "Public Domain.")Resized and recompressed to a web JPEG. No retouching.
Photograph "Muir and Riggs Glaciers, Muir Inlet, Alaska - 2004" (photo C, August 31, 2004)Bruce F. Molnia (USGS)https://www.usgs.gov/media/images/muir-and-riggs-glaciers-muir-inlet-alaska-2004Public domain (USGS page: "Public Domain.")Resized and recompressed to a web JPEG. No retouching.
High-resolution scans "muir1950.jpg" (content: the 1941 Field photograph) and "muir2004.jpg" (before/after pair)W. O. Field (1941; NASA credits the image "courtesy of the National Snow and Ice Data Center and Glacier Bay National Park and Preserve Archive"), B. F. Molnia (2004); published by USGS Office of Communicationshttps://www.usgs.gov/media/before-after/muir-and-riggs-glaciers-retreat-between-1941-2004 (records: https://www.usgs.gov/media/images/muir1950jpg, https://www.usgs.gov/media/images/muir2004jpg)Public domain (USGS pages: "Public Domain.")Downsampled from 17447 px wide to web JPEGs. No retouching.
Photograph "Muir Glacier in Glacier Bay National Monument 1941" (file "Molnia - Fig 17A - Field - 1950.jpg")W. O. Field, via USGS (figure in a Molnia publication)https://www.usgs.gov/media/images/muir-glacier-glacier-bay-national-monument-1941Public domain (USGS page: "Public Domain.")Resized to a web JPEG. Date conflict: the record says August 1, 1941, the file name says 1950 (see research/sources.md).
HDRI "Kloofendal Overcast (Pure Sky)", 1K .hdr (sky background + image-based lighting)Greg Zaal (Poly Haven)https://polyhaven.com/a/kloofendal_overcast_puresky (file https://dl.polyhaven.org/file/ph-assets/HDRIs/hdr/1k/kloofendal_overcast_puresky_1k.hdr, md5 d5c53f6432193893e7dc17eb65e67409 matches the Poly Haven API)CC0 1.0 (https://polyhaven.com/license: "Our assets are all licensed as CC0")None (used as downloaded). A South African sky, not an Alaskan one: used for neutral overcast lighting only.
Favicon (glacier tongue between ridges)glacier-time-machine projectOriginal work, this repositoryCC BY 4.0Original.
Sentinel-2 L2A true-colour image (TCI), scene S2B_8VML_20240806_0_L2A, acquired 2024-08-06 (cloud cover 0.13 %) — terrain drapeContains modified Copernicus Sentinel data 2024 (European Union / ESA); L2A processing by ESA, COG hosting by Element 84 / AWS Open Datahttps://registry.opendata.aws/sentinel-2-l2a-cogs/ (file https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/8/V/ML/2024/8/S2B_8VML_20240806_0_L2A/TCI.tif; licence terms: https://sentinels.copernicus.eu/documents/247904/690755/Sentinel_Data_Legal_Notice)Copernicus Sentinel data licence (free, full and open; attribution notice required)"Contains modified Copernicus Sentinel data 2024". Window read anonymously over HTTP (GDAL /vsicurl/) and cropped to the DEM footprint, averaged from 10 m to 20 m, re-encoded as a web JPEG by `scripts/fetch-sentinel2.sh`. No colour retouching. Raw window not committed.
Font Playfair Display (600, 700; Latin subset WOFF2)Claus Eggers Sørensen (via Fontsource `@fontsource/playfair-display`)https://github.com/clauseggers/Playfair (package https://fontsource.org/fonts/playfair-display)SIL OFL 1.1Latin subset WOFF2 files as published by Fontsource; self-hosted.
Font Inter (400, 600; Latin subset WOFF2)Rasmus Andersson (via Fontsource `@fontsource/inter`)https://github.com/rsms/inter (package https://fontsource.org/fonts/inter)SIL OFL 1.1Latin subset WOFF2 files as published by Fontsource; self-hosted. v3: the template's default face (`src/v3/fonts/`), declared in `src/v3/type.css` but replaced by Atkinson Hyperlegible (row 12) for all text.
Font Atkinson Hyperlegible (400, 700; Latin subset WOFF2)Braille Institute of America (via Fontsource `@fontsource/atkinson-hyperlegible`)https://www.brailleinstitute.org/freefont (package https://fontsource.org/fonts/atkinson-hyperlegible)SIL OFL 1.1Latin subset WOFF2 files as published by Fontsource; self-hosted (`src/styles/fonts/`, licence text alongside). v3 body and UI face (owner direction 2026-11-06). Replaces JetBrains Mono, which v3 no longer uses.
3D model Rock 07Jenelle van Heerden (Poly Haven)https://polyhaven.com/a/rock_07CC0 1.0Packed to a single GLB with 512 px JPEG textures by `../_tools/fetch-polyhaven-model.mjs`; meshes merged per material at load.
3D model Rock 09Jenelle van Heerden (Poly Haven)https://polyhaven.com/a/rock_09CC0 1.0Packed to a single GLB with 512 px JPEG textures; merged per material at load.
3D model Boulder 01Rico Cilliers (Poly Haven)https://polyhaven.com/a/boulder_01CC0 1.0Packed to a single GLB with 512 px JPEG textures; merged per material at load.
3D model Wild Rooibos Bush (stands in for low pioneer shrubs such as willow and alder)James Ray Cock, Jenelle van Heerden (Poly Haven)https://polyhaven.com/a/wild_rooibos_bushCC0 1.0Packed to a single GLB with 512 px JPEG textures; instanced. A South African plant used as a generic shrub shape: illustrative, not the real Glacier Bay species.
3D model Dry Branches Medium 01Rico Cilliers (Poly Haven)https://polyhaven.com/a/dry_branches_medium_01CC0 1.0Packed to a single GLB with 512 px JPEG textures; used as driftwood on the newly exposed shore.
Procedural scene dressing: ice surface crevasse normal map, calving-front cliff, icebergs, conifers, cloud layer, birds, 1941/1950 ice tongueglacier-time-machine projectOriginal work, this repository (`src/scenes/muir-dressing.js`)CC BY 4.0Original. Illustrative, not measured: only the ice-front distances at the three dated anchors come from the USGS captions.
Sentinel-2 L2A true-colour image (TCI) at the native 10 m resolution, same scene as row 9 (S2B_8VML_20240806_0_L2A, 2024-08-06) — imagery inside the v3 streamed terrain tiles (`public/tiles/muir/`)Contains modified Copernicus Sentinel data 2024 (European Union / ESA); L2A processing by ESA, COG hosting by Element 84 / AWS Open Datahttps://registry.opendata.aws/sentinel-2-l2a-cogs/ (file https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/8/V/ML/2024/8/S2B_8VML_20240806_0_L2A/TCI.tif; licence link checked by `scripts/fetch-sentinel2-10m.sh` against the STAC collection: https://sentinel.esa.int/documents/247904/690755/Sentinel_Data_Legal_Notice)Copernicus Sentinel data licence (free, full and open; attribution notice required)"Contains modified Copernicus Sentinel data 2024". Window read anonymously at 10 m (no resampling), cropped to the DEM footprint, box-averaged per tile level (10/20/40/80/160 m) and re-encoded as JPEG q84 inside each tile GLB by `scripts/build-terrain-tiles.mjs`. No colour retouching. Raw window not committed.
Streamed terrain tiles (3D Tiles 1.0 tileset, 341 GLB tiles, L0–L4, ~30 m leaf spacing) built from the Copernicus DEM GLO-30 of row 1glacier-time-machine project; elevation data: Copernicus WorldDEM-30 © DLR e.V. 2010-2014 and © Airbus Defence and Space GmbH 2014-2018 provided under COPERNICUS by the European Union and ESA; all rights reservedBuilt by `scripts/build-terrain-tiles.mjs` from `data/work/dem-l0-f32.tif` (row 1 source: https://registry.opendata.aws/copernicus-dem/)Copernicus DEM licence (GLO-30: free licence, attribution notice required); tiling code CC BY 4.0"produced using Copernicus WorldDEM-30 © DLR e.V. 2010-2014 and © Airbus Defence and Space GmbH 2014-2018 provided under COPERNICUS by the European Union and ESA; all rights reserved". Bilinear resampling onto 68 × 92 cell grids, skirts, normals from the 30 m DEM, meshopt compression. True scale, no vertical exaggeration, no detail added below the DEM's 30 m.
Texture Snow Field Aerial (1k diffuse, OpenGL normal, ARM; 80 × 80 m)Rob Tuytel (Poly Haven)https://polyhaven.com/a/snow_field_aerialCC0 1.0 (https://polyhaven.com/license, checked by `scripts/fetch-polyhaven-textures.mjs`)md5 checked against the Poly Haven files API; encoded to KTX2 (ETC1S colour/ARM, UASTC normal) by `scripts/fetch-polyhaven-textures.mjs`. Snowfield and upper-glacier surface detail, illustrative.
Texture Aerial Rocks 02 (1k diffuse, OpenGL normal, ARM; 50 × 50 m)Rob Tuytel (Poly Haven)https://polyhaven.com/a/aerial_rocks_02CC0 1.0 (https://polyhaven.com/license)md5 checked; encoded to KTX2. Distant bedrock and talus detail, illustrative.
Texture Rock Face (1k diffuse, OpenGL normal, ARM; 2.38 × 2.38 m)Greg Zaal, Dario Barresi (Poly Haven)https://polyhaven.com/a/rock_faceCC0 1.0 (https://polyhaven.com/license)md5 checked; encoded to KTX2. Close-up scraped bedrock, illustrative.
Texture Gravel Ground 01 (1k diffuse, OpenGL normal, ARM; 3 × 3 m)Rob Tuytel (Poly Haven)https://polyhaven.com/a/gravel_ground_01CC0 1.0 (https://polyhaven.com/license)md5 checked; encoded to KTX2. Moraine and glacial till detail, illustrative.
Texture Mossy Rock (1k diffuse, OpenGL normal, ARM; 3 × 3 m)Rob Tuytel (Poly Haven)https://polyhaven.com/a/mossy_rockCC0 1.0 (https://polyhaven.com/license)md5 checked; encoded to KTX2. Moss on till (succession stage 1), illustrative.
Procedural textures: crevasse field (diffuse, normal, ARM; 200 m tile), water swell normal map, cloud billboard atlas (4 × 2 sprites)glacier-time-machine projectOriginal work, this repository (`scripts/build-procedural-textures.mjs`, seeded tileable noise; no source image)CC BY 4.0Original. Illustrative surface detail; encoded to KTX2.
Procedural 3D models (GLB): Sitka spruce and western hemlock (LOD0 + LOD1), Sitka alder (LOD0 + LOD1), fireweed, Dryas mat, icebergs (dome, pinnacle, block), brash ice, séracs, sea kayak with paddler, survey flag, photo-station camera and tripodglacier-time-machine projectOriginal work, this repository (`scripts/build-models.mjs`; geometry built in code, no source model)CC BY 4.0Original. Real size (1 unit = 1 m) from `content/objects.json`; shapes illustrative. meshopt-compressed GLB with vertex colours.
Forest and alder placement (`public/data/forest-instances.bin`, 30,177 instances)glacier-time-machine project; derived from Copernicus Sentinel data 2024 (row 9) and the Copernicus DEM (row 1)Original work, this repository (`scripts/build-forest-placement.mjs`)CC BY 4.0 (own work); inputs under the Copernicus Sentinel data and Copernicus DEM licences (attribution notices in rows 1 and 9)"Contains modified Copernicus Sentinel data 2024". Instances placed only where the 2024 image shows vegetation (green-excess test), on DEM slopes and heights that allow trees, in stands near the valley path. Species mix, density and stand shapes are illustrative.
Posters (`public/poster-3.0.1.webp`, `.jpg`)glacier-time-machine projectOriginal work, this repositoryCC BY 4.0Headed-GPU screenshot of the v3 Muir Inlet view (overlay hidden), 1200 × 630; the terrain and imagery in it are the Copernicus data credited above. Replaces the v2 posters.