Перейти до основного вмісту
megapromotingПоговорімо

Рішення · Ресторани & HoReCa

Меню за QR-кодом, яке читається на телефоні, у напівтемряві, трьома мовами — і не ставить жодного cookie.

Меню закладу — це не брошура: у ньому є ціни та об’єми, які мають бути точними, воно часто змінюється і його читають люди, які говорять трьома мовами. Ми будуємо меню як дані, генеруємо сторінку з них і перевіряємо перед кожною публікацією, зокрема що ціни в кожній категорії впорядковані і що кожне фото існує.

Вже збудованоDouă meniuri digitale în producție, verificabile din exterior azi. Primul: 119 produse în 21 de categorii, cu preț, volum, compoziție și fotografie, plus câte un text scurt de prezentare și un set de recomandări de asociere pentru fiecare produs; generatorul are 402 linii, iar verificarea dinaintea publicării are 233 de linii și 16 blocuri. Al doilea, site-ul-soră cu același motor: 146 de produse în 31 de categorii, generator de 377 de linii, verificare de 210 linii cu 14 blocuri, iar integrarea continuă regenerează pagina din surse și respinge modificarea dacă rezultatul diferă de fișierul din depozit. Ambele răspund 200 și niciunul nu pune vreun cookie — verificat de mine pe 06.09.2026. Spunem și că sunt două lucrări cu același motor și același proprietar, nu două lucrări independente.

Відсканований PDF за QR-кодом не вирішує нічого з того, що має вирішувати заклад. У ньому не шукають, його не перекладають, він нормально не масштабується на телефоні, і його не можна змінити без передруку коду. А меню часто змінюється: кухня прибирає страву, бар отримує іншу марку, ціна позиції зростає. Меню — це набір даних, що змінюється щотижня, а не документ, надрукований один раз.

Тому ми поводимося з ним як із даними. Реальні джерела — це кілька структурованих файлів: продукти, тексти-презентації, рекомендації щодо поєднання, переклади — а генератор, написаний на Python, збирає з них одну сторінку. В одному із закладів: 119 продуктів у 21 категорії, кожен із ціною, об’ємом, складом і фото, плюс 119 коротких текстів і 119 наборів «з чим поєднується». В іншому: 146 продуктів у 31 категорії. Сторінку не редагують напряму — її генерують заново.

Переклад не зупиняється на кнопках. Румунська є базою, а російська й англійська покривають категорії, назви, об’єми, склад, 82 мітки смаку та всі тексти-презентації. У місті, де сусідній стіл замовляє іншою мовою, меню, перекладене наполовину, дратує більше, ніж неперекладене: воно змушує вас думати, що ви можете прочитати все.

Найважливіше, на нашу думку, і те, чого ніхто не просить у brief: кошик, список обраного та поділ рахунку працюють у браузері, без облікового запису і без сервера, а сайт не ставить жодного cookie і нічого не запитує з домену третьої сторони. Це не обіцянка з політики конфіденційності — це правило, яке задають автоматичні перевірки, що запускаються перед кожною публікацією і відхиляють зміну, якщо з’явився будь-який tracker, будь-який зовнішній ресурс або будь-який шрифт, узятий у когось іншого.

Що входить

Що конкретно змінюється в ресторанах і horeca

Меню — це набір даних, а сторінка генерується з нього

Продукти, презентаційні тексти, рекомендації та переклади зберігаються у структурованих файлах; генератор, написаний на Python — 402 рядки в одному локальному, 377 в іншому — складає з них одну сторінку. Опубліковану сторінку не редагують вручну; коли хтось це робить, безперервна інтеграція це виявляє, бо вона перегенеровує сторінку і порівнює результат.

Кожна позиція має ціну, обсяг, склад і фотографію

