The checkThe shipped anchor is opening. Reader-file interpretation is locked.

Your files are the specimen · physical

The Camera in the Noise

Bring at least four unedited, same-size photographs and this local browser lab will average their aligned noise residual, lock one file out before estimating the reference, and test crop, shift, scale, and JPEG controls without uploading a byte. The shipped anchor uses 51 training images because the 2006 paper recommends more than 50, but its fallback is openly synthetic, so a positive score is evidence of an aligned shared residual and never proof of a unique camera.

A photograph is not only a scene. It also carries what the imaging pipeline failed to remove: shot noise, demosaicking structure, compression blocks, row and column offsets, texture the denoiser mistook for noise, and sometimes a faint pixel-aligned response field. Average enough residuals in the same coordinates and the scene changes can cancel while a fixed field remains. The dangerous leap is to call that field a unique physical fingerprint. This page stops one sentence earlier.

1. The published anchor comes first

The instrument below follows the paper's residual definition W = I - F(I), its literal residual mean PC = sum(Wk)/N, and its zero-lag normalized correlation. The browser reduction is luma-only at a disclosed native crop, not the paper's full three-channel treatment. The fallback is generated, so it verifies the machinery and controls. It does not reproduce a measured physical-camera error rate.

Shipped anchor · 51 train, 1 held out, 8 controls

Opening provenance from the archive.

The archive has not been checked yet.

Waiting for the page load boundary.

The anchor must beat every different-source control, every one of 32 preregistered nonzero circular shifts, and its own one-pixel crop and 0.90 scale damage, and its held-out frame must not be a near-duplicate of any training frame. Any failed line keeps the reader controls locked. A comparison that was not supplied reads NOT RUN and never counts as a pass. This is deliberately easier to fail than an assertion that a score is merely positive.

2. Bring the run already on your disk

Use native-resolution originals from one physical camera if you can. More than 50 calibration files plus one held-out file reaches the paper's printed recommendation. Four through 51 total files get an explicitly underpowered preview. Exact stored dimensions, orientation, format, and EXIF make/model form separate groups. EXIF is a grouping hint, not identity evidence.

A split between groups can be caused by editing, a changed lens or pipeline, orientation handling, or ordinary export settings. It is a compatibility warning, not proof that a file was edited. The page never mixes those groups silently.

Up to 100 files, at least 256 by 256 stored pixels each. The parser accepts 8-bit JPEG and 8-bit PNG of color type 0, 2, 4, or 6; indexed PNG of color type 3 is refused by name rather than decoded. Every byte is read locally for type, dimensions, metadata, and SHA-256. Two files with identical bytes are refused, because a repeated file would put the held-out frame inside its own reference. Nothing is posted or persisted.

Waiting for the anchor.

3. Make the match fail

The sophisticated dismissal is right: scene leakage, an 8 by 8 JPEG grid, demosaicking, model-wide processing, and mere registration can all correlate without unique sensor PRNU. The useful response is not a stronger label. It is a bench where geometry and encoding can attack the score while all settings remain visible.

4. The historical rates stay historical

The following are Table II's unprocessed threshold and false rejection pairs at its fixed false acceptance rate. The detection-rate column is subtraction performed here, not a separately printed measurement. For example, the Canon G2 conversion is . None is a threshold for this page.

cameraprinted tprinted FRR1 minus FRR

Heavy JPEG compression is not a universal off switch. In the 2006 controlled JPEG rows, quality 50 raised the Nikon D100 false rejection rate to 0.163, while other listed cameras moved differently. Compression may suppress non-unique correlation, bury useful structure, introduce a common block grid, or do several at once.

All controlled JPEG rows printed in Table II
cameraqualityprinted tprinted FRR

Canon A10 and Olympus C3030 are absent because their source sets were already JPEG. These are historical rows only, never reader thresholds.

The check · equations, choices, and failure conditions

Wk = Ik - F(Ik)
PC = (1/N) sum Wk
corr = ((W - mean(W)) dot (PC - mean(PC))) / (norm(W - mean(W)) norm(PC - mean(PC)))
Khat = sum(Wk times Ik) / sum(Ik squared)
PCE = signed peak squared / mean squared correlation outside the 11 by 11 peak neighborhood

