Menus — digital QR menus that live on your domain

Build a mobile-first digital menu — categories, items, photos, prices, dietary tags, languages — and point a short link or QR at it.

A menu in Linked.Codes is a mobile-first page that lives at linked.codes/m/<your-slug> (or on your own domain, if you've connected one). It carries categories, items with photos and prices, dietary tags, optional info section, multi-language support driven by CSV, and a branding layer you can tune from one screen. Point a QR or short link at it and the customer scans → sees the menu → never sees a PDF.

Audience: businesses, restaurants, cafés, bars Time to first menu: under 10 minutes Output: mobile-first scannable menu at /m/<slug>
Three-step ship: create the menu in Menus, add categories + items, point a QR code at /m/<your-slug>. Print the QR; you're live.

What's in a menu

Create your first menu

  1. Open Menus in the sidebar.

    Hit + New menu. Three fields — name (e.g. "Main menu"), currency, and tags (optional, so you can filter the menu list later). That's it — you're in the editor.

  2. Add categories.

    On the menu's Items tab, tap + Add category. Start with the headings you'd put on a paper menu — Starters, Mains, Drinks. Click the name to rename. Items inside a category drag-reorder; cross-category drag moves an item from one category to another.

  3. Add items.

    + Add item opens a popup. Name, description, price, one or more categories, dietary tags (vegan, gluten-free, spicy, etc.), an availability toggle, and a photo (PNG / JPG / WebP, ≤2MB).

  4. Tune the design.

    The Design tab has a theme picker (light / dark / mint / warm), an accent colour, a font, and upload rows for logo + cover image (PNG / JPG / WebP, SVG for logos, ≤2MB each). Changes save as you click.

  5. Open the public menu.

    Use the Preview button in the top-right of the editor.

Items, photos, dietary tags

Item names cap at 200 chars, descriptions at 1,000. Price is in the menu's default currency unless you set a per-item override. A null price renders as "—" on the public menu — useful for "ask / market price" items.

The dietary tag picker covers ten presets: vegan, vegetarian, gluten-free, dairy-free, nut-free, spicy, halal, kosher, organic, low-carb. They render as small icons under the item name on the public menu, with a "What the icons mean" legend appearing automatically at the bottom of the menu when at least one item uses one.

The availability toggle off renders the item with a strikethrough + "currently unavailable" line. Useful for flipping items off when the kitchen runs out without deleting them.

The Highlight as a special toggle on an item adds a ★ Special pill next to its name and bubbles the item to a "Today's specials" strip at the top of the public menu. Good for happy hour, daily features, seasonal items — turn it off to remove the highlight without deleting the item.

The Info tab carries everything below your menu items — about paragraph, hours (Mon-Sun with start / end pickers and a per-day Closed toggle), tap-to-call phone, tap-to-email email, tap-the-address-for-Google-Maps address, and a list of social / external links. Each social link gets a dedicated icon (Instagram, Facebook, TikTok, X, YouTube, LinkedIn, WhatsApp, plus a generic "Website" or "Other link" option).

Import / export

Two CSV flows. The Items tab has Export CSV + Import CSV for bulk-editing every item in one go — open the CSV in a spreadsheet, edit names / prices / dietary, paste back. Re-importing fully replaces categories + items (photos preserved where item names match exactly).

The Languages tab uses the same CSV shape but tied to a specific locale — translate the file in your tool of choice, import back. Non-default-language imports only touch the translation rows, so your categories + prices stay put.

Automatic currency conversion. You type prices in your menu's default currency. From Settings → Currency, pick the currencies customers can switch into — they get a chip row on the public menu that converts every price client-side. Rates refresh every 24h from a public, ECB-derived source.

Branding

Theme
Four presets — light, dark, mint, warm. Each one sets background, surface, ink, muted and line colours together.
Accent
Used for category underlines and link colour. Pick from six brand-friendly swatches or paste any hex.
Font
System sans-serif, serif (Georgia), monospace (JetBrains), or Urbanist. Loads from system fonts where possible.
Logo
Top-left of the menu. Upload PNG / JPG / WebP / SVG (max 2MB). Square mark or wordmark.
Cover image
Hero banner above the menu name. Upload PNG / JPG / WebP (max 4MB). Wide image (1600×600+ ideal).

Multi-language via CSV

The menu's default language sits on the items themselves. Other languages live as translation rows keyed by ISO locale code (es, fr, de-de, etc.). The UI in v1 manages translations through CSV import / export instead of a per-row form — fast for hundreds of items, friction-free for whichever translation workflow you already use.

  1. Open the Languages tab.

    Tap + Add another language next to the languages chip row. Type the ISO code (id, es, nl, fr-fr).

  2. Find CSV import / export on the same tab.

    Pick the language you just added from the locale dropdown.

  3. Export the CSV.

    Columns: category, name, description, price, currency, available, dietary. The dietary column is pipe-separated (vegan|spicy).

  4. Translate the file.

    Any tool you prefer — manual edit, translation app, AI assistant. Keep the header row and the original name column values so the importer can match rows. Translate the human-language text and the description.

  5. Hit Import CSV.

    Paste the translated CSV. Non-default-language imports only update the translation rows; categories + items + prices stay untouched.

Default-language import is a full replace. If you re-import the default-language CSV, the importer rebuilds categories + items from scratch (preserving photos when item names match exactly). Use it for bulk renames, not for tweaks.

Info section

The Info tab toggles an extra section at the bottom of the public menu — about paragraph, hours, address, phone, email, website. Phone + email fields render as tap-to-call / tap-to-email links. Hours and address respect newlines (one line per row).

SEO + share preview

The SEO tab covers the share card shown in iMessage, WhatsApp, Slack, LinkedIn. OG title (defaults to the menu name), OG description (one line), OG image URL (1200×630 ideal). The noindex toggle adds noindex,nofollow to the public menu's <meta> tags — use for staff-only menus or seasonal menus you don't want Google ranking.

QR + short-link integration

The link editor at Links has a new destination type: Menu. Picking it shows a dropdown of your menus; pick one and the short link resolves to linked.codes/m/<slug> (or your custom domain plus /m/<slug> when the link is on a custom short-link host). Same shape for QR codes — pick "Menu" as the destination type in the QR designer.

Custom domain as menu home

If you own a domain (say your-restaurant.com) and have it pointed at Linked.Codes as a short-link domain, you can make the menu the root index. Open Domains, edit the domain, set Index URL to /m/<your-slug>. Now your-restaurant.com/ redirects straight to your menu — no path, no /m/, just your domain.

Ready? Build your first menu.
Three fields and you've got the URL. Items take a coffee.
Open Menus

What's deferred to v2

Listed here so you know what's coming and what to plan around:

  • Price variants per item (small/large, half/full).
  • Multiple photos per item.
  • Specials + happy-hour scheduling with start/end times.
  • Drag-to-reorder for categories themselves (items already drag inside a category and across categories).
  • Automatic FX conversion across currencies (today: prices display exactly as entered, including per-item currency overrides).
  • Per-item translation editor in the dashboard (CSV is the v1 path).