QR Code Generator
Make a QR code that never expires, needs no account, and reports your scans to nobody.
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.
For machines
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.
A machine-readable description lives at index.md. Third-party components and their licences are listed on the licences page.