Build static QR codes with full visual customization. Privacy-first — everything runs in your browser.
A QR ("Quick Response") code is a two-dimensional barcode that encodes a short message — usually a URL, but also plain text, contact info, WiFi credentials, or a phone number. When a phone camera sees it, the message is decoded and the phone offers to open it.
QR codes are public-domain (defined by ISO/IEC 18004). Any scanner can read any QR code — there's no concept of a "private" QR.
There are two kinds of QR codes in common use:
| Kind | What it encodes | After printing |
|---|---|---|
| Static | Your URL / text directly. The QR is the final artifact. | Cannot be changed without reprinting. Cannot track scans. |
| Dynamic | A short redirect URL on someone's server. The server forwards to your real URL. | Can be edited after printing. Can track scans. Requires the redirect service to keep running. |
This tool builds static QR codes only. No redirect service. No scan tracking. No dependence on a third party staying online. The QR you print today will still work in ten years, exactly as printed.
A vCard QR encodes a full contact card. When a phone camera scans it, the contacts app pops up with an "Add Contact" sheet pre-filled with the name, phone, email, organization, and address you provided. Saving the contact takes one tap — no manual typing.
Behind the scenes the tool produces a vCard 3.0 text payload (RFC 2426). vCard 3.0 has the broadest scanner support — iOS, Android, and most QR-reading apps handle it natively.
BEGIN:VCARD VERSION:3.0 N:Doe;Jane;;; FN:Jane Doe ORG:Acme Legal TITLE:Senior Partner TEL;TYPE=WORK,VOICE:+15551234567 TEL;TYPE=CELL,VOICE:+15559876543 EMAIL;TYPE=INTERNET:jane@acme.example URL:https://acme.example ADR;TYPE=WORK:;;1234 Main St;Springfield;IL;62701;USA NOTE:Family law & estate planning END:VCARD
A full vCard is the densest QR this tool produces — every field you fill adds modules. For business-card printing aim for at least 2.5 cm and error correction Q or H so a coffee ring or scuff doesn't kill the scan. The tool defaults to M, which is fine for clean digital surfaces.
What the server DOES see:
Note on the "generated" count: this metric records when a valid QR is successfully built in the preview, not just when you download. A user who builds a QR and closes the tab without downloading still produces a "generated" row. That lets the site admin compute a download-conversion rate (downloads ÷ generations), useful for understanding how often visitors who try the tool follow through to a download. The metric never includes your content — only the enum-style QR type.
What the server NEVER sees:
No QR images are stored on the server. Each download is produced fresh from the data already in your browser.
QR scanners read the contrast between modules and the background — not specific colors. The most reliable choice is still pure black on pure white.
Every QR code reserves some of its pixels for error correction. If part of the QR is dirty, smudged, scratched, or covered by a logo, the scanner can still read it — up to a point.
| Level | Recovers up to | When to use |
|---|---|---|
| L | ~7% | Clean digital surfaces (web pages, on-screen). Smallest QR. |
| M | ~15% | Default. Indoor printed materials. Good balance. |
| Q | ~25% | When overlaying a logo. Outdoor or high-wear surfaces. |
| H | ~30% | Heavy logo overlay or surfaces that get dirty / scratched. |
Higher levels make the QR pattern denser — meaning a larger printed size is needed to keep modules legible. If you overlay a logo, jump to Q or H so the QR can recover from the obscured center.
After every render, the preview is re-decoded by an in-browser QR reader. A green "Verified scannable" badge appears when the round-trip matches your input; a red badge surfaces with a specific cause (logo too large, contrast too low, error correction too low) when it doesn't. The check runs entirely in your browser — nothing is uploaded.
Drop a CSV with columns label, url, and optional frame_text under the "Bulk" section. Every row becomes a QR using the visual settings you picked above (colors, module + eye style, frame, logo, error correction, size); the results are packaged into a ZIP for download. The CSV is parsed and the ZIP is built entirely in your browser — at no point does the file or any of its contents reach the server. Capped at 500 rows.
Pick the colors you use, click "Save preset", give it a name. The next time you open the tool, the preset appears as a one-click chip below the color pickers. Presets live in your browser only (localStorage); they're shared with the Email Signature Generator on the same device. Clearing your browser's site data clears the presets.
Four output formats: PNG (raster, sized by the pixel-size slider), SVG (scales infinitely), JPG (smaller files for screen use), and PDF (single-page wrapper around the PNG, ready to drop into a press-ready document). Print works as a fifth path — the Print button opens your browser print dialog scoped to a clean view of the QR only.
Drag the logo size slider (10–40 % of QR width) to find the largest overlay that still scans. Clamped to the safe range — above 40 % even level H error correction starts dropping scans. If you opened this page from the UTM Builder's "Make a QR for this URL" button, the URL field is pre-filled automatically; the URL itself travels via the browser address bar and never reaches the server.
Static QR codes (what this tool makes) never expire. They're a physical pattern — as long as the pattern is legible, it scans. The destination URL it points to could go down, but the QR itself works forever.
No. See the Privacy statement above. The QR content never reaches our server. We log only your IP, timestamp, QR type, and file format for each download (no PII, no content).
Not with a static QR. Tracking requires a dynamic QR (which redirects through a third-party server). If you want scan analytics, build a tagged URL in our UTM Builder first, then encode that tagged URL into a static QR here. The tagged URL's clicks show up in your analytics tool.
Most likely you're using the PNG export at too small a resolution and scaling it up. Increase the Pixel size slider before downloading, or use the SVG export — SVG scales infinitely without blurring.
Common causes: too small (under 2 cm), too low contrast, missing quiet zone, or a logo overlay that's eating too much of the QR. Try: increase the size, switch to pure black on pure white, raise the error correction to Q or H, or reduce the logo size.
Hex codes are the universal pin for a specific color. They match between your screen, your printer, and your design software. The picker also accepts shorthand (e.g. #f0a → expands to #FF00AA on blur).
They contain your network name AND password in plain text. Anyone who scans the QR sees both. That's usually fine for guest networks, but treat them like you'd treat a printed copy of the password — don't leave them anywhere public if your network is sensitive.