🔳 Generators

Free QR Code Generator

No signup. Nothing uploaded. PNG, SVG, vector PDF and EPS.

Seventeen kinds of QR code — a link, a WiFi network, a contact card, a WhatsApp message, a social profile, a UPI or SEPA payment, a crypto address, a location, a calendar event — styled with rounded or dotted modules, gradients, custom corners and your logo in the middle. Then the tool decodes its own output and confirms it reads back exactly what you typed. Download PNG, SVG, vector PDF, EPS or JPG. It all runs in your browser: nothing is uploaded, and the codes never expire.

Quick answer: pick a type, type your link or text, and a static QR code appears instantly. No signup, nothing uploaded, no expiry.

What is a QR code?
A two-dimensional barcode that stores data — a link, text, WiFi credentials, a contact card — as a pattern of black and white squares called modules. A phone camera reads the pattern and acts on what it finds.
Can I make one without signing up?
Yes. There is no account, no email and no free-trial clock, and the result carries no watermark.
Is anything uploaded?
No. The code is built by JavaScript in your own tab, so a WiFi password or a private link never leaves your machine. The page contains no fetch, no XMLHttpRequest and no form — check it in your browser’s Network tab.
Do the codes expire?
No. These are static codes: your data is encoded in the pattern itself, so there is no redirect server or subscription that could switch them off.
Will a styled code still scan?
The tool decodes the finished image and tells you. Shapes, gradients, custom corners and a centre logo are all available, and anything we measured as unreadable is refused rather than handed to you.
What can I download?
PNG, SVG, vector PDF, EPS and JPG — plus a printable sheet of labels and a ZIP of up to 500 codes at once.
What goes in the code
Enter content to generate a QR code.
Look
100%
The three corner squares are how a scanner finds your code at all, so they are always drawn solid — we measured that dotting them breaks the code on every decoder.
Output
4 modules
The standard is 4. We measured a code with none: it stops scanning the moment you put it on anything but a white page.
Print a sheet of labels

The same code, laid out on a page at a known size, as a PDF rather than through the browser’s print dialog — so it comes out the size you asked for. Every label is the same vector page as the PDF download, scaled to the cell.

Make many at once

One link or line of text per row. Every code uses the style you set above, every one is decoded before it goes in the ZIP, and the whole thing runs here — a list of customer links or asset tags never leaves your machine.

Read in your browser. Nothing is sent anywhere.

What this tool is, at a glance

Every row here is a plain fact about this generator, and each one is explained somewhere further down the page.

AttributeValue
TypeStatic QR code generator
CostFree — no paid tier
Account or signupNot required
File or data uploadNone. Nothing is transmitted
Where it runsEntirely in your browser (client-side JavaScript)
Code expiryNever — the data is inside the pattern
WatermarkNone
Scan limitNone
Commercial usePermitted (terms)
Content types17 — see the table below
URL, text, email, phone, SMSYes
WiFiYes
vCard and MeCard contactsYes
WhatsAppYes
LocationYes — maps link or geo: URI
Calendar eventYes — iCalendar
PaymentsYes — UPI, SEPA/GiroCode, PayPal, crypto
PNGYes
SVGYes — true vector
PDFYes — true vector, exact physical size
EPSYes — vector, for print shops
JPGYes
Transparent backgroundYes
Logo in the centreYes — PNG, JPG, SVG or WebP
Colours, gradients, module shapesYes
Error correctionL, M, Q or H — selectable
Quiet zoneAdjustable, 0–10 modules
Frame with a call-to-action labelYes
Printable sheet of labelsYes — A4 or Letter, 2×2 to 4×4
Bulk generationYes — up to 500 codes, downloaded as a ZIP
Scan verificationYes — the page decodes its own output and reports
Maximum capacity2953 characters (level L); 1273 at level H
Dynamic or editable codesNowhy
Scan tracking or analyticsNo
Reading a code backSeparate tools: scanner, validator

The 17 types, and what each one writes

Picking a type does not change the picture — it changes the text encoded inside it. A scanner reads that text and decides what to offer: a prompt to join a network, a contact to save, a payment to confirm. Get the format right and the phone does the work; get it wrong and the visitor sees a wall of punctuation.

TypeWhat the phone does with it
URLOpens the address. A shorter link makes a visibly less dense code.
TextShows the text, with no action attached — a reference, a serial, a note.
EmailOpens the mail app with the address, subject and body filled in.
PhoneOpens the dialler with the number ready to call.
SMSOpens a new message to the number, text already written.
WhatsAppOpens a WhatsApp chat with your number, message ready to send.
WiFiOffers to join the network, no password typing.
Contact (vCard)Offers to save a full contact card, including a structured postal address.
MeCardThe same idea with fewer fields, and a noticeably smaller code.
LocationOpens the map — as a maps link, or as a geo: URI.
EventOffers to add an iCalendar entry to the diary.
SocialOpens your profile on the network you choose.
AppOpens your listing in the app store.
UPIOpens an Indian payment app with your ID and name filled in.
SEPA / GiroCodeOpens a euro-area banking app with a prepared transfer to confirm.
PayPalOpens your PayPal.me page.
CryptoOpens a wallet on the send screen, with your address filled in.