У барі обсяг є частиною ціни: одна й та сама назва на 40 і на 100 мілілітрів — це два різні продукти, а клієнт, який не бачить обсяг, думає, що йому сказали інше. Структура даних тримає всі чотири поля як обов’язкові, а не як опціональні, саме для того, щоб неповна позиція не потрапила на стіл.

Три мови, аж до останньої позначки смаку

Переклад охоплює інтерфейс, категорії, назви, обсяги, склади, 82 позначки смаку і всі короткі тексти презентації, і кожен румунський ключ має свою пару російською та англійською. Одна з перевірок перед публікацією не проходить, якщо меню не повне всіма трьома мовами.

Кошик, вибране та поділ рахунку працюють у браузері

Без облікового запису, без сервера, без передавання даних кудись. Клієнт складає своє замовлення на телефоні й показує його офіціанту або використовує для поділу рахунку. Технічний наслідок: не існує бази з тим, що замовили ваші клієнти, бо вона не створюється.

Нуль cookie і нічого з третіх доменів

Перевірено ззовні: жодного заголовка cookie на жодному з двох сайтів, а політика вмісту одного з них не дозволяє абсолютно нічого ззовні. Шрифти розміщені на тому самому домені, а не в зовнішньому сервісі. Єдині зовнішні адреси на сторінці — це посилання на соціальні мережі закладу, які натискає відвідувач, а не викликає сторінка.

Перевірки перед кожною публікацією, зокрема й нудні

Шістнадцять блоків перевірки в одному закладі, чотирнадцять в іншому: без трекерів, без ресурсів, автоматично завантажених від третіх сторін, шрифти з власним хостингом, дійсні структуровані файли, кожна фотографія існує, меню повне трьома мовами, структуровані дані на сторінці дійсні і — те, що дивує всіх — ціни знижуються в кожній категорії. Неправильно введена ціна видно як розрив у порядку списку, а не під час скарги клієнта.

Опублікована сторінка завжди відповідає джерелам

За кожної зміни безперервна інтеграція генерує сторінку з джерел і відхиляє зміну, якщо результат відрізняється від файла в репозиторії. Це єдина реальна гарантія того, що те, що бачить клієнт на екрані, походить із даних, які заклад редагує локально, а не з якоїсь ручної правки, забутої там три місяці тому.

Журнали сервера не зберігають повні IP-адреси

У конфігурації сервера одного із закладів: маскування IP-адрес, видалені з журналу заголовки ідентифікації та обмежене зберігання з явним посиланням на принцип обмеження строку зберігання. Безперервна інтеграція відхиляє зміну, якщо з конфігурації зникають ці рядки — отже, захист не може тихо зникнути під час зміни сервера.

Чого не робить цифрове меню

Не передає замовлення на кухню і не підтверджує резервування: для цього потрібне з’єднання з операційною системою закладу, а це окрема робота. І ми не публікуємо функції, які обіцяють щось, що треба виконати на касі — знижка типу «happy hour» або графік роботи кухні не запускаються без письмової згоди закладу, бо платить за обіцянку на екрані людина за стійкою.

Traseul

Як запит проходить через систему.

01

Ми структуруємо меню до того, як щось малювати

Перша поставка — це меню як дані: категорії, позиції, ціна, обсяг, склад, фотографія. Тут виявляються і прогалини — позиції без обсягу, категорії, які насправді є двома, продукти без фотографії. Цифрове меню, побудоване на неповних даних, виглядає неповним, яким би добрим не був дизайн.

02

Ми перекладаємо все, а не лише інтерфейс

Категорії, назви, обсяги, склади, позначки смаку та презентаційні тексти отримують свої пари російською та англійською. Ми постачаємо повне меню трьома мовами та автоматичну перевірку, яка падає, якщо якийсь ключ залишається неперекладеним.

03

Ми ставимо перевірки перед першою публікацією

