QR Code Generator
Generate QR codes for text, URLs, emails, WiFi, contacts, and more. Customize colors and sizes.
QR Code Options
Your QR code will appear here
Fill in the content above and click "Generate"
QR Code Generator & Scanner — Frequently Asked Questions
Search "qr code generator" and much of page one is a redirect service. qr-code-generator.com and the-qrcode-generator.com lead with dynamic codes: the symbol encodes a short link on their domain, every scan is counted, and the code dies when the account or plan does. This tool makes static codes only. The payload is encoded directly into the module pattern, so a vCard code contains the vCard and a URL code contains your URL. No redirect hop, no scan counter, no account, nothing to expire. The trade-off is real and worth stating plainly: you cannot change the destination after printing, and you get no analytics. For a WiFi placard, a conference badge, a menu or a link in a README, that is the correct trade — the destination does not change, and you do not need to know who scanned.
Each content type writes a different payload string, and the tool prints that exact string under the generated image before you download it. The preview matters, because a scanner does nothing clever with your data — it reads the text and matches a prefix. Get the prefix wrong and the phone shows a raw string instead of offering to join a network or save a contact. All eight formats follow published URI schemes rather than a proprietary wrapper, so any stock camera app on iOS or Android treats them the same way. Required fields are enforced before generation: an email needs a recipient, a vCard needs a first name, geo needs both coordinates.
Text
Encodes the input verbatim, with no prefix and no transformation.
URL
Auto-prefixes https:// when you omit the protocol, so example.com becomes https://example.com.
mailto: per RFC 6068, with optional subject and body appended as percent-encoded query parameters.
Phone
tel: per RFC 3966, with all whitespace stripped from the number.
SMS
sms: per RFC 5724, with an optional pre-filled message passed as ?body= and percent-encoded.
WiFi
WIFI:T:WPA;S:ssid;P:pass;H:true;; with backslash, semicolon, comma, colon and quote characters escaped; the P: segment is dropped entirely for open networks.
vCard
vCard 3.0 (RFC 2426) with N and FN, plus optional ORG, TITLE, EMAIL, TEL, URL and ADR lines.
Location
geo: per RFC 5870, written as geo:latitude,longitude in decimal degrees.
Error correction adds Reed-Solomon redundancy: L recovers about 7% of the codewords, M 15%, Q 25% and H 30%. Higher levels need more codewords for the same payload, so the symbol jumps to a higher version, gets denser, and needs more physical size to stay readable at the same distance. M is the default and is right for screens and clean print; move to Q or H only when the code will be laminated, curved or partially covered. On color, contrast is what scanners actually measure. Nine of the ten presets pair a dark foreground with a light background; Inverted flips it to white modules on black, which most phone cameras cope with but plenty of decoders — including this page's own reader — will not. Exports carry a fixed 2-module quiet zone; ISO/IEC 18004 specifies 4, so leave extra white space in your layout.
Decode mode accepts three sources. Drop or browse an image file and it is read with FileReader, drawn to a canvas created in memory, and passed to jsQR as raw RGBA pixel data — PNG, JPG, GIF and WebP all work. Paste a remote image URL and the browser fetches it, converts the blob to a data URL and runs the identical path. The Camera tab appears only when your browser exposes getUserMedia; starting it opens the rear-facing stream and samples a frame every 300ms until a code is found. Capture forces a single frame, Scan Another restarts the loop. Once decoded, the prefix is inspected to label the result as WiFi, vCard, email, phone, SMS, geo, URL or plain text, and WiFi payloads are unescaped and split into SSID, password, security type and hidden-network flag.
Nothing you type or upload reaches a server. The qrcode library renders to a canvas inside the page and hands back a data URL; jsQR reads pixels from a canvas inside the page. There is no upload endpoint, no account and no scan counter, because a static code has no server in the middle to count anything. Two honest caveats. Decode from URL makes your browser fetch that image from whichever host you named, so that host sees your IP, exactly as if you opened the image in a tab. And getUserMedia requires a secure context, so the camera scanner only works over HTTPS. Everything else — WiFi passwords, vCard details, private URLs — stays in the tab until you close it, and nothing is written to storage.
No. Generation runs through the qrcode library's toDataURL call, which draws to a canvas element in the page and returns a base64 PNG. Decoding runs jsQR over RGBA pixel data pulled from a canvas with getImageData. Neither path makes a request to a DevDrills server, so WiFi passwords and vCard details never leave the tab. The one exception is Decode from URL, where your browser fetches the image directly from the host you named — that request goes to that host, not to us.
Static only. The payload is encoded directly into the module pattern, so a vCard code contains the vCard and a URL code contains your URL, with no redirect hop through a third-party domain. That means the code never expires, works with no account, and cannot be disabled by a service shutting down or a plan lapsing. The trade-off is real: you cannot change the destination after printing, and you get no scan analytics, because there is no server in the middle to count anything.
The four levels add Reed-Solomon redundancy at roughly 7% (L), 15% (M), 25% (Q) and 30% (H) of the codewords. M is the default and is correct for screens and clean print. Higher levels consume more of the codeword budget, so the same payload pushes the symbol to a higher version, making it visually denser and requiring more physical size to stay readable at the same scan distance. Choose Q or H when the code will be laminated, printed on a curved surface, or partially obscured by a sticker or logo overlay.
It emits the standard WIFI scheme: WIFI:T:WPA;S:MyNetwork;P:secret;H:true;; where T is WPA, WEP or nopass, S is the SSID, P is the password and H marks a hidden network. Choose nopass and the P: segment is omitted entirely rather than left empty. Backslash, semicolon, comma, colon and double-quote characters in the SSID and password are backslash-escaped, which is what breaks most hand-written WiFi codes. The iOS Camera app has joined networks from this scheme since iOS 11, and native camera scanning arrived on Android with Android 10.
Version 3.0, defined in RFC 2426, which has the widest contact-app support. The generated payload starts with BEGIN:VCARD and VERSION:3.0, then writes N and FN for the name, plus ORG, TITLE, EMAIL, TEL, URL and ADR lines for any optional fields you filled in. Only the first name is required; the tool refuses to generate without it. vCard 4.0 (RFC 6350) is not offered, because several Android contact importers still handle 3.0 more reliably from a QR payload.
Yes. Drag an image onto the drop zone or browse for it, and the file is read with FileReader, drawn to an in-memory canvas and passed to jsQR. PNG, JPG, GIF and WebP all work. One limitation worth knowing: the decoder runs with inversionAttempts set to dontInvert, so it expects dark modules on a light background. A photographic negative or a white-on-black code will not be read, even though many phone cameras handle inverted codes fine. There is no clipboard paste — use drag and drop or the file picker.
Almost always CORS. Decode from URL runs a plain fetch against the address you paste. If that host does not return an Access-Control-Allow-Origin header, the browser blocks the response and the tool reports "Failed to fetch image from URL". Hotlinked CDN images, Google Drive links and most social-media image hosts fail this way, and no client-side tool can work around it. Save the image and use the upload path instead, which reads the file with FileReader and never touches the network.
No. Starting the camera calls navigator.mediaDevices.getUserMedia with facingMode set to environment, which requests the rear camera. Frames are drawn to an in-memory canvas and scanned with jsQR on a 300ms interval until a code is found, then the interval stops. No frame is transmitted or stored. getUserMedia requires a secure context, so the camera option only works over HTTPS and the tab hides it entirely on browsers that do not expose the API. Stopping the camera calls stop() on every track, which turns the hardware indicator off.
ISO/IEC 18004 caps a version 40 symbol at 7,089 numeric characters, 4,296 alphanumeric, or 2,953 bytes at error correction level L. At level H those ceilings fall to 3,057 numeric, 1,852 alphanumeric and 1,273 bytes, because the redundancy consumes the same codeword budget. In practice a vCard carrying a postal address plus a website reaches 400 to 600 bytes, which pushes the symbol to a high version number and makes it noticeably denser — print it larger than you think you need.
Not in this tool — it renders the raw symbol only, with no image compositing step. If you need a logo, generate at error correction level H and overlay the mark yourself in a vector editor using the downloaded SVG. Level H tolerates roughly 30% of codewords being lost, so a centred logo covering under about 20% of the symbol area normally still scans. Never cover the three finder patterns in the corners. Test the result with at least two different phone cameras before committing to print.
Yes. The SVG is regenerated from the payload with the qrcode library's toString call using type svg, not traced from the PNG, so the modules are path geometry and scale from a business card to a billboard without softening. It is written to a Blob with the image/svg+xml MIME type and saved through an object URL. The SVG honours the same size, 2-module margin, error correction level and foreground and background colours you set for the PNG.
The QR code's data URL — a base64 string beginning data:image/png;base64, — not an image on your clipboard. Paste it into an img src attribute, a CSS background, a markdown file or an email template and it renders with no hosting and no extra HTTP request. If you need a real image file to drop into Slack, a document or a design tool, use Download PNG or Download SVG instead. The data URL always reflects the size, colours and error correction level in effect when the code was generated.
Security & Developer Tools
Create UUIDs and other unique identifiers for your apps. Free, no signup needed.
Customer Reviews
0 out of 5 stars
Based on 0 reviews
Review data
5 star reviews
- 0%
4 star reviews
- 0%
3 star reviews
- 0%
2 star reviews
- 0%
1 star reviews
- 0%
Share your thoughts
If you've used this tool, share your thoughts with other users
Recent reviews
Latest Articles
Tips, guides, and insights from our blog
How to Create Strong Passwords in 2026: A Simple Guide
Practical tips for creating passwords that actually keep your accounts safe. Covers password security, managers, and two-factor authentication — no fluff.
What is a UUID? Complete Guide to Unique Identifiers
A straightforward look at UUIDs — what they are, how they work, and how to actually use them in your apps.
What is Lorem Ipsum? History, Meaning, and Modern Uses
The 2000-year story of Lorem Ipsum — from Cicero's Latin philosophy to modern web design. Plus why designers still use it and how to generate it yourself.
URL Slugs: The Complete SEO Guide for 2026
What URL slugs are, why they matter for search rankings, and how to get them right. Covers best practices and common mistakes to watch out for.