QR Code Scanner
Decode any QR code from your device camera (uses the back camera where available) or by dropping a PNG / JPG containing a QR. Powered by jsQR running on a hidden canvas, so frames never leave your browser. Auto-opens https URLs, copies text to clipboard, and keeps a 24-entry scan history in localStorage. 100% offline.
What is the QR Code Scanner?
QR Code Scanner uses the browser's `getUserMedia` API to stream your back camera into a hidden video element, draws each frame onto a hidden canvas, and decodes the pixels with jsQR — a small (~40 KB) pure-JS QR decoder. The decoded text is shown immediately with a Copy button and, when it's an http(s) URL, an Open button that launches it in a new tab. The decoder runs at roughly 30 fps on modern devices, so a QR is usually picked up within a fraction of a second of being framed. You can also drop a PNG, JPG, GIF or WebP onto the second card to decode a QR from a static image — useful for scanning QRs you've already received as a file. Every successful scan is added to a 24-entry history with timestamps, deduplicated against consecutive identical reads, and persisted in localStorage so you can come back later. No frame, no image, no decoded text ever leaves your browser.
How to use it
- Click 'Start camera' and grant camera permission (your browser asks once per origin).
- Point the camera at a QR code so it sits inside the green guide square.
- When the decoder finds a code, the text appears above the camera and gets added to the history.
- Or drop / pick an image file containing a QR code into the second card to decode it offline.
- Click Copy to put the decoded text on your clipboard, or Open if it's a URL.
Benefits
- Uses the back camera by default (where available) for natural QR pointing.
- jsQR decoder runs at ~30 fps on modern devices.
- Image file fallback decodes any PNG / JPG / GIF / WebP that contains a QR.
- Auto-recognises https URLs and exposes a one-click Open button.
- 24-entry history with consecutive-duplicate dedup, persisted in localStorage.
- Clear, friendly permission-denied state with file-upload fallback.
- Runs 100% in your browser — frames go camera → canvas → jsQR → text, all client-side.
- Works in mobile browsers (iOS Safari 14+, Android Chrome) and desktop browsers.
Frequently asked questions
Why does the camera need permission?
Browsers require explicit permission to access camera or microphone — it's a hard requirement of the MediaStream API. The permission is per-origin, so granting it on toollyz.com persists until you revoke it in browser settings.
Does the scanner upload my QR codes anywhere?
No. The video stream stays inside the browser, gets drawn onto a hidden canvas frame-by-frame, and the pixel array goes straight into jsQR (a JavaScript library that runs on your CPU). The decoded text appears on the page but the frames and the text never leave your device.
Why isn't my camera starting?
Three usual reasons: (1) you denied the permission prompt — reload and accept it, (2) another app or tab is using the camera — close it and retry, (3) you're on http:// — getUserMedia requires HTTPS (or localhost). The error message under the camera tells you which one.
Can I use the front camera instead of the back?
The tool requests the environment-facing (back) camera by default. If your device only has a front camera, or the back is unavailable, the browser falls back to whatever's available. The video element is mirrored on most devices to feel natural.
Does it handle WiFi QRs?
Yes — WIFI QR codes encode as a single string like `WIFI:T:WPA;S:MyNetwork;P:password;;`. The scanner just decodes the text; you'd then copy it into your phone's WiFi settings to actually connect. Some operating systems detect this format automatically when copied.
What QR versions are supported?
jsQR handles QR versions 1-40 (every standard size from 21×21 to 177×177 modules) and all four error-correction levels (L, M, Q, H). Reading is robust to angle, partial occlusion (up to the error-correction limit), and rotation.
Why does it not read damaged or low-contrast QRs?
Low contrast is the hardest case — jsQR thresholds the image first, and very dim or evenly-lit QRs may not pass thresholding. Try increasing room lighting or using the file-upload mode with a higher-resolution capture.
Can it decode barcodes (1D) too?
Not currently — jsQR only handles QR codes. For 1D barcodes (UPC, EAN, Code 128) you'd need a different library. We may add a barcode scanner separately.
Why is my scan history limited to 24 entries?
Keeps localStorage small and the UI tidy. If you need a longer history, copy entries elsewhere as you go.
How big is the bundle impact?
jsQR is ~40 KB minified and lazy-loaded with the route — the rest of the site isn't slowed down by it.
Is anything uploaded?
No. Camera frames stay in your browser; uploaded images are read with the File API and decoded locally. Toollyz has no server.
Related tools
See all generators toolsQR Code Generator
Generate QR codes for any text or URL — download as PNG.
WiFi QR Code Generator
Create scannable WiFi QR codes and printable cards — guests join in one tap.
QR Menu Generator for Restaurants
Standalone HTML menu + QR — host on Netlify Drop or your CDN.
Favicon Generator from Text
Letter / emoji favicon with auto-fit, 9 PNG sizes and a hand-rolled .ico.