Each type has an address of its own — ?type=wifi, ?type=vcard and so on — so you can link straight to the form you want rather than telling someone which button to press. The formats with rules worth knowing before you print (vCard’s positional address, an all-day event’s end date, SEPA’s unlabelled lines) each have a page of their own, linked above.

What people actually use QR codes for

Most of these are a link underneath — what changes is the physical situation the code has to survive. That is the part nobody tells you, so the third column is the one worth reading.

UseWhat goes in the codeWhat to watch in that setting
Business cardsvCard or MeCardA full card with a postal address is already 0.385 mm per module at 25 mm — at the edge of what prints. Give a complete address 30 mm, or carry fewer fields.
Guest WiFiNetwork name and passwordThe password is plain text inside the pattern. Anyone who scans it has it, so put the guest network on the card and never the main one.
Restaurant menusA link to the menu pageTable codes are the classic target for a sticker placed over the top. Laminate them, and print the restaurant name beside the code so a wrong destination is visible.
Payments at a counterUPI, SEPA/GiroCode, PayPal or cryptoSame sticker risk, with money attached. Print your own name next to it: most payment apps show the beneficiary before confirming, and that is the check that catches a swap.
Marketing and print adsA link to the landing pageA shorter URL is a visibly less dense code. And a static code cannot be re-pointed, so aim it at a page on your own site and change what that page does.
Events and invitationsA calendar entry, or a registration linkIf people need to book, link the registration page; a calendar entry puts the date in their diary but cannot take a booking. Use both, labelled, if you need both.
Product packagingA link to instructions, spares or registrationKeep it on the flattest panel you have — curvature distorts the pattern and no amount of error correction fixes a bent code. Packaging is also where codes get printed smallest, so check the module size before the print run.
Property listingsA link to the listing or brochureA window card is read from the pavement, through glass, often at an angle. Scanning distance scales with the size of the code, so a board meant to be read from two metres away needs a far bigger code than a leaflet does.
Equipment and asset labelsA link to the manual or a service logThese live in workshops and plant rooms. Error correction at Q or H buys tolerance for grease and scuffs — but keep the three corner squares clean, because damage there stops the code being found at all.

Two of these deserve saying plainly. A QR code is not a security feature — it is a faster way to type an address, and it carries exactly the protection typing one would. And nothing here is tracked: these codes contain your destination rather than a link to our server, so we cannot tell you how many people scanned one, and nobody else can either. If you need scan counts, the counting has to happen at the page the code points to, using whatever analytics that page already has.

What this generator does differently

Every QR generator will hand you a black-and-white square. Almost none of them will tell you whether it works. This one decodes the picture it just drew, compares the result to what you typed, and says so — and it refuses to pretend a colour pair, a gradient or a logo is fine when we can measure that it is not. Every number below came from that testing: real codes, read back with ZXing, the engine most phone scanners descend from, cross-checked against jsQR.

One thing that surfaced while building it is worth passing on: decoders disagree about what is readable. jsQR cannot read a code whose modules are rounded by more than about a twentieth of a module — not because those codes are broken, but because that library does not handle them. ZXing reads every shape we tried. That is why the check in this page runs ZXing, in two configurations, and counts a code as readable if either one gets your content back.

Shapes, gradients, and the three squares you must not touch

The data modules can be rounded, turned into dots or set as diamonds, the corner frames can be square, rounded or circular, and the corner centres are styled and coloured separately. Gradients work too. What the tool will not do is restyle the three big corner squares as if they were data.

Those are the finder patterns, and they are how a scanner locates a code at all: it sweeps a line across the image looking for the run-length signature 1:1:3:1:1 — dark, light, three-wide dark, light, dark. Turn them into dots and that signature disappears. We tested it: a code with dotted finder patterns failed on both decoders, while the same code with dotted data and solid corners read at every size and fill we tried. Generators that let you round the corner squares are relying on the rounding staying mild enough not to matter; this one keeps them solid and lets you shape everything else.

Gradients are handled a little unusually here. Instead of painting a continuous colour ramp, the tool samples the gradient once per module and fills each shape with a single flat colour. At module scale you cannot see the difference, and it buys two things: the PNG, SVG, PDF and EPS become the same picture rather than four approximations of it, and every colour that ends up in your code is a colour the contrast check can measure. A gradient that starts dark and ends in something unreadable is caught, rather than passing because its first colour looked fine.

The margin is not decoration

