QR code generator
Make a code for a link, a Wi-Fi network, a contact card or a phone number. It is drawn in this tab, so your password never leaves the machine you typed it on.
- Say what it carriesA link, a network, a contact card, a number.
- Watch it buildRedrawn on every keystroke, with the numbers underneath.
- Take the filePNG for a screen, SVG for print. Or a ZIP of the lot.
A bare domain gets https:// put in front of it, because a code carrying floi.dev with no scheme opens a search on most phones.
Plain text is shown on the screen when scanned. Nothing opens, which is what makes it the right choice for a serial number, a note or a password.
The password is typed into this page and encoded in this tab. It is not sent anywhere, and there is no server here to send it to.
Saved as a vCard 3.0, which is the version iOS and Android both open into the contacts app. Every field you leave blank is left out of the code, so it stays small.
Scanning it offers to dial. Write the number in full international form if the code will be seen outside one country.
Colour, size and error correction
Static codes, encoded in this tab. There is no redirect in the middle, so nothing expires, nothing counts your scans, and no watermark is added.
Make a batch from a list
One line per code, up to 500. Put a name first with a comma after it to control the filename: Table 4, https://example.com/menu. They are encoded here and saved as a ZIP, at the colour, size and error correction set above.
How to make a QR code
Pick what it carries
Link, plain text, a Wi-Fi network, a contact card, an email, a phone number or an SMS. Each one gets the fields it actually needs.
Fill it in and watch it build
The code redraws on every keystroke. Under it sit the version, the grid size, how full it is and the smallest size it can be printed at.
Save it as PNG or SVG
PNG up to 2048 px for a screen, SVG for print at any size. Or paste a list and take the whole batch as a ZIP.
Static codes, and why that is the point
Every code this tool makes is static. The link is encoded in the pattern itself, so a scanner reads it straight off the paper and goes there. Nothing sits in between.
The alternative is a dynamic code, which encodes a short address on the generator's own domain and redirects from there. That buys two things: you can change the destination after printing, and the company in the middle can count every scan. It also means the code stops working the day that company withdraws it, and a great many free tiers are built to make that happen. "Do QR codes expire" is asked about a thousand times a month in the US, and this is the whole of the answer.
So the trade is honest and worth saying plainly. A static code cannot be edited and cannot be measured. In exchange it works forever, offline, with nobody in the middle. If you need editable links and scan analytics, this is not the tool, and no tool without a server can be. The guide covers how to tell which kind you were given and what to do when one has already stopped working.
What the seven types actually encode
A QR code holds text and nothing else. What makes a Wi-Fi code join a network is that phones recognise a particular spelling of that text. These are the ones this tool writes.
| Type | What goes in the code | What a phone does |
|---|---|---|
| Link | https://example.com | Offers to open it. |
| Text | Exactly what you typed | Shows it. Nothing opens. |
| Wi-Fi | WIFI:T:WPA;S:name;P:pass;; | Offers to join the network. |
| Contact | A vCard 3.0 record | Offers to save a contact. |
mailto: with subject and body | Opens a draft. | |
| Phone | tel: and the number | Offers to dial. |
| SMS | SMSTO: and the message | Opens a message, already written. |
None of these are on a standards track anybody enforces. They are conventions that iOS Camera, Google Lens and the scanner apps all settled on, which is why the exact spelling matters and a missing semicolon quietly turns a Wi-Fi code into a plain-text one.
Choosing the error correction
A QR code carries spare data so it can be read when part of it is unreadable. That is why a code still scans with a coffee ring on it. You are choosing how much of that spare data to carry, and it is a real trade rather than a "higher is better" dial.
- Low, 7%. The most content in the smallest grid. Right for a long link on a screen, where nothing is going to damage it.
- Medium, 15%. The default, and the right answer nearly always. It is what most printed codes in the world carry.
- High, 25%. For a code going somewhere it will be handled, scuffed or printed small. A menu, a parcel label, a business card.
- Highest, 30%. For a code that will be partly covered, printed on something curved, or put on a surface that gets wet. Also what you need if you are going to place a logo over the middle.
Raising it spends capacity, so a long link can push the code onto a bigger grid. The Capacity used figure is there so you can see whether you have the room before you find out.
Printing one so it actually scans
Three things break a printed code, and none of them are visible on a screen. The tool works around all three, which is what the numbers under the code are for.
Modules landing on half a pixel. A code drawn at 7.3 pixels per module has modules of three different widths and grey edges on some of them. This tool floors the scale to a whole number and tells you the pixel count it actually produced, which is why asking for 512 sometimes gives you 492. That is the correct answer, not a rounding bug.
Too little contrast, or contrast the wrong way round. A scanner assumes the modules are darker than the background. A light code on a dark one has plenty of contrast and still fails on many readers. Both are checked here, and you are told before you print rather than after.
Printed too small. The Print at least figure is computed from the grid, not from a fixed 2 cm rule of thumb, because a version 2 code and a version 20 code are not the same problem. Give it the quiet zone too: that is the blank border, and cropping it off is the other common way a perfectly good code stops reading.
Nothing here is stored. The code is encoded in your tab and is gone when you close it, so save the file rather than bookmarking the page with your details in it.
Frequently asked questions
Is it really free, with no sign-up?
Yes, and there is no account to make and no limit to hit. There is nothing to sign up to, because there is no server here keeping anything: the code is drawn on your own machine by the page you are looking at. Nothing is watermarked, nothing is held back for a paid tier, and no code you make here can be switched off later. The site has no way to reach a code once it is on your screen.
Do the codes made here expire?
They cannot. Every code this tool makes is static, which means the content is encoded in the black and white squares themselves rather than stored on a server that the code points at. A scanner reads the link straight off the paper. There is no redirect in the middle to be switched off, no subscription behind it, and no way for anyone including us to change where it goes. Codes that expire are dynamic codes, and the guide explains why so many free generators hand those out.
Is it safe to put my Wi-Fi password in?
Safer here than on any generator that sends it somewhere. The password is read from the field by JavaScript in your own tab, turned into a grid of squares, and drawn onto a canvas. It is never put in a network request, because the page makes no network requests after it loads. You can prove this: open the network panel, fill the form, and watch nothing happen. Then turn your Wi-Fi off and make another one. Most hosted generators cannot do either, because they post your content to their own API and send a picture back.
Should I download the PNG or the SVG?
PNG for a screen, SVG for anything printed. A PNG is a fixed grid of pixels, so it is right for a website, a slide or a social post, and the size menu covers up to 2048 px. An SVG is the geometry rather than a picture of it, so it prints sharp at any size from a business card to a shop window. The SVG here is one merged path rather than a rectangle per module, which is the difference between a file Illustrator opens as a single object and one it opens as three thousand.
Can I put a logo in the middle?
Not in this tool, and the honest reason is that doing it properly needs judgement a form cannot make. A logo works by covering modules and letting the error correction rebuild them, so it only holds if the logo is small enough, opaque, and the correction is set high. Generators that offer a logo slot let you cover a third of the code at Low correction and hand back something that scans on the designer's phone and fails on a customer's. If you want one, export the SVG, set the correction to Highest, place your logo over no more than the middle fifth, and test it on two real phones before you print anything.
How many codes can I make at once?
Up to 500 in one go. Open "Make a batch from a list", paste one entry per line, and they come back as a ZIP at whatever colour, size and error correction you set above. Put a name and a comma in front of a line to control its filename, so Table 4, https://example.com/menu saves as table-4.png. Every one is encoded in your tab, which is why there is no per-code charge: nothing is being run on anyone's behalf.
Why did the code get bigger when I raised the error correction?
Because parity takes room that the content was using. A QR code of a given size holds a fixed number of bytes, and raising the correction from Medium to Highest spends about a quarter of them on recovery data instead. If your content no longer fits, the tool steps up to the next version, which is a wider grid. The Capacity used figure is there to tell you in advance: at 40% you have room to raise it for free, and at 95% you do not.
How small can I print it?
The tool tells you, under "Print at least". It is worked out from the grid: a module below about 0.4 mm is smaller than the blur circle of a phone camera at arm's length, so a 25-module code can be a stamp and a 77-module one cannot. The figure is rounded up to the next millimetre on purpose, because it is a floor you are about to send to a printer. As a rule a code reads from about ten times its own width away, so a 30 mm code scans from roughly 30 cm.