Local-first image metadata workbench
Know what an image carries. Drop what it shouldn’t.
Inspect a whole image set, remove private container data without touching encoded pixels, and leave with cleaned files plus proof of what changed.
No account · no upload · source files stay read-only
Files never cross the network.
Encoded pixels remain unchanged.
Files, folders, ZIP + manifest.
Unsafe formats stay inspect-only.
01 / Browser workbench
Bring the whole folder.
Deep inspection for common web containers, basic facts for everything else. MetaDrop only enables cleaning when it can preserve the image payload.
Drop images or a folder here
Up to 200 files per local batch. Nothing is uploaded.
Your inspection table will appear here.
Each row shows the file, detected container, embedded fields, privacy flags, cleanability, and verification result.
02 / Format contract
Honest support beats an “all formats” badge.
Every container gets an explicit capability. If MetaDrop cannot validate a byte-safe rewrite, the workbench shows what it can and leaves the file untouched.
Heads up Removing C2PA content credentials changes provenance state. MetaDrop reports the removal explicitly; it never markets provenance changes as detector evasion.
03 / Production API contract
The same contract,
one request.
Move from a browser check to repeatable media hygiene in CI, ingestion pipelines, DAMs, and upload services. Jobs return partial per-file results instead of hiding one failure behind the whole batch.
GET /api/openapi.jsonGET /api/v1/capabilitiesImplemented by the included Axum service. Run cargo run -p metadrop-api to use this exact contract on port 8080.
curl -X POST https://metaclean.help/api/v1/batches \
-H "Authorization: Bearer $METADROP_API_KEY" \
-F "files=@campaign/hero.jpg" \
-F "files=@campaign/card.png" \
-F 'options={"policy":"privacy-v1","failure_policy":"best_effort","verify":true};type=application/json'
# 202 Accepted
{
"id": "job_019f…",
"operation": "clean",
"status": "queued",
"progress": { "total": 2, "completed": 0, "succeeded": 0, "failed": 0 },
"links": {
"self": "/api/v1/batches/job_019f…",
"report": "/api/v1/batches/job_019f…/report",
"download": null
}
}/api/v1/images/inspectInspect one multipart image
/api/v1/images/cleanClean one image synchronously
/api/v1/batchesQueue a multi-file job · 202
/api/v1/batches/{job_id}Poll partial per-file results
/api/v1/batches/{job_id}/downloadDownload result archive
/api/v1/batches/{job_id}Delete job and retained files
04 / Processing pipeline
Evidence at every handoff.
The browser path is deliberately small: identify the real container, inventory its metadata, rewrite only approved blocks, then parse the output again.
- 01Sniff the bytesSIG
File signatures, not extensions, decide the parser. Mislabeled files fail closed.
- 02Inventory fieldsMAP
Group EXIF, GPS, XMP, IPTC, text, color, and provenance before changing anything.
- 03Rewrite the containerCUT
Drop approved metadata blocks while copying compressed pixels and animation byte-for-byte.
- 04Verify + manifestOK
Re-inspect outputs, hash every result, and package the evidence beside the files.
Your files. Your policy. Your proof.