QR Code Generator
Make scannable QR codes for URLs, Wi-Fi, email and text, fully in your browser.
This QR code generator builds scannable codes for a URL, a Wi-Fi network, an email, a phone number or plain text, and redraws live as you type. It runs a real ISO 18004 encoder in your browser, Reed-Solomon error correction included, so nothing is uploaded, no shortener rewrites your link, and the code never expires. Pick one of four error correction levels (L, M, Q, H), set the module size, and choose your own dark and background colors, with a contrast warning when a combination would fail readers. The download is a pixel for pixel PNG of the preview, quiet zone baked in. Wi-Fi strings are escaped for you so special characters do not break the join.
100% in your browser. Nothing you type ever leaves this page.
QR code generator
Pick what you want to share (a link, your Wi-Fi network, an email, a phone number, plain text) and the code redraws as you type. Everything happens on a canvas in your own browser. No API behind it, no shortener rewriting your URL, no expiry date. I implemented the actual QR spec in JavaScript for this, Reed-Solomon error correction included, then verified the output byte for byte against an independent decoder until every test payload scanned. That mattered to me. A generator that produces codes which almost scan is worse than no generator at all.
Waiting for input.
The download is pixel for pixel what you see here, quiet zone included.
How a QR code actually encodes your data
Strip away the mystique and a QR code is a very stubborn file format. Your text gets converted to UTF-8 bytes. Those bytes get a tiny header (4 bits saying "this is byte mode", then the length) and the whole stream is chopped into 8-bit codewords. Then the interesting part happens: Reed-Solomon error correction. The encoder treats your codewords as a polynomial, divides it by a generator polynomial over a finite field, and appends the remainder. Sounds abstract, but the effect is concrete. Those extra codewords are mathematical backup copies, and a scanner can use them to reconstruct data that is missing or misread. It is the same family of math that lets a scratched CD keep playing.
The bits then walk the grid in a zigzag, two columns at a time, starting from the bottom-right corner. The three big squares you see in every QR code are finder patterns. They are how a phone camera locks on at an angle, upside down, whatever. There is a strip of alternating modules (the timing pattern) that tells the decoder the grid spacing, and a 15-bit format strip, stored twice for redundancy, that says which error correction level and mask were used.
Masks are my favorite detail. The raw data might produce awkward zones, like a big black blob or a fake finder pattern that confuses scanners. So the spec defines eight XOR patterns, the encoder scores all eight against four penalty rules, and keeps the one with the lowest score. This tool does the full evaluation on every keystroke. Honestly, it is overkill for a screen-sized code, but the spec says all eight, so all eight it is.
Error correction levels: when H is actually worth it
The four levels trade size against resilience. L recovers roughly 7% of damaged codewords, M about 15%, Q about 25%, and H about 30%. Higher recovery means more error correction codewords, which means a bigger denser grid for the same content. Concrete example: the URL https://peoplearegeek.com/ fits a 25x25 code at level M. The same URL at level H needs 33x33. Printed at the same physical size, the H version has smaller modules, and smaller modules are exactly what cheap cameras struggle with.
So here is my honest take on picking one. M is right for most jobs: screens, slides, clean paper. H earns its size cost in two situations. First, you are putting a logo over the middle of the code (that logo is literally destroyed data, and H gives you the budget to survive it). Second, the code lives somewhere hostile: an outdoor sticker, a curved bottle, a warehouse label that gets scuffed daily. Q is the middle child; I almost never pick it. And L only makes sense when you are cramming long text into a code that will only ever be scanned off a bright screen.
One thing people get wrong: a higher level does not make a clean, well-printed code scan faster or from further away. If nothing is damaged, that extra redundancy just sits there making your code denser. Do not pay for insurance you cannot use.
The Wi-Fi QR format, decoded
When you pick the Wi-Fi preset, the tool builds a string like this:
WIFI:T:WPA;S:MyNetwork;P:MyPassword;;
That is the whole trick. T is the security type (WPA covers WPA, WPA2 and WPA3 personal; WEP exists for ancient hardware; nopass means open). S is the SSID, P the password, and a hidden network adds H:true. iOS and Android cameras both understand it natively, no app needed: point, tap the banner, connected.
The part that bites people is escaping. If your SSID or password contains a backslash, semicolon, comma, colon or double quote, it has to be escaped with a backslash, otherwise the parser cuts the field short and the join silently fails with a wrong password error. The tool escapes those five characters for you, which is honestly half the reason to use a generator instead of typing the string by hand. One real limitation: enterprise networks (the ones with a username and password, 802.1X) do not work with this format at all. There is no standard QR string for them.
Print and contrast tips that keep a code scannable
Most "my QR code does not work" complaints come down to four physical mistakes, and they are all avoidable.
- Respect the quiet zone. The spec wants four modules of empty background around the code. This tool bakes that margin into the PNG, so do not crop it off in your layout tool, and do not park text or a border right against the edge.
- Keep dark on light. Scanners binarize the image expecting dark modules on a light background. An inverted code (white on black) fails on plenty of readers even though it looks cool. The tool warns you when your colors flip the wrong way, or when contrast drops too low. Navy on white is fine. Yellow on white is a coin toss at best.
- Size for the scan distance. The rule of thumb I use: minimum code width is the scan distance divided by 10. A poster scanned from a meter away needs a code at least 10 cm wide. A business card scanned from 25 cm gets away with 2.5 cm, but only if the content is short. Long URL plus level H plus tiny print is how you make an unscannable square of noise.
- Matte beats glossy. A glossy lamination throws reflections straight into the camera. If you can choose the finish, choose matte. And before you print 500 flyers, test the actual printed proof with two phones, ideally one of them old and bad. That five minute test has saved me real money.
Sources and further reading
- ISO/IEC 18004, the QR code specification this encoder implements
- Thonky QR Code Tutorial, the reference walkthrough used to verify the Reed-Solomon output
- qrcode.com, DENSO WAVE, the inventors of the QR code
Frequently asked questions
Is my data sent to a server?
No. The encoder is plain JavaScript running in your browser, and the PNG comes straight off a local canvas. Your Wi-Fi password never leaves your machine. Open the DevTools network tab while you type and watch it stay empty, that is the proof I would ask for too.
Do QR codes made here expire?
Never. This tool makes static codes: your actual content is encoded in the pattern itself, with no redirect service in the middle. Commercial dynamic QR platforms route through their own short URL, which is exactly why those codes die when your subscription does. A static code printed today scans in twenty years.
Why does my Wi-Fi QR code not connect?
Usually one of three boring reasons. The password or SSID has a typo (case matters). The security type does not match the router (pick WPA for any WPA, WPA2 or WPA3 personal network). Or the network is enterprise 802.1X, which the Wi-Fi QR format simply cannot describe. Special characters are not the issue here, because the tool escapes them for you.
How much text can I put in?
This tool caps at version 10, a 57x57 grid, which holds 271 bytes at level L, 213 at M, 151 at Q and 119 at H. That cap is deliberate. Bigger versions exist on paper, but dense codes get genuinely unpleasant to scan when printed small. If your content does not fit, encode a short URL that points to the long thing instead.
Which error correction level should I pick?
Leave it on M unless you have a reason. Pick H when a logo will cover part of the code or when it lives somewhere that gets dirty or scratched. Drop to L only when you are squeezing long text in and the code will be scanned off a screen. The higher the level, the denser the grid, so do not buy resilience you do not need.