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
| Asset | Author | Source | License | Changes |
|---|---|---|---|---|
| Michroma 400 (latin subset, woff2) | Vernon Adams | https://fontsource.org/ | OFL-1.1 | none |
| Cormorant Garamond 700 (latin subset, woff2) | Christian Thalmann (The Cormorant Project) | https://fontsource.org/ | OFL-1.1 | none |
| Fraunces 700 (latin subset, woff2) | Undercase Type (Phaedra Charles, Flavia Zimbardi) | https://fontsource.org/ | OFL-1.1 | none |
| Big Shoulders Stencil Display 700 (latin subset, woff2) | Patric King, XO Type Co | https://fontsource.org/ | OFL-1.1 | none |
| Playfair Display 700 (latin subset, woff2) | Claus Eggers Sørensen | https://fontsource.org/ | OFL-1.1 | none |
Project posters are screenshots of each project's own 3D scene; their assets are credited in the project sections below.
Lunar Field Expedition
| Asset | Author | Source | License | Changes |
|---|---|---|---|---|
| LROC NAC DTM "NAC_DTM_APOLLO15" (2 m/px digital terrain model of the Apollo 15 site) | NASA / GSFC / Arizona State University | https://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/4720 | Public 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/4720 | Public 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-12100 | Public 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.jpg | Public 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.1 | three.js authors | https://github.com/mrdoob/three.js | MIT | None; 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 Barresi | https://polyhaven.com/a/moon_rock_01 | CC0 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 Heerden | https://polyhaven.com/a/moon_rock_02 | CC0 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 Heerden | https://polyhaven.com/a/moon_rock_03 | CC0 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 Adams | https://fonts.google.com/specimen/Michroma | SIL OFL 1.1 | Self-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/plex | SIL OFL 1.1 | Self-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/plex | SIL OFL 1.1 | Self-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 University | http://wms.lroc.asu.edu/lroc/view_rdr_product/NAC_DTM_APOLLO15 | Public 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 Astrogeology | https://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_118m | Public 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 Barresi | https://polyhaven.com/a/moon_01 | CC0 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 Heerden | https://polyhaven.com/a/moon_dusted_02 | CC0 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 Barresi | https://polyhaven.com/a/moon_footprints_01 | CC0 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 Heerden | https://polyhaven.com/a/moon_track_04 | CC0 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 Heerden | https://polyhaven.com/a/moon_rock_04 | CC0 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 Heerden | https://polyhaven.com/a/moon_rock_05 | CC0 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 Cilliers | https://polyhaven.com/a/moon_rock_06 | CC0 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 Heerden | https://polyhaven.com/a/moon_rock_07 | CC0 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.jpg | Public 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.jpg | Public 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 HEASARC | https://heasarc.gsfc.nasa.gov/W3Browse/star-catalog/bsc5p.html | Public 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 textures | This 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 Authors | https://github.com/indestructible-type/Jost | SIL 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 Authors | https://github.com/rsms/inter | SIL 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
| Asset | Author | Source | License | Changes |
|---|---|---|---|---|
| 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-e2908e1b64ef | CC0 1.0 | Unmodified 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-f526382b15cc | CC0 1.0 | Unmodified 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-91c2f9f91602 | CC0 1.0 | Unmodified 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-6c416c9e1cbb | CC0 1.0 | Unmodified 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-aa07998eb4dd | CC0 1.0 | Unmodified 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-ab7ee9786876 | CC0 1.0 | Unmodified std Draco GLB (2048 px), renamed with a content hash; used for photos in the transfer task |
| Object record metadata (6 records above) | Smithsonian Institution | https://api.si.edu/openaccess/api/v1.0/ (Open Access API) | CC0 1.0 | Excerpts quoted verbatim in content/objects.json and case archives |
| HDRI: Brown Photostudio 02 (1k) | Sergej Majboroda | https://polyhaven.com/a/brown_photostudio_02 | CC0 1.0 | None (renamed with a content hash) |
| Texture: Wood Floor 043 (1K) | ambientCG (Lennart Demes) | https://ambientcg.com/view?id=WoodFloor043 | CC0 1.0 | Colour, NormalGL, Roughness maps resized to 1024 px, re-encoded JPEG |
| Texture: Plaster 001 (1K) | ambientCG (Lennart Demes) | https://ambientcg.com/view?id=Plaster001 | CC0 1.0 | Colour, 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=Fabric026 | CC0 1.0 | Colour, NormalGL, Roughness maps resized to 512 px, re-encoded JPEG; tinted in-engine |
| 3D model: Chandelier 01 | Kirill Sannikov | https://polyhaven.com/a/Chandelier_01 | CC0 1.0 | GLB re-encoded (resized textures); ceiling light prop |
| 3D model: Vintage Grandfather Clock 01 | Yann Kervran, James Ray Cock | https://polyhaven.com/a/vintage_grandfather_clock_01 | CC0 1.0 | GLB re-encoded; pendulum animated in-engine |
| 3D model: Wooden Bookshelf Worn | Ulan Cabanilla | https://polyhaven.com/a/wooden_bookshelf_worn | CC0 1.0 | GLB re-encoded; archive corner shelving |
| 3D model: Drawer Cabinet | Ulan Cabanilla | https://polyhaven.com/a/drawer_cabinet | CC0 1.0 | GLB re-encoded; archive corner cabinet |
| 3D model: Desk Lamp Arm 01 | Yann Kervran, Kuutti Siitonen | https://polyhaven.com/a/desk_lamp_arm_01 | CC0 1.0 | GLB re-encoded; inspection desk lamp (lit) |
| 3D model: Ceramic Vase 01 | James Ray Cock | https://polyhaven.com/a/ceramic_vase_01 | CC0 1.0 | GLB re-encoded; shelf dressing |
| 3D model: Lantern 01 | Rajil Jose Macatangay | https://polyhaven.com/a/Lantern_01 | CC0 1.0 | GLB 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-Baskerville | SIL Open Font License 1.1 | Latin 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-sans | SIL Open Font License 1.1 | Latin 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 above | scripts/render-views.mjs | CC0 1.0 (derived from CC0 scans) | Renders of the scans in the game's inspection lighting |
| Draco and Basis decoders | Google (Draco), Binomial (Basis Universal), via three.js 0.186.1 | https://github.com/mrdoob/three.js/tree/r186/examples/jsm/libs | Apache-2.0 | Copied unmodified into dist/decoders at build time |
| Gallery architecture, display cases, inspection table, sweep, reference ruler/coin/card models, favicon | Built for this project (procedural) | This repository | MIT (code) / CC BY 4.0 (content) | Original |
| 3D scan: Abraham Lincoln's Patent Model (NMAH, PL.031940) — v3 neighbouring exhibit | Smithsonian National Museum of American History (3D: Smithsonian Digitization Program Office) | https://3d-api.si.edu/voyager/3d_package:9172faae-dbbe-424a-a9e7-56f4428a06dd | CC0 1.0 | Unmodified 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 exhibit | Smithsonian 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-90f5c5c8b9e8 | CC0 1.0 | Unmodified 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 exhibit | Smithsonian 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-296f328df4c5 | CC0 1.0 | Unmodified std Draco GLB (2048 px), renamed with a content hash (public/assets/v3/exhibits) |
| Object record metadata (3 v3 neighbouring exhibits above) | Smithsonian Institution | https://api.si.edu/openaccess/api/v1.0/ (Open Access API) | CC0 1.0 | Facts 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/11605 | CC0 1.0 | Resized 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/10850 | CC0 1.0 | Resized to 1024 and 2048 px (long edge), KTX2 ETC1S with mipmaps (public/assets/v3/paintings) |
| 3D model: Ottoman 01 (v3 gallery bench) | Caspian Fortune | https://polyhaven.com/a/Ottoman_01 | CC0 1.0 | 1k glTF re-packed as GLB: meshopt + quantization, textures KTX2 (colour 1024 px ETC1S, normal 512 px UASTC) |
| 3D model: Security Camera 01 | Alexander Otterbeck, Yann Kervran | https://polyhaven.com/a/security_camera_01 | CC0 1.0 | 1k glTF re-packed as GLB: meshopt + quantization, textures KTX2 (colour 1024 px ETC1S, normal 512 px UASTC) |
| 3D model: Magnifying Glass 01 | Nazar Borodavka | https://polyhaven.com/a/magnifying_glass_01 | CC0 1.0 | 1k glTF re-packed as GLB: meshopt + quantization, textures KTX2 at 512 px |
| Texture: Wood 051 (1K) | ambientCG (Lennart Demes) | https://ambientcg.com/view?id=Wood051 | CC0 1.0 | Colour 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=Marble012 | CC0 1.0 | Colour and Roughness 1024 px KTX2 ETC1S, NormalGL 512 px KTX2 UASTC |
| Texture: Cork 002 (1K) | ambientCG (Lennart Demes) | https://ambientcg.com/view?id=Cork002 | CC0 1.0 | Colour, NormalGL, Roughness at 512 px, KTX2 |
| Texture: Metal 048 A (1K) | ambientCG (Lennart Demes) | https://ambientcg.com/view?id=Metal048A | CC0 1.0 | Colour, NormalGL, Roughness, Metalness at 512 px, KTX2 |
| Texture: Fabric 085 (1K) | ambientCG (Lennart Demes) | https://ambientcg.com/view?id=Fabric085 | CC0 1.0 | Colour, NormalGL, Roughness at 512 px, KTX2; to be tinted in-engine |
| Texture: Fingerprints 002 (1K) | ambientCG (Lennart Demes) | https://ambientcg.com/view?id=Fingerprints002 | CC0 1.0 | Roughness map only, 1024 px KTX2 (glass smudges) |
| Texture: Paper 004 (1K) | ambientCG (Lennart Demes) | https://ambientcg.com/view?id=Paper004 | CC0 1.0 | Colour, NormalGL, Roughness at 512 px, KTX2 |
| Textures: exit sign face, night facade across the street | Built for this project (scripts/fetch-v3-assets.mjs; exit-sign lettering set in Source Sans 3, SIL OFL 1.1) | This repository | CC 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 repository | CC 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
| Asset | Author | Source | License | Changes |
|---|---|---|---|---|
| Empty Warehouse 01 (HDRI, 1k .hdr) | Sergej Majboroda | https://polyhaven.com/a/empty_warehouse_01 | CC0 1.0 | None. 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 Cilliers | https://polyhaven.com/a/concrete_floor_worn_001 | CC0 1.0 | None 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 Tuytel | https://polyhaven.com/a/blue_metal_plate | CC0 1.0 | Only 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 Tuytel | https://polyhaven.com/a/wood_planks_grey | CC0 1.0 | None to pixels. Used on pallets; files renamed with content hashes. |
| Wet Floor Sign 01 (`WetFloorSign_01-d4a94c3c.glb`) | Fran Calvente | https://polyhaven.com/a/WetFloorSign_01 | CC0 1.0 | Converted 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 Chaudhary | https://polyhaven.com/a/cardboard_box_01 | CC0 1.0 | Converted 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 Camacho | https://polyhaven.com/a/Barrel_01 | CC0 1.0 | Converted 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 Cock | https://polyhaven.com/a/wooden_crate_01 | CC0 1.0 | Converted 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 JOORIN | https://polyhaven.com/a/korean_fire_extinguisher_01 | CC0 1.0 | Converted 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 Siitonen | https://polyhaven.com/a/hanging_industrial_lamp | CC0 1.0 | Converted 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 Zakharov | https://polyhaven.com/a/tool_cart | CC0 1.0 | Converted 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`) | MP | https://polyhaven.com/a/ladder_sectioned_01 | CC0 1.0 | Converted 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 Co | https://github.com/xotypeco/big_shoulders | SIL OFL 1.1 | Self-hosted Latin WOFF2 subset for display headings. |
| Barlow (Latin 400/600/700 WOFF2, via `@fontsource/barlow`) | Jeremy Tribby | https://github.com/jpt/barlow | SIL OFL 1.1 | Self-hosted Latin WOFF2 subset for body copy and controls. |
| Share Tech Mono (Latin 400 WOFF2, via `@fontsource/share-tech-mono`) | Carrois Apostrophe | https://fonts.google.com/specimen/Share+Tech+Mono | SIL OFL 1.1 | Self-hosted Latin WOFF2 subset for in-world telemetry, tags, and tooltips. |
| Medical Box (`assets/v3/models/medical_box-*.glb`) | Ulan Cabanilla | https://polyhaven.com/a/medical_box | CC0 1.0 | v3 (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`) | Mutanzom3D | https://polyhaven.com/a/hand_truck | CC0 1.0 | v3 (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 Penguin | https://polyhaven.com/a/plastic_crate_03 | CC0 1.0 | v3 (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`) | PierreB3D | https://polyhaven.com/a/wall_clock | CC0 1.0 | v3 (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 Kervran | https://polyhaven.com/a/power_box_01 | CC0 1.0 | v3 (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 Cock | https://polyhaven.com/a/utility_box_01 | CC0 1.0 | v3 (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 Cabanilla | https://polyhaven.com/a/metal_office_desk | CC0 1.0 | v3 (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 Cabanilla | https://polyhaven.com/a/metal_stool_01 | CC0 1.0 | v3 (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 Schuster | https://polyhaven.com/a/security_light | CC0 1.0 | v3 (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 Siitonen | https://polyhaven.com/a/industrial_wall_lamp | CC0 1.0 | v3 (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 Cabanilla | https://polyhaven.com/a/mounted_fluorescent_lights | CC0 1.0 | v3 (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 Sadek | https://polyhaven.com/a/metal_toolbox | CC0 1.0 | v3 (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 B | https://polyhaven.com/a/worn_metal_rack | CC0 1.0 | v3 (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 Chaudhary | https://polyhaven.com/a/plastic_bottle_gallon | CC0 1.0 | v3 (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 Baglioni | https://polyhaven.com/a/concrete_block_wall | CC0 1.0 | v3 (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 Majboroda | https://polyhaven.com/a/corrugated_iron_02 | CC0 1.0 | v3 (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 Kumar | https://polyhaven.com/a/box_profile_metal_sheet | CC0 1.0 | v3 (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 Tuytel | https://polyhaven.com/a/metal_plate | CC0 1.0 | v3 (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 Savva | https://polyhaven.com/a/raw_plank_wall | CC0 1.0 | v3 (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 Baglioni | https://polyhaven.com/a/painted_metal_shutter | CC0 1.0 | v3 (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.html | CC0 1.0 | v3 (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 Community | https://github.com/makehumancommunity/mpfb2/blob/master/LICENSE.md | CC0 1.0 | v3 (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 Tribby | https://github.com/google/fonts/tree/main/ofl/barlowcondensed | SIL OFL 1.1 | v3 (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 Andersson | https://github.com/google/fonts/tree/main/ofl/inter | SIL OFL 1.1 | v3 (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.1 | three.js authors | https://github.com/mrdoob/three.js | MIT | None. Bundled by Vite. |
Field Ecologist: Sampling the Meadow
| Asset | Author | Source | License | Changes |
|---|---|---|---|---|
| Fraunces (Latin 600/700 WOFF2, `src/styles/fonts/`) | Undercase Type (Phaedra Charles, Flavia Zimbardi) | https://github.com/undercasetype/Fraunces | SIL OFL 1.1 | Self-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 Vanyashin | https://github.com/googlefonts/NunitoSans | SIL OFL 1.1 | Self-hosted Latin WOFF2 subset (via @fontsource); body copy, instructions and controls |
| Caveat (Latin 600 WOFF2, `src/styles/fonts/`) | Impallari Type | https://github.com/googlefonts/caveat | SIL OFL 1.1 | Self-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 LLC | via three.js `examples/jsm/libs` (Apache-2.0) | Apache-2.0 | Unmodified copies, self-hosted so no CDN requests |
| v3: Wooden Table 02 (`public/assets/v3/models/station-table-cd1ca3ec.glb`) | Serhii Khromov | https://polyhaven.com/a/wooden_table_02 | CC0 1.0 | 1k 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`) | ProgrammerOnCoffee | https://polyhaven.com/a/clipboard | CC0 1.0 | 1k 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 Borodavka | https://polyhaven.com/a/magnifying_glass_01 | CC0 1.0 | 1k 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`) | DaDrood | https://polyhaven.com/a/binder_notebook | CC0 1.0 | 1k 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`) | PierreB3D | https://polyhaven.com/a/plastic_thermos | CC0 1.0 | 1k 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 Cabanilla | https://polyhaven.com/a/folding_wooden_stool | CC0 1.0 | 1k 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 Sadek | https://polyhaven.com/a/stationery_supplies | CC0 1.0 | 1k 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 Cilliers | https://polyhaven.com/a/boulder_01 | CC0 1.0 | 1k 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 Cilliers | https://polyhaven.com/a/fern_02 | CC0 1.0 | 1k 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 Heerden | https://polyhaven.com/a/flower_gazania | CC0 1.0 | 1k 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 Cilliers | https://polyhaven.com/a/celandine_01 | CC0 1.0 | 1k 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 Kumar | https://polyhaven.com/a/periwinkle_plant | CC0 1.0 | 1k 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 Tuytel | https://polyhaven.com/a/dead_tree_trunk | CC0 1.0 | 1k 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 Cilliers | https://polyhaven.com/a/nettle_plant | CC0 1.0 | 1k 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 Cilliers | https://polyhaven.com/a/shrub_04 | CC0 1.0 | 1k 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 Tuytel | https://polyhaven.com/a/tree_stump_01 | CC0 1.0 | 1k 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 Cilliers | https://polyhaven.com/a/dry_branches_medium_01 | CC0 1.0 | 1k 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 Mischok | https://polyhaven.com/a/lilienstein | CC0 1.0 | Unmodified 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`) | ambientCG | https://ambientcg.com/a/Grass004 | CC0 1.0 | 1K 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`) | ambientCG | https://ambientcg.com/a/Grass003 | CC0 1.0 | 1K 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`) | ambientCG | https://ambientcg.com/a/Rock064 | CC0 1.0 | 1K 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`) | ambientCG | https://ambientcg.com/a/Foliage001 | CC0 1.0 | 1K 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`) | ambientCG | https://ambientcg.com/a/Ground036 | CC0 1.0 | 1K 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`) | ambientCG | https://ambientcg.com/a/Ground048 | CC0 1.0 | 1K 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`) | ambientCG | https://ambientcg.com/a/Bark012 | CC0 1.0 | Colour 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`) | ambientCG | https://ambientcg.com/a/LeafSet024 | CC0 1.0 | Leaves 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.mjs | Own 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.mjs | Own 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.mjs | Own 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.mjs | Own 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 repository | CC BY 4.0 (content) | Headed-GPU screenshot of the v3 meadow (overlay hidden), 1200 × 630. Replaces the v2 posters. |
Glacier Time Machine
| Asset | Author | Source | License | Changes |
|---|---|---|---|---|
| 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 reserved | https://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-1941 | Public 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-1950 | Public 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-2004 | Public 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 Communications | https://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-1941 | Public 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 project | Original work, this repository | CC BY 4.0 | Original. |
| Sentinel-2 L2A true-colour image (TCI), scene S2B_8VML_20240806_0_L2A, acquired 2024-08-06 (cloud cover 0.13 %) — terrain drape | Contains modified Copernicus Sentinel data 2024 (European Union / ESA); L2A processing by ESA, COG hosting by Element 84 / AWS Open Data | https://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.1 | Latin 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.1 | Latin 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.1 | Latin 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 07 | Jenelle van Heerden (Poly Haven) | https://polyhaven.com/a/rock_07 | CC0 1.0 | Packed to a single GLB with 512 px JPEG textures by `../_tools/fetch-polyhaven-model.mjs`; meshes merged per material at load. |
| 3D model Rock 09 | Jenelle van Heerden (Poly Haven) | https://polyhaven.com/a/rock_09 | CC0 1.0 | Packed to a single GLB with 512 px JPEG textures; merged per material at load. |
| 3D model Boulder 01 | Rico Cilliers (Poly Haven) | https://polyhaven.com/a/boulder_01 | CC0 1.0 | Packed 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_bush | CC0 1.0 | Packed 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 01 | Rico Cilliers (Poly Haven) | https://polyhaven.com/a/dry_branches_medium_01 | CC0 1.0 | Packed 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 tongue | glacier-time-machine project | Original work, this repository (`src/scenes/muir-dressing.js`) | CC BY 4.0 | Original. 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 Data | https://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 1 | glacier-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 reserved | Built 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_aerial | CC0 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_02 | CC0 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_face | CC0 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_01 | CC0 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_rock | CC0 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 project | Original work, this repository (`scripts/build-procedural-textures.mjs`, seeded tileable noise; no source image) | CC BY 4.0 | Original. 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 tripod | glacier-time-machine project | Original work, this repository (`scripts/build-models.mjs`; geometry built in code, no source model) | CC BY 4.0 | Original. 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 project | Original work, this repository | CC BY 4.0 | Headed-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. |