Skip to main content
OpenQRS
Tools
Current language: English
100% Private

Restaurant menu QR code generator

100% Private & Local — Your data never leaves your browser. These QR codes are permanent and will never expire.

Restaurant menu settings

The page or PDF you already publish. Include https:// so scanners treat it as a link rather than plain text.

Enter the address of the menu page you publish.

Names the file you download, so table codes stay apart in a folder. It is not part of the scanned link — a link code carries the URL and nothing else.

Only useful if your menu page reads the parameter. Otherwise it lengthens the code for no gain.

Design

Module shape
Presets
Corner frame
Add a centre logo
Choose an image, or drop one herePNG, JPEG, WebP or GIF, up to 1000 KB

The image is read in this page and embedded in the code as a data: URL. It is not uploaded, and it stays inside the file you download.

More design options

The dark half of the code. Keep it well below the background in lightness.

Covers the quiet zone as well as the gaps between modules. A transparent background leaves it out of the file, so nothing is drawn with it.

Contrast 11.5:1 between the modules and the background.

Presets

PNG and WebP keep an alpha channel; the SVG simply omits the background rectangle. Whatever the code is placed on becomes the light half of the contrast.

Gradient

A gradient fills the dark modules only. Its lighter end sets the contrast a scanner actually gets, so both ends have to stay dark.

The second colour, used only while a gradient is selected. It is measured for contrast alongside the first.

45°

Degrees clockwise from a left-to-right sweep. A radial gradient spreads from the centre outwards, so the angle applies to a linear one only.

Module shape

Rounded shapes cover less of each cell. The centre stays covered, which is where a decoder samples, but a small print of a dense code reads more reliably as squares.

Corner frame

The ring of the three finder patterns.

Corner centre

The eye inside each finder pattern.

4 modules

The blank margin around the code, measured in modules. 4 is the specified minimum.

Higher recovery survives more damage and costs capacity, so the same content produces a denser symbol.

A logo sits at the centre and holds the level at H. Its width limit follows the symbol: 14% on the smallest code, 30% on a dense one.

Live preview & export

Export

Export

Raster, for screens

Complete the form to enable the downloads.

Export size and encoded text
Payload
Nothing encoded yet
Symbol
Not built yet
Recovery
Q

Waiting for input

Export size

Between 64 and 4096 pixels. Exporting at 1024 px.

Encoded text

Encode the address of the menu you already publish, so a table code opens it in one scan. This tool does not host menus; it encodes the link you give it.

When someone scans it

The phone opens your menu URL in its browser. If you enabled the table parameter, the number is appended to the query string and arrives with the request.

What the code contains

One URL, character for character as you typed it, plus the table parameter if you asked for one. There is no shortener, no branded domain and no intermediate hop, so the address the diner's browser resolves is your own.

That has a practical consequence worth planning around: a shorter URL produces a smaller, coarser grid that scans faster from a table tent in dim light. A menu at example.com/menu encodes into far fewer modules than the same page reached through a long path with tracking parameters attached.

Table numbers as a query parameter

Turning on the table option appends table=<your value> to the query string. The value is percent-encoded, so a label such as "Terrace 4" survives the trip intact.

The parameter travels with the request and stops there. Nothing on this site reads it, and your menu page will ignore it unless it has been built to look for it. It is worth adding when your ordering system expects a table identifier in the URL, and worth leaving off when the menu is a static page or a PDF.

Printing once and changing the menu later

The code is permanent because it is static: the URL is baked into the pattern and cannot be rewritten afterwards. Reprinting is only ever forced by the address changing, never by this site.

So choose the address with reprinting in mind. A stable path on a domain you control — example.com/menu — lets you replace the seasonal menu behind it as often as you like without touching a single printed code. A link to a file whose name carries a date, or to a third-party menu host that may reorganise its URLs, is the version you will end up reprinting.

Questions and answers

Can I upload the menu itself and get a code for it?

No. A QR code holds at most a couple of thousand bytes, which is nowhere near a menu, and this site has no storage to put a file in — there is no server behind it. Host the menu on your own site or any service you already use, then encode that address here.

Should the code point at a PDF or a web page?

A web page, in most cases. Phone browsers render a responsive page immediately, while a PDF often downloads first and then opens zoomed out at a size that needs pinching. If a PDF is what you have, the PDF document tool covers the same link with notes on how phones handle it.

Do I need a separate code for every table?

Only if your menu page uses the table number. Each distinct value produces a different code, so twenty tables mean twenty exports. Where the number is not read by anything downstream, one code reprinted twenty times is simpler and just as effective.

Will diners be tracked when they scan?

Not by this site — it never sees the scan. What happens after the browser opens your URL is governed by your own page: its analytics, its cookies, its consent banner. If your menu page sets cookies or loads a third-party script, that applies to a visitor arriving by QR code exactly as it does to one arriving by search.

How a static QR code works

Every code on this site is static: the payload is written into the black and white modules themselves. Nothing is looked up when the code is read, no server of ours takes part, and no subscription holds the printed code up. The same property is the limit — once it is printed, what it contains cannot be changed.

Three things then decide whether a printed code reads: how many bytes the payload came to, which recovery level absorbs the damage, and how wide a single module ends up on paper. These guides work through each of them with the numbers.