Skip to content

Repository files navigation

3D ICE logo

3D ICE

CI Draft JOSS PDF MIT License

Interactive 3D Cryosphere Explorer for Antarctica and Greenland

3D ICE turns state-of-the-art cryosphere datasets into an explorable browser experience for research communication, teaching, and public engagement.

Website · Explore with the guided tour · Research edition · Releases

Deploy Pages workflow Release compat bundle workflow Node 22.12+ WebGL browser runtime Antarctica and Greenland

Overview

3D ICE is a standalone source repository for the full 3D ICE experience: the GitHub Pages site, the interactive browser runtime, bundled cryosphere datasets, preview media, and the preparation scripts used to turn scientific source data into web-ready assets.

The project is designed to bridge rigorous glaciological research and public curiosity. It lets people rotate, zoom, and layer Antarctica and Greenland datasets directly in the browser, then jump from the visualization to the underlying source products.

Watch demo on YouTube

3D ICE demo preview. Click to watch the video on YouTube.
Click to watch the full 3D ICE demo on YouTube.

Two Editions

3D ICE comes in two editions that share one runtime:

Edition Pages For What it offers
Public /explore/, /zh/explore/ Everyone: visitors, classrooms, outreach stands Each region's default terrain, animated ice flowlines coloured by speed, ocean currents, sea level, the ice-free rebound (the ice melts away over three seconds the first time it is switched on) and Antarctica's projected future to 2300, with a nine-stop guided tour and a plain-language explainer, with sources, for every layer.
Research /tools/3D-interactive-cryosphere-explorer.html, /zh/tools/… Researchers Every dataset, resolution and layer, the data-snapshot panel, flowline profiles, the idealised rebound models and the recording mode.

A page names its edition with <html data-edition>, and static/tools/js/editions.js turns that into the datasets, layers and behaviours on offer. Restricting a layer also drops the URLs of its packages, so the public pages never fetch a research-only package. The tour's stops and all the public edition's words, in English and Chinese, are in static/tools/js/explore-content.js. ?tour=1 opens the tour when the page loads, and ?tour=<stop id> opens it at that stop.

Why This Repo Exists

  • Publish static/ directly to GitHub Pages as a standalone site.
  • Preserve the legacy /tools/... public paths used by the main personal site.
  • Ship a compatibility bundle for downstream deployment into another repo.
  • Keep runtime assets, prepared data products, and data-preparation tooling together.

Experience Highlights

Capability What 3D ICE provides
Fully interactive 3D viewing Rotate, zoom, and inspect Antarctica and Greenland as if handling a physical model.
Layered cryosphere exploration Combine bed topography, surface velocity, basin boundaries, basal friction, subglacial hydrology, and ocean streamlines in one scene.
Antarctica-specific overlays Explore WAOM2 ocean circulation, IMBIE-refined basins, subglacial channels, and RISE basal melt plus thermal-driving fields.
Greenland-specific overlays Explore ITS_LIVE velocity mosaics, Greenland basin boundaries, basal friction fields, and clipped Arctic ocean circulation around Greenland.
Research-friendly workflow The runtime exposes direct links back to the source datasets, so the visual layer stays connected to the original scientific products.
Cross-platform delivery Balanced presets support mobile touchscreens, while HD options target larger desktop displays.
Flexible deployment The runtime auto-detects project-path prefixes, so it works both at a site root and under GitHub Pages project paths such as /3d-ice/tools/....

Documentation

Document Contents
docs/architecture.md The two-stage design, module boundaries, deployment and verification
docs/data-contract.md The binary and metadata format every data package follows
docs/data-pipeline.md Where each package's source product comes from and how to rebuild it
docs/example.md Worked examples that run from a clean clone
CHANGELOG.md Changes by release

Quick Start

Preview the site locally

The site itself is static. A simple local file server is enough:

cd static
python3 -m http.server 4173