Fixed free choices

All 8-tap analysis coefficients

Choices fixed by your specimen

Exact membership and exclusions; SHA-256 ordering; the held-out file; stored dimensions; EXIF orientation; optional make and model strings; center crop origin; whether a native crop margin exists; browser decoder and color management; format and progressive JPEG status; file count N; and every decode refusal. Names and pixels are discarded when the page is closed. No score is exported unless you explicitly copy it.

Uncertainties that remain

Scene leakage is not calibrated; the near-duplicate check catches copies, not two photographs of the same wall. Browser color conversion can vary. EXIF can lie. A phone may fuse frames, stabilize, change lenses, correct geometry, or rescale before writing. The luma reduction differs from the paper's color-channel treatment. This small crop has no validated threshold, false acceptance rate, or false rejection rate. The fallback's synthetic signal is easier than physical PRNU. A bounded shift or scale search can miss a real alignment. A high score can be forged, and the 2006 paper itself discusses deliberate suppression and planting.

Two further limits are worth naming because they are the ones most likely to flatter a result. First, a different-source control is the easy null. Two unrelated cameras are two independent random fields, and beating that says nothing about the case where the doubt actually lives: two physically distinct bodies of the same model, sharing a sensor design, a lens, a demosaicking pipeline and a JPEG table. This page cannot test that case and does not claim to. Second, a correlation that rises as N rises is not by itself evidence of a sensor. Non-unique artifacts shared by a camera model, and row and column structure, accumulate with averaging exactly as a fingerprint would, which is why the later large-scale work suppresses them before estimating anything. That is what the row and column control on the bench is for, and it is also why that control recomputes the nulls and not only the held-out score.

Rules that were changed after seeing data

These were not derived in advance. On 2026-08-09 an adversarial audit handed this instrument the same nonconstant image fifty-two times under different names. The page selected fifty-one copies as the reference and the fifty-second as the held-out evidence, and every line of the check panel went green at a correlation of 0.9999999999999342, because the held-out pixels were present verbatim inside the reference. A second audit finding was that the different-source control line printed PASS for readers, who never had a way to supply a control at all. In response, five rules were added after the fact and are named here as such:

  1. Two files with the same SHA-256 in one group are refused before the held-out position is chosen.
  2. Two decoded crops with identical pixels are refused after decode, which also catches the same image arriving in two containers.
  3. A held-out frame whose intensity correlates with its closest training frame above 0.95 fails a new near-duplicate check. The limit is a round number chosen for being far above anything two different exposures of a moving aim produce and far below the 1.0 of a copy. On the shipped specimen this statistic is about 0.33.
  4. The different-source comparison reads NOT RUN, not PASS, when no control group was supplied, and the summary counts checks that ran separately from checks that did not.
  5. The reader can now nominate a second, incompatible group as a different-source control, which is what makes that line able to run at all.

The audit's fully green duplicate result is now a refusal. That transition is asserted by the offline verifier, which builds the fifty-two-copy specimen itself and requires it to be refused rather than scored.

Refusals tested in this tab

The archive hash refusal runs when the shipped bytes open.

Local-only ledger

Your photographs were decoded in this tab and were never uploaded. This page's Content Security Policy sets connect-src 'self', so the only address this code may open a connection to is this origin, and the only connection it opens is one GET for the shipped specimen, issued before the file input is enabled. It has no analytics, remote font, service worker, storage write, beacon, or socket. Open the browser Network panel before choosing files and watch the list remain unchanged.

Resource entries added after load0
Reader bytes read locally0 B
Same-origin fetches, all before unlock0 of 0
Cross-origin attempts by this code0

The counter describes this page's own code and the Resource Timing entries this browser exposes. It cannot prove facts about extensions, the browser, the operating system, or another page. The shipped specimen is fetched from this origin as a 3.35 MiB gzip file, and its length and SHA-256 are pinned in the page's own module, so a substituted archive refuses rather than scores. That request is inbound: it carries this page's asset path and nothing else, and it completes before any reader file can be chosen. Reader files enter only through the file input or drop event, and no code path sends them anywhere.