A QR code needs four empty modules of clear space around it. The standard says so, and it is the single most common way a code gets quietly broken — because on a white web page you cannot tell it is missing. Put that same code on anything else and it stops working.

We measured it. The same link, rendered with a 4-module quiet zone and with none, then placed on three backgrounds:

Code sits on…With 4 modules of marginWith none
a white pagescansscans
a mid-blue panelscansscans
a dark backgroundscansdoes not scan

One module of margin was enough to bring the dark case back in our test, and four is what the standard asks for, so four is the default here. The slider lets you go lower — the tool will tell you what you are giving up.

How dark do the colours have to be?

Brand colours are where codes usually die. A scanner has to separate dark modules from light ones, and there is a point where it simply cannot. We stepped a grey foreground from black to white against a white background and decoded every step:

So this tool refuses anything under 4:1, and warns between 4:1 and 7:1 — a code in that band reads from a clean file, but it has no margin left for a phone camera, a cheap print run or bad light. For reference: a mid-blue like #5b6af5 on white is 4.4:1 and does scan; a warm yellow like #f5c45b on white is 1.6:1 and does not, which is the kind of code a generator without a check will happily hand you.

Light modules on a dark background — an inverted code — is a separate question. Many scanners cope; some refuse outright. The tool flags it rather than blocking it, because it is a real design choice, not a mistake.

This is the most repeated wrong thing about QR codes, and it is what breaks printed codes months after they were made. The error-correction level describes how many codewords can be reconstructed, not how much of the picture you may paint over. A logo destroys a contiguous block, and a contiguous block wipes whole codewords at once.

We swept a centre block from 5% to 40% of the code's width, across three payload lengths and three error-correction levels, and recorded the largest one that still read back:

Error correctionContentCode sizeLargest logoWhich is…
M21 characters25 × 2511%1.2% of the area
M44 characters33 × 3318%3.2% of the area
M106 characters41 × 4123%5.3% of the area
Q21 characters29 × 2920%4% of the area
Q44 characters33 × 3323%5.3% of the area
Q106 characters49 × 4934%11.6% of the area
H21 characters29 × 2920%4% of the area
H44 characters37 × 3730%9% of the area
H106 characters57 × 5739%15.2% of the area

Hold that last column against the level’s headline percentage. Level H “recovers 30%” — and the most a logo ever covered here was 15.2% of the area, on the longest payload. On a short link at the same level it was 4%. The two numbers measure different things: recovery is counted in codewords spread across the whole symbol, while a logo destroys a solid block in one place.

The table shows something else worth knowing: the level alone does not tell you. At M the workable size ran from 11% to 23% of the width, decided by nothing but how much content was in the code; at H, from 20% to 39%. A slider with a “safe” mark printed on it would be wrong in both directions.

So this tool does not print one. It decodes your actual code, with your actual logo, every time you move anything — and if it cannot read it back, it says so before you download it.

What happens to your logo in each download

Upload a PNG, JPG, SVG or WebP. The exports disagree about what an image even is, so the file is decoded once and kept in three shapes — otherwise a logo that looks right on screen quietly goes missing from the file you send to a printer, which is exactly what this page used to do to an SVG.

DownloadHow the logo is carried
PNG · JPGDrawn onto the canvas, so it is whatever your browser decoded
SVGEmbedded as the original file, so a vector logo stays vector
PDFEmbedded as PNG or JPEG. Anything else — SVG, WebP — is rasterised first, because those are the only two image formats a PDF can hold
EPSEmbedded as raw samples, flattened onto the background colour first, because PostScript has no transparency in an image

The format is read from the file’s own header bytes, never from what the browser labels it: an image off a phone share sheet often arrives with no type at all, and a PNG mislabelled as a JPEG would abort the PDF download outright. Logos are capped at 512 pixels on the long side, which on a code printed 30 mm wide is already more detail than a printer resolves.

Adding a logo raises error correction — as far as the content allows

A logo needs the extra recovery, so dropping one in moves the level up for you. Not always to H, though, and that distinction is a real one: H holds only 1273 characters. Forcing it on a 1300-character contact card — which fits perfectly well at Q — turned “add a logo” into a capacity error, so the tool now picks the highest level the content actually fits in. A short link gets H; a long vCard gets Q; something near the ceiling stays where it is, because no level with more recovery could hold it.

How much fits in a QR code

More error correction means less room. These are the real byte-mode limits, and the character counter under the content box counts against the one you have selected:

LevelRecovers aboutMaximum characters
L7%2953
M15%2331
Q25%1663
H30%1273

You will rarely get near them, and you should not want to: a code holding 2000 characters is 169 modules across, and printed on a business card each module is thinner than a hair. Long content belongs behind a short link.