Без трекерів, без ресурсів від третіх сторін, самостійно розміщені шрифти, дійсні файли, кожна фотографія на місці, ціни в порядку спадання в категорії, дійсні структуровані дані. Ми постачаємо скрипт перевірки в репозиторій, щоб заклад міг запускати його й без нас.

04

Автоматична публікація з репозиторію, з копією попередньої версії

Публікація відбувається під час злиття зміни, після того як безперервна інтеграція згенерувала сторінку та порівняла її з джерелами, і після того як збережено копію попередньої версії. Ми передаємо доступи та процедуру відновлення — не лише запущений сайт.

1Fișiere de date(produse, texte,asocieri, traduceri)2generator Python3o singură pagină416 verificări(urmăritori, terți,fonturi, fotografii,trei limbi, prețuridescrescătoare)5publicare automată,cu copie a versiuniianterioare
Traseul, în 5 pași

Дані

Чого торкаємося, де воно лежить і скільки лишається

Правила відрізняються від однієї галузі до іншої. Ось ті, що застосовуються в ресторанах і horeca.

Нічого про клієнта не збирається
Без облікового запису, без cookie, без трекерів, без ресурсів, запитаних у сторонніх доменів. Кошик і улюблене живуть у браузері відвідувача. У нас і в закладу немає списку того, що хтось переглядав у меню — не тому, що ми його стерли, а тому, що він не створюється.
Що залишається в журналах сервера
Звичайні запити вебсервера, з маскованою IP-адресою, без ідентифікаційних заголовків, збережені протягом обмеженого періоду. Вони прописані в конфігурації сервера, автоматично перевірені та обґрунтовані принципом обмеження зберігання — а не залишені на значеннях за замовчуванням програми.
Меню, ціни, рецепти та фотографії належать закладу
Ми будуємо структуру, генератор і перевірки. Контент належить йому і змінюється за його рішенням. Ми не публікуємо жодну цифру ціни як приклад у наших матеріалах, навіть ілюстративно.
Що відбувається, коли заклад хоче ще й асистента на сторінці
Можна, але це означає, що політика контенту сторінки має дозволяти саме той домен і нічого іншого. На одному з двох сайтів це видно зовні: політика дозволяє лише один зовнішній домен, домен асистента. Різниця між «ми дозволяємо домен» і «ми дозволяємо все» — це вся розмова про відстеження.
Дані бронювання, якщо вони з’являються, змінюють правила
У момент, коли меню отримує форму бронювання, з’являються ім’я, телефон і час — тобто персональні дані, з терміном зберігання, з місцем, куди вони потрапляють, і з кимось, хто їх бачить. Тоді пишеться і опублікована політика закладу. До того часу меню — це сторінка, яка нічого не збирає, і простіше, щоб так і залишалося, якщо бронювання роблять телефоном.

Випадок

Перевірка, яка вимагає, щоб ціни зменшувалися в кожній категорії

Ситуація

У меню з понад сотнею позицій найчастіша помилка не в дизайні, а в наборі тексту: зайва цифра в ціні або позиція без фотографії. Обидві зазвичай виявляють, коли клієнт показує їх офіціанту.

Що ми збудували

Перед публікацією ми додали скрипт перевірки — 233 рядки в одному закладі, 210 в іншому — який запускає шістнадцять, відповідно чотирнадцять блоків: що не потрапив жоден трекер, що сторінка нічого не запитує з третього домену, що шрифти розміщені локально, що файли даних чинні і кожна фотографія існує, що меню повне в усіх трьох мовах, що структуровані дані на сторінці чинні і що ціни зменшуються в кожній категорії. Окремо безперервна інтеграція заново генерує сторінку із джерел при кожній зміні та відхиляє її, якщо результат відрізняється від опублікованого файла.

Що вийшло

Помилка в наборі ціни ламає спадний порядок і зупиняє публікацію, а відсутня фотографія ніколи не потрапляє на екран за столом. Опублікована сторінка завжди відповідає даним, які редагує заклад, інакше вона не публікується.

