Your files never leave your device. All processing happens locally in your browser.
How do I make a restaurant menu online for free without uploading anything?
Open the Restaurant Menu Maker and build a structured menu — a header (restaurant name + tagline), then sections such as Starters, Mains, Desserts and Drinks, each holding items with a name, description, price and optional dietary tags (V, VG, GF, DF, N, HOT, Chef’s). Pick a real page size (A4, US Letter, Legal, slim DL or table-tent), a theme and a system-font pairing, flow it into one or two columns, add optional dish photos, then export a high-resolution PNG or a print-scaled PDF. Everything runs 100% in your browser — nothing is uploaded.
Add / edit / reorder / remove sections and items; edit prices and the currency symbol
Five starter templates: fine-dining, café/brunch, bistro, bar/drinks, food-truck
Seven themes + full colour, heading/body system-font and divider control
One or two columns on A4 / US Letter / Legal / slim DL / table-tent, with an overflow warning
Optional local dish photos; export hi-res PNG or a print-scaled PDF — all on-device
What is
Restaurant menu maker (client-side)
A restaurant menu maker is a design tool for laying out a food or drinks menu: a header with the venue name and tagline, then grouped sections (Starters, Mains, Desserts, Drinks…) each listing items with a name, description, price and sometimes dietary tags. A 100% client-side maker builds this from a structured data model and renders it to a print page entirely in the browser — the menu text, prices and any dish photos never leave the device — then exports a high-resolution PNG or PDF for printing or sharing.
Design
Related terms
menu designà la cartemenu engineeringprice leadersdietary tagsmenu psychologyA4 / US Letterbleed and trimsystem fontstwo-column layoutPDF export
Frequently Asked Questions
No. The menu is a data object held in the page and drawn onto an in-browser canvas; dish photos are read locally and composited on your device. Nothing is uploaded and there is no CDN in the path.
The Restaurant Menu Maker is 100% client-side. Your menu is a small object of text, numbers and colours, and a pure engine (menuEngine.ts) lays it out and paints it straight onto an HTML5 <canvas> in your browser. Dish photos you add are read locally with URL.createObjectURL and drawn on the canvas — they are never sent to a server or CDN. PNG export is a local canvas.toBlob and the PDF places that image on a correctly-sized page in-browser with pdf-lib. Nothing is fetched, uploaded, logged or stored; the tool works offline once cached, keeps no accounts and sets no tracking, and your work is gone when you close the tab.
Yes. Choose a page size and DPI, then Download PDF — the menu is rendered at export resolution and placed on a page sized to the real physical dimensions (e.g. A4 or US Letter).
Set the page (A4, US Letter, US Legal “long menu”, slim DL rack card or table tent) and an export DPI of 96, 150 or 300, then use Download PDF. The same engine that draws the preview renders the menu to a raster at the chosen pixel size, and pdf-lib places it on a PDF page whose dimensions are the true physical size in points, so it prints at the correct scale. You can also Download PNG. Honestly, this is a flat RGB export with no bleed, crop marks or CMYK conversion — for a professional press run add about 3 mm bleed and convert colour in a prepress tool, and confirm bleed and trim with your printer.
You can toggle it off. Menu-pricing research finds that showing prices without a currency symbol (just the number) tends to nudge spend up, so the tool lets you hide the symbol and even move it after the number.
Type only the number in each item (for example 12.5); the maker adds your chosen currency symbol ($, £, €, ₹, ¥ or a custom one). A widely-cited Cornell study found diners spent more when prices were shown as plain numerals than with a “$” sign, so the tool lets you turn the symbol off entirely or place it after the price. Other evidence-based touches it supports: grouping each section to 5–7 items, dotted price leaders, and dietary tags — all optional so you can test what works for your venue.
The preview warns when content runs past the page. Switch to two columns, reduce the body or title size, trim descriptions, remove items, or pick a taller page such as Legal.
The layout engine flows your sections and items down the page and, in two-column mode, into the second column; if content still overruns it shows a clear overflow warning. To fix it you can switch from single to two columns, lower the body / section / title point sizes, shorten item descriptions, remove or reorder items, increase the usable area by reducing the margin, or choose a taller page size (US Legal is a good “long menu”). It is a single-page (front) layout rather than a multi-page booklet, so very large menus are best split across separate exports.
Detailed Explanation
📖How It Works
What the Restaurant Menu Maker Does
The Restaurant Menu Maker is a 100% client-side design tool for building a print-ready food or drinks menu from a structured MODEL rather than a free text box: a header (restaurant name + tagline), then SECTIONS (Starters, Mains, Desserts, Drinks…) each holding ITEMS with a name, description, price and optional dietary tags (V, VG, GF, DF, N, HOT, Chef’s). You add, edit, reorder and delete sections and items, choose a real page size, a theme and a system-font pairing, and the engine flows everything into one or two columns and renders it live. Export is a high-resolution PNG or a print-scaled PDF, and nothing is ever uploaded.
Structured header → sections → items model, not a single text field
Per-item name, description, price and dietary tags (V/VG/GF/DF/N/HOT/Chef’s)
Real pages: A4, US Letter, US Legal (long menu), slim DL rack, table tent
One or two columns; live WYSIWYG preview identical to the export
Export high-resolution PNG or a print-scaled PDF, entirely on-device
⚙️Methodology
How the Layout Engine Flows a Menu
A pure engine (menuEngine.ts) works in POINTS (1/72 in), the natural print unit. It draws the header block, then walks each section and item, measuring wrapped text with the same Canvas context it paints with, and places blocks down a column; in two-column mode it advances to the second column when the next block would overrun the usable height. To avoid an orphaned heading, a section title is only placed if it plus its first item fit — otherwise the whole section starts the next column. Because Canvas measureText is independent of the transform matrix, measuring in points and painting after ctx.scale(scale) stays perfectly consistent, so the on-screen preview and the exported file are laid out identically.
Layout is computed in points; the caller renders at any scale (preview or export DPI)
Text wrapped and measured with the same ctx used to paint — WYSIWYG
Two-column flow advances columns when a block would overrun the page
Section headers are kept with their first item to avoid orphans
Overflow past the last column is detected and surfaced as a warning
🔧Technical Details
Rendering, Type and Export Internals
Each item is laid out as a name row (semibold ink) with the price right-aligned and an optional dotted price leader between them, dietary tags in the accent colour placed inline after the name (or dropped to their own mini-row if they would collide with the price), and an italic muted description that wraps beneath. Prices are typed as bare numbers and the currency symbol is applied at render (before or after, or hidden). Fonts are SYSTEM stacks only — an elegant serif (Georgia), a book serif (Palatino), Helvetica, a grotesk, Arial Narrow condensed, a slab, Trebuchet, a brush-script fallback and Courier — combined as a heading + body pairing, so no webfont is downloaded. The same drawMenu() paints the live preview and, at an export DPI of 96/150/300, an offscreen canvas whose toBlob is the PNG; the PDF embeds that PNG onto a page sized to the true physical dimensions in points via pdf-lib.
Name + right-aligned price with optional dotted leader; wrapping description
Dietary tags in accent colour; drop to their own row only if they’d collide
Currency symbol applied at render — before / after / hidden; number-only input
System-font heading + body pairing; no webfont download, works offline
One drawMenu() for preview and export; PNG via toBlob, PDF via pdf-lib in-browser
📋Use Cases
When to Reach for This
Use it to design a café or restaurant menu, a bar or cocktail card, a food-truck board, a wedding or event menu, daily specials or a table tent, and to iterate on menu ENGINEERING — grouping sections to 5–7 items, ordering dishes deliberately, and testing price presentation. It bakes in evidence-based touches: you can hide the currency symbol (a Cornell study found plain-numeral prices lift spend versus a “$” sign), use dotted price leaders or drop them for a cleaner modern look, and flag dietary options clearly. Start from a fine-dining, café/brunch, bistro, bar/drinks or food-truck template and adapt it, or build from scratch — with no account, no watermark and no upload.
Supports menu engineering: 5–7 items per section, deliberate ordering
Evidence-based pricing options: hide the currency symbol, toggle price leaders
Five starter templates to adapt, or build from a blank structure
No account, no watermark, no upload
⚠️Limitations
Honest Limitations
This is built for on-screen menus and home / office / local-printer printing. Type is set in your device’s SYSTEM font stacks with no embedded webfont, so a face can look slightly different on another machine — the brush-script option in particular falls back to whatever cursive font your OS provides. Export is a flat RGB raster (a PNG, or that PNG placed on a correctly-sized PDF page) with no bleed, no crop marks, no CMYK conversion and no spot colours; for a professional press run add about 3 mm bleed and convert colour in a prepress tool, and always confirm bleed and trim with your printer. It is a single-page (front) layout rather than a multi-page booklet, very large pages at 300 DPI are memory-heavy on low-end devices, and it is a design tool — it does not sync to a POS or generate a live/QR digital menu.
System fonts only — type varies slightly across machines; brush script falls back
Flat RGB export: no bleed, crop marks, CMYK or spot colours
Add ~3 mm bleed + convert colour in a prepress tool for professional printing
Single-page (front) layout, not a multi-page booklet
A design tool only — no POS sync, no live/QR digital menu
🔒Privacy & Security
Private by Design
Everything happens on your device. The menu is a small object of text, numbers and colours held in the page, and a pure engine draws it straight onto an in-browser <canvas>. Dish photos you add are read locally with URL.createObjectURL and composited on your machine — they are never sent to a server or CDN. PNG export is a local canvas.toBlob and the PDF is assembled in memory with pdf-lib. Nothing is fetched, uploaded, logged or stored on a server, there is no CDN in the render or export path, and fonts are the device’s own system fonts. The only optional network use is consent-gated ads; the tool works offline once cached, keeps no accounts and sets no tracking, and your work is gone when you close the tab.
Menu is local data drawn onto an in-browser <canvas>
Dish photos read locally and composited on-device — never uploaded
PNG via canvas.toBlob; PDF assembled in memory with pdf-lib
No server, no CDN, system fonts only; optional consent-gated ads
Works offline once cached; no accounts, no tracking; discarded on tab close
Ways to make a restaurant menu
Approach
How it works
Trade-off
Used here
This client-side maker
Structured header → sections → items, laid out to a print page and exported PNG/PDF
Private + free + no watermark; single-page RGB, no CMYK/bleed