JPEG
- Fields removed
- 1
- Removable fields left
- 0
- Decoded pixels
- Identical in this test
- File size
- 989 → 924 B
Our controlled browser experiments show what metadata cleanup removes and what it leaves behind. Download the synthetic files, check the measurements, and repeat the steps yourself.
By TuliAI · Page revised:
Latest measurement: . Each experiment retains its own date, files and results; a page revision does not mean the measurements were repeated.
Data license: the synthetic sample files and measured results on this page are published under CC BY 4.0. You can reuse them if you credit BeforeShare and link to this page.
In these three fixtures, reinspection found zero supported removable fields after cleaning, and all three files decoded to identical pixels. JPEG, PNG, and WebP are cleaned at the container level without re-encoding. Dimensions stayed the same in all three files.
Inspect a fixture or your own imageImage test: · chromium 145.0.7632.6
This is one synthetic still image per format, not a benchmark of every image or generator. The PNG contains a constructed C2PA-like container for detection testing, not a signed credential or a real provider export. We do not validate C2PA signatures, prove authorship, test invisible watermarks, or certify that every hidden field is gone. Animation, color profiles, other browsers and real-world files need separate tests.
Workflow test: · chromium 145.0.7632.6
We created two synthetic PNGs with a ComfyUI-style prompt, seed and workflow JSON. We ran the actual BeforeShare download and compared it with ExifTool 13.59. In both cases, BeforeShare removed both workflow containers while preserving the same IDAT image stream and decoded pixels.
Important result: ExifTool removed the recognized tEXt prompt and workflow fields, but its -all= command left the second file’s private comf chunks intact. That describes ExifTool 13.59 and these exact fixtures; it is not a universal limitation.
These are two synthetic still PNGs, not real ComfyUI exports. The second fixture models private comf storage but is not animated. The test does not cover every ExifTool command, option, version or format, signed C2PA, or proprietary watermarks. ExifTool supports far more formats and advanced operations than BeforeShare.
BeforeShare experiment · TuliAI ·
We created one synthetic PDF and one synthetic DOCX, cleaned them with the actual tool buttons, and checked the downloaded files with pdf-lib and JSZip as well as the cleaner receipt. Detected supported fields were removed in both. A name written in the content remained in both: metadata cleanup does not redact visible content.
Info and catalog XMP removed. One page and its content stream retained. The reviewer annotation remains.
Author, company and comment removed. Inserted text accepted and deleted text discarded. The name in the paragraph remains.
Download the independent verifier (JavaScript)
npm install --no-save pdf-lib jszip
node verify-documents.mjs
node verify-documents.mjs my-clean.pdf my-clean.docxResults, checks and SHA-256 hashes (JSON) · PDF receipt · DOCX receipt
Limits: these are two deliberately constructed files, not customer documents or coverage of every Office or PDF feature. We compared PDF content streams, not complete renderings. We did not test encryption, signatures, macros or every embedded object. The receipt uses the same engine for reinspection; the verifier adds specific independent checks. A hash identifies bytes, not universal safety. ZIP timestamps can change the DOCX hash on a repeat run.
chromium 145.0.7632.6 · Method and corrections: contact TuliAI.
Download an original fixture above, select it in the tool, then clean it and save the cleanup report. The report identifies your output with SHA-256. Because cleaning copies image data without re-encoding, the same input file produces the same output hash in any supported browser.
Inspect a fixture or your own image →Run from the app repository after installing its dependencies. The test uses the published fixtures and asserts real cleanup and pixel behavior. It does not replace the full regression suite.
npm run build
npx playwright test tests/e2e/cleanup-study.spec.mjsExecutable test: Download browser test source
{
"engineSourceSha256": "1586d4b6defd3053daa4bca94868b7826b56c8e7a0eeda90d0f3619cfa4197ff",
"testedAt": "2026-10-10T17:31:18.608Z",
"browser": "chromium 145.0.7632.6",
"scope": "Three synthetic still images. Not provider exports, signed C2PA validation, animation or universal format coverage.",
"rows": [
{
"format": "JPEG",
"fixture": "synthetic.jpg",
"inputSha256": "eb47ea573dbeca14e8d5c9ea4bfafd2a63afd269ca8b02a0d80d885b7aea401c",
"outputSha256": "dfe906d75ecc0bee3721d04c082968241fba7607518ac36899e2c396a45f6b3f",
"inputBytes": 989,
"outputBytes": 924,
"removedCount": 1,
"residualCount": 0,
"width": 32,
"height": 24,
"pixelsEqual": true
},
{
"format": "PNG",
"fixture": "synthetic.png",
"inputSha256": "ed60f185c99d42c460296fcf4bf41efe89abf349db315a42f1f0c36f30e4348b",
"outputSha256": "5f8564422b1aa2e65999237b5fe9eca4ed4296f22eb28c05246bc21a4a598e13",
"inputBytes": 282,
"outputBytes": 72,
"removedCount": 2,
"residualCount": 0,
"width": 8,
"height": 8,
"pixelsEqual": true
},
{
"format": "WebP",
"fixture": "synthetic.webp",
"inputSha256": "a64ffe91bdcb17056442681f77c48b2f53bb831abc1202bd47bc44cf9665287c",
"outputSha256": "1138f8186cfe30696561aae8bf415b3d115dc7f2340ac0713fe3050530d19fa4",
"inputBytes": 888,
"outputBytes": 650,
"removedCount": 2,
"residualCount": 0,
"width": 32,
"height": 24,
"pixelsEqual": true
}
]
}