Lighter mesh for phones: tools/build.py --coarsen N (and UNROLL_STEP) keeps every Nth sampled row and column of a built mesh with the same UV mapping; PHerc0172 lite mesh 527,834 vertices (from 2,082,140), 1.5 MB packed, loaded automatically on phones via geometry.lite (?mesh=full or ?mesh=lite overrides); tear threshold follows the mesh step
Chase
0d6db02
Short labels and tooltips show the scan as 9.4 µm (9.362 µm stays in the details)
Reword ink-layer copy: candidates for expert reading
Chase Hendrick
bf77c3f
Replace claims that neural networks found the ink with: ink layers
show where models detect ink; letters visible here are candidates
for expert reading. Updates the README, page lede, meta tags, and
the PHerc0139 manifest lede.
Assisted-by: Grok Bot
Add PHerc1667 (Scroll 4): 19 segments (7.91 um meshes, X-ray from the 2.399 um scan, published ink 2.399 um and 1.129 um), from the open data bucket (CC BY-NC 4.0), with the EduceLab-Scrolls citation
Public API at window.unroll (schema, help, coverage test; ui and bench groups), embed mode with postMessage bridge and oEmbed, version 0.9.4 in About and API, ink_9um (9 µm) label and credit, Ink Bench hardening from the audit, hashchange without reload, capped test hooks
Relicense all code to Apache 2.0 (LICENSE, NOTICE with three.js kept MIT, frontmatter), version 1.0.0 (version.json, CHANGELOG.md); scan data stays CC BY-NC 4.0
Chase
7a02281
Add PHerc1447 (prize eligible): 15 segments, 8.64 um meshes and X-ray only, no ink layer and no ink model run, from the open data bucket (CC BY-NC 4.0)
Overlay textures upload through a per-frame queue (about 6 ms per frame, initTexture) instead of all at once, removing the 14.6 s main-thread freeze; import map versions for tear.js, damage.js and lib/*.js; scan shown as 9.4 µm with 9.362 µm voxels in the details; glossary links every occurrence; mobile panel clears the bottom bar
Add PHerc0172 (Scroll 5): 44 segments w052 to w095 (7.91 um meshes and X-ray, published ink 7.91 um, newest model), from the open data bucket (CC BY-NC 4.0)
Control panel redesign (ui.js, ui.css): grouped Layers, Ink Bench, View, Destroy and Scrolls with icon and text labels, 44 px targets, pressed states, shortcut tooltips, focus rings, docked mobile panel; Settings (quality, reduced motion, speed, glow, background, HUD, labels, sensitivity, units, Ink Bench button) saved in localStorage and settable by URL; agent API unrollView.actions/settings/state/glossary (docs/AGENT_API_UI.md); plain language glossary.json under About with linked terms; faster intro (motion within one frame, ease-out, about 2.5 s, skip with Enter or button, follows speed) with shaders compiled behind the loader; CPU pick fallback for Destroy on GPUs without float targets; readout panel, fixed Roll up width, header clear of the panel
Relabel the second ink layer as ink_9um (9 µm): Chase Hendrick ran the public scrollprize/ink_9um model, which the Vesuvius Challenge trained; HUD readout INK_9UM; cache-busting version on JS and CSS
Multi-scroll support: build.py and fetch.py take any open-data scroll (per-scroll voxel size, X-ray scan, renumbering by radius, optional ink, a second 1 um ink layer), make_manifest.py, the scroll picker's prize eligible badge and eligible-only toggle (window.unrollScrolls), and a 'Why N ink layers?' box written from each manifest's ink layers
Faster first load: ship the int16 geometry as byte planes + gzip (scroll.i16p.gz, 1.62 MB instead of 3.48 MB), unpacked in the browser to the exact scroll.bin bytes with a fallback to scroll.bin; tools/pack_bin.py builds it, tests/pack_bin.mjs checks the round trip
ink_9um layer: all 37 windings (w023 to w045 and w052 to w059 run on Modal), manifest range and gpu.json
Grok Bot
e0226a7
Destroy: fibrous alpha-tested damage edges, Burn and Water tools with cursors, Roll up, size-dependent debris that settles on the floor, wall-clock burn timing; rename Tear apart to Destroy; ink model text reads its coverage from the manifest
- scrolls/index.json registry and per-scroll manifests (windings with ranges, ink layers with sources and resolutions, credits, data terms); PHerc. 139 migrated with no visible change
- scroll picker (hidden with one scroll), per-scroll and per-winding lazy loading
- lib/manifest.js validator shared by the page and tools/validate_scroll.mjs; docs/ADDING_A_SCROLL.md; tools/precompute_template.py
- Open your own: files, folders, zips or a URL, read in the browser only (nothing uploaded), OBJ/PLY with UVs, PNG/JPG/TIFF layers, size limits, clear errors, kept in IndexedDB and labelled local; downloadable synthetic example package
- atlases as WebP with JPG fallback (about 2.1 MB smaller)
- rename layers: Published ink (2.4 µm) and Our ink model (9 µm)