Print a QR code from most "free QR generator" sites and two things happen that nobody mentions at the counter: the code does not point at your URL, and the company keeps a kill switch.

The code points at their redirect domain. Every scan is logged (where, when, what phone). And the moment you stop paying, or they pivot, or they fold, every menu, poster and business card you printed points at a dead redirect. This is such a common small-business injury that consumer-protection agencies publish warnings about it.

A QR code is just an encoding of a string. If the string is your URL, the code points at your URL, forever, with nobody in the middle. There is no server component. Generating one is a library call:

import QRCode from "qrcode"; const canvas = document.getElementById("qr"); await QRCode.toCanvas(canvas, "https://your-restaurant.example/menu", { width: 512, margin: 2, errorCorrectionLevel: "M", // M or Q is plenty; H if you add a logo color: { dark: "#1a1a1a", light: "#ffffff" }, }); 

That is the entire product. Everything else - colors, shapes, logos, PNG/SVG export, Wi-Fi and vCard payloads - is presentation on top of that one call.

A few things worth knowing if you roll your own:

  • Error correction matters when you add a logo. A centered logo eats part of the code. Level H (30% recovery) survives it; level L often does not. Test by scanning the printed result, not the screen.
  • Quiet zone is not optional. The white border around the code is part of the spec. Shrinking it to look tighter is the number one cause of "it scans on my phone but not theirs."
  • Size for the scan distance. A rough rule: scanning distance divided by 10 is the minimum code width. A table tent scanned from 30 cm wants a 3 cm code.
  • Static means uneditable. If the destination URL changes, the printed code is wrong. The honest fix is a short URL you control (your own domain with one redirect rule), not a QR vendor's domain.

We built our own version of this because we kept printing codes for things and did not want a subscription for the privilege of our own link working: Xargaar QR Code Generator - link, Wi-Fi, contact, email, phone, SMS, place and event payloads, colors and shapes, logo overlay, PNG/SVG/PDF download. It runs entirely in the page; open your network tab and watch nothing leave. The link you encode is never sent anywhere.

There is a paid offline pack ($19, one time) for people who want the same tool as a folder that works with no internet, but the online one is free and unlimited.

If you are printing something that needs to keep working for years, print a static code. Your URL should be the payload, not a stranger's redirect.