What actually gets encoded when you pick a data type
A QR code does not store a URL, a WiFi network, or a contact as a concept — it stores one plain text string, built in whatever syntax makes a phone's camera app react correctly. This generator's real job is choosing that string. Picking URL does not just save what you typed: it trims the value and, if it does not already start with http:// or https://, silently adds https:// in front of it, so pasting example.com produces a working link. Text mode does the opposite — whatever you type is encoded exactly as-is, with no protocol guessing at all, which is the mode to use for anything that is not meant to be tapped as a link.
Email builds an older, purpose-built format called MATMSG rather than a mailto: link: MATMSG:TO:address;SUB:subject;BODY:body;; . SMS builds SMSTO:number:message, and Phone builds TEL:+number, both with spaces stripped from the number first. WiFi and vCard go further and build small structured blocks — a WIFI:...;; line and a full multi-line vCard 3.0 record — because a phone's camera only offers actions like "Join network" or "Add contact" when it recognizes one of these specific formats, not from a generic piece of text that merely looks similar.
Validation runs before generation, and warnings do not block it
Every data type has its own required fields and its own soft warnings, and the two behave differently: an error (shown in red) means Generate stays unavailable until it is fixed, while a warning (shown in yellow) is advisory only and never blocks the code from being created. URL and Text are lenient — both only hard-require non-empty input, and everything else is a warning: a URL past 2,000 characters, plain text past 1,000 characters, or text containing CJK characters, all of which can make a QR code dense enough to be unreliable, but none of which stop generation.
SMS and Phone share one hard rule: the number must match /^\+?\d{7,15}$/ once spaces, dashes, dots, and parentheses are stripped — 7 to 15 digits, an optional leading +. WiFi is the strictest: the network name is required and capped at 32 characters as a hard error, a WPA password under 8 characters is rejected outright, and a WEP password gets only a soft nudge toward the lengths WEP actually uses (5, 10, 13, or 26 characters). vCard requires nothing but a first name — email, phone, and website are all optional and only checked loosely if filled in.
- URL — required only; 2,000+ characters and plain http:// are warnings, not errors
- Text — required only; 1,000+ characters or CJK characters are warnings, not errors
- Email — recipient address required and checked against a basic email pattern; long subject or body are warnings
- SMS / Phone — required, and must match /^\+?\d{7,15}$/ after stripping spaces, dashes, dots, and parentheses
- WiFi — SSID required (32-character hard limit); WPA password rejected under 8 characters; WEP password only nudged toward 5, 10, 13, or 26 characters
- vCard — only first name is required; email and website get soft warnings if they look malformed
Shape, size, and the one real tradeoff: error correction vs. density
Beyond the classic black-square look, the customizer offers six module shapes (square, rounded, dots, classy, classy-rounded, extra-rounded), three finder-corner shapes, and two corner-dot shapes, plus a size slider that runs from 128 to 1024 pixels in 32-pixel steps and a margin slider from 0 to 50 pixels. The one setting that changes how the code behaves, not just how it looks, is error correction: L (about 7% recoverable), M (about 15%), Q (about 25%), and H (about 30%). Higher levels let the code keep scanning after real-world damage — a torn corner, a light stain, or a logo dropped over the middle — but they do it by packing more redundant data into the same grid, which makes the pattern visually denser at a given size.
That tradeoff is exactly why a logo needs a higher error correction level to stay reliable: the logo options let an image be sized from 20% to 40% of the QR code, with a margin around it, and either show or hide the underlying dots behind it in a circle, square, rounded, or no background shape. Covering a meaningful chunk of the code with a logo destroys the data modules underneath it, and only a high correction level (Q or H) leaves enough redundancy for a scanner to reconstruct what is missing.
Twelve presets, and what they actually change
The twelve built-in presets — Classic, Rounded, Dots, Ocean, Sunset, Forest, Midnight, Minimal, Bubblegum, Corporate, Neon, and Vintage — are saved combinations of foreground color, background color, module shape, and corner shapes, applied on top of whatever data type is already selected. Minimal is a useful edge case worth knowing: it is the only preset that also changes margin, dropping it to 2 pixels for a tighter, badge-like footprint. Applying a preset never touches the underlying data, a logo, or the error correction level — only the visual fields it defines.
Export, sharing, and two ways to hand a code off without downloading it
Once a code validates, it can be downloaded as SVG or PNG, copied straight to the clipboard as an image, or copied as its raw encoded text (the literal WIFI:... or MATMSG:... string, not a picture). A fourth option, Copy design link, copies the current page URL — the whole configuration (data, style, logo settings) round-trips through that link, so sending it to someone else reopens the exact same code rather than a blank generator.
One WiFi network, encoded exactly
Take a visible WPA network named Home Office with the password coffee123. The encoder builds the parts in order — WIFI:T:WPA, then S:Home Office, then P:coffee123 — joins them with semicolons, and appends a closing ;; , producing exactly WIFI:T:WPA;S:Home Office;P:coffee123;; . Marking the same network hidden appends one more segment before the close, H:true, so the string becomes WIFI:T:WPA;S:Home Office;P:coffee123;H:true;; — that single flag is the entire difference between a QR code that just joins a visible network and one that tells a phone to actively search for a hidden one.