Click the image to center it. The lines are where each mesh crosses this z plane: orange for the published label, blue for the snapped one, with gray strokes joining matching points. The blue line moves only vertices whose own face was measured (abstain.tif 0). Filled vertices (abstain.tif 2, moved in the dataset by their measured neighbors' offsets) and vertices left in place (1) are drawn at the published position, so the two lines coincide there.
| Scroll | Segment | Method | Vertices | Snapped | Median move | Held back | Claim |
|---|
Is each snapped vertex within one voxel of the papyrus face?
Per scroll, one of three claim levels. Measured: scored against the face seen in an independent, finer scan of the same scroll, and at least one class cleared the bar. Where a card says covered, the claim holds only on the share of sites where two finer scans agree on the face; that share is shown beside it, and the card says in words what exact means there. Certified: no finer scan, so a lower bound from a truth-free certificate whose assumptions are listed. Not shown: neither holds, and the card says why; where a test ran, the card still shows what it measured, which makes no claim. Every number here is model output: the snapped meshes come from a band finder, and the truth face is itself found by a rule.
Per-vertex residuals
No public residual view yet. Drawing the truth face at every vertex would publish where the face is, densely, and spend that region for every later test, so a region appears here only once it is named as spent.
Each cell is a vertex of the label surface (grid rows and columns). Blue: the snapped point lies inward of the truth face; orange: outward. Click a cell to center the CT on it. The outlined row is the z plane shown.
How it is measured
- Release 1.0.1, pinned by its revision, so the vertices scored are the ones you download.
- Split by
abstain.tif: C0 snapped, C2 filled, C1 left in place. Each is scored on its own. - Test sites drawn after the rule was frozen, in regions never used before.
- Truth face found in the finer scan (1.129 µm for PHerc0139); a 2.4 µm scan, where one exists, is the positive control. In a two-scan test a second finer scan (2.403 µm for PHerc0139) reads the face too, and a site counts only where the two agree within 1 voxel (covered); the claim is then on covered sites, with the covered share and its own bar beside it.
- Negative controls: the published label, offsets of 1.5 and 3 voxels planted on purpose, and the verso face; in a two-scan test also the second scan moved by 1.5 and 3 voxels, and the snapped offsets scored against other sites' faces. Each must fail the bar.
- Verdict per stratum: PASS, FAIL, NOT SHOWN or UNANSWERABLE; or VOID for the whole test when a control or the integrity check breaks.
The three claim levels
Measured. A finer scan of the same scroll exists. At test sites drawn after the rule was fixed, the face is found in it, registered into the label scan, and each snapped vertex's distance to it is measured along the normal. The share within 1 voxel and its one-sided 95% lower bound are reported; the claim holds when the bound clears the bar. In a two-scan test the share counts covered sites only (where both finer scans name the face and agree within 1 voxel), so two numbers always go together: how many drawn sites are covered, and how many snapped vertices on those lie within 1 voxel. The rule was fixed before any test site was looked at; its preregistration digest is .
Certified. No finer scan. A certificate computed from the label scan alone gives a lower bound on the share within 1 voxel, valid only under the assumptions the card lists. It was fixed before any test site was looked at too, under the same preregistration.
Not shown. Neither a measurement nor a certificate holds for that scroll, or a control failed. The card says why. Where a test ran, the card still shows its shares, intervals and controls, so you can see how far it is from the bar; nothing on it is a claim.
Limits
- A snap moves along the normal only. It cannot fix a label that follows the wrong wrap, and where two sheets touch the face it finds can belong to the neighbor.
- Only scored strata carry a claim, and a share is a share of test sites, not of every vertex. A covered claim says nothing about the sites the two scans do not cover, and agreement of two scans cannot see an error both share.
- The truth face is itself found by a rule on the finer scan, so it is model output too.
- A certificate rests on its stated assumptions. The certificate code and the snapping code are not public.
- Only the scrolls in the dataset appear here. The meshes are geometry: they say nothing about ink or text.
What each number is
| On this tab | Claim label |
|---|---|
| Shares, bounds, histograms | Model output, measured |
| A certificate's bound | Model output, certified |
| Snapped and truth lines | Model output |
| Which scrolls are prize-eligible | Sourced fact |
Source: .
Scans and source meshes: Vesuvius Challenge open data, CC BY-NC 4.0; the snapped meshes are shared under the same terms. Page code Apache 2.0. Made by Chase Hendrick.

What a snap does
A surface label is a mesh (tifxyz: three float grids, x, y and z in scan voxels) that follows one wrap of papyrus. Traced labels sit near the sheet but rarely on it: on fresh test sites only about a quarter of published label vertices were within one voxel of the sheet's recto face. A snap moves each vertex along its mesh normal onto the face of the bright band nearest it, on the side toward the scroll's center line.
Two methods
- finesnap (PHerc0139, PHerc0814, PHerc0841): the label's own 9.4 µm scan is registered, vertex by vertex, to a 2.4 µm scan of the same scroll, and the face is found there. Where that fails, the label scan's own face is used (
source.tifsays which). - labelsnap (PHerc0172): the face is found in the label's own 7.9 µm scan.
How it was measured

Truth is the recto face seen in an independent 1.129 µm scan, at test sites drawn after the method was fixed and never used before. PHerc0139, 60 sites: within 1 voxel 23.7% for the published labels, 79.4% for labelsnap, 91.2% for finesnap. PHerc0814, 60 sites: 24.2% for published labels, 71.0% for labelsnap. A 3D surface model trained on snapped PHerc0139 labels placed the surface 0.61 voxels closer on PHerc0814 than the same model trained on published labels (95% interval 0.39 to 0.84; all 9 seed pairings).
Against seven community snaps

On 29 October 2026 the single-scan snap (labelsnap, the method used here for PHerc0172) ran once on fresh test sites of PHerc0814 and PHerc0841 next to seven community snaps, under a rule fixed before it ran. Truth is the recto face in a finer scan of the same scroll (1.129 µm for PHerc0814, 2.403 µm for PHerc0841), registered per site; 71 sites were scored. Pooled, labelsnap moved labels 2.15 voxels closer to that face than the published labels (95% interval 1.82 to 2.51) and 1.89 closer than VC3D's vc_objrefine with thresholds tuned on PHerc0139 (1.48 to 2.35). It was also closer than vc_objrefine as shipped, recto-offset r2 with and without its gate, surface_placement_audit, RectoRefine's midline and a snap onto a surface prediction, on each scroll and pooled. Within 1 voxel: 55% (PHerc0814) and 66% (PHerc0841) for labelsnap, 19% for the published labels on both, 22% and 21% for the best community snap. Every control held: reversing the move pushed labels away, a random sign gained nothing.
Limits: PHerc0814 is held out by site, not by scroll. The test shows labels moved closer to the face, not every vertex within 1 voxel. A label displaced toward the verso was not shown to come back. The midline and nearest-peak snaps aim at the sheet center by design, so part of their loss is that target. Where a finer scan exists, finesnap did better than labelsnap on PHerc0814 by 0.93 voxels. The released PHerc0841 meshes were not scored here, because their finesnap read the same 2.403 µm scan this test used as truth.
What is in each segment folder
snapped.tifxyz/: the moved mesh, same grid as the source;-1where there is no vertex or it was held back.abstain.tif: 0 snapped (face measured at the vertex), 1 not measured and left at its published position, 2 not measured and moved by the offset filled in from measured neighbors (filled), 255 no vertex or held back. Version 1.0.1 added code 2; in 1.0.0 filled vertices were 1.confidence.tif(0 to 1),reason.tif(why no face was measured),source.tif(finesnap: 1 fine scan, 2 label scan).release_mask.tif: 0 released, 1 held back for evaluation, 255 not in the source mesh.release.json: source URLs, checksums and the summary.
Limits
A snap moves along the normal only; it does not fix a label that follows the wrong wrap. Where two sheets touch, the face it finds can belong to the neighbor. Small regions are held back for evaluation and five segments of PHerc0139 and one of PHerc0841 are not included. The meshes are geometry: they say nothing about ink or text.
Scans and source meshes: Vesuvius Challenge open data, CC BY-NC 4.0; the snapped meshes are shared under the same terms. Page code Apache 2.0. Made by Chase Hendrick.
Connect your tool
The snapped meshes, their records and the CT they sit on read straight from these URLs, logged out. Every segment is a tifxyz folder, so VC3D, villa and anything that reads tifxyz opens it as it is.
Snapped labels: every segment, with index.json and checksums
https://huggingface.co/datasets/SharpMeow/vesuvius-snapped-labelsPython (huggingface_hub)tested 2026-10-24
# pip install huggingface_hub
from huggingface_hub import hf_hub_download, snapshot_download
path = hf_hub_download("SharpMeow/vesuvius-snapped-labels", "index.json", repo_type="dataset") # one file, cached
folder = snapshot_download("SharpMeow/vesuvius-snapped-labels", repo_type="dataset")Command line (hf)tested 2026-10-24
pip install -U huggingface_hub
hf download SharpMeow/vesuvius-snapped-labels index.json --repo-type dataset --local-dir vesuvius-snapped-labelscurltested 2026-10-24
curl -L -O https://huggingface.co/datasets/SharpMeow/vesuvius-snapped-labels/resolve/main/index.jsonOne snapped mesh (tifxyz): PHerc0841 w00
https://huggingface.co/datasets/SharpMeow/vesuvius-snapped-labels/resolve/main/PHerc0841/20260220213127-w00/snapped.tifxyzPython (numpy, tifffile)tested 2026-10-24
# pip install numpy tifffile
import io, json, urllib.request
import numpy as np, tifffile
T = "https://huggingface.co/datasets/SharpMeow/vesuvius-snapped-labels/resolve/main/PHerc0841/20260220213127-w00/snapped.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 surfaceThe CT that mesh is in, PHerc0841 9.366 um
https://vesuvius-challenge-open-data.s3.us-east-1.amazonaws.com/PHerc0841/volumes/20250821151531-9.366um-1.2m-113keV-masked.zarrPython (zarr)tested 2026-10-24
# pip install "zarr>=3" fsspec aiohttp
import zarr
root = zarr.open_group("https://vesuvius-challenge-open-data.s3.us-east-1.amazonaws.com/PHerc0841/volumes/20250821151531-9.366um-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[3600:3664, 600:664, 500:564] # (z, y, x); reads only the chunks it touchesvilla's vesuvius packagetested 2026-10-24
# 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/PHerc0841/volumes/20250821151531-9.366um-1.2m-113keV-masked.zarr/2") # one pyramid level
block = v[3600:3664, 600:664, 500:564]VC3Dfrom villa's source
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/PHerc0841/volumes/20250821151531-9.366um-1.2m-113keV-masked.zarr
It accepts http, https and s3 OME-Zarr roots.neuroglancertested 2026-10-24
Open in neuroglancerhttps://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%2FPHerc0841%2Fvolumes%2F20250821151531-9.366um-1.2m-113keV-masked.zarr%2F%22%2C%22name%22%3A%22The%20CT%20that%20mesh%20is%20in%2C%20PHerc0841%209.366%20um%22%7D%5D%2C%22layout%22%3A%224panel%22%7Dcurltested 2026-10-24
curl -s https://vesuvius-challenge-open-data.s3.us-east-1.amazonaws.com/PHerc0841/volumes/20250821151531-9.366um-1.2m-113keV-masked.zarr/.zattrs # OME multiscales metadata
curl -s https://vesuvius-challenge-open-data.s3.us-east-1.amazonaws.com/PHerc0841/volumes/20250821151531-9.366um-1.2m-113keV-masked.zarr/2/.zarray # one level: shape, chunks, dtype, codecThis page's own files
https://sharpmeow-snapped-labels.static.hf.space/Links and embedtested 2026-10-24
The dataset card: https://huggingface.co/datasets/SharpMeow/vesuvius-snapped-labels
A segment's cross sections for the viewer (float32 rows, see the .json beside it): https://huggingface.co/datasets/SharpMeow/vesuvius-snapped-labels/resolve/main/viewer/PHerc0841/20260220213127-w00.json
Page source: https://github.com/ChaseHendrick/Scrolls/tree/main/spaces/snapped-labels