The darkroom · every byte examined here

What is in
the picture.

Drop a photograph and this page reads the file itself, byte by byte — the JPEG markers, the PNG chunks, the EXIF ledger a camera writes into every frame. Camera, lens, dates, software, and — if the file carries one — the exact place it was taken, each with the hex offset where the bytes sit. Then the bench: a waveform monitor, an RGB parade, a noise-variance map, and an error-level wipe over the original.

No byte of your photograph ever leaves this machine. The walkers, the instruments and the press are all in this page’s own script — no upload, no thumbnail service, no library, no network call on the file. When you are done, the press hands back a clean copy with the metadata gone and the savings counted to the byte.

JPEG, PNG, WebP and HEIF containers walked by hand · a hand-written TIFF/EXIF walker · 4 instruments · zero network calls on the file

The ledger

The file, read by hand.

The container is parsed by this page’s own walkers — no decoder library, no guesswork. Every marker, chunk and box is listed with its offset and size; every metadata field is named, valued and located. What the bytes do not say, the ledger does not invent.

Byte ledger

waiting for a photograph

Drop a photograph anywhere on this panel — or pick one.

JPEG, PNG, WebP and HEIC/HEIF are walked in full; anything else is identified by its magic bytes and decoded if this browser can. The file is read into this page’s memory and nowhere else.

Nothing read yet. The ledger reads the container even when the pixels will not decode.

The bench

Instruments, not verdicts.

Four readings off the decoded pixels. The waveform and the parade are the broadcast engineer’s exposure instruments; the noise map measures high-frequency variance tile by tile; the error-level wipe re-encodes the frame as JPEG at quality 0.75 and amplifies what moved. Each one shows a property of the image — none of them, alone, proves anything about its history.

Instruments

waiting for pixels

Waveform monitor — luma

RGB parade

Noise map — variance per 16×16 tile

Brighter tiles carry more high-frequency energy. A region markedly quieter or louder than its surroundings has a different texture — which can be grain, blur, sky, or an edit. The map measures; it does not judge.

Error-level wipe — original | re-encoded difference ×18

Wipe

Left of the line is the photograph; right of the line, the absolute difference against a fresh quality-0.75 JPEG, amplified eighteen times. Uniform texture is ordinary; the instrument reads a whole image, not a region’s guilt.

The instruments read a working copy capped at 1200 px on the long edge — the ledger and the press read the real thing.

The press

The same picture, carrying nothing.

The press redraws the decoded pixels and re-encodes them — PNG in, PNG out; everything else comes back as JPEG — through the browser’s own encoder, so nothing the camera wrote can carry over. No maker, no dates, no GPS, no thumbnail; at most the encoder tags its own generic sRGB colour profile. The download is labelled with the exact byte difference, and the pressed file is read back through the same ledger above — whatever survived is named there, not rounded down to zero.

Press

waiting for pixels

The press re-encodes pixels — the copy is visually the same picture, not a bit-identical one. A JPEG pressing of a JPEG is a second compression, said plainly here because most “metadata removers” do exactly this without saying it.

About

A darkroom, not a service.

Everything on this page happens in this page. The container walkers — JPEG markers, the little-endian/big-endian TIFF walker under EXIF, PNG chunks, RIFF and ISO-BMFF boxes — are written into the page’s own script, and they read the file exactly as it sits in this browser’s memory. No byte of the photograph is sent anywhere: there is no upload, no analysis API, no preview service. Close the tab and the picture is gone.

The limits, plainly. The instruments read a working copy capped at 1200 px on the long edge, so the page stays inside its memory on a 50-megapixel frame. Error-level analysis and the noise map are instruments, not verdicts — they show where an image’s statistics change, and ordinary photographs change statistics at every edge and sky. HEIC pixels decode only where the browser can; when it cannot, the page says so and the byte ledger still reads the container in full. The press re-encodes pixels rather than splicing the original stream, so its copy is clean by construction — and a second compression, which it admits.

What the file does not say, the ledger does not invent. A field is listed because its bytes are in the file, at the offset shown — and a photograph with GPS in it is called what it is: a photograph that carries a location.