QR Code Generator
Make static QR codes that never expire for links, text, vCard contacts, email, SMS and map pins. Sharp PNG or SVG, exact size limits, made in your browser.
- Runs in your browser
- Your data never leaves your browser
- Free · No Sign-Up
Scan with WeChat to share this tool
Examples, details and FAQ Worked examples, how it compares with other tools, and answers to common questions.
What the Status Line Shows
The tool splits your text into segments and picks, for each one, the mode that uses the fewest bits: numeric (digits), alphanumeric (digits, upper-case letters, space and $%*+-./:), byte, or Kanji. The ISO/IEC 18004 standard allows any split (2006 edition, Annex J); the status line shows the one chosen. Three examples, as the tool reports them:
https://zerotool.devat level M: Version 2 · 25×25 modules · level M · 172 of 224 data bits (77%), encoded as byte (20 bytes).
HTTPS://ZEROTOOL.DEVat level L is version 1 (21×21) in alphanumeric mode; the lower-case form needs version 2. The scheme and host of a URL are case-insensitive (RFC 3986 §3.1 and §3.2.2), so this trick is safe up to the first/of the path. Paths and query strings can be case-sensitive.
- 2,400 characters of plain text at level M: Too long: this needs 19220 data bits and version 40 at level M holds 18672 (69 bytes too many). It fits at level L. The tool never cuts the text to make it fit.
Contact Cards: vCard or MECARD
The Contact tab writes a vCard 3.0 by default: CRLF line ends, N and FN filled in, and commas, semicolons, backslashes and line breaks escaped as RFC 2426 §4 requires. The reading fields go into X-PHONETIC-LAST-NAME and X-PHONETIC-FIRST-NAME, the properties Android’s vCard library reads for phonetic names (VCardConstants.java).
For Jane Doe with a mobile number, an email address and a website, the tool produces:
BEGIN:VCARD
VERSION:3.0
N:Doe;Jane;;;
FN:Jane Doe
TEL;TYPE=CELL:+1 555 0100
EMAIL;TYPE=INTERNET:jane@example.com
URL:https://example.com
END:VCARD
That is version 8 (49×49) at level M. The same fields as MECARD, NTT DOCOMO’s compact format (MECARD:N:Doe,Jane;TEL:+15550100;EMAIL:jane@example.com;URL:https://example.com;;), fit in version 5 (37×37). MECARD has no company or job title field (DOCOMO’s format table), so the tool leaves those out and says so. Pick vCard when the company matters, MECARD when the card goes on something small.
The other tabs follow their specifications: mailto: with percent-encoded subject and body and %0D%0A line breaks (RFC 6068), tel: without spaces (RFC 3966), geo:latitude,longitude (RFC 5870), and SMSTO:number:message, the SMS form listed on ZXing’s Barcode Contents page. Each template was encoded, decoded with zxing-cpp and parsed back by the QR Code Reader in this site’s test suite.
Size, Quiet Zone and Colors
- Whole pixels per module. A version 2 code with its quiet zone is 33 modules wide; stretched to 256 px that is 7.76 px per module, so some modules come out 7 px and others 8 px wide. The tool rounds down instead: the 1024 px option gives 1023 px at 31 px per module. The SVG is one path on a module grid with
shape-rendering="crispEdges", so it stays sharp at any print size. - Quiet zone. ISO/IEC 18004 asks for a light margin 4 modules wide on all four sides (2006 edition, §8.1). That is the default. Smaller margins are available for layouts that already have white space around the code, with a warning.
- Colors. The tool compares the luminance of the two colors as a stand-in for reflectance and warns below a 40% difference, the lower bound of grade C for symbol contrast in ISO/IEC 15415 (Cognex grading table). It also checks the red channel, because DENSO WAVE notes that scanners lighting the code with red light cannot read red on white (QR code FAQ). Light modules on a dark background are allowed by the standard (reflectance reversal, §5.2); zxing-cpp reads them, but the tool warns because some scanner apps do not try it.
Text Encoding: UTF-8, No ECI Header
Byte segments hold UTF-8 and carry no ECI header. The 2006 standard names ISO/IEC 8859-1 as the default for byte mode, and readers such as ZXing detect UTF-8 from the bytes instead; 你好,世界, 안녕하세요 and emoji all came back unchanged from zxing-cpp in the tests, read as plain ]Q1 symbols. Japanese text can also use Kanji mode, 13 bits per character instead of 24, for JIS X 0208 characters; the checkbox is off by default and the status line tells you when turning it on would make the code smaller.
How It Compares
Tested on 2026-10-01 in desktop Chromium with https://example.com/menu?table=12:
- QR Code Generator (Bitly) turns on scan tracking by default, labels the result Dynamic QR Code, and asks you to sign up before downloading. The preview image is requested from
public-api.qr-code-generator.comwith the URL in theqr_code_textparameter. - QRCode Monkey sends the content to
api.qrcode-monkey.com/qr/customand shows an image saved underapi.qrcode-monkey.com/tmp/. The code itself is static and decodes to the URL. - GenQRCode sends the content to
genqrcode.com/preview. Its 1000 px PNG has modules 27 or 28 px wide, and it adds an ECI header even to this plain ASCII URL.
This page sends nothing while you work, keeps every module the same width, and tells you the exact capacity numbers when something does not fit.
Limits
- Up to 2,953 bytes, 4,296 alphanumeric characters or 7,089 digits (version 40, level L); with Kanji mode, 1,817 Japanese characters.
- No logo overlay, dot styles, gradients or frames. A logo covers modules and relies on error correction to survive.
- No dynamic codes or scan statistics: the code holds the final content.
- PNG up to 4096 px (no DPI tag; set the print size in your layout program) and SVG. No PDF or EPS, no Micro QR.
- Kanji mode covers JIS X 0208 except 8 symbols whose Unicode mapping differs between decoders (wave dash, minus sign and similar); those stay in byte mode.
FAQ
Do these QR codes expire?
No. They are static codes: the link or text is stored in the pattern itself, with no redirect through this site and no account behind it. A printed code works as long as the link it contains works. If you may need to change the destination later, encode a short URL on a domain you control and change the redirect there.
Is what I type sent to a server?
No. The code is built in your browser by the node-qrcode library, which this site serves from its own /vendor folder, and the PNG and SVG are drawn on the page. The page stores only your option choices (error correction, size, colors) in this browser, never the content.
Why is the PNG 1023 pixels when I chose 1024?
Each module gets the same whole number of pixels. A version 2 code with its quiet zone is 33 modules wide, and 1024 / 33 is 31.03, so the image is 33 × 31 = 1023 pixels. Stretching to exactly 1024 would make some modules one pixel wider than others.
How much text fits in one QR code?
At the lowest error correction level (L), up to 7,089 digits, 4,296 upper-case letters and digits, or 2,953 bytes. Chinese, Japanese and Korean characters take 3 bytes each in UTF-8. When the text is too long, the status line says how many bits it needs, how many fit and whether a lower level would work.
Which error correction level should I use?
M (about 15% of the symbol recoverable) suits most screens and prints. Use Q or H for codes on surfaces that get scratched or dirty. Each step up adds error correction codewords, so the same text may need a bigger, denser version.