Чого цей випадок не каже

Перевірки виявляють те, що можна перевірити механічно. Неправильно введена, але правдоподібна — і впорядкована — ціна проходить; для неї немає іншого механізму, окрім того, щоб хтось подивився. Документація одного з проєктів каже «14 перевірок» там, де скрипт має 16 блоків; правильна цифра — та, що в скрипті.

Питання

Що запитують люди з ресторанів & horeca

Можемо самі змінювати ціни та прибирати страву з меню?

Так. Редагуються дані, а не сторінка; сторінка заново генерується з них. Безперервна інтеграція перевіряє генерацію при кожній зміні й відхиляє зміну, якщо опублікована сторінка більше не відповідає джерелам. Так немає сценарію, за якого хтось виправив ціну прямо на сторінці, а зміна зникла під час наступної публікації.

Чому важливо, що ви не ставите cookies?

Тому що меню, яке нічого не збирає, не потребує смуги згоди, не має що витікати і не має нічого пояснювати контролеру. Перевірити це може кожен: один запит до сайту показує, що не повертається жоден заголовок cookie. А політика вмісту одного із закладів не дозволяє абсолютно жодного ресурсу ззовні.

Меню може приймати замовлення?

Кошик працює в браузері, як список, який клієнт показує офіціанту або використовує для поділу рахунку. Надсилання замовлення на кухню потребує з’єднання із системою закладу і є окремою роботою, з перевіркою сумісності перед цим. Ми не називаємо «онлайн-замовленням» кошик, який нікуди не потрапляє.

Можемо поставити «happy hour» або вечірню пропозицію?

Це можна побудувати, але ми не запускаємо це без письмової згоди закладу, бо це обіцянка, яку виконують на касі. Наше правило: функції, які зобов’язують заклад перед клієнтом — знижки, години кухні, доступність — не публікуються на основі усної розмови.

У скількох мовах і наскільки повно?

Три: румунська як база, російська та англійська. Повно означає категорії, назви, об’єми, склад, позначки смаку й тексти презентації, а не лише кнопки. Автоматична перевірка падає, якщо меню не є повним у всіх трьох — тому воно не потрапляє на сайт перекладеним наполовину.

Як ви переконуєтеся, що не з’явиться неправильна ціна?

Серед перевірок перед публікацією є одна, яка вимагає, щоб ціни зменшувалися в кожній категорії. Це не комерційне правило, а детектор помилок набору тексту: позиція, введена із зайвою або відсутньою цифрою, ламає порядок і зупиняє публікацію. Решта перевірок займається відсутніми фотографіями та невалідними файлами.

Чи швидкий сайт на телефоні, локально, на мобільних даних?

Результат — це одна згенерована сторінка, зі шрифтами, розміщеними на тому самому домені, і без ресурсів, запитаних із сторонніх доменів. Це означає менше з’єднань для відкриття і нічого, що чекало б на зовнішній сервіс. Ми не публікуємо цифри швидкості, виміряні в інших умовах, ніж ваші.

Чи можемо додати асистента, який відповідає на запитання про меню?

Так, і тоді політика вмісту сторінки дозволяє саме цей домен, нічого іншого. На одному з двох локалів це видно зовні. Варто сказати і про зворотний бік: у той момент сторінка вже не є «без нічого зовні», тож рішення ухвалюється свідомо, а не як бонус.

У вас у портфоліо два майже ідентичні меню. Це два роботи?

Це два сайти з тим самим двигуном, одного й того самого власника, і ми кажемо це прямо. Задекларована функціональна різниця між ними — це рекомендації щодо поєднання для кожного продукту, яких у другого немає. Ми могли б представити їх як незалежні роботи; це було б перебільшенням портфоліо.

Що вам хотілося б налагодити?

Розкажіть про свій процес. Разом визначимо, що варто збудувати, що можна підключити і як перевіримо результат.

Поговорімо