Shorter content also encodes smarter. A phone number like +15551234567 uses numeric mode and comes out 21 modules across; the same length of mixed-case text needs 25. Typing a URL in capitals switches it to alphanumeric mode, which is why some printed codes look coarser than others.

Printing it: how big does it need to be?

A printed module has to survive ink spread, paper and a camera. The usual working rule is that no module should be under about 0.4 mm, and that a code scans from roughly ten times its own width away. What that means for a real code depends on how many modules it has — which depends on what you put in it:

Printed widthShort link (25 × 25)Typical link (33 × 33)Scans from about
20 mm0.61 mm per module0.49 mm20 cm
25 mm0.76 mm0.61 mm25 cm
30 mm0.91 mm0.73 mm30 cm
40 mm1.21 mm0.98 mm40 cm
80 mm2.42 mm1.95 mm80 cm

The panel under the preview does this sum for whatever you have actually typed. For anything that goes to a printer, take the PDF — it is a real vector at 30 mm square, so a print shop can scale it without a single soft edge. The SVG is the same code for design tools; the PNG is for screens; the JPG exists because people ask for it, and it is the worst of the four for a QR code, because JPEG compression rings around exactly the hard edges a scanner is looking for.

The five downloads, and which to use where

They are all the same code. What differs is what survives being resized, and what a print shop can do with the file.

FileUse it forWhy
PNGScreens, slides, email, anything on the web.Sharp edges, no compression artefacts, and transparency if you want the page colour behind it.
SVGAnything that will be resized, and any design tool.Vector — it redraws cleanly at poster size. This is the right file to hand a designer.
PDFPrint, at an exact physical size.A PDF carries its own page dimensions, so 40 mm stays 40 mm. Printing a PNG leaves the size to whatever dialog opens.
EPSA commercial printer that asks for one.Vector PostScript. Some print workflows still want it; most now take the PDF.
JPGOnly where a system refuses everything else.JPEG compression softens the hard edges a decoder relies on. It is offered because some upload forms accept nothing else, not because it is a good idea.

A caution worth repeating, because it was a real bug here and is the kind that hides: a logo that shows in the preview is not proof the logo is in the file. Until this was measured and fixed, a PNG logo reached the PDF and an SVG or WebP one silently did not — the preview looked perfect and the file sent to the printer had no logo in it. All five downloads are now built from one shared description of the picture, so they cannot disagree. If you change anything after downloading, download again rather than editing the file.

For a page of identical labels rather than one code, there is a printable sheet — A4 or Letter, 2×2 up to 4×4, with cut guides.

A frame, and the one module that decides whether it works

A bare square on a window tells nobody anything. A frame with a line of text under it does two jobs at once: it says this is a code, and it says what happens if you scan it. “SCAN ME” is a prompt; “SCAN FOR MENU”, “SCAN TO ORDER”, “SCAN TO PAY” are answers, and they are better.

The interesting part is where the frame is allowed to sit. A frame drawn tight against the pattern eats the quiet zone, and the quiet zone is not decoration — it is how a scanner knows where the code stops. We swept a frame stroke inward one module at a time, at two different margins and two stroke widths, and decoded at every step:

Clear modules between the frame and the codejsQRZXing
Two or morereadsreads
Onereadsreads
None — the frame touches the patternfailsfails

One clear module is the boundary, and it lands in the same place in every combination we tried. So the frame here is built entirely outside the quiet zone — it makes the image bigger rather than borrowing space from the code — and it cannot eat into the margin however you set the slider. The code keeps exactly the module size it had without a frame; it is the picture around it that grows.

Two things worth knowing before you send one to a printer. The label is real text in the SVG and the PDF rather than an outline, which is what lets a designer restyle it — but it also means it renders in whatever font the machine opening it resolves, so convert it to outlines in your design tool if the typeface matters. And in the PDF and EPS the label is set in Helvetica, one of the fonts every reader already has, so nothing is embedded and the file stays small; characters outside that font, an emoji among them, are dropped from those two formats rather than taking the export down with them.

Making a few hundred at once

Bulk generation is behind a login almost everywhere, and there is a structural reason for that rather than a commercial one: if the codes are drawn on a server, your list has to be sent to it, and a list is exactly the kind of thing that needs an account attached. Here the codes are drawn in your tab, so there is nothing to send and nothing to sign up for. Paste a list or open a .csv, and you get a ZIP.

That matters most for the lists people actually make in bulk. Table numbers for a restaurant are dull. A column of customer links, staff names, patient identifiers, asset tags or unlisted URLs is not — and pasting one into a website is a decision somebody may have to justify later. This page has no route to send it: the file is read with FileReader and the ZIP is assembled in the same tab.

Four things it does that are worth knowing:

It makes URL and text codes. A batch of WiFi networks or contact cards would need a column per field and a different format per type, and the single-code tool above does those properly — so this does not pretend to.

