Skip to main content
QC

QR Code Generator

Generate a real, scannable QR code from text, a URL, Wi-Fi details, an email address or a phone number — encoded entirely in your browser, no external API.

Did you like the tool? Thanks!
Share:

More Image Tools Tools

IC

Image Cropper

Crop any image to exactly the area you need, with a live preview — nothing is uploaded, everything happens in your browser.

IR

Image Resizer

Resize any image to an exact width and height in your browser — optional aspect-ratio lock, PNG/JPEG/WebP output, nothing uploaded.

IC

Image Compressor

Shrink an image's file size by re-encoding it at a chosen quality level — live before/after size comparison, JPEG/WebP/PNG output, done locally.

IF

Image Flip & Rotate

Flip an image horizontally or vertically and rotate it by any angle — quick 90/180/270° buttons or a free-angle slider, corners never clipped.

IT

Image to Base64

Convert an image into a Base64-encoded string — full data URI or raw Base64, character count, one-click copy, all done locally.

BT

Base64 to Image

Paste a Base64 string or data URI and preview the decoded image instantly — auto-trims whitespace, lets you pick the assumed format, download in one click.

PI

Placeholder Image Generator

Generate a simple placeholder image for wireframes and mockups — custom size, colors and text, auto-sized to fit, PNG/JPEG/WebP output.

IF

Image Format Converter

Convert an image between PNG, JPEG, WebP and BMP entirely in your browser — no upload, instant preview, adjustable quality.

FG

Favicon Generator

Turn any image into a complete favicon package — six PNG sizes plus a combined multi-resolution .ico file, generated locally in your browser.

AA

ASCII Art Generator

Turn a photo into text-based ASCII art, or type a short message as a large block-letter banner — both rendered entirely in your browser.

Version , × modules, EC level , bytes encoded.

How to Use QR Code Generator

Type any text or URL, or use the Wi-Fi, Email or Phone preset to build a correctly-formatted payload from a few simple fields. Choose an error correction level (L, M, Q or H), and a QR code generates automatically, sized to whichever version fits your input at that level. Download the result as a PNG or an SVG. Everything — the actual QR encoding, not just the display — happens locally in your browser.

About QR Code Generator

Most "QR code generator" tools online are, underneath, a thin form that submits your text to a third-party server, which does the actual encoding and hands back an image — meaning whatever you're encoding (a Wi-Fi password, a personal phone number, an address) passes through and is potentially logged by a server you have no visibility into. This tool is a genuine from-scratch implementation of the QR code standard (ISO/IEC 18004) running entirely as JavaScript in your browser: every step, from turning your text into raw data bits through to the finished grid of black-and-white squares, happens on your device, and nothing is ever transmitted anywhere. Building a real QR encoder from first principles is a substantial undertaking, so this tool deliberately and transparently scopes down which parts of the full standard it implements, favouring a smaller set of genuinely correct, genuinely scannable QR codes over an ambitious attempt at the full 40-version, four-mode specification that risks subtle, hard-to-notice bugs. Three scope decisions matter most. First, **only byte mode** is implemented — the encoding mode suited to arbitrary UTF-8 text, which is what URLs, Wi-Fi strings, email addresses and plain messages all are; the standard's separate, more compact Numeric and Alphanumeric modes (which pack digits-only or a restricted character set more tightly) aren't implemented, which very slightly reduces the maximum length available for input made up purely of digits or uppercase letters compared to what a fully-featured encoder could manage, but never affects whether a given input can be encoded at all in byte mode. Second, **QR versions 1 through 5 only** (versions are the standard's name for the different available grid sizes, from a compact 21×21 up through much larger grids for longer content) — and third, restricted further to only the specific (version, error-correction level) combinations that use a **single Reed-Solomon error-correction block**, since the standard's block-splitting and interleaving rules for larger, multi-block codes add substantial extra complexity that would meaningfully increase the risk of a subtle, hard-to-catch encoding bug. Both restrictions are deliberately conservative rather than a workaround for something being broken — everything within this narrower scope is implemented and verified as a complete, correct, standard-compliant instance of the specification. In concrete terms, this caps the maximum input length depending on which error correction level you choose: 106 bytes at level L, 42 bytes at level M, 20 bytes at level Q, or 14 bytes at level H — comfortably enough for a URL, a Wi-Fi network name and password together, an email address, a phone number, or a short message, which covers the overwhelming majority of real-world QR code use, but not enough for a long paragraph of text at higher error-correction levels. If your input is too long for the level you've picked, the tool tells you the exact limit and suggests trying a lower error-correction level rather than silently producing a corrupted or unscannable result. Error correction level itself controls how much of the code's data can be physically damaged, dirty, or obscured (by a logo overlay, a crease, a scuff) and still scan correctly, at the direct cost of how much of the code's total capacity goes toward that redundancy rather than your actual content — L recovers roughly 7% damage and leaves the most room for data, right up through H, which recovers roughly 30% damage but leaves noticeably less room, which is exactly why the maximum input length shrinks so much as the level rises. One more simplification, and a genuinely inconsequential one: the standard defines 8 different "mask patterns" — different fixed geometric patterns XORed over the raw data to avoid accidentally creating large solid blocks or patterns that confuse a scanner — and a fully optimised encoder tries all 8 and picks whichever produces the fewest problematic-looking patterns by a scoring formula. This tool always applies a single fixed mask (mask pattern 0) instead of running that comparison. This does not make the resulting code any less correctly scannable — the code's format information correctly declares which mask was used, exactly as a fully optimised encoder's chosen mask would be declared, so any real-world scanner reads it exactly the same way — it simply means the visual pattern isn't quite as evenly distributed as it could theoretically be, an entirely cosmetic difference with no effect on reliability.

