QR Code Generator - Create Custom QR Codes Online
Generate QR codes for URLs, text, WiFi, vCard contacts, and email. Customize colors, add logos, choose dot styles, and download as PNG or SVG.
Frequently Asked Questions
What is a QR code?
A QR (Quick Response) code is a two-dimensional barcode that can store data such as text, URLs, WiFi credentials, and contact information. Originally developed in 1994 by Denso Wave for tracking automotive parts, QR codes are now widely used for mobile payments, marketing, authentication, and information sharing. They can be scanned by smartphone cameras and dedicated QR code reader apps.
How do I use this QR code generator tool?
1. Select the input type tab (Text/URL, WiFi, vCard, Email, SMS, or Phone). 2. Enter the relevant information in the form fields. 3. The QR code generates automatically in real-time as you type. 4. Optionally customize colors, dot styles, corners, and add a logo. 5. Download as PNG or SVG, or copy to clipboard.
Is my data safe? Does it get sent to a server?
Your data is 100% safe and never leaves your browser. All QR code generation is performed client-side using JavaScript and the HTML5 Canvas API. No data (text, URLs, WiFi passwords, contact details) is transmitted to any server. Even uploaded logos are processed locally as data URLs without any server upload. This makes the tool safe for encoding sensitive information like WiFi passwords.
What is QR code error correction and which level should I use?
QR codes include built-in error correction using Reed-Solomon codes, allowing them to remain readable even if partially damaged or obscured. There are four levels: L (7% recovery), M (15%), Q (25%), and H (30%). Use M for standard QR codes, Q for codes that will be printed on physical materials, and H when embedding a logo (since the logo covers part of the code). Higher correction levels reduce data capacity.
Why should I use a WiFi QR code?
WiFi QR codes allow guests and visitors to connect to your network by simply scanning the code with their phone camera — no need to manually type complex passwords. This is especially useful for offices, cafes, hotels, and events. The QR code encodes the network name (SSID), password, and encryption type in a standard format recognized by both iOS and Android devices.
What is the maximum data a QR code can hold?
A QR code can hold up to 7,089 numeric characters, 4,296 alphanumeric characters, or 2,953 bytes of binary data (at error correction level L). In practice, shorter content produces smaller, easier-to-scan QR codes. For URLs, using a URL shortener before encoding can help keep the QR code compact and scannable at smaller print sizes.
Can I add a logo to my QR code and will it still scan?
Yes, you can add a logo to the center of your QR code. This works because of QR code error correction — the logo effectively "damages" part of the code, and the error correction algorithm recovers the lost data. For reliable scanning with a logo, use error correction level H (30% recovery) and keep the logo size to about 20-30% of the QR code area. This tool automatically sets error correction to H when you add a logo.
Code Examples
import QRCodeStyling from 'qr-code-styling';
// Basic QR code
const qrCode = new QRCodeStyling({
width: 300,
height: 300,
data: 'https://example.com',
dotsOptions: {
color: '#000000',
type: 'rounded',
},
backgroundOptions: {
color: '#ffffff',
},
qrOptions: {
errorCorrectionLevel: 'M',
},
});
// Append to DOM
qrCode.append(document.getElementById('canvas'));
// Download as PNG
qrCode.download({ name: 'qr-code', extension: 'png' });
// Generate WiFi QR code string
function generateWiFiQR(ssid, password, encryption = 'WPA', hidden = false) {
const escape = (str) => str.replace(/([\\;,:"'])/g, '\\$1');
return `WIFI:T:${encryption};S:${escape(ssid)};P:${escape(password)};H:${hidden};;`;
}
// Generate vCard QR code string
function generateVCardQR({ firstName, lastName, phone, email, org }) {
return [
'BEGIN:VCARD',
'VERSION:3.0',
`N:${lastName};${firstName};;;`,
`FN:${firstName} ${lastName}`,
phone && `TEL:${phone}`,
email && `EMAIL:${email}`,
org && `ORG:${org}`,
'END:VCARD',
]
.filter(Boolean)
.join('\n');
}