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
Content type Choose text / URL, contact, email, phone, SMS or location. The code updates as you type. The Wi-Fi tab provides a link to the dedicated generator. Only your option choices are saved in this browser; the content stays out of saved preferences.
Export PNG uses the same whole number of pixels for each module, so its actual size may be below the selected size. SVG scales without blur. If copying is blocked, download instead. Scan the exported image before printing.
QR options
M is the default error correction level. Higher levels can make the code denser. Auto chooses the smallest version that fits; a fixed version that is too small produces an error.
The default is a light margin four modules wide on every side. A smaller quiet zone triggers a warning; leave enough clear space around the code when placing it.
Modules / Background Low contrast, a red-channel difference below 40%, or light modules on a dark background trigger warnings. A transparent background exposes the surface beneath the code: use a plain, light surface.
Off by default. Japanese characters in the supported Shift_JIS mapping can use 13 bits each. Numeric and alphanumeric modes remain available; byte segments use UTF-8. No ECI header is added; test the code with the phones that will scan it.
QR code preview The status shows the version, module count, used data bits, encoding modes and actual PNG size. Content that does not fit produces an error; the tool never truncates it.

    Check the downloaded image with the QR Code Reader →

    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.dev at level M: Version 2 · 25×25 modules · level M · 172 of 224 data bits (77%), encoded as byte (20 bytes).
    • HTTPS://ZEROTOOL.DEV at 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.com with the URL in the qr_code_text parameter.
    • QRCode Monkey sends the content to api.qrcode-monkey.com/qr/custom and shows an image saved under api.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.