QR Code Generator — Create Custom QR Codes Free
Enter Content
QR Code Customization
High Quality
Scan to test your QR code
✓
💡 Tip: You can scan the QR code to test. Always test before downloading.
⚙️
100% FreeNo hidden charges
🚫
No WatermarkClean QR codes
🖨️
High ResolutionPrint ready quality
∞
Unlimited ScansNo scan limit
🔒
Privacy FocusedWe respect privacy
🛡️
SecureYour data is safe
⚡
Advanced EngineReal-time rendering
Pricing
Everything on this generator is 100% free — no plans, no watermark, no scan limits.
API
REST API access for developers is coming soon. In the meantime, use the generator UI to create and download QR codes.
Blog
Guides on QR code best practices, design tips and use cases — coming soon.
Contact
Questions or feedback? Reach us any time at hello@qrgenerator.example.
`);
w.document.close();
setTimeout(()=>{ w.focus(); w.print(); }, 300);
});
document.getElementById('testScanBtn').addEventListener('click',()=>{
if(typeof jsQR === 'undefined'){ showToast('Scan verifier failed to load — check your connection'); return; }
const imgData = ctx.getImageData(0,0,canvas.width,canvas.height);
const result = jsQR(imgData.data, canvas.width, canvas.height);
if(result && result.data){
showToast('✓ Scan verified — decodes correctly');
} else {
showToast('Could not verify — try increasing error correction or reducing logo size');
}
});
/* ===================== THEME TOGGLE ===================== */
document.getElementById('themeToggle').addEventListener('click',()=>{
const html=document.documentElement;
const cur = html.getAttribute('data-theme');
html.setAttribute('data-theme', cur==='dark' ? 'light' : 'dark');
});
document.getElementById('loginBtn').addEventListener('click',()=> showToast('Demo build — accounts are not enabled'));
/* ===================== NAV / PAGE ROUTING ===================== */
const pages = ['generator','scan','pricing','api','blog','contact'];
document.querySelectorAll('.mainnav a').forEach(a=>{
a.addEventListener('click',e=>{
e.preventDefault();
const p = a.dataset.page;
document.querySelectorAll('.mainnav a').forEach(x=>x.classList.remove('active'));
a.classList.add('active');
pages.forEach(pg=> document.getElementById('page-'+pg).classList.toggle('hidden', pg!==p));
if(p==='scan') initScanPageIfNeeded();
});
});
/* ===================== SCAN PAGE ===================== */
let camStream=null;
function initScanPageIfNeeded(){}
document.getElementById('startCam').addEventListener('click', async ()=>{
const video = document.getElementById('video');
try{
camStream = await navigator.mediaDevices.getUserMedia({video:{facingMode:'environment'}});
video.srcObject = camStream;
scanLoop();
}catch(e){ showToast('Camera not available: '+e.message); }
});
function scanLoop(){
const video=document.getElementById('video');
const c=document.getElementById('scanCanvas'); const cx=c.getContext('2d');
function tick(){
if(video.readyState===video.HAVE_ENOUGH_DATA){
c.width=video.videoWidth; c.height=video.videoHeight;
cx.drawImage(video,0,0,c.width,c.height);
const imgData=cx.getImageData(0,0,c.width,c.height);
const code=jsQR(imgData.data,c.width,c.height);
if(code){
showScanResult(code.data);
if(camStream){ camStream.getTracks().forEach(t=>t.stop()); camStream=null; }
return;
}
}
if(camStream) requestAnimationFrame(tick);
}
requestAnimationFrame(tick);
}
document.getElementById('scanFile').addEventListener('change', e=>{
const file=e.target.files[0]; if(!file) return;
const img=new Image();
img.onload=()=>{
const c=document.getElementById('scanCanvas'); const cx=c.getContext('2d');
c.width=img.naturalWidth; c.height=img.naturalHeight;
cx.drawImage(img,0,0);
const imgData=cx.getImageData(0,0,c.width,c.height);
const code=jsQR(imgData.data,c.width,c.height);
if(code) showScanResult(code.data);
else showToast('No QR code detected in image');
};
img.src=URL.createObjectURL(file);
});
function showScanResult(text){
const r=document.getElementById('scanResult');
r.classList.remove('hidden');
r.innerHTML = `
Decoded content:${text.replace(/