The darkroom · no photo leaves this page
What your photos say,
and a clean copy to send.
A photograph from a phone carries more than the picture: the make and model, the lens, the second it was taken and, very often, the place, to within a few metres. Drop some here and read all of it. Then strip it out without re-encoding a single pixel, or develop a whole batch into JPEG, PNG or WebP at the size you need.
Everything happens in this tab. There is no upload button because there is no upload: nothing in the page sends a file, it is served with a header that lets it reach only this site and Google’s analytics, and the method at the foot of the page says how to watch that for yourself.
JPEG, PNG, WebP and HEIC read by hand · EXIF, GPS, XMP and IPTC · a lossless strip, all or only the location · convert, resize, compress and crop · 0 bytes uploaded
The tray
Drop them in. Read them. Clean them.
Each photograph gets a card: what the file really is (by its bytes, not its name), its size, and a flag for every thing in it that points at a place or a person. What it says opens the lot, tag by tag. Strip takes the metadata out and leaves the picture exactly as it was; Develop writes a new file in the format and size the developer is set to. Beside the tray, the bench holds the other tools — the Exif viewer, Convert, Resize, Compress and Crop. Several photos at once is the point: the buttons under the drop zone do the whole tray.
The tray
Empty — nothing read yet
Drop photographs hereYour photographs, read here
JPEG, PNG and WebP; HEIC and AVIF where this browser can decode them. Or paste an image. Nothing is uploaded.
The tray is empty. Choose some photographs, drop them anywhere on this page, paste one, or try the sample — a picture drawn by this site whose metadata was written by hand the way a phone writes it.
A batch lives in this tab’s memory until you clear it or close the tab. Nothing is written to the browser’s storage except the developer’s settings.
Six tools, one tray
Each tool has a page of its own.
Every tool page carries this same tray and opens the bench on its own tool; the tabs switch tools in place, so the photos already in the tray stay where they are. Each page says more about its one job.
- Exif viewerEvery tag in a photo named and decoded — camera, lens, date, the GPS position — with XMP, IPTC and the colour profile.
- Remove EXIF and GPSAll the metadata, or only the location, out without re-encoding: the picture’s bytes are copied and read back.
- ConvertTo WebP, JPEG or PNG with the browser’s own encoder — and AVIF where it can write it.
- ResizeFit photos inside a box of pixels, or set an exact size — one or a batch, as one ZIP.
- CompressA quality slider that shows the new size in bytes before you download.
- CropDrag a frame or type exact pixels; hold 1:1, 4:3, 3:2, 16:9 or 4:5.
How to read a card
A card’s left edge gives the verdict before a word is read: red, the file says where it was taken; amber, it names a place or a person, or carries a passenger such as a thumbnail or a second picture; green, nothing at all. The chips under the name say what it carries, and a serial number or an owner’s name is flagged identifying, because that is what matches one photo to one camera across the web. What it says opens every tag in plain words, filed by what it gives away, and Every tag, raw under it shows each directory as it is stored.
Lossless, and not
A JPEG is a run of segments; a PNG and a WebP are runs of chunks. Some hold the compressed picture and some hold notes about it. Strip copies the first kind byte for byte and leaves the second out, so the picture cannot lose anything — and the page proves it on every strip by comparing the image data. Developing, converting, resizing, compressing and cropping are different: they decode the picture, draw it on a canvas and encode it again, in sRGB, with none of the original’s metadata and none of its colour profile carried over.
What a photo carries
The picture is not the whole file.
01 · WHERE
A place, to a few metres
With location on for the camera, a phone writes latitude, longitude and altitude into EXIF’s GPS directory, often with the accuracy of the fix and the direction the lens faced. Editing software may add a city and country in XMP or IPTC as well. Many social platforms remove all of it when they re-encode an upload; a photo sent as an attachment, a document or a cloud link usually arrives with every byte.
02 · WHO AND WHEN
A camera, sometimes a name
The make, model and lens; the moment, to the second, with its offset from UTC on newer phones. Interchangeable-lens bodies commonly write their serial number, and many let the owner set a name that goes into every frame. Serial numbers are how photos get matched to one camera across the web — the darkroom flags every field of that kind.
03 · PASSENGERS
A thumbnail, a history, a second picture
A small thumbnail the camera made, which an editor may not rewrite — so a crop can survive, uncropped, in miniature. XMP that records the software and every step of an edit. Maker notes no one publishes a key to. And after the image’s end marker, sometimes a whole second file: a depth map, a gain map, a motion photo’s video.
One thing no tool can strip: the picture itself. A street sign, a view from a window or a reflection says where a photo was taken with no metadata at all.
Method
What is read, what is written, and what is sent: nothing.
Read by hand
No library reads your files. The page walks each container itself, following the published formats: the JPEG marker stream (ITU-T T.81 and JFIF 1.02); EXIF 3.0 (CIPA DC-008) on the TIFF 6.0 directory structure, including the GPS and thumbnail directories; PNG’s chunks (the W3C PNG specification, third edition); the WebP RIFF container (RFC 9649); and the item boxes of HEIF (ISO/IEC 23008-12), which is what HEIC and AVIF are. XMP (ISO 16684-1) is read by pattern, not by a full RDF parser, and IPTC IIM from Photoshop’s APP13 resources. Maker notes are counted and labelled, never decoded: their layouts are private to each manufacturer.
What a file is comes from its first bytes, not its name, so
a PNG called .jpg is read as the PNG it is.
Compressed PNG text is inflated with the browser’s own
DecompressionStream.
Tags are named from a register of 310 — 273 TIFF, Exif and
DNG tags, 32 GPS tags and 5 interoperability tags, generated from
Pillow 11.3.0’s PIL.ExifTags — and 176 of
them also carry this page’s own plain words and drawer. The
38 tables that turn a value into words were written for this bench
and checked key by key against ExifTool’s published tag
tables, as were 39 IPTC dataset names and 8 Photoshop resource
names; 25 PNG chunk types were checked against the W3C
specification. The colour profile is read by its header
— version, class, colour space — not just its name.
On a phone, the system photo picker can hand the page a copy rather than the original — an iPhone may turn HEIC into JPEG and may leave the location out on the way — so what is read here is the file the picker gave. Choosing from the Files app gives the original.
Strip, exactly
JPEG: every APP1 (EXIF, XMP), APP13 (Photoshop and IPTC) and comment segment is dropped, with the other application segments, the multi-picture index and anything after the end-of-image marker. The JFIF header, the colour profile (APP2 ICC, unless you ask for it to go) and Adobe’s colour-transform flag are kept, because the colours depend on them. PNG: tEXt, zTXt, iTXt, eXIf, tIME and C2PA chunks go; nothing else is touched. WebP: the EXIF and XMP chunks go and the header’s flags are corrected.
The scan data is copied, not decoded, so the picture is identical to the byte — and the page proves it on every strip by reading the new file back with the same walker and comparing the image data byte for byte, and then says how many things are still in the file. HEIC is read but not stripped in place; Develop writes a clean copy instead.
Only the location takes the GPS pointer out of the first directory and sets every byte of the GPS directory and its values to zero where they stand, so the coordinates are gone rather than unlinked and the EXIF block keeps its length. An XMP packet that mentions GPS goes whole, and so does a PNG’s hex-encoded EXIF profile that holds GPS. The maker note, the thumbnail and place names typed into captions or IPTC stay; the read-back lists them.
Develop
The browser decodes the photo (upright, by its Orientation), draws it on a canvas at the size asked for — in two steps when it shrinks a lot, for a cleaner result — and encodes it with its own JPEG, PNG or WebP encoder. The new file carries no EXIF, GPS, XMP or IPTC — the page reads it back to show that — though some browsers add a standard sRGB colour profile. It is 8-bit sRGB: a wide-gamut photo loses its extra colour, and an animation keeps its first frame. Whether this browser can write WebP or AVIF is tested, not assumed: where it cannot, the option is switched off and the page says why. iPhones and iPads cap a canvas at about 16.7 megapixels; before anything is drawn, the canvas is made, one pixel is put in its far corner and read back, and a refusal is reported as one, never as a blank file. Resize and Develop ask the decoder for the smaller size directly where the photo is not turned by its Orientation, so a large photo can often be reduced even where it could not be drawn whole. Convert, Resize, Compress and Crop work the same way, each with its own page.
Nothing is sent
There is no upstream. The page fetches its own files, and the
sample card from this site when you ask for it; your
photographs are read from disk into this tab’s memory
and written back out as downloads made in that memory. The
folder is served with a Content-Security-Policy header that
backs this up in the browser. Its connect-src
allows this site and Google’s analytics and
ad-measurement hosts — *.google-analytics.com,
analytics.google.com and
*.analytics.google.com,
*.googletagmanager.com,
www.google.com and its country domains, and
stats.g.doubleclick.net — and nothing
else; its img-src allows this site,
data:, blob: and the tag’s
two hosts. So even a mistake in this page could not send a
photograph to any other server: the browser would refuse
it. The analytics tag counts the visit and that a tool was
used; nothing here hands it a file name, a pixel or a tag.
To check it yourself: open the developer tools, choose
the Network tab, clear it, then drop a photo, strip it and
develop it. The list stays empty of anything carrying your
file; blob: rows are the page reading its own
memory. Or load the page, switch the network off, and use it
— it works the same.
Limits, all in one place
- A lossless strip: JPEG, PNG and WebP. HEIC and AVIF are read, not rewritten.
- Decoding HEIC, AVIF or TIFF depends on the browser. The page tests, and says so plainly when it cannot.
- Maker notes, extended XMP and JIS-encoded comments are named and measured, not decoded.
- “Only the location” removes the GPS directory, an XMP packet that mentions GPS, and a PNG’s hex EXIF profile that holds it. It leaves the maker note, the thumbnail and typed place names.
- Canvas tools write sRGB, carry no colour profile of the original, keep one frame of an animation, and stop at the browser’s canvas limit. MDN notes that iOS devices limit a canvas to 4,096 × 4,096 pixels.
- This page’s own rules: files over 300 MB are not read; pictures over 100 megapixels are not decoded (Strip still works on them).
- The zip is written without ZIP64: 65,535 files and 4 GB at most.
- No tool removes what a picture shows.
Not advice
This page states what a file contains and what the named sources say. It is not legal advice about privacy, copyright or evidence. Removing a copyright notice from a picture you do not own may be unlawful where you live.
Every source, and the day it was read
- ExifTool tag tables — EXIF: what each value means; the value tables were checked against it key by key. Read 2026-09-28.
- ExifTool tag tables — GPS: the GPS directory’s tags and reference letters. Read 2026-09-28.
- ExifTool tag tables — IPTC: dataset numbers and names. Read 2026-09-28.
- ExifTool tag tables — Photoshop: image resource numbers (0x0404 is the IPTC block). Read 2026-09-28.
- ExifTool tag tables — JPEG: which application segment carries what, and the trailers phones append. Read 2026-09-28.
- JPEG File Interchange Format 1.02: the JFIF header — version, density, thumbnail. Read 2026-09-28.
- ITU-T T.81 (JPEG), hosted by W3C: marker codes and the structure of a JPEG stream. Read 2026-09-28.
- W3C PNG Specification, Third Edition: chunk types and eXIf. Read 2026-09-28.
- Google — WebP Container Specification: RIFF chunks, the VP8X flags, EXIF, XMP and ICCP. Read 2026-09-28.
- WHATWG HTML — the canvas element: sRGB by default, quality from 0.0 to 1.0, and how a browser answers a format it cannot write. Read 2026-09-28.
- MDN — <canvas>: maximum canvas size: the iOS limit of 4,096 × 4,096 pixels. Read 2026-09-28.
- MDN — createImageBitmap(): decoding upright, by the EXIF orientation, and to a smaller size. Read 2026-09-28.
- PKWARE — .ZIP File Format Specification: stored entries, CRC-32, UTF-8 names. Read 2026-09-28.
- Pillow — PIL.ExifTags: the 310 tag names were generated from it (Pillow 11.3.0). Read 2026-09-28.
Tag names from Pillow: © 1997–2011 Secret Labs AB, © 1995–2011 Fredrik Lundh
and contributors, © 2010 Jeffrey A. Clark and contributors, under the MIT-CMU licence, whose
notice travels with them in darkroom-tags.js. The bench’s strip-only-the-GPS,
colour-profile, crop, compress and resize tools came from photo.com.im, the LABS photo site this
bench replaces.
One photograph under a forensic lamp — waveform, noise and error-level views — is Glass. Audio, video, documents and archives are OmniFile. Questions and corrections: labs@labs.llc.