Loading the scroll.
The scroll could not be loaded.
37 of its windings have been traced through X-ray CT by the Vesuvius Challenge. Ink layers show where models detect ink; letters visible here are candidates for expert reading. Drag to look around. Scrub to unroll.
Nothing is uploaded. Your files are read by this page inside your browser and kept on this device (in browser storage) until you remove them. No server sees them.
A URL is fetched by your browser straight from that server, which must allow cross-origin requests (CORS).
Meshes: OBJ or PLY with texture coordinates (UVs), one per winding. Layers: PNG, JPG or TIFF images laid out on those UVs: an X-ray layer, an ink layer and an optional comparison layer. The manifest says which file is which, the voxel size, and who made the data.
Live sheet: stream any public traced segment and a scan volume (CT or a 3D ink prediction) from the open data bucket and see the volume on the sheet in 3D, with nothing packed ahead of time.
PHerc. 139 is one of the papyrus rolls carbonized when Vesuvius buried Herculaneum in 79 CE. It is too fragile to open, so it was scanned with X‑rays at the ESRF synchrotron in Grenoble. It is held by the Biblioteca Nazionale di Napoli.
Each sheet in the 3D view is one winding of the roll, traced through the CT volume by the Vesuvius Challenge. The shapes are the real ones, from the public 9.362 µm meshes. The X‑ray layer is the CT intensity on each surface. The Published ink (2.4 µm) layer is the Vesuvius Challenge's public ink detection on the 2.4 µm scan. In 3D it is drawn through a local‑contrast filter so letter‑sized strokes stand out; the close‑up view shows the published preview unfiltered, downscaled to 2,400 px.
Unrolling lays the windings end to end, outermost first, the way a reader would open the roll. Each traced winding runs a little past one full turn, so roughly a tenth of the 2.8 m strip repeats surface from its neighbor.
Sources: open data bucket PHerc0139/segments/*/mesh/*9.362um.tifxyz, surface-volumes/9.362um…zarr and ink-detection/downsampled. Data: Giorgio Angelotti, Stephen Parsons, Sean Johnson, Elian Rafael Dal Prà, Johannes Rudolph, Paul Tafforeau, Alessandro Mirone, Paul Henderson, Hendrik Schilling, Forrest McDonald, David Josey, Youssef Nader, C. Seth Parker, W. Brent Seales. Vesuvius Challenge - CT Scans of Herculaneum Papyri. Vesuvius Challenge. Licensed CC BY‑NC 4.0. The page's code (HTML, CSS, JS and tools/) is Apache 2.0; see the Space's README.
Made by Chase Hendrick.
Paste this into your page. Visitors can unroll, scrub, switch layers and use every tool inside the frame; a click hands the mouse wheel to the viewer, so your page still scrolls normally.
oEmbed: /oembed.json. Host pages can drive the viewer with postMessage; see EMBED.md.
The traced windings, X-ray CT and ink layers in Unroll come from the Vesuvius Challenge open data, and every one of them reads straight from these URLs in your own tool, with no account and no download step.
https://vesuvius-challenge-open-data.s3.us-east-1.amazonaws.com/PHerc0841/segments/20260220213127-w00/mesh/20260220213127-on-20250821151531-9.366um.tifxyz# pip install numpy tifffile
import io, json, urllib.request
import numpy as np, tifffile
T = "https://vesuvius-challenge-open-data.s3.us-east-1.amazonaws.com/PHerc0841/segments/20260220213127-w00/mesh/20260220213127-on-20250821151531-9.366um.tifxyz"
meta = json.load(urllib.request.urlopen(T + "/meta.json")) # scale, bbox, format
get = lambda c: tifffile.imread(io.BytesIO(urllib.request.urlopen(f"{T}/{c}.tif").read()))
xyz = np.stack([get(c) for c in "xyz"], -1) # xyz[i, j] = (x, y, z) in scan voxels; -1 = no surfaces3://vesuvius-challenge-open-data/PHerc0841/segments/import re, urllib.request
B = "https://vesuvius-challenge-open-data.s3.us-east-1.amazonaws.com"
xml = urllib.request.urlopen(B + "/?list-type=2&delimiter=/&prefix=PHerc0841/segments/").read().decode()
print(re.findall(r"<Prefix>([^<]+)</Prefix>", xml)) # subfolders; <Key> gives fileshttps://vesuvius-challenge-open-data.s3.us-east-1.amazonaws.com/PHerc0139/volumes/20250728140407-9.362um-1.2m-113keV-masked.zarr# pip install "zarr>=3" fsspec aiohttp
import zarr
root = zarr.open_group("https://vesuvius-challenge-open-data.s3.us-east-1.amazonaws.com/PHerc0139/volumes/20250728140407-9.362um-1.2m-113keV-masked.zarr", mode="r") # OME-Zarr, zarr v2
a = root["2"] # level 0 is full resolution; level L is 2**L times coarser
print(a.shape, a.dtype, a.chunks)
block = a[2622:2686, 828:892, 828:892] # (z, y, x); reads only the chunks it touches# pip install "vesuvius[volume-only]"
from vesuvius import Volume
v = Volume(type="zarr", path="https://vesuvius-challenge-open-data.s3.us-east-1.amazonaws.com/PHerc0139/volumes/20250728140407-9.362um-1.2m-113keV-masked.zarr/2") # one pyramid level
block = v[2622:2686, 828:892, 828:892]In VC3D (villa's volume-cartographer), open or create a project, then
File > Attach Remote Zarr... and paste:
https://vesuvius-challenge-open-data.s3.us-east-1.amazonaws.com/PHerc0139/volumes/20250728140407-9.362um-1.2m-113keV-masked.zarr
It accepts http, https and s3 OME-Zarr roots.https://neuroglancer-demo.appspot.com/#!%7B%22layers%22%3A%5B%7B%22type%22%3A%22image%22%2C%22source%22%3A%22zarr%3A%2F%2Fhttps%3A%2F%2Fvesuvius-challenge-open-data.s3.us-east-1.amazonaws.com%2FPHerc0139%2Fvolumes%2F20250728140407-9.362um-1.2m-113keV-masked.zarr%2F%22%2C%22name%22%3A%22X-ray%20CT%20behind%20the%20CT%20view%2C%20PHerc0139%209.362%20um%22%7D%5D%2C%22layout%22%3A%224panel%22%7Dcurl -s https://vesuvius-challenge-open-data.s3.us-east-1.amazonaws.com/PHerc0139/volumes/20250728140407-9.362um-1.2m-113keV-masked.zarr/.zattrs # OME multiscales metadata
curl -s https://vesuvius-challenge-open-data.s3.us-east-1.amazonaws.com/PHerc0139/volumes/20250728140407-9.362um-1.2m-113keV-masked.zarr/2/.zarray # one level: shape, chunks, dtype, codechttps://sharpmeow-unroll.static.hf.space/API description (window.unroll, postMessage, deep links): https://huggingface.co/spaces/SharpMeow/unroll/resolve/main/api.json
Guide for agents: https://huggingface.co/spaces/SharpMeow/unroll/resolve/main/llms.txt
Scroll list and per-scroll manifests: https://huggingface.co/spaces/SharpMeow/unroll/resolve/main/scrolls/index.json
Ink Bench on the command line: https://huggingface.co/spaces/SharpMeow/unroll/resolve/main/tools/inkbench.py
Deep link to one winding: https://sharpmeow-unroll.static.hf.space/?scroll=PHerc0139&t=0.6&layer=overlay&focus=w047&compare=0.3
<iframe src="https://sharpmeow-unroll.static.hf.space/index.html?embed=1" width="100%" height="600" allow="fullscreen; clipboard-write"></iframe>