# QR Code Generator — AO tool

> Make a QR code that never expires, needs no account, and reports your scans to nobody. Runs entirely client-side: no upload, no server, no file limits, no sign-up.

Human page: https://abstractobjective.dev/tools/qr-code/
Status: live · Category: generate

## Input and output
- In: Content typed or pasted into the page
- Out: svg, png, downloadable

## Programmatic use (the AI-facing twin)
All computation happens locally in the page context.

- `window.AOQr.svg(text, {level, margin, dark, light}) -> Promise<string>`
  Generate a QR code as an SVG string. level: L|M|Q|H error correction. margin is the quiet zone in modules. Set light to "none" for a transparent background.
- `window.AOQr.matrix(text, level) -> Promise<{modules: boolean[][], count: number}>`
  The raw module matrix, for rendering the code yourself.

## Notes
- The QR mathematics (Reed–Solomon error correction, masking) comes from the vendored qrcode-generator library; the SVG and PNG rendering is AO's own, so the output carries no styling we did not choose.
- SVG output is a single path with crisp edges, so the code stays exact at any size — a blurred module is an unreadable code, not a cosmetic problem.
- PNG output scales by whole pixels per module, for the same reason.
- These are static QR codes: the content is encoded in the pattern itself. It cannot expire, cannot be switched to point elsewhere, and cannot report who scanned it.
- "QR Code" is a registered trademark of DENSO WAVE INCORPORATED.

## Properties
- Privacy: files never leave the browser tab.
- Limits: none imposed by us; the practical ceiling is your device's memory.
- Cost model: client-side compute — free without caps, sustainably.

---

## Static, which is the whole point

There are two kinds of QR code, and the difference matters more than the marketing suggests.

A **static** code has your content encoded directly in the pattern. The black squares *are* the URL. Nothing is looked up, nothing is tracked, and the code works forever — including when the company that made it no longer exists.

A **dynamic** code encodes a short link to someone's server, which then redirects. That is how the QR industry sells subscriptions: your code keeps working only while you keep paying, the destination can be changed later, and every single scan is logged and reported. Plenty of "free QR generator" sites hand you a dynamic code by default, and people discover this when the codes on their printed menus stop working.

This page only makes static codes. It could not make a dynamic one if it wanted to — there is no server here to redirect through.

## Error correction

QR codes carry redundancy, so a damaged or partly obscured code still reads. You choose how much:

- **L** stores the most data in the smallest grid and tolerates the least damage.
- **M** is the sensible default for anything on a screen or clean print.
- **Q** and **H** survive real-world abuse — a sticker, a fold, a coffee ring, a logo placed in the middle. They need a denser grid for the same content.

If you plan to print it, put it on something that will be handled, or overlay anything, choose **Q** or **H**.

## The quiet zone is not decoration

The blank margin around the code is a functional part of it. Scanners use it to find where the code begins, and a code butted right up against other artwork often will not read at all. Four modules is the specification's recommendation and the default here. Reduce it only if you know the surroundings are plain.

## SVG or PNG

**SVG** is the right choice for anything printed or resized. It is a vector, so it stays exact at any scale — which matters here more than in ordinary graphics, because a blurred module is not an aesthetic problem, it is an unreadable code.

**PNG** is easier to paste into documents and chat. This one is rendered with whole pixels per module, for the same crispness reason.

One honest note: the tool renders the pattern, but it cannot tell you whether the *content* is right. Scan your own code with your own phone before printing a thousand of them.