Two types the picture cannot vouch for

Most codes are self-checking: scan it, and either the right thing happens or it does not. Two types are not like that. They can decode flawlessly, character for character, and still be wrong — because what goes wrong happens after the scanner has finished its job. Both have a page of their own, because there is more to say than belongs here.

A WhatsApp number has to be in full international form, digits only, with no national trunk prefix. 07700 900123 and 44 7700 900123 are the same number to a person and different things to wa.me; the first one builds a link, scans perfectly, and tells the customer the number is invalid once they have already scanned it. The tool strips spaces, dashes, a leading + and an unambiguous 00 prefix, then flags what is left if it still looks like a national number, is too short to hold a country code, or runs past the fifteen digits an international number is allowed. It cannot tell you the number is on WhatsApp — that is a shape check, and finding out for real would take a request we do not make. More on WhatsApp codes, and what the pre-filled message costs in printed size →

A calendar event is checked here by parsing the payload with two real calendar libraries rather than by looking at the image. That is how we found three faults in our own first version: an event carrying only a name parses fine but cannot be placed on any calendar, so the tool now refuses to build one; an all-day event's end date is exclusive, so 20 June to 20 June is an event of zero seconds and the tool writes the 21st for you; and a timed event with no end has no length at all, so it is given an hour. More on event codes, time zones and printing an invitation →

Printing a sheet of labels

The same code laid out on a page, as a PDF rather than through the browser’s print dialog. That is a deliberate choice: a print dialog decides its own margins and scaling, so “fit to page” quietly shrinks everything and a label you measured at 40 mm arrives at 37. A PDF carries its own page size, and the printer honours it.

Pick A4 or US Letter and 2 × 2, 3 × 3 or 4 × 4, add a title, a caption and a “SCAN ME” line if they help, and turn on cut guides if you are trimming by hand. On A4 that gives:

GridLabelsLabel sizeModule size, typical link
2 × 2492 × 136 mm2.11 mm
3 × 3960 × 89 mm1.32 mm
4 × 41643 × 65 mm0.92 mm

All three clear the 0.4 mm floor easily, though a long payload has many more modules to fit in the same cell — so the panel works the figure out for what you have actually built, before you download.

Worth saying how it is made: each label is the PDF download, embedded. Not redrawn at label size — literally the same vector page, placed nine times. That is the only way to be certain a label is the code you approved, and it is why the frame, the logo and the colours come along with no second implementation to keep in step. Every label carries the same code; for a sheet of different ones, the batch panel above gives you a ZIP to place yourself.

Copying instead of downloading

Three buttons under the downloads, for the times a file is more trouble than it is worth. Copy image puts the PNG straight on the clipboard, so it can be pasted into a slide, a chat or a document without a trip through the downloads folder. Copy contents copies the payload rather than what is in the boxes — for a WiFi code that is WIFI:T:WPA;S:Cafe;P:hunter2;;, which is what a scanner actually reads, and it is the quickest way to see what you have really made. Copy SVG hands over the markup as text, ready to paste into a design tool or straight into a page.

Two limits worth knowing, both the platform’s rather than ours. PNG is the only image a browser will put on the clipboard — ask for SVG and Chrome refuses outright, which is why the SVG button copies text instead. And some browsers do not allow an image on the clipboard at all; there the button says so and points at the PNG download, which is the same code.

What this tool deliberately cannot do

Other generators offer QR codes for a PDF, an MP3, a photo gallery, a feedback form or an app that sends iPhones and Android phones to different stores. Those are not extra QR formats — a QR code holds text, and none of that is text. Every one of them works by uploading your file to the generator’s server, or by pointing the code at a redirect they control, and encoding a link to it.

That has three consequences worth knowing before you choose a tool. Your file leaves your device. The code stops working if that company folds, changes its pricing or retires the link — and it is printed by then. And the address inside your code belongs to them, not to you.

Nothing is uploaded here, so those types are not on offer, and we would rather say why than quietly leave them off the list. The substitute is straightforward and better: put the file somewhere you control, then make an ordinary URL code pointing at it. If you need a destination you can change later, put a redirect on your own domain and encode that — you get the editability without handing anyone else the keys to your printed code.

What actually crosses the network

“Nothing is uploaded” is a claim every generator makes, so here is the specific version, which you can check yourself in about thirty seconds.

Open your browser’s developer tools, switch to the Network tab, and type a WiFi password into the field above. Watch what happens. The requests you will see are these, and no others:

RequestWhenCarries your content?
The QR library, from jsDelivrOnce, on the first code you makeNo — a static file, identical for every visitor
A decoder, from jsDelivrOnly when you add a logo, style the code, or press TestNo — same static file, and it runs on the picture in your tab
A PDF writer, from jsDelivrOnly when you click the PDF buttonNo
A ZIP builder, from jsDelivrOnly when you make a batch of codesNo — your list is read and zipped in the tab
This site’s own header, footer and fontsOn page loadNo
Analytics and an ad scriptOn page load, as on any page hereNo — they never see the field contents

