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.

This article contains affiliate links: we may earn a commission if you use them, at no extra cost to you. This does not influence our recommendations.

“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. And if you digitize often, a dedicated scanner like Brother DS-640 — portable scanneraffiliate keeps your documents off the cloud too.

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.

Brother DS-640 — portable scannerBrother DS-640 — portable scannerThe classic among portable document scanners.affiliateSee on Amazon