QR Code Customizer

Design branded QR codes with custom colors, logo & styles. Live preview as you type.

1 — Content

Need WiFi, vCard, or email types? Use the QR Generator for structured formats.

2 — Color preset

3 — Colors

Foreground

Background

4 — Logo (optional)

Use High (30%) error correction when adding a logo

5 — Settings

Export size — 512px

Margin — 4

Error correction

Frame label (optional)

Text drawn below the QR — included in PNG, WebP & SVG exports.

Preview

Live

🔒 Generated locally — nothing uploaded

Runs entirely in your browser. No uploads. Your files stay private.

Designing a Branded QR Code Without Breaking Scannability

QR Customizer renders a styled QR code in real time as you change colours, margin, logo, and label. It is built on the qrcode npm library: QRCode.toCanvas paints the matrix to an offscreen HTMLCanvasElement, your logo is drawn over the centre with the Canvas 2D drawImage method, and an optional caption strip is appended below using ctx.fillText. The result is composited onto a single visible canvas that you can export as PNG, WebP, or SVG, or copy directly to the clipboard via the async ClipboardItem API.
Colour comes down to luminance contrast between the dark and light modules. Phone cameras locate finder patterns by binarising the image, so the foreground should be substantially darker than the background regardless of hue. The presets shipped here (Ocean, Forest, Crimson, etc.) are tuned to keep that delta high; if you pick custom colours, aim for at least a 4:1 luminance ratio. Inverted codes (light foreground on dark background) violate the QR spec's assumption and many older scanners will refuse them, even though most modern phones cope.
The transparent-background option writes the light colour as #00000000 (RGBA zero alpha). This is honoured natively by both PNG and SVG exports — the SVG simply omits the light <rect>s — but WebP's alpha channel is shallower, so very subtle gradients behind the code can introduce edge fringing. If you need a clean cut-out for compositing in Figma or InDesign, prefer SVG.
Logo overlay is the part most likely to break a code. A QR symbol contains Reed-Solomon error-correction codewords that let scanners recover from physical damage — error correction level L recovers about 7%, M 15%, Q 25%, and H 30%. Covering the centre with a logo eats into that budget. The slider here is capped at 30% of the code's width for that reason, and switching to level H is the standard practice when adding a logo. The tool also paints a clean rectangle behind the logo with five pixels of padding so the boundary between logo and modules is unambiguous to the scanner.
The frame label is drawn as a fixed band below the code at 12% of the code's height, with a bold sans-serif font scaled to 55% of the band height and clipped to 90% of the width. It is part of the exported image, so when you save the SVG via QRCode.toString and then download, the label is regenerated on the fly to match. Keep labels short — &quot;Scan me&quot; or a domain — because long text gets compressed and visually competes with the code.
Margin is the white quiet zone around the matrix, measured in QR modules. The spec mandates at least four modules; less than that and many camera apps fail to lock on, especially when the code is printed flush against a coloured background. The slider goes from 0 to 10; values below 4 are intentionally allowed for digital placements where you control the surrounding pixels, but for print stick to four or higher.
Export size up to 2048 px gives you a raster suitable for poster prints, but the SVG export is the better choice for any output above A4 — it is resolution-independent and the file is typically just a few kilobytes. PNG keeps a transparent background; WebP exports at quality 0.92 for a smaller file at near-identical visual quality. Everything happens in the page; the only network request involved is the one that loaded this page.

Common Use Cases

01

Branded marketing collateral

Generate codes in your brand's primary and secondary colours with the company mark centred for posters, flyers, and trade-show backdrops.

02

Restaurant menus and table cards

Style codes to match the restaurant's visual identity while keeping high error correction so they survive grease, wear, and dim lighting.

03

Business card vCards

Embed a centred logo over a vCard QR so the back of a card reads as a designed object rather than a generic black square.

04

Product packaging

Design codes that complement label artwork and print well on coloured stock with the SVG export sent straight to the prepress workflow.

Frequently Asked Questions

Yes, as long as the foreground is meaningfully darker than the background. Aim for at least a 4:1 luminance contrast ratio. The shipped presets all meet that threshold. If a code looks fine but fails to scan, the most common culprit is a near-equal luminance pair (e.g. medium teal on medium green).
The slider caps at 30% of the QR width. Beyond that you start covering finder patterns, alignment patterns, or so much data that even level H error correction cannot reconstruct the message. 20% is a good default; only go higher if you have set error correction to H and you test the result before printing.
Use M for plain styled codes without a logo — it adds 15% redundancy with the smallest matrix. Move to Q or H whenever you add a logo, print on rough materials, or expect the code to be photographed at an angle. The error correction selector lists each level's recovery percentage.
The QR spec mandates at least four modules of empty space around the matrix so cameras can lock onto the finder patterns. The margin slider goes from 0 to 10; values below 4 are allowed for digital placements where you control the surrounding pixels, but for printed flyers, packaging, or coloured backgrounds keep it at 4 or higher. Codes that scan fine on a white screen and fail on a dark business card almost always have the quiet zone clipped.
When &quot;Transparent background&quot; is enabled the SVG omits the light-colour rectangles. macOS Preview and Chrome render the empty area as transparent, but some viewers fall back to a checkerboard or black. Open the SVG in a browser or design tool to see the true output.
PNG is the safe default — universally supported, lossless, and predictable when printed. WebP saves about 25-35% on file size at quality 0.92 and is fine for web use, but its alpha channel is shallower than PNG's so subtle gradients behind a transparent code can show edge fringing. SVG is the right pick whenever the destination is print, Figma, or anywhere you need to scale without resampling — just remember the SVG export here contains only the matrix, not the logo.
Currently the SVG export contains only the QR matrix — the logo and frame label are PNG/WebP-only. This is because the qrcode library writes the SVG itself; embedding a raster logo would require base64-encoding it into a foreignObject, which inflates the file and breaks vector workflows. For logo-overlaid output, use PNG at 1024 px or higher.
Canvas's fillText call is given a max width of 90% of the QR width, so very long labels are squeezed by the browser. Keep captions to a few words or a short domain — long sentences are visually noisy next to a QR code anyway. The 40-character input limit is a hint in that direction.
It uses the modern navigator.clipboard.write API with a ClipboardItem of type image/png. That works in current Chrome, Edge, Safari, and Firefox in secure contexts (HTTPS or localhost). On unsupported browsers it transparently falls back to triggering a PNG download instead.
No. The qrcode library and all canvas operations run in your tab. Even your logo is read with FileReader.readAsDataURL, kept as a base64 string in component state, and drawn locally — it is never sent anywhere.

Advertisement