Code reader · No upload

QR code reader

Drop a photo or screenshot of a QR code and read what it actually says. The contents are printed in full and nothing is opened for you — for a link you get the real host on its own line, so you can check it before you follow it. The picture stays in your browser, the network meter below proves the zero live, and this page downloads nothing at any point.

Statusidle Files File Image Symbol Correction Contents Blocks repaired Network since file read
What the code says

    


    

The contents are printed exactly as they were encoded, never shortened and never turned into a clickable link. That is deliberate: a QR code is the one address you cannot read before following it, and a reader that opens it for you has removed the only moment you had to look.

How this reader works

When you choose a picture, the browser hands this page the bytes in memory, draws them to a canvas and gives back the pixels. Those pixels are reduced to grey and then to black and white — not with one threshold for the whole image, which fails on the ordinary case of a photo lit from one side, but block by block, each block judged against the average of its neighbours so a shadow across the code moves the threshold with it rather than swallowing half the squares.

Then the geometry. Three corners of a QR code carry a distinctive square whose slices run 1:1:3:1:1 in any direction through the middle, so every row of the image is scanned for that signature and each hit is confirmed by a second scan across it. Real corners agree with each other in two ways nothing else does: their squares are the same size, and the three of them sit at a right angle with two equal sides. Those two facts pick the true corners out of the false ones, and from them the grid is laid over the image and every module read.

What comes out is a stream of codewords protected by Reed-Solomon error correction, and that is what makes the answer trustworthy rather than merely plausible. If the grid were placed even one module out, the correction would fail rather than return something wrong — which is why this page can safely try a few candidate grids and let the mathematics decide between them. The readout prints how many codewords had to be repaired, so a code that was nearly too damaged to read tells you so.

Frequently asked questions

Is my picture uploaded anywhere?
No. Your browser opens the file with its File API and draws it to a canvas, and everything after that — the thresholding, the corner search, the error correction — is JavaScript running inside this tab. The readout's network meter counts every request from the moment your file is read and stays at zero, and there is no library download to footnote: this page fetches nothing at any point. The methodology page shows how to verify that independently, including with your wifi switched off.
Why does it not just open the link?
Because that is the one thing a QR code should never be allowed to do unsupervised. A QR code is an instruction you cannot read before acting on it, which is exactly what has made them a favourite for phishing: a sticker over the code on a parking meter or a restaurant table sends you somewhere you never chose. This page decodes and stops. It prints the whole address, names the scheme and the host on their own line, and says plainly when a link is unencrypted or when the host has been disguised with a username before the @ sign. Then you decide. No button here navigates anywhere.
What kinds of codes does it read?
Standard QR codes, model 2, every size from the smallest 21x21 up to the largest 177x177, all four error-correction levels and all eight data masks. It reads numeric, alphanumeric and byte segments, which between them cover links, wifi credentials, contact cards, calendar entries, phone numbers and plain text. Kanji-mode segments are named and refused rather than mis-decoded. It does not read barcodes, Data Matrix, Aztec or PDF417, and it reads one code per picture rather than hunting for several.
Why did it refuse my photo?
Because a QR reader that invents an address is far worse than one that admits it could not read the code, so this page refuses in every case it is not certain. The usual reasons: part of the code is out of frame, the picture is too blurry or too small for the individual squares to be told apart, the photo was taken at a sharp enough angle that the grid no longer lines up, or the code is genuinely damaged beyond what its error correction can repair. Crop close to the code, get it square to the camera and try again. Error correction can rebuild a surprising amount — the readout prints how many blocks it had to repair.
How do I know the decoder is right?
It is checked three ways, and the checks are the reason this answer can be specific. Its arithmetic tables are generated rather than copied and verified against their own mathematical identities. Its capacity figures are computed from the symbol's geometry, which reproduces the standard's published remainder-bit column as a side effect. And every symbol size from 1 to 40 is decoded from codes built by a separate, independent encoder — a test that caught two genuine bugs that testing against its own output never could, because both halves shared the mistake.

Related tools