Details & Tips

Worked example: encoding the short URL `https://a.co` (12 bytes as UTF-8) at error-correction level M. The tool first converts the text to its raw UTF-8 bytes, then checks the smallest supported version (1 through 5) whose byte-mode capacity at level M can hold 12 bytes — Version 1 at level M holds up to 14 bytes, which is enough, so Version 1 (a 21×21 module grid) is selected without needing to step up to Version 2. The data bits are then assembled as: a 4-bit mode indicator (`0100`, meaning byte mode), an 8-bit character count indicator (`00001100`, the number 12 in binary), the 12 bytes of the URL itself as 96 data bits, a short terminator, and padding bytes (alternating the two standard pad patterns `11101100` and `00010001`) until the data reaches exactly the 16 data codewords Version 1 at level M requires. Reed-Solomon error correction is then computed over those 16 data codewords using GF(256) arithmetic built on the standard primitive polynomial `x⁸+x⁴+x³+x²+1`, producing the 10 additional error-correction codewords Version 1 level M specifies, and the two are placed into the grid together, one continuous stream, exactly matching Version 1's single-block structure — no interleaving is needed since it's a single block by construction, one of the constraints this tool's scope keeps deliberately simple. The module grid itself is then built up in a fixed, well-documented order: the three large finder patterns (the bullseye-like squares) go into three of the four corners, each surrounded by a one-module white separator; alternating light/dark timing patterns run in a straight line connecting the finder patterns, giving a scanner a reference for the physical spacing between modules; a single fixed dark module is placed at a version-dependent coordinate; an alignment pattern (a smaller nested square, needed from Version 2 upward to help a scanner correct for a photographed or printed code being slightly skewed or distorted) is placed at its version-specific coordinate; and the 15-bit format information — which encodes the chosen error-correction level and mask pattern together, protected by its own small error-correcting BCH code so it can be recovered even if part of it is damaged — is written twice, in two different fixed locations, for redundancy. Every remaining module is then filled by the actual data-and-error-correction bit stream, threaded through the grid in a fixed zig-zag path that moves in two-column strips from the bottom-right corner, alternating direction every strip and skipping the timing-pattern column entirely, with the fixed mask pattern (module state flipped wherever `(row + column) is even`) applied as each data bit is placed. The maximum input length at each supported level, so you know exactly where the ceiling is before you hit it: **106 bytes at level L**, **42 bytes at level M**, **20 bytes at level Q**, and **14 bytes at level H** — each figure is the largest value achievable within this tool's supported version range (1 through 5) and single-block-only restriction. If your input exceeds the limit for your selected level, the tool shows the exact byte limit for that level and suggests either shortening the text or choosing a lower error-correction level, rather than ever producing a silently corrupted or unscannable code. Output is offered two ways: a `<canvas>` rendering, with each module drawn as a filled square and a full quiet-zone margin of 4 blank modules on every side (a real, physical requirement — a QR code with an insufficient quiet zone is one of the single most common reasons a printed or displayed code fails to scan, since scanners rely on that clean border to first detect where the code begins), and a downloadable SVG built from one combined vector path covering every dark module, which stays perfectly crisp at any print size or zoom level, unlike a fixed-resolution raster export.