Then open:

  • http://127.0.0.1:4173/
  • http://127.0.0.1:4173/explore/ (public edition)
  • http://127.0.0.1:4173/tools/3D-interactive-cryosphere-explorer.html (research edition)

Build the compatibility bundle

The bundling scripts need no npm packages: they use Node built-ins and the system tar, and run on Node 20 (the release workflow's version) or newer.

npm run bundle:compat
npm run smoke:compat

This produces:

  • dist/3d-ice-compat.tar.gz
  • dist/3d-ice-compat.tar.gz.sha256
  • dist/3d-ice-compat-manifest.json

The tarball holds the files a host serves at the same paths as 3d-ice.com, so it can be mounted at a site root:

  • tools/: the research edition, the runtime, data, media and vendored libraries, so legacy /tools/... URLs keep working;
  • explore/, zh/explore/ and zh/tools/3D-interactive-cryosphere-explorer.html: the public edition and the Chinese research page;
  • css/, js/ and fonts/: what the home page loads.

It also holds the two home pages as home/en-US.html and home/zh-CN.html, for a host that builds its own copy of the home page. They sit under home/ so that mounting the bundle cannot replace the host's own home page. yuwang.blog builds its /tools/3d-ice/ page this way, and tests/test_site_embed.py pins what it relies on.

Repository Layout

Path Purpose
static/index.html, static/zh/index.html Home pages (English and Chinese): the way into both editions, previews, updates, source data and feedback.
static/css/3d-ice-home.css, static/css/3d-ice-type.css, static/js/3d-ice-home.js Home-page styles, typefaces and behaviour (theme, preview videos, feedback form, language switcher).
static/fonts/ Self-hosted Space Grotesk and Playfair Display (SIL Open Font License).
static/tools/3D-interactive-cryosphere-explorer.html, static/zh/tools/… Research-edition explorer pages (English and Chinese).
static/explore/index.html, static/zh/explore/index.html Public-edition explorer pages (English and Chinese).
static/tools/js/explorer-app.js, static/tools/css/explorer.css The explorer runtime and styles that every explorer page loads.
static/tools/js/editions.js What each edition offers: datasets, layers and runtime behaviours.
static/tools/js/explore-guide.js, explore-content.js, explore-tour.js, static/tools/css/explore.css The public edition's guided tour and layer explainers: interface, copy, camera and tour logic, and styles.
static/tools/js/ (other modules) Data-package decoder, polar projections, isostatic-rebound solver, and place and feature search.
static/tools/*-worker.js Web Workers for overlay geometry and the rebound solve.
static/js/3d-ice-locale.js English and Chinese interface strings.
static/tools/data/ Prepared data packages (.bin + .meta.json) and feature catalogues.
static/tools/media/3d-ice/ Preview stills and loop videos used across the experience.
static/tools/vendor/three/ Vendored Three.js r161.
scripts/ Data preparation, bundle and release utilities, and trailer capture.
tests/ Python, JavaScript and browser tests.
docs/, examples/ Design documentation and runnable examples.
dist/ Generated compatibility bundle (not committed).
.github/workflows/ CI, the JOSS paper draft, GitHub Pages deployment and release automation.

Core Data Layers

Region Layers in the experience Representative source products
Antarctica Bed topography, surface elevation, thickness, mask, refined basins, velocity, basal friction, subglacial hydrology, ocean streamlines, basal melt, thermal driving, isostatic rebound, ice-sheet projections to 2300 BedMachine Antarctica v4, Bedmap3 v1.0 (CC BY 4.0), MEaSUREs Antarctic Boundaries v2, MEaSUREs Phase-Based Antarctica Velocity v1, Antarctic basal friction inversions, GlaDS Antarctic subglacial hydrology, WAOM2, RISE, Paxman et al. (2022) isostatic response, grids v3 (CC BY 4.0), ISMIP6 Antarctica 2300 projections (CC BY 4.0; Seroussi et al. 2024)
Greenland Bed topography, surface elevation, thickness, mask, basin boundaries, velocity, basal friction, ocean streamlines, isostatic rebound BedMachine Greenland v6, QRF Greenland subglacial topography (2025), MEaSUREs ITS_LIVE v2, Greenland basal friction ensemble inversion reference, Copernicus Marine Arctic Ocean Physics, Paxman et al. (2022) isostatic response, grids v3 (CC BY 4.0)

Bedmap3 is available as a 10 km Balanced or 4 km HD Antarctica terrain alternative. Both modes support velocity, flowlines, basal friction, effective pressure, subglacial channels, refined basins, and WAOM2 ocean streamlines. The gridded velocity, basal-friction, and hydrology layers are regenerated on Bedmap3's native grid; the projected WAOM2 streamlines are clipped against the active terrain at runtime. RISE basal melt and thermal-driving fields remain exclusive to BedMachine v4.

Greenland QRF subglacial topography (2025) is available as 3 km Balanced and 1 km HD terrain alternatives. The 300 m QRF GeoTIFF is sampled at pixel centres. The package replaces bed elevation only for grounded ice where the QRF prediction is valid, keeps BedMachine Greenland v6 surface elevation and mask, derives internally consistent thickness from those two fields, and falls back to BedMachine values over QRF gaps, ocean, and floating ice. Velocity, flowlines, basal friction, basins, and ocean streamlines reuse their existing BedMachine-aligned grids. The upstream data repository does not state a standalone data licence; confirm redistribution terms with the authors before publishing derived assets.

Ice-sheet projections (ISMIP6, to 2300)

The projection layer plays Antarctica forward from 2015 to 2300 under three ISMIP6 scenarios, all forced by UKESM1-0-LL: low emissions (SSP1-2.6), high emissions (SSP5-8.5), and high emissions with ice-shelf collapse driven by surface melt. Each scenario is the equal-weight mean of the eight ice sheet models that ran all three, out of the sixteen groups in Seroussi et al. (2024). Every model's change in thickness and in depth-averaged ice speed since 2015 is resampled conservatively onto the explorer's 10 km grid. The mean change is then applied to today's BedMachine v4 ice, so the first frame is the ice already on screen. Thickening is added as it is. Thinning is scaled by BedMachine thickness over the models' own 2015 thickness, so each cell keeps the share of its ice that the models keep; where the models average less than 10 m of ice, it is gone. Adding the thinning outright would riddle the ice shelves with holes, because the models' shelves start out thicker than BedMachine's in some cells and thinner in others.

The browser rebuilds the surface and base by flotation on the BedMachine bed. It colours the ice by its thickness change and keeps the flowlines on: they ride the projected surface, recolour and speed up with today's speed plus the mean change, and drop out where the ice is gone. Switching the projection on switches the flowlines on, and switching it off switches them off again unless they were changed in between. A switch at the end of the projection's controls shows or hides them there; it is the same layer as the flowline toggle in the main list. On the research pages the projection and the isostatic rebound share the Interactive Scenarios section of the sidebar.

The sea-level number and chart are the mean of the models' own published results, with their range. Because flotation is not linear, the averaged ice on the map implies more sea-level rise than that mean: by 2300 it is 0.15 m against 0.05 m (SSP1-2.6), 1.93 m against 1.46 m (SSP5-8.5) and 3.12 m against 2.43 m (with collapse). The packages record both figures. The packages, the pipeline (docs/data-pipeline.md) and the browser module (static/tools/js/ice-projection.js) are tested in tests/test_prepare_ismip6_projection.py, tests/test_ismip6_2300_hpc_scripts.py, tests/js/ice-projection.test.mjs and tests/e2e/test_ice_projection.py.

Isostatic rebound (ice-free equilibrium)

The isostatic-rebound layer answers "what would the bed look like with the ice gone and rebound complete?" By default it shows the published total isostatic response of Paxman, Austermann & Hollyday (2022), loaded from packages sampled at each terrain grid's nodes. Two idealised responses, solved in the browser from the loaded terrain, stay available as what-ifs.

Published response (default). Paxman et al. compute the fully re-equilibrated response to removing both ice sheets: flexure of an elastic plate whose effective elastic thickness varies laterally (Swain & Kirby 2021 for Antarctica, Steffen et al. 2018 for Greenland), plus the post-LGM disequilibrium still to come (the mean of 24 self-gravitating viscoelastic Earth models driven by ICE-6G_C) and the load of the seawater that floods the rebounded bed. The sea surface rises by the 65.3 m eustatic contribution of both ice sheets plus the residual post-LGM geoid change, 73–91 m in all above the grounded Antarctic ice and 43–51 m above Greenland's. Version 3 of their grid files (doi:10.18739/A22Z12R8C, CC BY 4.0) is computed on the same BedMachine Antarctica v4, Bedmap3 and BedMachine Greenland v6 grids the terrain packages are point-sampled from, so scripts/prepare_isostatic_response.py samples it at exactly the terrain nodes, with no interpolation, and writes one *_isostatic_response_* package per terrain package. Each stores three fields at 0.1 m: the topography change T = R − G (the published total response), the solid-surface displacement R and the Earth-model spread σ. The script checks each download against the repository's MD5 and checks that the fields satisfy the published identities T = R − G and T = ice unloading + post-LGM + water loading (residuals below 1e-4 m).

The explorer draws the bed at bed + T, so heights and emergence read directly against the ice-free sea surface however much that surface varies, and it reports uplift as R, as the solver does. The sea-level datum slider is disabled in this mode because the model fixes its own sea surface. On the 10 km BedMachine Antarctica v4 grid the peak solid-surface uplift is 1028.6 m, the peak rise above the ice-free sea surface 940.6 m, and 2.94 million km² of today's sub-sea-level bed emerges; on the 3 km BedMachine Greenland v6 grid the figures are 829.0 m, 784.4 m and 0.394 million km². The QRF Greenland terrain has no published grid of its own and borrows the BedMachine v6 response on the same grid; computing the flexure for the QRF ice load instead changes it by about 10 m RMS, well inside the model spread.

Idealised responses (what-ifs). The solver below computes the equilibrium vertical displacement of the solid Earth after the present ice load is removed, from the thin-plate flexure equation

D grad^4 u + rho_m g u = sigma_now - sigma_after

solved in the spectral domain, where u is uplift (positive up), D is flexural rigidity and sigma is the vertical stress the overburden applies to the bed. Two Earth responses are offered: regional flexure (an elastic lithosphere over a fluid asthenosphere, the ELRA steady state, D = 1e25 N m, flexural length scale 133 km) and local Airy isostasy (D = 0), which bounds the peak uplift from above.

The present-day load is case-split by mask, which matters: grounded ice contributes rho_i g H; a subglacial lake adds its own fresh-water column; and floating ice contributes exactly the load of the seawater it displaces, so removing an ice shelf produces no rebound at all. After deglaciation each column is either dry or flooded to the chosen sea-level datum, but only where it still drains to the open ocean — basins that rebound into closed hollows carry no marine water. Both the flooded depth and the flooded footprint depend on the uplift, so the system is non-linear and is closed by Picard iteration, which contracts at rho_w / rho_m ~ 0.31 and converges to centimetre residuals in about eight iterations.

Numerical choices. The deflection is band-limited near the flexural length scale, so the transform is taken on a ~16–20 km grid and bicubically upsampled with half-cell registration; against a native-resolution solve this moves the peak uplift by under 0.1 %. The water load is evaluated against each coarse cell's sub-cell bathymetry rather than its mean bed, which removes a Jensen bias worth roughly 3 m RMS of uplift and half a percent of the emergent-area figure. Areas are integrated with the polar-stereographic point scale factor, which varies true cell area by about −3 % to +8 % across Antarctica. The test suite checks the solver against the analytic point-load Kelvin-function solution: it agrees to within 10⁻⁴ of the peak beyond half a flexural length, and to about 0.1 % under the load itself, where the solve grid's Nyquist limit cuts off the kernel. Local isostasy reproduces the closed-form Airy uplift exactly.

What the idealised responses are not. They are steady states, so they say where the bed ends up and not how it gets there: neither is a transient GIA simulation nor a sea-level projection. They assume the present bed is in balance with the present load, which it is not: part of the post-LGM rebound is still to come (Paxman et al. put it at up to +68 m of bed elevation under the Ross and Weddell embayments, while the collapsing Laurentide forebulge lowers Greenland by up to 25 m), and the Amundsen Sea Embayment is rising at up to 41 mm/yr in response to recent ice loss over a low-viscosity mantle (Barletta et al. 2018). They omit the sea-level equation, geoid change and rotational feedback, and replace real lateral Earth structure with a single rigidity and mantle density. Against the published response, regional flexure differs by 68 m RMS over grounded Antarctic ice and 69 m over Greenland, mostly because of its uniform rigidity (D = 1e25 N m is an elastic thickness of about 104 km, stiffer than any of Paxman et al.'s cases) and the missing post-LGM term. The UI states these assumptions alongside the figures.

The scenario slider advances ice thinning and bed relaxation together, which is an illustrative coupling rather than a simulated deglaciation path; for the published response it has no time axis, since that response has no single relaxation time. Because every other overlay is baked onto the present-day bed or ice surface, enabling this layer clears them.

Cost. The published response is one fetch per terrain package (2.7 MB on the Balanced grids, 17–25 MB on the HD grids), decoded and summarised once and then cached. The idealised solve runs once per (region, dataset, Earth response, sea-level datum) in a dedicated module worker, and takes 0.2–0.9 s across the shipped packages; there is a main-thread fallback for browsers without module workers. Moving the scenario slider afterwards only rewrites vertex heights and colours from the cached uplift field, holding ~13 ms frames on the 10 km Antarctic grid.

Where the code lives. scripts/prepare_isostatic_response.py (published packages), static/tools/js/gia-rebound.js (summarisePublishedResponse and the idealised physics), static/tools/js/gia-grid.js (coarsening, upsampling, connectivity, area weighting), static/tools/js/fft2d.js (transform) and static/tools/gia-rebound-worker.js (module worker). Unit tests: tests/test_prepare_isostatic_response.py and tests/js/gia-rebound.test.mjs (npm run test:gia-rebound). Browser tests: tests/e2e/test_isostatic_rebound.py.

Key references: Paxman, Austermann & Hollyday (2022) for the published response, with Swain & Kirby (2021) and Steffen et al. (2018) for the elastic-thickness models it uses; Turcotte & Schubert (2002) for plate flexure; Le Meur & Huybrechts (1996) for the ELRA formulation and parameter defaults; Lingle & Clark (1985) and Bueler et al. (2007) for the deformable-Earth response and its spectral solution; Brotchie & Silvester (1969) for the Kelvin-function validation case; Whitehouse et al. (2019) and Barletta et al. (2018) for present-day Antarctic uplift and lateral viscosity structure.

Standalone GitHub Pages Site

This repository publishes static/ directly to GitHub Pages. That serves:

  • / as the standalone landing page
  • /css/3d-ice-home.css as the home-page stylesheet
  • /explore/ as the public edition, with the guided tour
  • /tools/3D-interactive-cryosphere-explorer.html as the research edition
  • /tools/data/*, /tools/media/3d-ice/*, /tools/vendor/*, and /tools/3d-antarctica/ as supporting assets

The Pages workflow writes static/.nojekyll before deployment so the project-path asset layout is preserved exactly as shipped.

Release Flow

  1. Push to main to deploy static/ to GitHub Pages.
  2. Push a tag like v0.1.0 to build and publish compatibility assets to a GitHub release.
  3. Use workflow_dispatch when you want either workflow to run manually.

The release workflow uploads and optionally publishes:

  • dist/3d-ice-compat.tar.gz
  • dist/3d-ice-compat.tar.gz.sha256
  • dist/3d-ice-compat-manifest.json

Installation

Browser runtime (no install needed)

Visit the public edition or the research edition in a WebGL-capable browser (Chrome or Edge 89+, Firefox 114+, Safari 15+), or serve static/ locally:

python3 -m http.server 4173 --directory static
# open http://127.0.0.1:4173/explore/ or http://127.0.0.1:4173/tools/3D-interactive-cryosphere-explorer.html

Development environment

  • Python 3.10 or newer for the data-preparation scripts and the Python tests. Dependencies are declared in pyproject.toml.
  • Node.js 22.12 or newer for the JavaScript tests; CI uses Node 24. The runtime has no npm dependencies, and the bundle scripts also run on Node 20.
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -e ".[dev]"

Data preparation pipeline

The prepared packages are committed, so nothing needs rebuilding to run the explorer or the tests. docs/data-pipeline.md gives, for every package, its source product, where to obtain it and the exact command, and lists the steps that rebuild packages from the repository alone. For example:

# Rebuild the six Bedmap3 overlay packages from committed inputs (identical payloads)
python scripts/prepare_bedmap3_antarctica_overlays.py

# Rebuild BedMachine Antarctica from the NSIDC file: Balanced, then HD
python scripts/prepare_bedmachine_antarctica.py --input BedMachineAntarctica_V4.nc
python scripts/prepare_bedmachine_antarctica.py --input BedMachineAntarctica_V4.nc --step 8 --basename bedmachine_antarctica_v4_741

Scripts write into static/tools/data/ by default and overwrite the committed package of the same name.

Running tests

With the environment active:

python -m pytest tests/ --ignore=tests/e2e     # Python unit and integration tests
npm run test:js                                 # JavaScript unit, data-contract and example tests
npm run bundle:compat && npm run smoke:compat   # build and check the distributable bundle

# Browser end-to-end tests (Playwright; about 25 minutes on a laptop)
python -m pip install -e ".[e2e]"
python -m playwright install chromium           # on Linux, add --with-deps as CI does
python -m pytest tests/e2e/

Worked examples

node examples/isostatic-rebound.mjs reproduces the isostatic-rebound figures the explorer shows for Antarctica, with the explorer's own decoder and rebound module: the published response by default, or an idealised solve with --model flexural|local. docs/example.md walks through it and through a rebuild of part of the data pipeline from the repository alone.

JOSS Paper Draft

Changes to paper.md, paper.bib, or the paper workflow trigger the Draft JOSS PDF workflow. The compiled paper.pdf is available from each workflow run as the joss-paper artifact. To use the same Open Journals toolchain locally when Docker is available:

docker run --rm \
  --volume "$PWD:/data" \
  --user "$(id -u):$(id -g)" \
  --env JOURNAL=joss \
  openjournals/inara -o pdf paper.md

Citation

Until an archival DOI and the JOSS paper are available, cite the latest tagged software release. The repository also includes a machine-readable CITATION.cff file for GitHub's Cite this repository menu.

@misc{wang2026_3dice,
  author  = {Wang, Yu and Lin, Yucheng},
  title   = {{3D ICE}: An Interactive Browser-Based Cryosphere Explorer for Antarctica and Greenland},
  year    = {2026},
  version = {0.3.0},
  url     = {https://github.com/yuwang115/3d-ice/releases/tag/v0.3.0}
}

Contributing

We welcome contributions! Please see CONTRIBUTING.md for guidelines.

This project follows the Contributor Covenant Code of Conduct.

License

This project is licensed under the MIT License.

Project Scope

This repo is intentionally focused on the standalone 3D ICE experience and related distribution artifacts. It is the source of truth for:

  • the browser runtime
  • the standalone landing page
  • prepared data bundles
  • preview media
  • compatibility packaging for downstream deployment

If you are looking for the broader personal site that consumes the compatibility bundle, this repo is the upstream asset and runtime source rather than the final umbrella website.

About

3D ICE: The Polar World at Your Fingertips

Resources

Code of conduct

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages