§

Drop image or click to choose

Drop image or click to choose PNG, JPG, GIF, BMP, WebP — or paste from clipboard
§

Scan with camera

Camera access is requested only when this toggle is on. We never upload or record anything.
§

Decoded content

Across the US and UK, QR codes carry data that’s often sensitive. Restaurant menus on paper table cards, Eventbrite and Ticketmaster entry gates, NHS prescription pickup slips, CDC health-information posters, loyalty apps from CVS to Tesco, boarding passes from Delta to British Airways. Every one of those use cases sends a phone camera at a printed symbol. When you point a desktop browser at the same symbol instead, you usually want to check what’s inside before you act on it — confirm the URL on a poster is the real venue, recover the Wi-Fi password your router config page printed as a QR, or read the vCard a conference badge wants to drop into your contacts. This reader handles every format those sources produce: URL, Wi-Fi join strings, vCard, MeCard, plain text, email, SMS, geo coordinates. The image bytes and the decoded payload stay in your tab.

What is a QR code reader?

A QR code is a two-dimensional matrix barcode defined by ISO/IEC 18004. It encodes text, URLs, contact cards, Wi-Fi credentials, and other short payloads as a grid of black-and-white square modules, together with Reed-Solomon error-correction data so the symbol still decodes after partial damage or a logo overlay. A QR code reader does the inverse: it takes the image of a QR symbol and recovers the original payload string. This reader runs the decode pipeline directly in your browser using the open-source jsQR library (about 130 KB, MIT-licensed). The image you drop, paste, or scan with the camera never leaves the tab. There is no upload step. Open DevTools while you decode and the Network panel stays silent — the page makes no XHR, no fetch, no analytics beacon tied to your image content.

How does QR decoding work?

Decoding runs entirely on your machine. Each image goes through a fixed pipeline before the payload text is returned:

  1. The image file (PNG, JPG, WebP, or a camera frame) is drawn onto an offscreen HTML <canvas>. The canvas API returns raw pixel data as an RGBA byte array.
  2. The jsQR library converts the pixel array to a grayscale bitmap and scans for the three distinctive finder-pattern squares in the corners of a QR symbol.
  3. Once the finder patterns are located, the decoder calculates the perspective transform and extracts the full module grid, reading each cell as a binary 0 or 1.
  4. The module grid is parsed according to the QR spec: format and version information are read first, then the data modules are de-interleaved and Reed-Solomon error correction is applied.
  5. The corrected data codewords are decoded according to the segment mode (numeric, alphanumeric, byte, or kanji), yielding the original payload string.
  6. This tool then sniffs the payload with a small set of regular expressions to identify the content type (URL, Wi-Fi credential, vCard, and so on) and surfaces the result with an appropriate action button.

Why use a browser-based QR reader?

  • The image bytes never leave your device. Paste a QR that hides a Wi-Fi password, an internal staging URL, or a vCard with someone’s personal phone number, and that content stays on your laptop. Other QR readers run the decode on a remote server and ask you to upload the image first — this one doesn’t.
  • Once the page is loaded, decoding works offline. The jsQR library lives in your tab. You can disconnect Wi-Fi, drop a QR image into the page, and still get the payload back — useful on flights, in basements, and anywhere the corporate network blocks third-party scanners.
  • If your desktop or laptop has a webcam, you can point it at a printed QR code and read it without installing an app or unlocking a phone. The camera stream stays in the browser and stops the moment a code decodes.
  • The reader recognises URLs, Wi-Fi join strings, vCard, MeCard, mailto, SMS, and geo payloads and surfaces an action button that matches. Open a URL, copy the Wi-Fi password, save the contact card — whatever the QR actually contains.

Common uses for a QR code reader

Any time you need to see what a QR code actually says without pointing a phone at it:

  • Debugging codes you just generated. Paste the QR your app produced (or take a screenshot from the QR Code Generator next door) and confirm the encoded URL or payload matches what you intended before sending it to print, packaging, or a poster.
  • Recovering Wi-Fi credentials. Scan the Wi-Fi QR from a router config page, a hotel welcome card, or an AirBnB listing photo and the reader returns the SSID, security type, and passphrase as plain text you can copy into another device.
  • Auditing and accessibility. Decode QR codes on scanned documents, product labels, conference badges, or screenshots of social posts to extract their content into a spreadsheet, a compliance log, or assistive software — handy when the destination URL is the actual claim under audit.

What does decoding a real QR code look like?

Take a Wi-Fi QR code printed on a coffee-shop window. Behind the symbol, the raw payload follows the WIFI: URI scheme: WIFI:S:CafeGuest;T:WPA;P:espresso2026;H:false;;. Photograph the symbol, drop the image into the upload zone above, and the pipeline kicks in: the canvas reads the pixels, jsQR locates the three corner finder patterns, the perspective transform straightens the grid, Reed-Solomon repairs any glare or compression damage, and the byte-mode segment yields the URI string. The reader then sniffs the prefix WIFI: and labels the kind as Wi-Fi, parses the network name as CafeGuest, the security type as WPA, and the passphrase as espresso2026. A Copy button puts the password on your clipboard so you can paste it into the OS network picker. For a plain URL QR containing https://tools.ultim8soft.com, the same pipeline returns the URL kind badge and an Open button that navigates to the target in a new tab. Either way, the only thing that happened on the network was the page load itself — the decode is local.

This QR code reader was built for one job: show you exactly what a QR code encodes, in your browser, with no server in between. Drop an image, paste from clipboard, or let the webcam run, and the decoded content plus its type land on screen in under a second. The image bytes don’t get uploaded. The camera frames don’t get recorded. The decoded payload doesn’t pass through anyone else’s logs on the way back to you. Pair it with the QR Code Generator next door when you need round-trip confirmation that what you encoded is what someone else will see.

Is the image uploaded to a server?

No. The image is drawn to an in-memory HTML canvas and decoded entirely by client-side JavaScript running in your tab. No pixel of your image is ever sent to a server, logged, or stored. You can confirm this by opening DevTools and watching the Network panel while you drop an image: no XHR, no fetch, no analytics beacon ties to the file content.

How does camera scanning work?

When you enable camera mode, the browser asks for permission to access your device camera through the standard getUserMedia API. Video frames are captured into an offscreen canvas at up to 640×480 resolution and handed to jsQR for decoding. Each frame is discarded the moment the next one arrives, and the camera stream is stopped on the first successful decode. No frames are recorded, no frames are transmitted, and the permission prompt only fires when you tick the toggle — not on page load.

Why does some QR content auto-detect as Wi-Fi or vCard?

QR payloads for Wi-Fi credentials follow the format WIFI:S:ssid;T:type;P:password;;, and vCards begin with BEGIN:VCARD. This reader recognises those patterns along with other standard prefixes (mailto:, geo:, smsto:, MECARD:, https://) and labels the content type automatically so the action button matches what you’d actually want to do with the payload.

Why didn’t my QR code scan?

Common causes: the image is too small or low resolution (~100×100 px is the floor, 300×300+ scans reliably), the symbol has heavy damage or is partly obscured by a logo without enough error correction, the quiet zone (the blank border around the modules) is missing or cropped off, or the contrast between dark and light modules is too low. For camera mode, improve the lighting or move the code closer to the lens — jsQR needs to resolve individual modules cleanly to lock onto the finder patterns.