Frequently Asked Questions

Is my text or Wi-Fi password sent to a server?
No. This is a genuine from-scratch QR encoder implemented entirely in JavaScript — every step, from turning your text into data bits through to the final grid of modules, runs locally in your browser. Nothing is ever transmitted anywhere.
What's the maximum text length I can encode?
It depends on the error correction level: 106 bytes at level L, 42 bytes at level M, 20 bytes at level Q, or 14 bytes at level H. If your text is too long for the selected level, the tool shows the exact limit and suggests a lower level or shorter text.
Why does choosing a higher error correction level reduce how much text I can fit?
Higher error correction reserves more of the code's total capacity for redundancy data, which can recover the code even if part of it is damaged, dirty, or obscured — that redundancy trades directly against how much room is left for your actual content.
Which error correction level should I use?
Level M is a solid default for most uses. Choose L for maximum text length when the code will stay clean and undamaged (a digital screen, for instance), or Q/H if the code might get printed small, scuffed, or partially covered by a logo.
Why does this tool only support byte mode, not numeric or alphanumeric mode?
Byte mode handles any UTF-8 text, which covers URLs, Wi-Fi strings, emails, phone numbers and plain messages — everything this tool needs. The standard's Numeric and Alphanumeric modes pack digit-only or restricted-character content slightly more tightly, but implementing them wasn't necessary for the tool's actual use cases.
Why does this tool cap out at QR version 5?
Versions 1 through 5, restricted further to combinations using a single Reed-Solomon error-correction block, were chosen deliberately to keep every part of the encoder fully verifiable and correct, rather than risking a subtle bug in the more complex multi-block splitting and interleaving rules used by larger, higher-capacity versions.
Does the Wi-Fi preset actually connect me to the network, or is it a normal QR code?
It's a standard-format QR code most phone camera apps recognise automatically and offer to join directly — it isn't a special connection mechanism, just a specific text format (starting with "WIFI:") that phones are built to detect and act on.
Why is there a blank white border around the code?
That's the quiet zone — a required 4-module margin on every side that gives a scanner a clean, unambiguous edge to detect where the code starts. Removing or cropping it is one of the most common reasons a real-world QR code fails to scan.
Should I download the PNG or the SVG?
SVG if you plan to print the code at a large size or resize it in design software, since it stays perfectly crisp at any scale. PNG is simpler for quick digital use, like pasting directly into a document or a chat message.
Why does the pattern in the middle look random rather than optimized?
The tool always applies one fixed mask pattern rather than testing all 8 standard masks and picking the visually "best" one. This has zero effect on how reliably the code scans — the code correctly declares which mask it used, so any scanner reads it exactly the same either way — it's a purely cosmetic difference.
Can I put a logo in the middle of the generated code?
This tool doesn't offer that directly, and doing so safely requires care: any obscured area needs to stay within what your chosen error correction level can actually recover, and covering too much, especially at level L, can make the code unscannable.

Also Available As

qr code generator, free qr code generator, wifi qr code, qr code maker online, generate qr code, qr code for url

Found a Problem?

Let us know if something with QR Code Generator isn't working as expected.

Thanks — we'll take a look.