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 image

Measured results

Image test: · chromium 145.0.7632.6

JPEG

Fields removed
1
Removable fields left
0
Decoded pixels
Identical in this test
File size
989 → 924 B
Download synthetic JPEG

PNG

Fields removed
2
Removable fields left
0
Decoded pixels
Identical in this test
File size
282 → 72 B
Download synthetic PNG

WebP

Fields removed
2
Removable fields left
0
Decoded pixels
Identical in this test
File size
888 → 650 B
Download synthetic WebP

Download the measured results (JSON)

Small test. Explicit limits.

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

Test: ComfyUI workflow metadata and ExifTool

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.

Download results and commands (JSON)

Comparison limits

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 ·

PDF and Word: what is removed and what remains

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.

How to repeat and check the experiment

  1. Download a synthetic original, select it in the PDF or Word cleaner, and save the clean copy and its report. You do not need a personal file.
  2. Open the PDF and DOCX in their viewers. The visible name remains; the PDF also retains the annotation. Compare Word review history in the original and the copy.
  3. For an independent check, download the verifier below. With Node.js installed, run these commands in an empty folder. With no arguments it checks the published copies; the second mode checks copies you cleaned yourself.

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.docx

Results, 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.

How we tested

  1. Created synthetic JPEG author metadata, PNG prompt text and a structural provenance container, and WebP XMP metadata.
  2. Selected each fixture in the English AI-metadata tool, cleaned it, and read the actual post-clean report.
  3. Decoded both files in the same browser. Compared dimensions and a SHA-256 hash of the RGBA pixels; PNG/WebP had to match.
  4. Recorded input/output file hashes, byte counts, removed-field counts, remaining supported fields and browser version.

Repeat it yourself

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 →
Technical record and reproduction

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.mjs

Executable 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
    }
  ]
}

Format references