Skip to content
FlashScan Pro

Scan QR codes in your browser without uploading anything

Decoding happens in your browser: neither the image nor its content ever leaves your device. How to check that a scanner is truly client-side.

“Scanning online” shouldn’t mean “sending online”

Search “scan QR code online” and the top results all offer the same thing: drop your image or allow the camera. What those pages rarely specify is where the decoding happens. Historically, many sent the image to a server that decoded it and returned the result — convenient in 2012, indefensible today: browsers can decode QR codes on their own.

FlashScan Pro was built on that observation: all processing — camera scanning, image decoding, generation, history — runs inside the browser. This article gives you the method to verify that claim yourself, here or on any competing tool.

Why server-side decoding existed at all

Fair’s fair: uploading made sense once. Fifteen years ago, browsers had no camera API and no decoder that could run at acceptable speed in JavaScript — sending the frame to a server was the only viable architecture. That constraint is gone. getUserMedia provides camera access, BarcodeDetector provides native decoding, and ZXing compiles to fast client-side code for the rest. Any service still uploading your images today is doing it for reasons other than technical necessity — which is exactly why the verification below matters.

How it works under the hood

Two decoders take turns, both client-side:

  • BarcodeDetector: the browser’s native API (Chrome, Edge, Android). It decodes camera frames and imported images without leaving the device.
  • ZXing: when BarcodeDetector is absent (Firefox, older Safari), the open-source decoder loads into the page and analyzes pixels in JavaScript — still locally.

In both cases, the result is displayed in plain text before any action: you read the content, then you decide whether to open or copy it. Your scan history lives in the browser’s localStorage (500 entries maximum) — on your device, nowhere else.

Verification in three tests — reproducible

Test 1: the Network tab

  1. Open developer tools (F12 on desktop), Network tab.
  2. Filter on Fetch/XHR to hide the noise.
  3. Start a camera scan or import an image.

With a local scanner, no request fires during decoding. If you see a POST to a remote domain the moment you scan, the image or its content is traveling.

An honesty note: the Network tab may show ad requests if you’ve consented to ads — they fund the app but carry neither your image nor the code’s content. What matters is that no request fires at scan time with the file or the payload.

Test 2: airplane mode

Load the page, cut all connectivity (airplane mode), then scan. If decoding still works — ours does — processing is local by construction: you can’t send what you can’t reach. It’s the simplest and most convincing test, no developer tools required.

Test 3: the storage inspector

In developer tools, Application tab (Chrome) or Storage (Firefox), look at localStorage: you’ll see your history entries there — proof they live inside your browser. Clear the site’s storage: the history vanishes with it, permanently, since it exists nowhere else.

What still goes over the network

The scan is local, but the session isn’t entirely — let’s separate the flows:

  • Page loading: HTML, scripts, and images necessarily cross the network, once, at the start. That’s the price of an “online” tool — installing as a PWA then reduces that flow to a minimum.
  • Ads: if you’ve consented, ad scripts load their own resources. They see neither the imported file nor the decoded content, which stay in local memory.
  • What you open afterwards: following a decoded link is normal browsing, visible to the network and the target site.

What “local” doesn’t protect — honesty required

Local decoding guarantees the scan leaks nothing. It says nothing about what happens after: if the code contains a URL and you open it, that browsing goes over the network like any visit — the target site sees you. Local protects the code’s content until your decision; afterwards, the usual web rules apply (see spotting a malicious QR code).

Likewise, “local” means “on this device”: your history doesn’t follow you from one phone to another — the flip side of having no account and no sync.

The account question

One last tell: does the scanner ask you to create an account, sign in, or “sync your scans”? An account implies a server side — and a server side implies your scans exist somewhere else. FlashScan Pro has no account at all: there is nothing to sign into because there is nothing stored anywhere but your browser. When a free tool insists on identity before decoding a barcode, the product being scanned might be you.

The checklist to audit any online scanner

  • Does decoding work in airplane mode?
  • Does the Network tab stay quiet during the scan?
  • Does the tool require an account or a file upload to an API domain?
  • Where does the history live — local localStorage or a remote server?
  • Is the decoded content shown before being opened?

If an “online scanner” fails the first question, it isn’t an online scanner: it’s an upload form in disguise.