URL QR code generator
100% Private & Local — Your data never leaves your browser. These QR codes are permanent and will never expire.
URL settings
Design
Add a centre logo
The image is read in this page and embedded in the code as a data: URL. It is not uploaded, and it stays inside the file you download.
More design options
The dark half of the code. Keep it well below the background in lightness.
Covers the quiet zone as well as the gaps between modules. A transparent background leaves it out of the file, so nothing is drawn with it.
Contrast 11.5:1 between the modules and the background.
PNG and WebP keep an alpha channel; the SVG simply omits the background rectangle. Whatever the code is placed on becomes the light half of the contrast.
A gradient fills the dark modules only. Its lighter end sets the contrast a scanner actually gets, so both ends have to stay dark.
The second colour, used only while a gradient is selected. It is measured for contrast alongside the first.
Degrees clockwise from a left-to-right sweep. A radial gradient spreads from the centre outwards, so the angle applies to a linear one only.
Rounded shapes cover less of each cell. The centre stays covered, which is where a decoder samples, but a small print of a dense code reads more reliably as squares.
The ring of the three finder patterns.
The eye inside each finder pattern.
The blank margin around the code, measured in modules. 4 is the specified minimum.
Higher recovery survives more damage and costs capacity, so the same content produces a denser symbol.
A logo sits at the centre and holds the level at H. Its width limit follows the symbol: 14% on the smallest code, 30% on a dense one.
Live preview & export
Enter the web address the code should open.
Export
Raster, for screens
Complete the form to enable the downloads.
Export size and encoded text
- Payload
- Nothing encoded yet
- Symbol
- Not built yet
- Recovery
- M
Waiting for input
Paste a web address and those exact characters are encoded into the symbol. Nothing is shortened and no redirect sits in the middle, so the printed code keeps working for as long as your page does.
When someone scans it
The reader shows the full address and offers to open it in the browser. Nothing loads until the person scanning agrees.
What is written into the symbol
The payload is the address, character for character. A reader decodes https://example.com/spring-sale and hands that string to the browser, with nothing in between to count the scan or rewrite the destination.
If you leave the scheme out it is encoded as https://, because a bare host is not a URL and several readers will treat it as plain text instead of a link. An explicit http:// is kept as you typed it, for the internal addresses that still need it.
Other schemes are rejected. javascript:, data: and file: are the ones used to hide something hostile behind a printed square, and the payloads worth encoding deliberately — mailto:, tel:, sms:, a Wi-Fi join string — each have their own page here with validation that suits them.
- Entered example.com/menu, encoded https://example.com/menu
- Entered http://intranet.local/rota, encoded unchanged
- Query strings, fragments and percent-encoding are preserved exactly; nothing is normalised away
Length decides the printed size
A URL is stored in byte mode at eight bits per character, because QR's denser alphanumeric mode has no lowercase letters. Every extra character therefore pushes the symbol towards a higher version, which means more rows and columns and smaller modules at the same printed width.
Twenty-eight characters fit a version 3 symbol at recovery level M, 29 modules across. Two hundred characters need version 10, 57 modules across. Printed at the same 2 cm those version 10 modules are half the width of the version 3 ones, and the camera has to come much closer.
The working rule of thumb is that a symbol reads from about ten times its own width. Roughly 2 cm square is a practical floor for a short link scanned at arm's length; for a poster read from three metres, plan on about 30 cm.
- Trim campaign and tracking parameters before encoding — they are pure symbol growth
- Level H restores about 30% of the symbol's codewords, and pays for it in capacity: version 40 holds 2,953 bytes at L and 1,273 at H
- The four-module quiet zone is part of the code, and cropping it is the most common reason a printed link fails to read
Static codes and the dynamic alternative
This code is static: the address lives in the black and white modules, not in a database. That is why it works with this site offline, why no subscription is attached to it, and why nobody can count your scans, including us.
The trade-off is real and worth stating. A dynamic code from a tracking service encodes a short redirect address instead, so the destination can be changed after printing and every scan is logged. If you need to repoint a printed code later, that is what the subscription buys. If you own the page the code points at, you can change the page instead and keep the code static.
Questions and answers
Can I change where the code points after it is printed?
No. The address is encoded into the symbol, so changing it means printing a new code. The usual way around this is to point the code at a short path on your own domain and redirect that path, which keeps control with you rather than with a service.
Does the code stop working if openqrs.com goes offline?
No. This site builds the symbol and takes no further part. A decoded code is a string handed to the browser; nothing in that path touches us.
Why was my link rejected?
Either it used a scheme other than http or https, or it had no host to resolve. Anything without a scheme is treated as https, so example.com/page is fine; example is not.
Does a shorter URL really scan better?
Yes, and measurably. Fewer bytes means a lower version and fewer modules, so each module is physically wider at the same printed size. A wider module survives more paper texture, ink spread and camera blur.
How a static QR code works
Every code on this site is static: the payload is written into the black and white modules themselves. Nothing is looked up when the code is read, no server of ours takes part, and no subscription holds the printed code up. The same property is the limit — once it is printed, what it contains cannot be changed.
Three things then decide whether a printed code reads: how many bytes the payload came to, which recovery level absorbs the damage, and how wide a single module ends up on paper. These guides work through each of them with the numbers.