[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"content:site:uk":3,"content:products:uk":22,"content:post:architecture-small-team:uk":250},{"email":4,"salesEmail":4,"supportEmail":5,"phone":6,"telegram":7,"telegramUrl":8,"whatsappUrl":6,"githubUrl":9,"linkedinUrl":10,"locale":11,"footerAbout":12,"contactPromise":13,"whereBody":14,"officeCity":15,"workHours":16,"budgetRanges":17},"sales@jvdsoft.com","support@jvdsoft.com",null,"@jvdsoft_support","https:\u002F\u002Ft.me\u002Fjvdsoft_support","https:\u002F\u002Fgithub.com\u002FEvgeniyKiryanow","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fyevhenii-kirianov-54b8081ba\u002F","uk","Веб-розробка повного циклу. Київ — працюємо з клієнтами з України, ЄС і США. Власні продукти Qrenza і ShiftPlan тримаємо в продакшені самі.","Пишіть, як вам зручно — відповідаємо протягом робочого дня. По продажах sales, по підтримці продуктів support.","Київ, Україна. Працюємо віддалено з клієнтами з України, ЄС і США. Документи — договір і NDA, оплата на ФОП або юридичну особу.","Київ, Україна","Пн–Пт, 10:00–19:00 (Київ)",[18,19,20,21],"до [сума]","[сума] — [сума]","більше [сума]","ще не знаю",[23,154],{"slug":24,"status":25,"order":26,"siteUrl":27,"logoUrl":28,"heroImageUrl":29,"accentColor":30,"stack":31,"launchedYear":38,"locale":11,"name":39,"tagline":40,"summary":41,"positioning":42,"metaTitle":43,"metaDescription":44,"audience":45,"features":54,"steps":85,"plans":95,"faq":114,"gallery":136},"qrenza","live",0,"https:\u002F\u002Fqrenza.jvdsoft.com","\u002Fmedia\u002Fproducts\u002Fqrenza\u002Flogo.svg","\u002Fmedia\u002Fproducts\u002Fqrenza\u002Fhero.webp","#6366f1",[32,33,34,35,36,37],"Laravel","React","TypeScript","PostgreSQL","Tailwind CSS","Vite",2026,"Qrenza","Цифрова платформа каталогу з QR-меню та замовленнями в реальному часі","Каталог, замовлення й аналітика для будь-якого бізнесу з товарами чи послугами. Клієнт сканує QR-код і бачить меню — без застосунку, без паперу, без очікування.","Qrenza забирає паперове меню й таблиці: категорії, товари, ціни та фото ви ведете в одному місці, а клієнт відкриває каталог із QR-коду на столику, прилавку чи у вітрині. Замовлення з телефона клієнта падає прямо на дашборд, статус проходить три кроки, карта столів показує, де зараз працюють. Підходить ресторанам, кафе, барам, пекарням, магазинам, салонам і студіям — усім, у кого є перелік того, що вони продають.","Qrenza — QR-меню й цифровий каталог для бізнесу","Qrenza — платформа цифрового каталогу: QR-меню, замовлення в реальному часі, карта столів, аналітика, ролі команди та 6 мов. Продукт JVD Soft у продакшені.",[46,47,48,49,50,51,52,53],"Ресторани","Кафе та кав’ярні","Бари та нічні клуби","Пекарні та кондитерські","Магазини та крамниці","Краса та велнес","Салони та студії","Ринки та кіоски",[55,58,61,64,67,70,73,76,79,82],{"title":56,"body":57},"Розумний каталог","Категорії й позиції з фото, цінами, описами та контролем доступності — для меню, каталогу товарів або переліку послуг.",{"title":59,"body":60},"Замовлення в реальному часі","Клієнт замовляє з QR-меню, замовлення з’являється на дашборді миттєво. Три кроки статусу: нове → готується → готово.",{"title":62,"body":63},"Управління столами","Карта столів показує, де є активні замовлення. Замовлення можна переносити між столами і стежити за кожним місцем окремо.",{"title":65,"body":66},"Живий дашборд","Статистика по активних каталогах і щоденних операціях у реальному часі — з будь-якого пристрою.",{"title":68,"body":69},"Аналітика та звіти","Динаміка виручки, топ-товари, рівень скасувань і повна історія замовлень в одному дашборді.",{"title":71,"body":72},"Ролі команди","Власники, адміністратори та персонал з різним рівнем доступу. Уся команда керується з одного місця.",{"title":74,"body":75},"Багатомовність","Шість мов інтерфейсу. Каталог відкривається мовою клієнта — для двомовних і туристичних закладів.",{"title":77,"body":78},"Свій бренд і домен","Логотип, фавікон, кольори, стиль навігації, власний домен, мета-теги та Google Analytics — без плагінів.",{"title":80,"body":81},"Програма лояльності","Вбудовані бали нараховуються автоматично за кожне замовлення — щоб клієнт повертався.",{"title":83,"body":84},"Вбудовування будь-де","Повний каталог вставляється на будь-який сайт як iframe одним рядком коду.",[86,89,92],{"title":87,"body":88},"Створіть акаунт","Реєстрація за секунди, без картки. 14-денний пробний період починається одразу, з повним доступом до всіх функцій.",{"title":90,"body":91},"Побудуйте каталог","Додайте категорії та позиції — товари, страви, послуги. Фото, ціни, описи; порядок змінюється перетягуванням.",{"title":93,"body":94},"Поділіться QR-кодом","Роздрукуйте унікальний QR-код і поставте де завгодно — на столик, прилавок або вітрину. Клієнт сканує й бачить каталог одразу.",[96,104,109],{"name":97,"price":98,"note":99,"features":100,"popular":103},"[Старт]","[сума]","\u002F міс",[101,102,102],"[Обмеження плану]","[Що входить]",false,{"name":105,"price":98,"note":99,"features":106,"popular":108},"[Робочий]",[107,102,102],"[Усе зі «Старту», плюс]",true,{"name":110,"price":98,"note":99,"features":111,"popular":103},"[Команда]",[112,102,113],"[Усе з «Робочого», плюс]","Пріоритетна підтримка",[115,118,121,124,127,130,133],{"q":116,"a":117},"Чи є безкоштовний пробний період?","Так — 14 днів із повним доступом до всіх функцій, без кредитної картки. Пробний період починається одразу після реєстрації.",{"q":119,"a":120},"Чи можна оновлювати каталог у реальному часі?","Так. Зміна ціни, опису чи доступності позиції видна клієнтам одразу — QR-код перепечатувати не потрібно, він завжди веде на актуальний каталог.",{"q":122,"a":123},"Чи потрібно клієнтам завантажувати додаток?","Ні. Каталог відкривається у браузері телефона після сканування QR-коду. Інтерфейс зроблений mobile-first, тому працює на будь-якому пристрої.",{"q":125,"a":126},"Чи можна використовувати власний домен?","Так. Можна підключити свій домен і поставити логотип, фавікон та кольори бренду — каталог виглядатиме як частина вашого сайту.",{"q":128,"a":129},"Для яких бізнесів підходить Qrenza?","Для будь-якого, у кого є перелік товарів або послуг: ресторани, кафе, бари, пекарні, магазини, салони краси, студії, ринки й кіоски.",{"q":131,"a":132},"Чи можна відстежувати замовлення клієнтів?","Так. Кожне замовлення проходить три кроки статусу на дашборді, а карта столів показує, де воно зараз. Уся історія залишається в системі.",{"q":134,"a":135},"Де зберігаються дані?","У нашій інфраструктурі: вхід через email\u002Fпароль або Google OAuth, токен-сесії з підтвердженням email, доступи розділені за ролями.",[137,142,146,150],{"src":138,"alt":139,"width":140,"height":141},"\u002Fmedia\u002Fproducts\u002Fqrenza\u002Forders.webp","Дашборд Qrenza із замовленнями в реальному часі та картою столів",1280,588,{"src":143,"alt":144,"width":140,"height":145},"\u002Fmedia\u002Fproducts\u002Fqrenza\u002Fmenu.webp","QR-меню Qrenza на телефоні клієнта",572,{"src":147,"alt":148,"width":140,"height":149},"\u002Fmedia\u002Fproducts\u002Fqrenza\u002Fsettings.webp","Налаштування закладу в Qrenza: бренд, тема, навігація, SEO",879,{"src":151,"alt":152,"width":140,"height":153},"\u002Fmedia\u002Fproducts\u002Fqrenza\u002Ffeatures.webp","Перелік можливостей платформи Qrenza",1020,{"slug":155,"status":25,"order":156,"siteUrl":157,"logoUrl":158,"heroImageUrl":159,"accentColor":160,"stack":161,"launchedYear":38,"locale":11,"name":162,"tagline":163,"summary":164,"positioning":165,"metaTitle":166,"metaDescription":167,"audience":168,"features":169,"steps":200,"plans":210,"faq":217,"gallery":233},"shiftplan",1,"https:\u002F\u002Fshifts.jvdsoft.com","\u002Fmedia\u002Fproducts\u002Fshifts\u002Flogo.svg","\u002Fmedia\u002Fproducts\u002Fshifts\u002Fhero.webp","#f97316",[32,33,34,35,36,37],"ShiftPlan","Графік змін для команд — без таблиць і без «хто сьогодні працює?»","Створюйте, призначайте й публікуйте графік змін за хвилини. Команда отримує сповіщення автоматично, накладки система знаходить сама.","ShiftPlan замінює таблицю в Excel і чат із питаннями «хто сьогодні на зміні». Графік будується на календарі з видами місяць\u002Fтиждень\u002Fдень, зміни можна повторювати за розписом і розфарбовувати кольорами, на одну зміну призначається кілька людей. Щойно графік опубліковано, кожен бачить свої зміни й отримує push-сповіщення про будь-яку зміну; накладки й подвійні бронювання система блокує одразу. Для менеджера — статистика змін і навантаження команди.","ShiftPlan — графік змін і планування роботи команди","ShiftPlan — планування змін для команд: календар, повторювані зміни, кольори, кілька виконавців, сповіщення, аналітика навантаження. Продукт JVD Soft.",[],[170,173,176,179,182,185,188,191,194,197],{"title":171,"body":172},"Візуальний графік","Зміни будуються на чистій календарній дошці з видами місяць, тиждень і день.",{"title":174,"body":175},"Повторювані зміни","Зміна, що повторюється щодня, щотижня, щомісяця або за власним розписом — одним кліком.",{"title":177,"body":178},"Кольори без обмежень","Кольорове кодування змін: необмежені власні кольори або готова палітра.",{"title":180,"body":181},"Керування командою","Кілька виконавців на одну зміну, роботa з ролями й облік того, хто коли працює.",{"title":183,"body":184},"Аналітика й навантаження","Статистика змін, графіки співробітників і розуміння навантаження команди.",{"title":186,"body":187},"Розумні сповіщення","Миттєві push-сповіщення про будь-яку зміну графіка — ніхто не пропустить свою зміну.",{"title":189,"body":190},"Контроль накладок","Система сама знаходить накладки й подвійні бронювання і не дає їх зберегти.",{"title":192,"body":193},"Mobile-first","Адаптивний інтерфейс однаково працює на телефоні, планшеті й десктопі.",{"title":195,"body":196},"Шифрування","Дані шифруються під час передавання і у сховищі — графіки залишаються вашими.",{"title":198,"body":199},"Відповідність і бекапи","GDPR, CCPA і SOC 2, щоденні автоматичні резервні копії з можливістю відновлення.",[201,204,207],{"title":202,"body":203},"Створіть зміни","Побудуйте графік на календарі: додайте зміни, задайте час, призначте людей.",{"title":205,"body":206},"Призначте співробітників","На одну зміну призначається один або кілька людей, кольорове кодування показує все з першого погляду.",{"title":208,"body":209},"Сповістіть команду","Команда одразу отримує сповіщення про свій графік — усі в курсі, завжди.",[211,213,215],{"name":97,"price":98,"note":99,"features":212,"popular":103},[101,102,102],{"name":105,"price":98,"note":99,"features":214,"popular":108},[107,102,102],{"name":110,"price":98,"note":99,"features":216,"popular":103},[112,102,113],[218,221,224,227,230],{"q":219,"a":220},"Скільки коштує почати?","Почати можна безкоштовно й перейти на платний план пізніше — реєстрація не вимагає оплати.",{"q":222,"a":223},"Що буде, якщо дві зміни накладуться?","Система сама знаходить накладки й подвійні бронювання і повідомляє про них одразу, ще до публікації графіка.",{"q":225,"a":226},"Як команда дізнається про зміни в графіку?","Кожен співробітник отримує миттєве push-сповіщення. Оновлення приходять у реальному часі, тому переписка «а хто сьогодні?» зникає.",{"q":228,"a":229},"Чи можна працювати з телефона?","Так. Інтерфейс адаптивний і зроблений mobile-first — на телефоні, планшеті й десктопі однаково.",{"q":231,"a":232},"Наскільки захищені дані графіка?","Дані шифруються під час передавання і у сховищі, сервіс відповідає GDPR, CCPA і SOC 2, резервні копії створюються щодня.",[234,238,242,246],{"src":235,"alt":236,"width":140,"height":237},"\u002Fmedia\u002Fproducts\u002Fshifts\u002Ffeatures.webp","Можливості ShiftPlan: календар, повторювані зміни, кольори, команда",696,{"src":239,"alt":240,"width":140,"height":241},"\u002Fmedia\u002Fproducts\u002Fshifts\u002Fhow.webp","Три кроки роботи в ShiftPlan",476,{"src":243,"alt":244,"width":140,"height":245},"\u002Fmedia\u002Fproducts\u002Fshifts\u002Fwhy.webp","Чому команди обирають ShiftPlan",580,{"src":247,"alt":248,"width":140,"height":249},"\u002Fmedia\u002Fproducts\u002Fshifts\u002Fsecurity.webp","Безпека ShiftPlan: шифрування, відповідність, резервні копії",508,{"slug":251,"category":252,"tags":253,"coverImageUrl":6,"coverImageAlt":256,"readingMinutes":257,"featured":103,"publishedAt":258,"updatedAt":259,"locale":11,"title":260,"excerpt":261,"lead":262,"bodyHtml":263,"metaTitle":264,"metaDescription":265,"takeaways":266,"faq":271,"author":278,"related":284},"architecture-small-team","architecture",[252,254,255],"monolith","team","",11,"2026-06-24T09:00:00.000Z","2026-08-28T15:57:52.490Z","Архітектура для команди з трьох людей","Мікросервіси коштують команді втричі дорожче, ніж здається на діаграмі. Що обрати, коли розробників троє, а продукт має жити роками: модульний моноліт, спільні контракти й межі, які видно в коді.","Архітектурні поради зазвичай пишуть люди з великих компаній для людей з великих компаній. Для команди з трьох це не просто надлишок — це прямий шлях зупинити розробку. Ось що працює на цьому масштабі.","\u003Ch2 id=\"cost\">Справжня ціна мікросервісів\u003C\u002Fh2>\u003Cp>На діаграмі мікросервіси виглядають як акуратні коробочки. У житті кожна коробочка — це окремий деплой, окремий лог, окремий набір змінних середовища, окрема міграція й окремий спосіб зламатись о третій ночі. Плюс мережа між ними, яка тепер може відповісти таймаутом там, де раніше був виклик функції.\u003C\u002Fp>\u003Cp>Для команди з трьох це означає, що більшу частину тижня ви обслуговуєте інфраструктуру замість того, щоб писати продукт. Мікросервіси розв’язують \u003Cem>організаційну\u003C\u002Fem> проблему: кілька команд, які заважають одна одній релізити. Якщо у вас одна команда, цієї проблеми немає, а ціну ви платите повну.\u003C\u002Fp>\u003Ch2 id=\"modular\">Модульний моноліт\u003C\u002Fh2>\u003Cp>Робочий варіант — один застосунок, розділений усередині на модулі з явними межами. Один деплой, одна база, один лог. Але код усередині впорядкований так, що з нього можна виділити сервіс, коли з’явиться \u003Cem>причина\u003C\u002Fem>, а не бажання.\u003C\u002Fp>\u003Cp>Ознаки, що межі справжні, а не намальовані:\u003C\u002Fp>\u003Cul>\u003Cli>Модуль має публічний вхід (сервіс) і не дозволяє лізти у свої внутрішні класи.\u003C\u002Fli>\u003Cli>Модулі не імпортують одне з одного напряму, окрім явно оголошеного API.\u003C\u002Fli>\u003Cli>Кожен модуль володіє своїми таблицями. Сусід читає їх через сервіс, а не через JOIN.\u003C\u002Fli>\u003Cli>Схему бази можна прочитати й зрозуміти, до якого модуля належить таблиця.\u003C\u002Fli>\u003C\u002Ful>\u003Cp>Останній пункт — найдешевший тест. Якщо в схемі є таблиця, яку правлять три модулі, межа проходить не там.\u003C\u002Fp>\u003Ch2 id=\"contracts\">Один пакет контрактів\u003C\u002Fh2>\u003Cp>Найбільша щоденна біль малої команди — фронтенд і бекенд, які розходяться в уявленнях про дані. Лікується це не документацією, а спільним пакетом типів і схем валідації, від якого залежать обидві сторони.\u003C\u002Fp>\u003Cp>Практично: одна zod-схема на правило, з неї виводиться TypeScript-тип, бекенд робить із неї DTO, фронтенд — валідацію форми. Правило описане один раз. Якщо ви змінили його, обидва застосунки перестають компілюватись — і це саме те, що потрібно. Помилка має вилізти на збірці, а не в проді.\u003C\u002Fp>\u003Cblockquote>\u003Cp>Дублювання правила валідації в двох місцях — це не дублювання коду. Це дві різні системи, які поки що збігаються.\u003C\u002Fp>\u003C\u002Fblockquote>\u003Ch2 id=\"db\">База: одна, але з правилами\u003C\u002Fh2>\u003Cp>Спільна база між модулями — нормально, поки дотримано три речі:\u003C\u002Fp>\u003Col>\u003Cli>\u003Cstrong>Констрейнти в базі, а не лише в коді.\u003C\u002Fstrong> NOT NULL, CHECK, унікальні індекси. Валідація в застосунку захищає користувача, констрейнт захищає дані від застосунку.\u003C\u002Fli>\u003Cli>\u003Cstrong>Індекси під реальні запити.\u003C\u002Fstrong> Не «на всяк випадок», а під ті, що видно в повільних логах.\u003C\u002Fli>\u003Cli>\u003Cstrong>М’яке видалення там, де дані цінні.\u003C\u002Fstrong> \u003Ccode>deletedAt\u003C\u002Fcode> замість \u003Ccode>DELETE\u003C\u002Fcode> перетворює катастрофу на непорозуміння.\u003C\u002Fli>\u003C\u002Fol>\u003Ch2 id=\"ops\">Мінімум експлуатації, який окупається\u003C\u002Fh2>\u003Cp>Мала команда не може дозволити собі повноцінний SRE-стек, але чотири речі окупаються майже одразу:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cstrong>Аудит-лог.\u003C\u002Fstrong> Хто, що, коли змінив. Перше питання при будь-якому інциденті з даними.\u003C\u002Fli>\u003Cli>\u003Cstrong>Черга фонових задач.\u003C\u002Fstrong> Пошта, вебхуки й важкі обчислення поза запитом користувача. Інакше падіння SMTP стає падінням форми.\u003C\u002Fli>\u003Cli>\u003Cstrong>Outbox.\u003C\u002Fstrong> Повідомлення пишеться в базу в тій самій транзакції, що й подія, а воркер його розсилає. Заявка не губиться, навіть якщо пошта лежить.\u003C\u002Fli>\u003Cli>\u003Cstrong>Бекап із перевіркою відновлення.\u003C\u002Fstrong> Бекап, який жодного разу не відновлювали, — це файл невідомого призначення.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"when\">Коли все-таки ділити\u003C\u002Fh2>\u003Cp>Виділяйте сервіс, коли з’явився хоча б один із цих сигналів:\u003C\u002Fp>\u003Cul>\u003Cli>Частина системи має принципово інший профіль навантаження (обробка відео поруч із формою зворотного зв’язку).\u003C\u002Fli>\u003Cli>Частина має інші вимоги до доступності або до регуляторики.\u003C\u002Fli>\u003Cli>З’явилась друга команда, і релізи почали блокувати одна одну.\u003C\u002Fli>\u003C\u002Ful>\u003Cp>Зверніть увагу: жоден із сигналів не звучить як «так правильніше». Якщо модулі всередині моноліту чесні, виділення сервісу — це переміщення папки й додавання HTTP-шару. Якщо межі намальовані — жодна кількість сервісів не допоможе.\u003C\u002Fp>\u003Ch2 id=\"summary\">Коротко\u003C\u002Fh2>\u003Cp>Троє людей — це не «маленька версія великої команди». Це інший режим роботи, де кожна одиниця інфраструктури віднімає час у продукту. Модульний моноліт, спільні контракти, констрейнти в базі й чотири речі з експлуатації дають більшу частину переваг «дорослої» архітектури за частку її вартості.\u003C\u002Fp>","Архітектура для малої команди: модульний моноліт замість мікросервісів","Чому мікросервіси надто дорогі для команди з трьох, як влаштувати модульний моноліт, спільні zod-контракти, констрейнти в базі й мінімум експлуатації, що окупається.",[267,268,269,270],"Мікросервіси розв’язують організаційну проблему, якої в малої команди немає","Межі модулів справжні лише тоді, коли кожен володіє своїми таблицями","Одна zod-схема на правило: помилка контракту має ламати збірку","Аудит-лог, черга, outbox і перевірений бекап окупаються майже одразу",[272,275],{"q":273,"a":274},"Коли моноліт стає проблемою?","Коли релізи блокують одне одного через кількість команд, або коли частина системи має принципово інший профіль навантаження. Розмір коду сам собою проблемою не є.",{"q":276,"a":277},"Чи можна перейти на мікросервіси пізніше?","Так, якщо модулі мають чесні межі: власні таблиці, публічний сервіс на вході й жодних прямих імпортів усередину. Тоді виділення — це папка плюс HTTP-шар.",{"slug":279,"name":280,"role":281,"avatarUrl":282,"photoUrl":283},"yevhenii-kirianov","Євгеній","Фронтенд і фулстек, інтерфейси, продуктова розробка","\u002Fmedia\u002Fteam\u002Fyevhenii-avatar.webp","\u002Fmedia\u002Fteam\u002Fyevhenii.webp",[285,297,308],{"slug":286,"category":287,"tags":288,"coverImageUrl":6,"coverImageAlt":256,"readingMinutes":292,"featured":103,"publishedAt":293,"updatedAt":294,"locale":11,"title":295,"excerpt":296},"taking-over-a-project","process",[289,290,291],"legacy","audit","handover",8,"2026-06-02T09:00:00.000Z","2026-08-28T15:57:52.583Z","Як приймати проєкт після іншої команди","Перші два тижні на чужому коді вирішують, буде це підтримка чи безкінечне гасіння пожеж. Порядок дій: доступи, відтворюваний запуск, аудит ризиків, стабілізація — і тільки потім нові функції.",{"slug":298,"category":287,"tags":299,"coverImageUrl":6,"coverImageAlt":256,"readingMinutes":303,"featured":103,"publishedAt":304,"updatedAt":305,"locale":11,"title":306,"excerpt":307},"no-project-without-prototype",[300,301,302],"prototype","discovery","design",5,"2026-05-18T09:00:00.000Z","2026-08-28T15:57:52.681Z","Чому ми не беремось за проєкт без прототипу","Прототип — це не етап дизайну, а спосіб зробити помилки дешевими. Що він ловить, скільки триває і чому «давайте одразу в дизайн» майже завжди виходить дорожче.",{"slug":309,"category":310,"tags":311,"coverImageUrl":6,"coverImageAlt":256,"readingMinutes":314,"featured":103,"publishedAt":315,"updatedAt":316,"locale":11,"title":317,"excerpt":318},"website-cost-2026","money",[312,313,287],"budget","estimation",7,"2026-07-11T09:00:00.000Z","2026-08-28T15:57:52.399Z","Скільки коштує сайт у 2026 році і чому вилка така широка","Одна й та сама фраза «нам потрібен сайт» означає роботу на тиждень і роботу на три місяці. Розбираємо, з чого складається ціна, які пункти зникають з дешевих пропозицій і що спитати перед підписанням."]