Everyday

Make a QR Code That Nobody Else Can Track

Type what the code should carry and it is drawn as you go. Download it as a PNG for a document or as an SVG for print, where it stays sharp at any size. The code is generated here in the page, so the link you encode is not recorded by anyone and the image will not stop working later.

Pixels per module in the PNG.
Module shape
The corner markers and the small alignment squares stay square whatever you pick, because that is what a reader lines itself up with.
Logo in the middle, optional
Pick a symbol, or load your own image below. Nothing is uploaded: your file is read in this tab.
18% of the code

—version
—modules per side
—bytes encoded

Why a generated code should not be a redirect

Many QR generators give you a code that points at their own domain, which then forwards to your link. That is sold as a feature, because it lets you change the destination later and count the scans. It also means every person who scans your poster makes a request to a company you have never dealt with, and that your code stops working on the day that company shuts the service down or starts charging for it. Codes printed on menus and business cards have died exactly that way.

The code this page makes contains your text and nothing else. There is no middle party, no counter, and nothing to expire. The trade is that you cannot change where it points after it is printed, which is the honest version of the same deal.

What the quality setting does

A QR code carries redundant data so it still reads when part of it is dirty, creased or covered. The four settings here are the four error correction levels of the specification: Low is L and recovers about 7% of the code, Medium is M at about 15%, High is Q at about 25%, and Maximum is H at about 30%. More recovery means more data, which means a denser grid for the same text, and a denser grid has to be printed larger to stay readable.

Medium is the sensible default for a screen or a clean printed page. Go to High or Maximum when the code will be on something that gets handled, when a symbol will sit over the middle, or when it will be printed small. Dropping to Low is worth it only when the text is long and the surface is clean.

The white border is part of the code

The specification calls for a quiet zone of four modules on every side, and this page includes it in both downloads. Scanners use it to find where the code starts. A code cropped tight to its edge, or placed on a dark background that touches it, fails to read on a surprising number of phones, and it is the single most common reason a printed code does not work.

PNG or SVG

Take the SVG for anything that will be printed. It is drawn from shapes rather than pixels, so it stays sharp whether it ends up on a business card or a poster, and the file is usually smaller. Take the PNG for a document, a slide or a message, where an image is simply easier to place.

Either way, test the printed result before you order a thousand of them. Scan it with a phone that is not yours, from the distance people will actually stand at, under the light the thing will live in.

Codes for wifi and contact details

A QR code is just text, and the format of that text is what makes a phone offer to join a network or save a contact. For wifi the pattern is WIFI:T:WPA;S:NetworkName;P:ThePassword;;. For a plain link, write the whole address including https://, because a code that says toolpile.io without the scheme is treated as text by some readers and as a link by others.

Colours a scanner will actually read

A reader does not see your colour. It samples the middle of each module and decides whether that point is lighter or darker than its neighbours, so what matters is the distance between your two colours rather than which ones you picked. This page measures that distance with the same relative luminance formula the accessibility guidelines use, and it warns below 3 to 1. Above 7 to 1 is comfortable for print.

Keep the dark colour dark. The specification describes dark modules on a light background, and although some readers try both polarities, plenty try only one, so a pale code on a dark card is a gamble. The page says so when you invert the two. There is no gradient option here, because a gradient that looks good on screen is the thing most likely to fail at the far end of a poster.

Twelve module shapes, and the parts that never change

The square grid is what the specification draws, and most of it can be drawn as something else. There are rounded squares, dots, leaves, hexagons, octagons, diamonds, triangles, hearts, clovers, stars and crosses here, and every one of them scans, which took more than drawing them nicely.

A decoder does not read your picture as it is. It first turns it into black and white against a threshold worked out from the surrounding area, so what arrives at the part that reads modules is closer to the average brightness of a whole cell than to the colour at its middle. A diamond covers half of its cell, which lands on that threshold, so the first version of these shapes was drawn at exactly the module size and a real decoder refused it. The sparser shapes here are drawn a little larger than their cell instead, overlapping their neighbours the way solid squares already do, which only ever merges dark with dark.

The corner markers, the two timing lines and the small alignment squares stay square whichever shape you choose. The corners are what a reader sweeps for to find the code at all. The timing lines tell it how wide one module is. The alignment squares are what it fits its grid to once the photo is at an angle, and that last one is what decides whether the odd shapes work: with the alignment squares reshaped, an independent decoder refused a third of the dotted codes tested here, and with them left alone it refused none.

A logo over the middle, and what it costs

Error correction is what pays for a logo. At Medium a code can lose about 15% of itself and still read, at Maximum about 30%, so a logo is safe only to the extent the budget covers the modules it hides. The page reads its own drawing back, says whether the payload still comes out, and reports how much of that budget the logo spent. When it says five of eight codewords, three are left for a crease or a thumbprint.

Load an image, or pick one of the symbols on the page. The symbols are drawn here rather than fetched, so they cost no request and take the code colour on their own. Either way the middle gets a pad of the background colour first, with the edge you choose: square, rounded, or a full circle that crops a photo the way a profile picture does.

Tinting an image maps every pixel onto the line between your two colours by its own brightness, so the picture keeps its shading and its transparency and comes out in one colour, the way a duotone print does. Filling the covered pixels with a flat colour instead, which is the obvious thing to reach for, turns a logo into a rectangle. A photo tints well. A flat two-colour mark usually does not, and is better left in its own colours.

The check here averages each module cell, which is close to what a decoder works from, so it catches a logo that covers too much and colours that sit too close together. It cannot tell you how your printer spreads ink, or how an old scanner at a till behaves. Print one and try it.

Frequently asked questions

Does this QR code expire?

No. The code contains your text directly, so there is nothing to expire and no service that has to stay running. Codes that expire are the ones that point at a shortener or a tracking domain first, which is how most free generators work and why printed codes sometimes stop working a year later.

Is my link sent anywhere?

No. The code is calculated and drawn in this page, on your machine. Nothing about what you encode leaves the browser, which also means nobody counts the scans, including us. Disconnect from the internet after the page loads and the generator still works.

Which quality should I pick?

Medium for a screen or a clean printed page. High or Maximum when the code will be handled, printed small, or partly covered by a logo. The four settings are the specification's L, M, Q and H levels, which recover about 7%, 15%, 25% and 30% of a damaged code. More recovery makes the grid denser for the same text, so it has to be printed larger to stay readable.

Can I put a logo in the middle?

Yes, either your own image or one of the symbols on the page, with square, rounded or circular edges. The page reads back every version it draws, so it says when the logo has covered more than the correction can repair, and how much of that budget is left. Raise the quality to High or Maximum if it complains, and keep the logo under about a fifth of the width. Your image stays in the browser like everything else here.

Can I change the colours?

Yes, both of them. The only thing a reader cares about is that the two are far enough apart, so the page measures the contrast and warns below 3 to 1. Keep the code darker than its background: the specification describes dark on light, and a reader that tries only that one polarity will fail on an inverted code even though the picture looks fine to you.

Do the shaped modules still scan?

They do, and every shape offered here was checked against a separate decoder before it was offered. Two things make that work: the sparser shapes are drawn slightly larger than their cell, and the corner markers, timing lines and alignment squares are left square whatever you choose. Shapes still leave less ink in each cell than plain squares, so give a dotted or triangular code more size when it is going to be printed small.

Why is there a white border around my code?

That is the quiet zone, and it is part of the specification rather than decoration. Scanners use the four modules of blank space on each side to find where the code begins. Cropping it off, or placing the code against a dark edge, is the most common reason a printed code fails to scan.

Last updated October 4, 2026