The reason none of them can carry it is structural rather than a promise: this page contains no way to send anything. There is no fetch, no XMLHttpRequest, no sendBeacon, no WebSocket and no form in it. The code is drawn onto a <canvas> in your tab and every download is a blob: URL created in that same tab. We check for this on every build, because a claim like this is only worth making if something enforces it.

What that buys you in practice: a WiFi password, a private link, an unlisted contact card or a payment address can go into a code here without existing anywhere except your own machine. Type the same thing into a generator that renders the image on its server and it has been transmitted, whatever the page says underneath.

Two honest caveats. The library files come from a public CDN, so that CDN can see that a browser at your address asked for a QR library — not what you did with it. And this site runs analytics and an ad script like most free tools; they measure page views, not the contents of a text field. If neither is acceptable, the page works with them blocked.

If you have the opposite problem — a code you did not make and want to know what is inside — the QR code scanner reads one out of an image and shows you the destination as text before anything opens. It runs the same decoder this page already uses to check its own output.

Static and dynamic codes

Every code this page makes is static: the destination is encoded in the pattern itself. Nothing sits between the scanner and the thing you pointed at, so the code cannot be switched off, rate-limited, watermarked or lost when a company folds. There is no account behind it and no expiry. The trade is the obvious one — you cannot change where a static code points once it is printed.

A dynamic code is a different arrangement. The pattern holds a short link on the generator’s own domain, and that domain redirects to wherever you currently want it to go. That buys two real things: you can change the destination after the code is printed, and you get scan counts. It costs two real things in return. The code stops working the moment that redirect service does — a link shortener that shuts down takes every printed code with it, and that has happened to companies with a lot of signage in the field. And every scan passes through someone else’s server, which sees the scanner’s IP address and rough location.

We do not offer dynamic codes, and the reason is architectural rather than a roadmap item: running them means running a redirect service and a database, which means your destinations live on our servers. This page has no way to send anything anywhere, which is the property most of the rest of it is built to protect. If you genuinely need editable destinations or scan analytics, use a service built for it — and go in knowing that you are renting the code, not owning it.

If what you want is the ability to fix a mistake, the cheaper answer is usually to point the static code at a URL you control — a page on your own site — and change what that page does. You keep the redirect and nobody else is in the path.

Frequently Asked Questions

