Repository navigation
Releases: ChaseHendrick/Scrolls
Release list
AutoPipeline 0.1.10
AutoPipeline runs villa's pipeline from a released Vesuvius Challenge scan to a scored ink map, with a rule fixed before the run in place of each choice a person usually makes by eye, and a control beside every check.
What changed in 0.1.10
- Labels, fibers and joins after a run.
kit apcoupleadds three swappable stages, each with anoffchoice:labelsmoves each accepted surface onto the recto face of its sheet (Snapped Labels' placement code),fiberstraces papyrus fibers around it with Weft, our fiber tracer, from the public probabilities made with Qual's AFV V2 model, andjoinsscores glued sheet joins at the fiber ends along it, with a control point 3 cm back along the surface beside each score.from-runfollows a finished AutoPipeline run;initstarts from any tifxyz surface;swapruns two choices side by side and writes what changed. - Also:
kit switchfix barrier2(experimental, off by default), a faster region crop, and API and MCP tools in the ink Space.
The three new steps are experimental: a smoke run on public data shows they run, not that any label, fiber or score is right. Every surface, label, fiber, score and map is model output, not a reading. Full notes: CHANGES.md.
Try it
git clone --branch submission/progress-2026-10-fix10 --depth 1 https://github.com/ChaseHendrick/Scrolls.git scrolls-autopipeline
cd scrolls-autopipeline/submissions/progress-2026-10-fix10/autopipeline
python3 -m venv .venv && . .venv/bin/activate # Python 3.11 or newer
python -m pip install -e '.[couple]'
python scripts/demo_synthetic.py # every step on a synthetic scroll; prints DEMO PASS
scrolls-kit stages list labels # the new stages' choicesGuide: package README.
Lasagnetta 0.1.1
Lasagnetta writes a fast preview of villa's lasagna field (cos, grad_mag and sheet normals) in villa's own layout, so anything that opens a villa lasagna field opens a preview. It averages three small 3D U-Net students distilled from villa's lasagna net; the weights are on Hugging Face at SharpMeow/lasagnetta (CC BY-NC 4.0).
What changed in 0.1.1
- Faster end to end. The finest level is written while later tiles still run, the coarser levels are pooled on the GPU, and each batch copies back to pinned host memory while the next one runs. On one RTX Pro 6000 with a 1024 x 2048 x 2048 region of PHerc0800: 0.1.0 took 58.2 s, 0.1.1 takes 44.9 s, and
--tile 320 576 576takes 35.2 s. villapredict3dtook 234.2 s on the same GPU and region, so the preview is 5.2 times faster (6.6 times with the larger tile), up from 4.0. - Same output. Same weights and recipe. cos and grad_mag are byte-identical to 0.1.0 at the default tile;
--pyramid cpumakes every level byte-identical. Agreement with the published field on that region is unchanged (peak F1 0.851, cos r 0.933). - New options:
--tile(one size or Z Y X),--pyramid auto|gpu|cpuand--no-stream.
On five scans no student trained on, the release agrees with villa's field at pooled peak F1 0.86, cos r 0.91 and a median normal angle of 3.1 degrees. --self-check runs villa's net on 12 spots of your region first and says where to use villa instead.
Try it
git clone https://github.com/ChaseHendrick/Scrolls && cd Scrolls
pip install torch numpy numcodecs huggingface_hub
python scripts/lasagnetta/preview.py --checkpoint release --tile 320 576 576 \
--ct s3://vesuvius-challenge-open-data/PHerc0139/volumes/20260102150214-2.399um-0.2m-78keV-masked.zarr/2 \
--region 9472 9984 3072 3584 4096 4608 --input-level 2 --out out --name PHerc0139Guide: docs/tools/lasagnetta.md. Code Apache-2.0; the teacher is villa's lasagna (MIT). A preview is model output of another model's output, not a reading; villa's own field stays the reference where exact values matter.
AutoPipeline 0.1.9
AutoPipeline runs villa's pipeline from a released Vesuvius Challenge scan to a scored ink map, with a rule fixed before the run in place of each choice a person usually makes by eye, and a control beside every check.
What changed in 0.1.9
- Swap any stage by name.
python -m kit stageslists every option of every stage (umbilicus, surface, trace, repair, flatten, render, ink, ensemble and others) with who made it, its licence, its maturity (default, validated, experimental, pending or failed) and why.python -m kit autopipeline plan SAMPLE --use STAGE=NAME(repeatable, orKIT_STAGE_<STAGE>in the environment) writes the pick into the plan before its digest is fixed. An experimental pick warns and a pending one is refused. Code or weights with no stated licence are only read from their own host at run time. - 3D ink readers in the ink stage.
python -m kit ink3druns a 3D ink model, or reads a published 3D prediction, and projects the volume onto the surface's 2.5D render canvas, so a 3D map and a 2.5D map of one surface share their pixels, labels and scorer. Engines: the organisers' Paris 4 3D model (team-3d-paris4, MIT), villa full_3d checkpoints, published predictions, or any command. Reversed depth means nothing in 3D, so the control is the same read with the sheet moved two sheet pitches out and in; with no measured or given pitch the run refuses. - Unchanged: the default reader stays Reader V3, a plan without a 3D reader keeps its digest, and the ink Space is the same as 0.1.8's.
Every 3D reader is experimental: none has beaten the 2.5D default on a held-out test. These are software changes, not a new ink-accuracy or scroll-reading result. Full notes: CHANGES.md.
Try it
git clone --branch submission/progress-2026-10-fix9 --depth 1 https://github.com/ChaseHendrick/Scrolls.git scrolls-autopipeline
cd scrolls-autopipeline/submissions/progress-2026-10-fix9/autopipeline
python3 -m venv .venv && . .venv/bin/activate # Python 3.11 or newer
python -m pip install -e .
python scripts/demo_synthetic.py # every step on a synthetic scroll; prints DEMO PASS
python -m kit stages # every option of every stageGuide: package README and reference. Every ink map it makes is model output, not a reading.
AutoPipeline 0.1.8
AutoPipeline runs villa's pipeline from a released Vesuvius Challenge scan to a scored ink map, with a rule fixed before the run in place of each choice a person usually makes by eye, and a control beside every check.
What changed in 0.1.8
- Reader V3 is the default reader.
ink.modelsnow defaults to Domenico Russo's Reader V3 (MIT) in place of his Reader v2. Reader V3 continues Reader v2 on 384 px tiles with the same data and keeps the same checkpoint format, so villa's ink detection downloads, checks and runs it the same way, at the patch size its config names. It is the newest release of that family; no rule fixed in advance chose it, and this release does not claim it reads ink better. Its author reports fewer false ink marks on blank papyrus, and also benchmarked PHerc0841 while choosing its recipe. - The ink Space runs Reader V3, sized for its 384 px patches (uploads 384 to 768 px a side). On a CPU, the Space's code reproduced earlier scores of the same checkpoint on two PHerc0841 sample crops to four decimals; those crops were chosen with the labels, so they are development numbers.
- Changed behavior: a plan without
ink.modelsnow uses Reader V3, so its digest differs;"models": ["reader-v2"]keeps the earlier default. The built-in koine route added in 0.1.6 is renamed fromreader-v3toreader-v3-koine.
These are software changes, not a new ink-accuracy or scroll-reading result. Full notes: CHANGES.md.
Try it
git clone --branch submission/progress-2026-10-fix8 --depth 1 https://github.com/ChaseHendrick/Scrolls.git scrolls-autopipeline
cd scrolls-autopipeline/submissions/progress-2026-10-fix8/autopipeline
python3 -m venv .venv && . .venv/bin/activate # Python 3.11 or newer
python -m pip install -e .
python scripts/demo_synthetic.py # every step on a synthetic scroll; prints DEMO PASSGuide: package README and reference. Every ink map it makes is model output, not a reading.
Headless VC3D for agents 1.1.1
Docs only: the package README now shows every one of the 46 tools with a call and result recorded on public PHerc0139 data, client setup for Claude Code, Codex and other MCP clients, a recorded agent session with its GIF and stills, and a table of failure modes. The code is unchanged from 1.1.0. Package: branch submission/progress-2026-10-vc3d-agent-1-1-1, folder submissions/progress-2026-10-vc3d-agent-1-1-1/vc3d-agent. Software only, not an ink or reading result.
Headless VC3D for agents 1.1.0
Adds seven lasagna tools that run villa's lasagna surface fit headless (status, configs, manifest, fit, export, selftest, service), for 46 tools over MCP and the shell. Package: branch submission/progress-2026-10-vc3d-agent-1-1-0, folder submissions/progress-2026-10-vc3d-agent-1-1-0/vc3d-agent (README, docs/lasagna-agents.md). Software only, not an ink or reading result.
Headless VC3D for agents 1.0.0
Headless VC3D for agents 1.0.0: an MCP server and shell command that let an AI agent run villa's VC3D tools with no display.
It serves 39 tools with JSON schemas, progress, cancellation and preview images over stdio (MCP protocol versions 2024-11-05 to 2025-11-25): find Vesuvius Challenge open data, trace, check, render and flatten surfaces, run ink models with the reverse-depth control, drive the VC3D app through its agent bridge, and see each result as a PNG. The checks are built in: render votes on the surface normal before trusting the layer order, audit finds chunks a render would read as zeros, landmarks checks the affine between two scans, and target-scroll ink refuses to run without a preregistered readout rule.
This is the server that shipped inside AutoPipeline, released on its own without AutoPipeline's pipeline tools (umbilicus, seeds, distortion, autopipeline).
Install (Python 3.11 or newer):
git clone --branch submission/progress-2026-10-vc3d-agent --depth 1 https://github.com/ChaseHendrick/Scrolls.git scrolls-vc3d-agent
cd scrolls-vc3d-agent/submissions/progress-2026-10-vc3d-agent/vc3d-agent
python3 -m venv .venv && . .venv/bin/activate
python -m pip install -e ".[maps]"
python -m unittest discover -s tests
claude mcp add vc3d-agent -e VC_APPIMAGE=/path/to/VC3D.AppImage -- "$PWD/.venv/bin/vc3d-agent" vc3d mcpInstall it from the folder (editable): the guides the guide tool serves live there, so no wheel is attached. Tests run every tool against stand-in VC3D tools, with no VC3D, GPU or scan data. This is software, not an ink-accuracy or scroll-reading result. Code under Apache License 2.0; data and model weights keep their own licenses and are not included.
The release commit 9c507bd has no parent and holds only the 90 package files; submissions/progress-2026-10-vc3d-agent/release.json lists their sha256 hashes.
Greek letter classifier weights letterclass-v1
Weights for letterclass, the Greek capital letter classifier and line reader in scripts/letters/ (tool page). Fetch them with python scripts/letters/reader_api.py fetch, which checks each file against scripts/letters/letterclass-weights.json.
- Three ConvNeXt runs (
cb128convnext_base,cs128s0andcs128s1convnext_small, 128 px), trained on Hell-Char's letter crops only (github.com/ipavlopoulos/diachronic-greek-letterforms at aeef8466, CC BY 4.0) from timm's ImageNet weights (Apache-2.0). No ICDAR 2023 image and no scroll data in training. License: CC BY 4.0. letterclass-v1-greek-prose-lm5.json.gz: a Kneser-Ney order-5 letter model of 22 Perseus prose texts (PerseusDL/canonical-greekLit at 0189b9c8), with Homer, poets, verse and quotations left out. License: CC BY-SA 4.0.
In a preregistered head-to-head on the ICDAR 2023 test answers (Zenodo 13825619; 8,479 letters, boxes given), letter error was 0.291 against 0.340 for Hell-Char ConvNeXt-V2. These are photographs of papyri, not ink maps. Every read is model output, not a reading.
AutoPipeline 0.1.7
AutoPipeline runs villa's pipeline from a released Vesuvius Challenge scan to a scored ink map, with a rule fixed before the run in place of each choice a person usually makes by eye, and a control beside every check.
What changed in 0.1.7
- Ink maps in color. The monitor and the ink Space draw ink maps from dark umber (low model score) through copper to pale papyrus (high score), with lightness rising evenly, so a brighter pixel is a higher score in either theme. The reversed control stays on its forward map's scale. Thumbnails are cropped to the surface, off-surface pixels are clear, and small maps are enlarged smoothly instead of in blocks.
- A demo with something to look at. The synthetic demo plants pen strokes in its CT, so the forward map shows them and the reversed control does not.
- Center lines v2.4. The pinned dataset adds a coverage-polished copy of each Center Finder line on 1.2 m scans, and takes it before the original.
- Changed behavior: a plan made by 0.1.6 that names
umbilicus.centerlinespins the old dataset revision and is refused; make the plan again.
These are software and display changes, not a new ink-accuracy or scroll-reading result. Full notes: CHANGES.md.
Try it
git clone --branch submission/progress-2026-10-fix7 --depth 1 https://github.com/ChaseHendrick/Scrolls.git scrolls-autopipeline
cd scrolls-autopipeline/submissions/progress-2026-10-fix7/autopipeline
python3 -m venv .venv && . .venv/bin/activate # Python 3.11 or newer
python -m pip install -e .
python scripts/demo_synthetic.py # every step on a synthetic scroll; prints DEMO PASSGuide: package README and reference. Every ink map it makes is model output, not a reading.
AutoPipeline 0.1.6
AutoPipeline runs villa's pipeline from a released Vesuvius Challenge scan to a scored ink map, with a rule fixed before the run in place of each choice a person usually makes by eye, and a control beside every check.
What changed in 0.1.6
- The monitor fits one screen and has a console. Notes per run, kept under the kit home, and one AutoPipeline, kit or VC3D agent command at a time run as a background job. The console listens on loopback only and is off with
--read-only. - Why a trace failed qa. A rejected trace's qa record lists each failed check with the value it measured and its threshold.
- Opt-in steps, each off unless a plan names it: the Crackle Check gate at report, the published center lines as the scroll axis, other axis backends, a region crop that keeps the clean parts of a rejected trace, edge extension, a stack check, trace budgets with partial results, and z-scored ink ensembles.
- Swap and trace backends. Commands list each stage's backends, check a plan's choices, say which stage and inputs made an output, and make a run with one backend swapped.
- Two built-in ink models,
inkfilterandreader-v3. Reader v2 stays the default. - Changed behavior: a plan naming
qa.repairwithout a method now gets the barrier repair. A plan naming none of the new settings runs as before.
These are software changes, not a new ink-accuracy or scroll-reading result. Full notes: CHANGES.md.
Try it
git clone --branch submission/progress-2026-10-fix6 --depth 1 https://github.com/ChaseHendrick/Scrolls.git scrolls-autopipeline
cd scrolls-autopipeline/submissions/progress-2026-10-fix6/autopipeline
python3 -m venv .venv && . .venv/bin/activate # Python 3.11 or newer
python -m pip install -e .
python scripts/demo_synthetic.py # every step on a synthetic scroll; prints DEMO PASSGuide: package README and reference. Every ink map it makes is model output, not a reading.

