Evidence
The ASC MHL report
Card Offloader writes an ASC MHL manifest next to your footage. This page is not about why that is a good idea — it is about how to check that ours is actually valid, using software that is not ours.
What an MHL is, briefly
An ASC Media Hash List is an XML file that records every file in a folder tree with its checksum, size and modification date, plus who created the list and how. It exists so that a copy can be handed from a shoot to a post house to an archive with a chain of custody that each party can verify independently. The specification is published by the Advanced Data Management Subcommittee of the ASC Motion Imaging Technology Council, and if you want the format itself, read it from them rather than from us.
Several tools write ASC MHL, including free ones. Writing the format is not the achievement. Being able to show that a third party validated your output is.
The verdict
Checked against the reference implementation
We took a manifest produced from our engine's own digests and handed it to ascmhl 1.2, the reference implementation published by Pomfort for the ASC MITC, installed in a clean virtual environment.
- Schema check against the official XSD: validated
verifyexit code 0 — 520 files out of 520 reportedverification (xxh64) … OK
- Directory hashes recomputed from the real files and compared: 6 folders out of 6, both content and structure, identical
- The reference tool then wrote generation 0002 on top of ours, continuing our chain of custody as its own
Test folder of 520 files deliberately built to break things: ampersands, angle brackets, apostrophes and quotation marks in filenames, the same accented name in both NFC and NFD, Japanese, Greek, Cyrillic, emoji, double spaces, an empty file and an empty folder. Performed 22 August 2026 with ascmhl 1.2.
Repeat it yourself
Nothing here needs our cooperation. Install the reference implementation, run an offload, and ask someone else's software what it thinks of the result.
python3 -m venv venv
./venv/bin/pip install ascmhl
./venv/bin/ascmhl --version # ascmhl, version 1.2
# the XSD ships in the source distribution, not in the wheel
./venv/bin/pip download ascmhl --no-binary :all: --no-deps -d sdist
tar xzf sdist/ascmhl-1.2.tar.gz 'ascmhl-1.2/xsd/*.xsd'
Then, against a folder Card Offloader has written:
./venv/bin/ascmhl-debug xsd-schema-check <folder>/ascmhl/*.mhl -xsd xsd/ASCMHL.xsd
./venv/bin/ascmhl-debug verify -v <folder> # expect exit 0
./venv/bin/ascmhl-debug verify -dh -v <folder> # including directory hashes
./venv/bin/ascmhl create -h xxh64 <folder> # continues our chain
That last command is the interesting one. It does not start a new history: it reads generation 0001, re-verifies every file, and appends generation 0002 with action="verified". If our manifest were malformed, or our checksums wrong, or our chain file inconsistent, it would refuse.
A validator that always says yes is worthless
The result above only means something if the same tool rejects a bad copy. So we broke things on purpose and recorded what it said.
| What we did to the folder | Exit | What the tool said |
|---|---|---|
| Appended 6 bytes to one file | 11 | hash mismatch for DCIM/100CANON/IMG_00000.CR3 |
| Added one extra file | 21 | found new file … |
| Removed one file | 10 | 1 missing file(s) |
| Changed a single byte inside the manifest | 31 | Modified ASC MHL manifest in history |
| Left everything alone | 0 | verified |
The fourth row matters more than it looks. The chain file records a C4 ID for every manifest, and the library compares it against the file on disk — so the manifest cannot be quietly edited after the fact, not even by us.
Why our first generation says original, not verified
Open a manifest we wrote and you will see action="original" on every file. It would be reasonable to read that as this hash was never checked
— especially from us, given that we do read every file back off the destination. That reading is wrong, and the reason is worth knowing.
In ASC MHL, verified means this entry updates an earlier record of the same file in this history
. In a first generation there is no earlier record to update. We tried writing verified anyway, because it felt more honest: the reference implementation failed with exit 21 and declared all 520 files to be new, unreferenced files.
original is the correct statement that this is the first recorded hash for this file in this history. Our read-back verification is reported in the PDF and CSV, where it belongs — not by bending an attribute of somebody else's standard until it says what we want.
Directory hashes, and why they are free
The manifest records a content hash and a structure hash for every folder, so it attests not only that the files are intact but that the folder is that folder, complete and in that shape. These cost no extra reading: they are computed from the file digests the engine already produced while reading the card once. We reimplemented the algorithm from scratch and compared it against the reference tool's output on a test tree — 6 folders out of 6 matched on both hashes.
Where the files go
<destination>/
└── ascmhl/
├── 0001_<folder>_<YYYY-MM-DD_HHMMSS>Z.mhl
└── ascmhl_chain.xml
Reports written into the destination alongside your footage — the PDF and the CSV — are declared in the manifest's <ignore> section. Without that, anyone else verifying the folder would get found new file and a failed check for files we put there ourselves. We tested it both ways.
What this does not claim
Writing ASC MHL is not rare. Other tools do it, including free ones: Stow writes ASC-MHL v2 and lastcard writes ASC MHL 2.0 (both checked 24/08/26). The claim on this page is narrower and, we think, more useful: we have run our output past the reference implementation, published what it said, and given you the commands to disagree with us.
The ASC MHL report is a Pro feature. The verification itself is not, and never will be: reading every file back off the destination is in the free tier, in full. See how verification works and what costs what.