The pattern is a grid of squares called modules. The three large squares in the corners are finder patterns: a scanner locates the code by their distinctive 1:1:3:1:1 run of dark and light, which is why this tool never styles them even when you style everything else. The rest carries your data plus error-correction codewords spread across the whole symbol, which is what lets a scuffed or partly covered code still read. More data means more modules — from 21 across for a short link up to 177 — and in the same printed square, more modules means each one is smaller.
Use a generator that builds the code in your browser rather than on its server. This one has no way to transmit anything — no fetch, no XMLHttpRequest, no sendBeacon, no form — so your link, WiFi password or payment address never leaves the machine you typed it on. You can confirm it in about thirty seconds: open your browser's Network tab, type something into the field, and watch. The only requests are static library files, identical for every visitor and the same whatever you type.
Here, and there is nothing to sign up for. No account, no email, no free-trial clock and no watermark on the result. The codes are static, so there is no service behind them that could later ask you to pay to keep them working — which is what a login usually exists to enable. Make as many as you like and close the tab.
This one. The pattern is computed by JavaScript running in your tab, drawn onto a canvas, and handed to you as a blob URL created in that same tab. The only things fetched from elsewhere are the QR library itself and, if you use them, a decoder and a PDF writer — all static files that carry nothing of yours. After the page has loaded, making a code needs no network at all.
No. These are static QR codes — the data is encoded directly into the pattern, so the code works forever and never expires. There is no account, redirect or tracking link that could stop working. The trade is that a static code cannot be re-pointed after it is printed.
Yes, and the tool checks it for you. A logo covers real data, so after every change it decodes the actual image and tells you whether your content came back. That check matters more than any rule of thumb: in our sweep the largest workable logo ran from 11% to 39% of the code's width depending on the error-correction level and how much content was in the code. Adding a logo also raises error correction for you, which is the one setting that helps — to H where the content fits, and otherwise to the highest level that does. H holds only 1273 characters, so forcing it on a longer contact card would turn adding a logo into a capacity error.
No, and this is the most repeated wrong thing about QR codes. The level describes how many codewords can be reconstructed, not how much of the picture you may paint over — and a logo destroys a solid block in one place rather than damage spread across the symbol. Measured at level H, the largest logo that still read back covered 15.2% of the code's area on a long payload and 4% on a short link. Both are well under the 30% the level is named for.
PNG, JPG, SVG and WebP. The format is read from the file’s own header bytes rather than from what your browser labels it, because an image off a phone share sheet often arrives with no type at all. Each download carries the logo differently: the SVG embeds your original file, so a vector logo stays vector; the PDF embeds PNG or JPEG and rasterises anything else, since those are the only image formats a PDF can hold; and the EPS embeds raw samples flattened onto the background colour, because PostScript has no transparency in an image. A transparent PNG stays transparent everywhere except the EPS.
Yes — rounded, dots or diamonds for the data modules, and square, rounded or circular corner frames, with the corner centres styled separately. What the tool will not do is restyle the three big corner squares as data modules. Those finder patterns are how a scanner locates the code at all, by the 1:1:3:1:1 pattern of dark and light along a scan line, and we measured that dotting them breaks the code on every decoder we test with. Everything else is fair game, and every change is decoded before you download it.
M for almost everything on a screen. Higher levels let a code survive damage, dirt or a logo, but they also make it bigger and hold less: L recovers about 7% and holds 2953 characters, M about 15% and 2331, Q about 25% and 1663, H about 30% and 1273. Choose H when there is a logo or the code will be printed somewhere it might get scuffed.
It usually still scans. Every code carries error-correction codewords, and the level you pick sets how many: roughly 7% of the code recoverable at L, 15% at M, 25% at Q and 30% at H. Two caveats matter more than the numbers. That recovery is spread across the whole symbol, so it handles scuffs and a crease far better than one solid block — in our own sweep the largest centre logo that still read at level H covered 15.2% of the area, half what the level is named for. And the three corner squares are the exception: a scanner finds the code by them, so damage there stops it being found at all, however high the level.
That is the quiet zone, and it is part of the code. The standard requires four empty modules around the pattern. We measured the same link with and without it: both versions scan on a white page, but with no margin at all the code stops scanning the moment you place it on a dark background. You can reduce it with the slider, and the tool will tell you what that costs.
Within limits, and the tool enforces the limits rather than letting you find out in print. A scanner has to separate dark modules from light ones. Stepping a grey foreground against white, everything at a contrast ratio of 4.06:1 and above decoded, and everything at 4.00:1 and below failed. So anything under 4:1 is refused, and 4:1 to 7:1 is flagged — it reads from a clean file but leaves nothing spare for a phone camera in poor light. Gradients are checked at both ends, and separate corner colours are checked too, because a code is only as readable as its worst colour.
Yes. Choose WiFi, enter the network name and password, pick the security type and mark it hidden if it is. Scanning it lets a phone join without anyone typing the password. Accents and non-Latin characters are encoded correctly, which is worth saying because it is a common failure: some generators prepend a byte-order mark to any non-ASCII text, so a password containing é or ü is silently encoded wrong and the phone refuses to connect.
Yes, and you should understand what that means. A WiFi code carries the password as plain text inside the pattern — it is not encrypted, and anyone who scans the code has the password, whether or not their phone shows it to them. That is fine for a guest network on a café table and wrong for your main network. Anyone can read it back: paste the image into our QR code scanner and the password appears as text. Treat a printed WiFi code as a password written on the wall, because that is exactly what it is.
Yes. Choose Contact for a vCard, or MeCard for a smaller code with fewer fields. Name, company, job title, phone, email, website and a full postal address are all carried. The address is asked for as five separate boxes on purpose: vCard's ADR is positional, and a generator with one “Address” field puts the whole thing in the street slot and leaves city, region, postcode and country empty. There is more detail on the contact QR code page, including what a photo would cost you.
Yes — a filled or outline frame with a line of text under the code, and the text is yours to write. Prefer an instruction to a prompt: "Scan for menu" or "Scan to order" tells someone what happens, where "Scan me" only tells them they can. The frame is built entirely outside the quiet zone, so it never borrows space from the code: we swept a frame inward a module at a time and found that with one clear module left both decoders still read it and with none both failed. The code keeps the same module size it had without a frame; the image around it grows instead.
Yes, and without an account. Paste one link or line of text per row, or open a .csv or .txt, pick PNG or SVG, and you get a ZIP. Up to 500 rows at a time. Every code uses the style you set, and every one is decoded before it goes into the archive — any that do not read back are named. Most generators put bulk behind a login because the codes are drawn on their server, which means your list has to be sent there; here the file is read in your browser and the ZIP is built in the same tab, so a column of customer links or staff names never leaves your machine.
Yes — choose WhatsApp, enter your number with its country code, and add the message customers should arrive with. No WhatsApp Business account is needed. The one thing to get right is the number format: wa.me needs the full international form with the national trunk prefix dropped, so 07700 900123 has to be 44 7700 900123. Get that wrong and the code still scans; WhatsApp reports the bad number afterwards, to your customer. The tool checks the shape before you print.
Yes. Choose Event, give it a name and a start date, and the code carries a standard iCalendar event, so scanning it offers to add the whole thing — title, time, location, description. Leave both time boxes blank for an all-day event such as a wedding. This is the one type where a scan check proves nothing, since a perfectly readable code can still hold the wrong date, so the payload is parsed with two real calendar libraries instead of being taken on trust.
Not here, and it is worth being clear about why. A QR code holds text, not files — every generator offering those types uploads your file to its own server and encodes a link to it. That means your file leaves your device, the code stops working if that company disappears or moves you to a paid plan, and the destination is theirs rather than yours. This tool never uploads anything, so it cannot offer them. Put the file somewhere you control, then make a URL code pointing at it: same result, and it keeps working.
A static code holds your data inside the pattern itself; a dynamic code holds a short link to the generator's server, which redirects to wherever you currently point it. Dynamic buys two things — you can change the destination after printing, and you get scan counts — and costs two: the code dies if that redirect service does, and every scan passes through someone else's server, which sees the scanner's IP address. Everything made here is static. If you want to keep the ability to fix a mistake without renting your code from anyone, point a static code at a page on your own domain and change what that page does.
Because a dynamic code would have to point at our server instead of at your content. A dynamic code does not contain your destination at all — it contains a link to the generator's server, which then redirects and counts the scan. That is what makes it editable and trackable, and also what makes it fragile: the code is only as permanent as somebody else's subscription. Everything here is static, so it points straight at your content and cannot be switched off. If you need editable destinations and scan statistics, use a redirect on a domain you own and make a static code for that.
No. The destination is encoded in the pattern itself, so changing it means generating and printing a new code. If you want to keep the ability to change your mind, point the code at a URL you control — a page on your own site — and change what that page does. You keep the redirect, nobody else is in the path, and the printed code never stops working.
Yes. Choose A4 or US Letter and 2 × 2, 3 × 3 or 4 × 4, optionally add a title, a caption and a SCAN ME line, and you get a PDF laid out at a known size with optional cut guides. It is a PDF rather than a browser print because a print dialog decides its own margins and scaling, so a label you measured at 40 mm can arrive at 37. Every label is the PDF download embedded rather than redrawn, so it is the same vector code you approved. On A4 a 4 × 4 sheet gives sixteen 43 × 65 mm labels at 0.92 mm per module, comfortably above the 0.4 mm a printer can hold — and the panel works that figure out for your actual code before you download. Every label carries the same code; for a sheet of different ones, use the batch panel.
Yes — three ways. Copy image puts the PNG on the clipboard to paste straight into a slide, a chat or a document. Copy contents copies the encoded payload rather than what you typed into the boxes, which for a WiFi code is the WIFI: string a scanner actually reads. Copy SVG copies the markup as text, ready to paste into a design tool. PNG is the only image format a browser will accept on the clipboard — Chrome refuses SVG outright — which is why the SVG button copies text rather than an image. If a browser will not allow an image on the clipboard at all, the button says so and points at the PNG download, which is the same code.
They are the same code in five wrappers. PNG for screens, web and social. SVG for design tools, where it stays sharp at any size. PDF and EPS for a printer — both are real vectors at 30 mm square, and EPS is what most print shops ask for. JPG only because people ask for it; it is the worst choice for a QR code, since JPEG compression rings around exactly the hard edges a scanner looks for.
Big enough that one module stays around 0.4 mm, and a code scans from roughly ten times its own width away. How wide that makes it depends on how many modules your content produces: a short link is 25 modules across, so at 25 mm wide each module is 0.76 mm; a typical link is 33 modules, giving 0.61 mm at the same size. The panel under the preview works this out for what you have actually typed.
No limits and no watermark. The code points directly at your content, so it works on print, packaging, business cards and posters with unlimited scans. There is no account and nothing to expire.
Yes. Codes you make here are yours to use for anything, including commercial work, with no watermark, no scan limit, no attribution and no licence to buy — our terms say so explicitly. The format itself is free too: QR Code is an open ISO standard (ISO/IEC 18004), and Denso Wave, who invented it and hold the patents, have stated they will not exercise them. “QR Code” is a registered trademark of Denso Wave, which matters if you are naming a product after it, not if you are printing codes on a menu.
No. The QR code is generated entirely in your browser, so your URL, password or message is never sent to a server. It is safe for private WiFi passwords, internal links and personal contact details — and you can confirm it in your browser's network tab.
At most 2953 characters, and only at the lowest error-correction level — 2331 at M, 1663 at Q, 1273 at H. The counter under the content box tracks the limit for the level you have chosen. You should stay well clear of it: 2000 characters makes a code 169 modules across, which on a business card is finer than most printers can hold. Long content belongs behind a short link.