Skip to content
FRFaizan Raza
All work
Web app · privacy-first toolLive

Scanform

A QR code studio for links, text, Wi-Fi and email that runs entirely in the browser. No backend, no sign-up, no tracking. Pick colors and a pattern, then download a PNG or SVG.

Period
2026
Context
Personal product
My role
Sole engineer

The problem

Most free QR generators want an account, wrap your link in a redirect they can track, or send what you type to their server. That last one matters more than it sounds: a Wi-Fi QR code contains the network password. A QR code is just an encoding, so there is no reason any of it has to leave the page.

How it was built

Nothing leaves the browser

Encoding runs on the page with a bundled encoder. Each content type is turned into the payload scanners expect: URLs are validated to http or https, Wi-Fi uses the WIFI: format with its special characters escaped, and email becomes a mailto link with an encoded subject and body. There is no backend, no analytics, no remote fonts and no storage. Input lives in memory and is gone when the tab closes.

One SVG, two exports

The module matrix is drawn straight to SVG. The soft pattern rounds the data modules but leaves the three finder squares sharp, so scanners still lock on. PNG export rasterises that same SVG onto a canvas with smoothing turned off, at 512 up to 4096 pixels, so both formats come from one source and match exactly.

Tests that actually scan the code

Checking that an SVG string looks right proves nothing about whether a phone can read it. The tests render each generated SVG with Resvg and decode it with jsQR, a separate decoder, then compare the result to the input. They cover Unicode, Wi-Fi escaping, email encoding, every palette, both patterns, each correction level and oversized input. CI runs lint and tests before every deploy.

Where it landed

  • Zero backend: the site is static files on GitHub Pages
  • Every generated code is decoded by an independent reader in tests before it ships
  • PNG up to 4096 px and scalable SVG from the same render

Specification

Content
URL · text · Wi-Fi · email
Export
SVG · PNG at 512 to 4096 px · copy to clipboard
Privacy
No backend, analytics, storage or remote fonts
Testing
Render with Resvg, decode with jsQR
Framework
React 19 with the React Compiler · Vite 8 · Tailwind 4
Deploy
GitHub Actions → GitHub Pages
  • React 19
  • React Compiler
  • TypeScript
  • Vite 8
  • Tailwind 4
  • qrcode
  • Resvg
  • jsQR