QR Code Reader
Drop in a screenshot or photo and read the QR code without a camera. Wi-Fi passwords, contacts and payment links stay on your device, and you always see the full link before deciding whether to open it.
Drop an image with a QR code
PNG, JPG, WEBP, GIF, HEIC - nothing is uploaded
Or press Ctrl+V (⌘V on Mac) to paste a screenshot straight from your clipboard.
No image read yet.
| File | Type | Content |
|---|
How it works
Add the image
Drop a screenshot or photo on the box, pick a file, or simply press Ctrl+V to paste whatever is on your clipboard.
It decodes locally
Your browser reads the code. If the first pass fails it retries with more contrast, at a larger size and rotated, so photographed and dark-mode codes still work.
You see what is inside
The content is shown as a proper card: a link stays a link you can read before opening, a Wi-Fi code shows the network and password, a contact becomes a downloadable card.
What it can read
| Code type | What you get |
|---|---|
| Link | The full address in plain text, plus a warning when the link is shortened or unencrypted |
| Wi-Fi network | Network name, security type and the password, hidden until you choose to reveal it |
| Contact | Every contact field, with a .vcf download for your address book |
| Calendar event | Title, times and location, with an .ics download for your calendar |
| Recipient, subject and message body | |
| Phone number | The phone number, ready to copy |
| Text message | Number and the prepared message |
| Location | Latitude and longitude |
| Two-factor secret | Issuer and account, with the secret masked |
| Plain text | The raw text exactly as it was encoded |
Nothing is uploaded
The image is decoded in your browser. QR screenshots often hold payment links, Wi-Fi passwords or login secrets, and none of it should travel to a server.
You see the link first
Decoded addresses are shown as text and never opened or fetched automatically, so a malicious code cannot act on its own.
Reads difficult codes
Rotated photos, dark-mode screenshots and small codes are retried with contrast stretching, upscaling and rotation.
Several codes at once
An image with more than one code returns all of them, each highlighted on the preview, and a batch of images becomes one table.
Reading a QR code from an image instead of a camera
Most QR tools assume you are holding a phone in front of a poster. In practice the code is often already on your screen: a payment request in a chat, a Wi-Fi code in a hotel confirmation, a ticket in a PDF, a two-factor setup page you need to move to a new phone. Pointing a second device at your own monitor is awkward and sometimes impossible, which is exactly the gap this tool fills.
Why local decoding matters here
The contents of a QR code are frequently sensitive in a way that a random image is not. A Wi-Fi code contains your network password in plain text. An otpauth code contains the seed that generates your login codes, which is as good as a password. A payment code contains an account identifier. Uploading that image to a server to have it decoded means handing all of it to a third party, which is why everything here happens inside the page.
Seeing the link before you follow it
QR phishing works because a code is unreadable to a human: you cannot tell a legitimate parking meter sticker from one pasted over it. Scanning apps that open the link immediately remove your last chance to notice. This reader never opens or requests a decoded address on its own. It prints the full address, flags shortened links because they hide the real destination, and flags plain http because anything typed on such a page travels unencrypted.
When a code will not read
Failures almost always come down to too few pixels, too little contrast or too much angle. A code smaller than roughly a hundred pixels across has lost the detail the decoder needs, a screenshot taken through a dark theme can end up with very little contrast between the modules, and a photograph shot from the side distorts the finder patterns. The reader retries with contrast stretching, upscaling and rotation before giving up, and tells you what to change if it still cannot find anything.