[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"technologies":3,"\u002Fservices\u002Fweb-development\u002Fcompanion-web-app":167,"service-parent:\u002Fservices\u002Fweb-development\u002Fcompanion-web-app":434,"service-children:\u002Fservices\u002Fweb-development\u002Fcompanion-web-app":740,"glossary":741},[4,10,15,21,26,32,38,43,48,53,58,63,68,73,77,82,87,92,97,103,108,113,118,123,128,133,138,143,147,152,157,162],{"title":5,"description":6,"slug":7,"category":8,"icon":9},"Android","Каждое наше приложение выходит и на Android — платформенные API, фоновое выполнение, разрешения и требования магазина вместе с ними.","android","framework","logos:android-icon",{"title":11,"description":12,"slug":13,"category":8,"icon":14},"Angular","Фронтенд-фреймворк, в котором мы работаем, когда продукт уже на Angular, — строгая структура, подходящая большим долгоживущим приложениям.","angular","logos:angular-icon",{"title":16,"description":17,"slug":18,"category":19,"icon":20},"Dart","Язык, на котором написано каждое наше Flutter-приложение, — строгая null safety, полноценный pattern matching и компиляция в нативный код и веб.","dart","language","logos:dart",{"title":22,"description":23,"slug":24,"category":8,"icon":25},"Django","Python-фреймворк, который мы берём, когда продукту нужны админка, аутентификация и модель данных в первый же день, а не самописный сервис.","django","logos:django-icon",{"title":27,"description":28,"slug":29,"category":30,"icon":31},"Docker","Каждый наш сервис поставляется в виде контейнера, поэтому на ноутбуке, в CI и в продакшене работает один и тот же артефакт, а не три разных.","docker","infrastructure","logos:docker-icon",{"title":33,"description":34,"slug":35,"category":36,"icon":37},"Fastlane","Автоматизация релизов в нашей мобильной разработке — подпись, сборки и загрузка в сторы идут из CI, а не с ноутбука одного инженера в день релиза.","fastlane","tools","logos:fastlane",{"title":39,"description":40,"slug":41,"category":8,"icon":42},"Flutter","Наш основной мобильный стек с 2018 года — одна кодовая база на Dart для iOS, Android, веба и десктопа без отдельной команды под каждую платформу.","flutter","logos:flutter",{"title":44,"description":45,"slug":46,"category":36,"icon":47},"Git","Все проекты, к которым мы прикасаемся, живут в Git — ревью пул-реквестов, CI на каждой ветке и история, понятная и спустя месяцы.","git","logos:git-icon",{"title":49,"description":50,"slug":51,"category":19,"icon":52},"Go","Наш бэкенд-язык для real-time API и сервисов под нагрузкой — маленькие бинарники, быстрая сборка и конкурентность, которая остаётся читаемой.","go","logos:gopher",{"title":54,"description":55,"slug":56,"category":30,"icon":57},"Google Cloud","Облако, в котором работают наши продакшен-нагрузки, — управляемый Kubernetes, хранилище и сеть без серверов, которые надо обслуживать руками.","gcp","logos:google-cloud",{"title":59,"description":60,"slug":61,"category":36,"icon":62},"Gradle","Система сборки, через которую проходит каждый Android-релиз, — флейворы, конфигурации подписи и вся обвязка зависимостей под Flutter-приложением.","gradle","logos:gradle",{"title":64,"description":65,"slug":66,"category":30,"icon":67},"Helm","Так мы упаковываем деплой в Kubernetes — сервис, конфигурация, секреты и ingress как одна версионируемая единица, которую можно выкатить и откатить.","helm","logos:helm",{"title":69,"description":70,"slug":71,"category":19,"icon":72},"Kotlin","То, что мы берём, когда Flutter-приложению нужен настоящий Android под ним, — platform channels, фоновые задачи и интеграции с нативными SDK.","kotlin","logos:kotlin-icon",{"title":74,"description":75,"slug":76,"category":8,"icon":72},"Kotlin Multiplatform","Общая бизнес-логика для iOS и Android, а нативный интерфейс у каждой платформы свой, — альтернатива, когда Flutter не подходит.","kmp",{"title":78,"description":79,"slug":80,"category":30,"icon":81},"Kubernetes","Так мы запускаем сервисы в продакшене — деплой в Helm-чартах, откатываемые выкатки и масштабирование, для которого не нужен человек в три ночи.","kubernetes","logos:kubernetes",{"title":83,"description":84,"slug":85,"category":30,"icon":86},"NATS","Лёгкий обмен сообщениями между сервисами — publish\u002Fsubscribe и request\u002Freply без эксплуатационного веса полноценного кластера брокера.","nats","logos:nats-icon",{"title":88,"description":89,"slug":90,"category":8,"icon":91},"Nuxt","Vue с серверным рендерингом, роутингом и SEO из коробки — так мы делаем сайты и веб-приложения, которые должны быстро грузиться и индексироваться.","nuxt","logos:nuxt-icon",{"title":93,"description":94,"slug":95,"category":19,"icon":96},"PHP","Там, где PHP-бэкенд уже есть: дорабатываем его, интегрируемся с ним и делаем мобильные и веб-клиенты, которые он обслуживает.","php","logos:php",{"title":98,"description":99,"slug":100,"category":101,"icon":102},"PostgreSQL","Наша база данных по умолчанию — от проектирования схемы до настройки индексов мы берём её, если у продукта нет конкретной причины взять другую.","postgres","database","logos:postgresql",{"title":104,"description":105,"slug":106,"category":19,"icon":107},"Python","Наш язык для бэкендов, работы с данными и AI-интеграций — включая Python-биндинги, которые мы выпускаем к собственным инструментам на Rust.","python","logos:python",{"title":109,"description":110,"slug":111,"category":8,"icon":112},"React","Фронтенд-библиотека, в которой мы работаем, когда продукт уже на React, — компоненты, хуки и выросшая вокруг них экосистема.","react","logos:react",{"title":114,"description":115,"slug":116,"category":101,"icon":117},"Redis","Место для данных, которые должны быть быстрыми и которые не жалко пересчитать, — кэши, сессии, лимиты и очереди фоновых задач.","redis","logos:redis",{"title":119,"description":120,"slug":121,"category":19,"icon":122},"Ruby","Язык, на котором написана автоматизация наших мобильных релизов, — лейны Fastlane, кастомные действия и связка с CI, доставляющая сборки в сторы.","ruby","logos:ruby",{"title":124,"description":125,"slug":126,"category":19,"icon":127},"Rust","Куда мы идём, когда важны и скорость, и корректность, — рендеринг документов, CLI-инструменты и сервисы, которые обязаны оставаться быстрыми и предсказуемыми.","rust","simple-icons:rust",{"title":129,"description":130,"slug":131,"category":101,"icon":132},"SQLite","База данных, которая поставляется внутри приложения, — локальные кэши, offline-first хранилище и всё, что должно работать без сети.","sqlite","logos:sqlite",{"title":134,"description":135,"slug":136,"category":8,"icon":137},"Strapi","Headless CMS, к которой мы обращаемся, когда контент должны вести сами редакторы, — готовая админка и чистый API вместо самописных.","strapi","logos:strapi-icon",{"title":139,"description":140,"slug":141,"category":19,"icon":142},"Swift","То, что мы берём, когда Flutter-приложению нужен настоящий iOS под ним, — platform channels, интеграции нативных SDK, виджеты и App Clips.","swift","logos:swift",{"title":144,"description":145,"slug":146,"category":8,"icon":142},"SwiftUI","UI-фреймворк Apple, на котором мы делаем нативные поверхности, недоступные Flutter-приложению, — виджеты, App Clips и расширения.","swiftui",{"title":148,"description":149,"slug":150,"category":8,"icon":151},"Tailwind CSS","Так мы стилизуем весь фронтенд — утилитарные классы и дизайн-токены вместо таблицы стилей, которая только растёт и никогда не чистится.","tailwind","logos:tailwindcss-icon",{"title":153,"description":154,"slug":155,"category":19,"icon":156},"TypeScript","Стандарт для всего, что мы пишем для браузера и для Node-сервисов, — типы ловят ошибки интеграции раньше, чем код доходит до ревью.","typescript","logos:typescript-icon",{"title":158,"description":159,"slug":160,"category":8,"icon":161},"Vue","Наш фронтенд-фреймворк для админок, дашбордов мерчантов и веб-приложений, которые должны оставаться поддерживаемыми годами, а не спринтами.","vue","logos:vue",{"title":163,"description":164,"slug":165,"category":36,"icon":166},"Whisper","Открытая модель распознавания речи от OpenAI — движок транскрипции для голосового ввода, который работает и как бэкенд-сервис, и прямо на устройстве в приложении.","whisper","simple-icons:openai",{"id":168,"title":169,"body":170,"description":399,"extension":400,"footerCta":401,"headingCta":415,"image":419,"meta":423,"metaDescription":424,"metaTitle":421,"navigation":425,"ogDescription":426,"parent":427,"path":428,"seo":429,"slug":430,"stem":431,"updated":432,"__hash__":433},"services_ru\u002Fservices\u002Fcompanion-web-app.md","Парные веб-приложения",{"type":171,"value":172,"toc":380},"minimark",[173,177,180,185,229,234,237,241,248,252,265,269,272,276,279,283,286,290,293,297,305,309,315,331,334,338,353,356,360,363,367],[174,175,176],"p",{},"Парное веб-приложение — это браузерная сторона продукта, который живёт прежде всего в мобильном приложении: место, где клиент регистрируется до установки, где расшаренная ссылка открывается у того, у кого приложения нет, где работа, начатая на телефоне, продолжается на десктопе. Это тот же продукт, на том же API, оформленный под то, что браузер действительно умеет хорошо, — а не порт приложения и не брошюра о нём.",[174,178,179],{},"Большинство агентств делает одну из сторон. Мы выпускаем Flutter-приложения, веб-фронтенды и бэкенд-сервисы, которыми и те и другие пользуются. Это меняет инженерию, потому что на вопрос «на какой стороне должна жить эта функция» отвечает одна команда, глядящая на одну систему, а не переговоры двух подрядчиков.",[181,182,184],"h3",{"id":183},"какие-продукты-мы-делаем","Какие продукты мы делаем",[186,187,188,196,202,208,219],"ul",{},[189,190,191,195],"li",{},[192,193,194],"strong",{},"Клиентские веб-приложения рядом с мобильными"," — полный продукт в браузере там, где это оправдано, или осознанное подмножество там, где нет",[189,197,198,201],{},[192,199,200],{},"Публичные, расшариваемые страницы"," — страницы, в которые разворачивается пересланная ссылка, отрендеренные и индексируемые, с передачей в приложение, когда оно установлено",[189,203,204,207],{},[192,205,206],{},"Веб-клиенты реального времени"," — живые данные в браузере из той же ленты, которую потребляют приложения",[189,209,210,213,214],{},[192,211,212],{},"Бэк-офисы того же продукта"," — операторская сторона — отдельная дисциплина, разобранная на странице ",[215,216,218],"a",{"href":217},"\u002Fservices\u002Fweb-development\u002Fadmin-dashboards","админ-панелей и дашбордов",[189,220,221,224,225],{},[192,222,223],{},"Веб-сторона на Nuxt"," — когда парная веб-часть должна ранжироваться, машинерия для этого — наша практика ",[215,226,228],{"href":227},"\u002Fservices\u002Fweb-development\u002Fnuxt-development","разработки на Nuxt",[230,231,233],"h2",{"id":232},"кто-будет-делать-ваше-парное-веб-приложение","Кто будет делать ваше парное веб-приложение",[174,235,236],{},"Паттерн видно на двух продуктах в продакшене: у каждого — приложение и веб на одном общем бэкенде.",[181,238,240],{"id":239},"formtastic-одна-платформа-три-клиента","Formtastic — одна платформа, три клиента",[174,242,243,247],{},[215,244,246],{"href":245},"\u002Fportfolio\u002Fformtastic","Formtastic"," работает как веб-приложение на Nuxt плюс Flutter-приложения для iOS, iPad и Android — все против одного бэкенда на Django и Go. Одна и та же функция устроена по-разному на каждой стороне. Голосовой ввод в вебе записывает аудио в браузере и отправляет его на эндпоинт транскрипции, потому что бэкенд, который можно расширить, уже был; мобильные приложения несут Whisper прямо на устройстве, потому что на объектах нет связи. Одна функция, две реализации, и каждая честно считается со своей средой. Именно это суждение, больше чем владение фреймворком, и есть то, чего продукт с двумя клиентами требует на самом деле.",[181,249,251],{"id":250},"extraetf-одна-лента-реального-времени-все-клиенты","ExtraETF — одна лента реального времени, все клиенты",[174,253,254,255,259,260,264],{},"Для ",[215,256,258],{"href":257},"\u002Fportfolio\u002Fextraetf","ExtraETF"," мы построили на Go сервис на базе ",[261,262],"term",{"slug":263},"websocket",", который транслирует живые рыночные данные и веб-, и мобильным клиентам: тысячи одновременных подключений, обновления сведены к той частоте, которая реально нужна человеку, следящему за ценой. Мы сделали мобильные приложения и слой реального времени; веб-клиент, который его потребляет, принадлежит команде самого клиента. Хорошо спроектированный сервис кормит и те интерфейсы, которые вы никогда не будете строить сами.",[230,266,268],{"id":267},"чего-на-самом-деле-требует-продукт-с-двумя-клиентами","Чего на самом деле требует продукт с двумя клиентами",[174,270,271],{},"Четыре дисциплины удерживают приложение и веб от превращения в два разных продукта.",[181,273,275],{"id":274},"один-api-честно-обслуживающий-обоих","Один API, честно обслуживающий обоих",[174,277,278],{},"В момент, когда вебу нужен «всего один особый эндпоинт», у вас уже два бэкенда под одним именем. Мы проектируем API как единый контракт продукта: одна аутентификация, одни модели, одно версионирование для каждого клиента. Там, где сторонам действительно нужны разные формы данных, это различие прописывается в контракте, а не залатывается в клиенте.",[181,280,282],{"id":281},"решить-чем-является-веб-версия","Решить, чем является веб-версия",[174,284,285],{},"Дорогая ошибка — «приложение, только в браузере». Парная веб-часть окупает свой бюджет тем, чего приложение не умеет: быть достижимой из поисковой выдачи, мгновенно открываться по пересланной ссылке, давать клавиатуру и большой экран для серьёзного редактирования. Мы просеиваем через этот тест каждую функцию, и вычеркнутая из веб-версии функция для нас решение, которое мы отстаиваем вслух, а не дыра, обнаруженная позже.",[181,287,289],{"id":288},"передача-между-вебом-и-приложением","Передача между вебом и приложением",[174,291,292],{},"Пересланная ссылка должна открывать приложение, когда оно установлено, веб-страницу — когда нет, и никогда — сломанную промежуточную страницу. Universal links на iOS и app links на Android, фолбэк-страницы за ними и сценарий регистрации, который начинается в браузере и продолжается в приложении. На этом шве продукты с двумя клиентами теряют пользователей заметнее всего, поэтому мы прорабатываем его намеренно, не рассчитывая, что он заработает сам.",[181,294,296],{"id":295},"рендеринг-под-задачу-страницы","Рендеринг под задачу страницы",[174,298,299,300,304],{},"Публичные, расшариваемые страницы рендерятся на сервере, чтобы краулеры и превью ссылок видели настоящий контент; рабочее пространство за логином рендерится как приложение, которым оно и является. Компромиссы разложены на пилларной странице ",[215,301,303],{"href":302},"\u002Fservices\u002Fweb-development","веб-разработки",", и выбор делается для каждого маршрута, а не для проекта целиком.",[230,306,308],{"id":307},"как-мы-работаем","Как мы работаем",[174,310,311,314],{},[192,312,313],{},"Проект с фиксированным объёмом."," Мы ведём веб-сторону от определения набора функций до деплоя, против вашего существующего API или того, который построим рядом с ним.",[174,316,317,320,321,325,326,330],{},[192,318,319],{},"Staff augmentation."," Наши инженеры входят в команду, которая владеет продуктом, — см. ",[215,322,324],{"href":323},"\u002Fservices\u002Fteam-augmentation","расширение команды",". Если мобильную сторону тоже нужно строить, это наша ",[215,327,329],{"href":328},"\u002Fservices\u002Fflutter-app-development","практика Flutter",".",[174,332,333],{},"В обоих случаях смету под задачу мы присылаем в течение двух рабочих дней после того, как разберёмся в требованиях.",[230,335,337],{"id":336},"сколько-стоит-парное-веб-приложение","Сколько стоит парное веб-приложение",[174,339,340,341,343,344,349,350,330],{},"Парная веб-часть оценивается по тем же опубликованным тарифам, что и страница ",[215,342,303],{"href":302},": веб-приложение с авторизацией на вашем существующем API попадает в тариф веб-приложения, ",[345,346],"service-price",{"format":347,"service":348},"full","web-development\u002Fapp",", а полноценная вторая сторона продукта с реальным временем, платежами или мультитенантной структурой оценивается как работа уровня SaaS — ",[345,351],{"format":347,"service":352},"web-development\u002Fsaas",[174,354,355],{},"Это те же ключи, из которых рисуется таблица цен пилларной страницы, поэтому разойтись они не могут. Что двигает цифру: какая часть API уже существует и насколько чисто он спроектирован под больше чем одного клиента, какую часть продукта покрывает веб-версия и едут ли функции реального времени по существующей ленте — или её нужно строить.",[230,357,359],{"id":358},"частые-вопросы","Частые вопросы",[174,361,362],{},"Что чаще всего спрашивают команды, чей продукт живёт в приложении, а пользователи продолжают просить его в браузере.",[364,365],"questions",{":items":366},"[{\"title\":\"Наш продукт — мобильное приложение. Нужна ли нам веб-версия вообще?\",\"text\":\"Не всегда. Честный ответ зависит от того, где утекает ваш рост. Веб-сторона окупает бюджет, когда регистрации начинаются с поиска или пересланных ссылок, когда пользователи просят работать на большом экране или когда каждый расшаренный кусок контента сейчас упирается в тупик для людей без приложения. Если ничего из этого не про вас, мы так и скажем: хорошо сделанной карточки в сторе и диплинков может быть достаточно.\"},{\"title\":\"Должна ли веб-версия уметь всё, что умеет приложение?\",\"text\":\"Обычно нет, и решить, что оставить за бортом, — большая часть работы по определению объёма. Браузер выигрывает в достижимости (поиск, пересланные ссылки, мгновенный доступ без установки) и в работе с клавиатурой на большом экране; приложение выигрывает камерой, офлайном, уведомлениями и тем, что оно в одном касании. Голосовой ввод Formtastic — образцовый пример: веб записывает в браузере и транскрибирует на сервере, приложения транскрибируют на устройстве, потому что на объектах нет связи. Одна функция, разные честные реализации, и часть функций справедливо остаётся только в приложении.\"},{\"title\":\"Вы можете строить на нашем существующем бэкенде или вам нужно владеть им?\",\"text\":\"Мы регулярно строим поверх существующих API: веб-фронтенд Formtastic работает на том бэкенде на Django, который у продукта уже был, расширенном там, где это понадобилось вебу. Первым делом мы оценим, действительно ли API готов к нескольким клиентам: аутентификация, которой браузер может пользоваться безопасно, модели, не предполагающие сценариев только для приложения, и версионирование, позволяющее двум клиентам развиваться. Где он не дотягивает, мы точно скажем, что менять, — и можем сделать обе стороны сами, если так быстрее.\"},{\"title\":\"Может ли веб-приложение показывать те же живые данные, что и мобильное?\",\"text\":\"Да, и это вопрос проектирования ленты, а не фреймворка. Для ExtraETF мы построили на Go сервис на базе WebSocket, который транслирует живые рыночные данные и веб-, и мобильным клиентам: тысячи одновременных подключений, обновления сведены примерно к одному на инструмент в секунду — частоте, которая реально нужна человеку. Спроектируйте слой реального времени один раз и правильно — и каждый нынешний и будущий клиент будет потреблять один и тот же поток.\"},{\"title\":\"Как пересланная ссылка выбирает между приложением и веб-страницей?\",\"text\":\"Через universal links на iOS и app links на Android: один и тот же URL открывает приложение, когда оно установлено, и веб-страницу, когда нет, — причём веб-страница несёт полный контент, а не уговоры установить приложение. Сделанная правильно, ссылка переживает и установку: человек, попавший на веб, установивший приложение и открывший его, оказывается у того контента, который ему обещали. На этой передаче продукты с двумя клиентами теряют больше всего пользователей, поэтому мы относимся к ней как к функции с собственным инженерным бюджетом.\"},{\"title\":\"Сколько стоит парное веб-приложение?\",\"text\":\"Веб-приложение с авторизацией на существующем API обычно стоит от 1 200 000 до 3 200 000 рублей и занимает один-три месяца: это опубликованный тариф веб-приложения на нашей странице веб-разработки. Полноценная вторая сторона продукта с данными в реальном времени, платежами или мультитенантной структурой оценивается как работа уровня SaaS — свыше 4 000 000. Главный рычаг — ваш API: спроектированный под несколько клиентов, он держит веб-разработку компактной, а рассчитанный только на приложение добавляет бэкенд-работу, которую мы явно включим в оценку.\"}]",[174,368,369,370,372,373,377,378,330],{},"Посмотрите обе стороны в кейсе ",[215,371,246],{"href":245},", почитайте, как ",[215,374,376],{"href":375},"\u002Fblog\u002Fextraetf-realtime-fintech-flutter-go","лента реального времени ExtraETF"," раздаётся всем клиентам, или начните с пилларной страницы ",[215,379,303],{"href":302},{"title":381,"searchDepth":382,"depth":382,"links":383},"",2,[384,386,390,396,397,398],{"id":183,"depth":385,"text":184},3,{"id":232,"depth":382,"text":233,"children":387},[388,389],{"id":239,"depth":385,"text":240},{"id":250,"depth":385,"text":251},{"id":267,"depth":382,"text":268,"children":391},[392,393,394,395],{"id":274,"depth":385,"text":275},{"id":281,"depth":385,"text":282},{"id":288,"depth":385,"text":289},{"id":295,"depth":385,"text":296},{"id":307,"depth":382,"text":308},{"id":336,"depth":382,"text":337},{"id":358,"depth":382,"text":359},"Браузерная сторона mobile-first продукта — один API, один бэкенд и два интерфейса, которые не расходятся, от команды, которая выпускает и приложения, и веб, и сервисы за ними","md",{"heading":402,"text":403,"buttons":404},"Нужна ли вашему приложению веб-сторона?","Расскажите, что ваш продукт делает на мобильном и что у вас продолжают просить в браузере. Мы честно скажем, каким функциям место в вебе — а каким по-настоящему нет.",[405,411],{"to":406,"label":407,"leadingIcon":408,"color":409,"variant":410},"\u002Fcontact?intent=web-development","Записаться на консультацию","lucide:message-circle","neutral","outline",{"to":245,"label":412,"color":413,"variant":414},"Смотреть продукт с двумя клиентами","primary","solid",[416,417],{"to":406,"label":407,"leadingIcon":408,"color":413,"variant":414},{"to":245,"label":418,"color":409,"variant":410},"Смотреть наши работы",{"url":420,"alt":421,"text":422},"\u002Fservices\u002Fcompanion-web-app.webp","Разработка парных веб-приложений для мобильных продуктов","Один продукт, один API — приложение и браузер в ногу",{},"Разработка парных веб-приложений: браузерная сторона мобильного продукта на том же API и бэкенде — от команды, которая делает обе стороны сама.",true,"Ваш продукт живёт в приложении, но регистрации, шаринг и поиск происходят в браузере. Мы строим веб-сторону на том же бэкенде, что и ваши приложения.","web-development","\u002Fservices\u002Fweb-development\u002Fcompanion-web-app",{"title":169,"description":399},"companion-web-app","services\u002Fcompanion-web-app","2026-09-05","cmtr9XU5Gh03j0W0UqseJKTE3sZInLSiPrc2ejdYHe4",{"id":435,"title":436,"body":437,"description":712,"extension":400,"footerCta":713,"headingCta":723,"image":729,"meta":732,"metaDescription":733,"metaTitle":734,"navigation":425,"ogDescription":735,"parent":736,"path":302,"seo":737,"slug":427,"stem":738,"updated":432,"__hash__":739},"services_ru\u002Fservices\u002Fweb-development.md","Веб-разработка",{"type":171,"value":438,"toc":699},[439,443,446,466,470,474,477,481,484,488,491,495,505,509,522,527,540,544,547,591,595,598,604,610,621,650,654,657,661,668,670,673,696],[230,440,442],{"id":441},"современная-веб-разработка-на-nuxt-и-ssr","Современная веб-разработка на Nuxt и SSR",[174,444,445],{},"Мы создаём быстрые, понятные поисковикам веб-приложения на современном стеке с серверным рендерингом. Не конструктор сайтов и не раздутый single-page app, который отдаёт Google пустой экран, — настоящие приложения, которые рендерятся на сервере, быстро грузятся на телефоне и ранжируются.",[174,447,448,449,452,453,457,458,460,461,465],{},"Насколько мы уверены в этом стеке? ",[192,450,451],{},"Этот самый сайт собран на нём"," — Nuxt 4, ",[261,454,456],{"slug":455},"server-side-rendering","серверный рендеринг",", Tailwind CSS и Nuxt Content. Мы выбрали эти инструменты не для лендинга — мы ведём на них собственный бизнес. И делали на них проекты для клиентов, включая ",[215,459,246],{"href":245},", платформу для создания форм на Nuxt, и ",[215,462,464],{"href":463},"\u002Fportfolio\u002Fcashback-loyalty-platform","платформу лояльности с кешбэком",", чья админка на Nuxt запускает брендированные приложения поверх PHP-сервисов.",[467,468],"statistics-grid",{":items":469},"[{\"icon\": \"lucide:search\", \"value\": \"SSR\", \"label\": \"Индексируется сразу\", \"description\": \"Серверный HTML, который краулеры читают без запуска JavaScript\"}, {\"icon\": \"lucide:gauge\", \"value\": \"90+\", \"label\": \"Цель по Lighthouse\", \"description\": \"Мы строим под Core Web Vitals, а не против них\"}, {\"icon\": \"lucide:smartphone\", \"value\": \"Mobile-First\", \"label\": \"Адаптивно везде\", \"description\": \"Сначала под телефоны, затем — десктоп\"}, {\"icon\": \"lucide:code\", \"value\": \"Type-Safe\", \"label\": \"TypeScript насквозь\", \"description\": \"От слоя API до пропсов компонентов\"}]",[230,471,473],{"id":472},"наш-стек-и-почему-nuxt-ssr","Наш стек — и почему Nuxt + SSR",[174,475,476],{},"Выбор фреймворка — это разница между сайтом, который Google читает мгновенно, и тем, который он с трудом рендерит. Вот на чём мы строим и почему.",[181,478,480],{"id":479},"серверный-рендеринг-для-seo","Серверный рендеринг для SEO",[174,482,483],{},"Классический single-page app отдаёт пустую HTML-оболочку и просит браузер собрать страницу с помощью JavaScript. От этого страдают краулеры, превью ссылок и медленные устройства. Nuxt рендерит полный HTML на сервере, поэтому контент присутствует уже в первом ответе — мета-теги, заголовки, структурированные данные и текст, всё до того, как выполнится хоть строка клиентского JavaScript. Это самый мощный рычаг внутренней SEO-оптимизации, который может дать фреймворк, и здесь он по умолчанию, а не как надстройка.",[181,485,487],{"id":486},"tailwind-для-быстрого-единообразного-ui","Tailwind для быстрого, единообразного UI",[174,489,490],{},"Мы стилизуем на Tailwind CSS — utility-first, без хаотичных глобальных стилей, без мёртвого CSS, который грузится пользователю. Он держит дизайн-систему единой на всех страницах, делает адаптивные брейкпоинты явными и отгружает только реально используемые классы. Результат — UI, который быстро собирать, легко поддерживать и который мало весит.",[181,492,494],{"id":493},"nuxt-content-для-контентных-сайтов","Nuxt Content для контентных сайтов",[174,496,497,498,504],{},"Для маркетинговых сайтов, документации и блогов ",[215,499,503],{"href":500,"rel":501},"https:\u002F\u002Fcontent.nuxt.com",[502],"nofollow","Nuxt Content"," превращает Markdown в полностью отрендеренные на сервере страницы с типобезопасными схемами — ровно так работают блог и страницы услуг этого сайта. Редакторы пишут Markdown; сайт остаётся быстрым и индексируемым; разработчики держат всё под контролем версий. База данных не нужна.",[181,506,508],{"id":507},"strapi-когда-нужна-headless-cms","Strapi, когда нужна headless CMS",[174,510,511,512,516,517,521],{},"Когда контентом должны владеть нетехнические редакторы — товары, объявления, кампании, — мы подключаем ",[215,513,134],{"href":514,"rel":515},"https:\u002F\u002Fstrapi.io",[502],", open-source ",[261,518,520],{"slug":519},"headless-cms","headless CMS",". Ваша команда получает удобную админку; фронтенд на Nuxt получает данные через чистый API и рендерит их на сервере. Вы получаете редакторскую свободу без потери производительности и SEO, а данные и хостинг остаются вашими.",[523,524],"features",{":items":525,":title":526},"[{\"label\": \"Мобильная совместимость\", \"description\": \"Mobile-first, адаптивные макеты, которые работают на любом экране от телефона до широкоформатного — протестировано, а не на авось\"}, {\"label\": \"Правильная аутентификация\", \"description\": \"Сессии, OAuth и JWT с реальными серверными проверками авторизации — а не экран входа с открытым бэкдором\"}, {\"label\": \"Безопасные cookie и согласие\", \"description\": \"httpOnly, secure, SameSite cookie для сессий плюс обработка согласия по GDPR для аналитики и трекинга\"}, {\"label\": \"SEO встроено\", \"description\": \"Серверные мета-теги, Open Graph, canonical и hreflang, структурированные данные JSON-LD на каждой странице\"}, {\"label\": \"Производительность и Core Web Vitals\", \"description\": \"Оптимизация изображений, code splitting и кеширование, настроенные под прохождение Core Web Vitals на реальных устройствах\"}, {\"label\": \"Интеграция headless CMS\", \"description\": \"Nuxt Content или Strapi, чтобы команда публиковала контент, не трогая код\"}]","Что мы делаем правильно",[528,529,532],"info-box",{":leading-icon":530,":title":531},"lucide:shield-check","Безопасность — часть сборки",[174,533,534,535,539],{},"Аутентификация, cookie и работа с данными — именно здесь большинство веб-приложений незаметно даёт утечки. Мы делаем это правильно с самого начала — а если вам досталось приложение, в котором вы не уверены, наш ",[215,536,538],{"href":537},"\u002Fservices\u002Fai-code-audit","аудит AI-кода"," проверит аутентификацию, безопасность сессий и утечки данных, пока они не стали инцидентом.",[230,541,543],{"id":542},"что-мы-строим","Что мы строим",[174,545,546],{},"Четыре вида веб-работы возвращаются в наших проектах снова и снова, и теперь у каждого есть собственная страница с доказательствами за ней:",[186,548,549,560,571,578],{},[189,550,551,556,557,330],{},[192,552,553],{},[215,554,555],{"href":217},"Админ-панели и дашборды"," — бэк-офисы, стоящие за продуктами: ролевой доступ, формы, которые управляют реальной машинерией, таблицы, остающиеся удобными на любом объёме. Опорный пример — админка, запускающая брендированные приложения нашей ",[215,558,559],{"href":463},"платформы кэшбэка и лояльности",[189,561,562,567,568,570],{},[192,563,564],{},[215,565,566],{"href":227},"Разработка на Nuxt"," — маркетинговые сайты, контентные платформы и миграции на серверный рендеринг, как переезд ",[215,569,246],{"href":245}," с шаблонов Django на Nuxt. Этот сайт — постоянная демонстрация.",[189,572,573,577],{},[192,574,575],{},[215,576,169],{"href":428}," — браузерная сторона продукта, который живёт прежде всего в мобильном приложении и делит с ним один API и один бэкенд.",[189,579,580,586,587,330],{},[192,581,582],{},[215,583,585],{"href":584},"\u002Fservices\u002Fweb-development\u002Fembeddable-widgets","Встраиваемые виджеты и скрипты"," — JavaScript, работающий внутри страниц, которые вы не контролируете, без зависимостей и защищённый по замыслу, как сборщик за нашей ",[215,588,590],{"href":589},"\u002Fportfolio\u002Frealtime-bot-detection-platform","платформой детекции ботов",[230,592,594],{"id":593},"flutter-для-веба-плюсы-и-минусы","Flutter для веба — плюсы и минусы",[174,596,597],{},"Flutter умеет компилироваться в веб, и клиенты с мобильным приложением на Flutter часто спрашивают, не переиспользовать ли его и для сайта. Честный ответ: иногда — но редко для публичного, контентного веба. Вот в чём компромисс.",[599,600],"features-table",{":heading":601,":rows":602,":top-left-label":603},"[{\"label\": \"Nuxt + SSR\", \"hightlightLabel\": \"Публичный веб\"}, {\"label\": \"Flutter Web\"}, {\"label\": \"Классический SPA\"}]","[{\"label\": \"SEO \u002F индексация\",\"cells\": [{\"text\": \"Отлично (SSR)\", \"color\": \"success\", \"icon\": \"lucide:check-circle\" },{ \"text\": \"Плохо (canvas)\", \"color\": \"error\", \"icon\": \"lucide:x\" },{ \"text\": \"Слабо (пустая оболочка)\", \"color\": \"warning\", \"icon\": \"lucide:minus\" }]}, {\"label\": \"Размер первой загрузки\",\"cells\": [{\"text\": \"Маленький\", \"color\": \"success\", \"icon\": \"lucide:check-circle\" },{ \"text\": \"Тяжёлый бандл\", \"color\": \"error\", \"icon\": \"lucide:x\" },{ \"text\": \"Средний\", \"color\": \"warning\", \"icon\": \"lucide:minus\" }]}, {\"label\": \"Общий код с мобильным\",\"cells\": [{\"text\": \"Нет\", \"color\": \"warning\", \"icon\": \"lucide:minus\" },{ \"text\": \"Почти 100%\", \"color\": \"success\", \"icon\": \"lucide:check-circle\" },{ \"text\": \"Частично (React Native)\", \"color\": \"warning\", \"icon\": \"lucide:minus\" }]}, {\"label\": \"UI как в приложении\",\"cells\": [{\"text\": \"Хорошо\", \"color\": \"success\", \"icon\": \"lucide:check-circle\" },{ \"text\": \"Отлично\", \"color\": \"success\", \"icon\": \"lucide:check-circle\" },{ \"text\": \"Хорошо\", \"color\": \"success\", \"icon\": \"lucide:check-circle\" }]}, {\"label\": \"Контентные \u002F маркетинговые сайты\",\"cells\": [{\"text\": \"Идеально\", \"color\": \"success\", \"icon\": \"lucide:check-circle\" },{ \"text\": \"Плохо подходит\", \"color\": \"error\", \"icon\": \"lucide:x\" },{ \"text\": \"Сносно\", \"color\": \"warning\", \"icon\": \"lucide:minus\" }]}, {\"label\": \"Доступность\",\"cells\": [{\"text\": \"Нативный HTML\", \"color\": \"success\", \"icon\": \"lucide:check-circle\" },{ \"text\": \"Улучшается, ограничена\", \"color\": \"warning\", \"icon\": \"lucide:minus\" },{ \"text\": \"Нативный HTML\", \"color\": \"success\", \"icon\": \"lucide:check-circle\" }]}, {\"label\": \"Лучше всего для\",\"cells\": [{\"text\": \"Сайты и веб-приложения\", \"color\": \"success\"},{ \"text\": \"Внутренние инструменты в духе приложения\", \"color\": \"warning\"},{ \"text\": \"Дашборды\", \"color\": \"warning\"}]}]","Аспект",[174,605,606,609],{},[192,607,608],{},"Где Flutter web силён:"," продукт, который ведёт себя как приложение, где у вас уже есть мобильная кодовая база на Flutter и вы хотите, чтобы одна команда выпускала продукт на всех платформах — внутренние дашборды, инструменты за логином, сильно интерактивные или canvas-ориентированные интерфейсы за стеной авторизации, где SEO не важно, а пользователи ждут приложение, а не страницу.",[174,611,612,615,616,620],{},[192,613,614],{},"Где он подводит:"," всё, что нужно находить в Google. Flutter web рендерит в canvas, который краулеры читают с трудом, отгружает тяжёлый стартовый бандл и конфликтует с браузером в части доступности и ",[261,617,619],{"slug":618},"deep-linking","диплинков",". Для маркетинговых сайтов, блогов, e-commerce и лендингов это дисквалифицирующий недостаток.",[528,622,623],{},[174,624,625,628,629,632,633,636,637,640,641,645,646,330],{},[192,626,627],{},"Итог:"," используйте ",[192,630,631],{},"Nuxt + SSR"," для всего публичного и SEO-зависимого — маркетинговых сайтов, контента, e-commerce, маркетинговых страниц SaaS. Используйте ",[192,634,635],{},"Flutter web",", когда расширяете мобильное Flutter-приложение в веб-инструмент, который ведёт себя как приложение, а охват через поиск не цель. Мы делаем и то, и другое и честно подскажем, что нужно вашему проекту. Если на повестке и мобильное приложение, посмотрите услугу ",[215,638,639],{"href":328},"разработки на Flutter"," и разбор компромиссов в ",[215,642,644],{"href":643},"\u002Fblog\u002Fflutter-vs-react-native-2026","Flutter против React Native в 2026"," и ",[215,647,649],{"href":648},"\u002Fblog\u002Fflutter-vs-native-2026","Flutter против нативной разработки",[230,651,653],{"id":652},"стоимость-веб-разработки","Стоимость веб-разработки",[174,655,656],{},"Прозрачные диапазоны на основе объёма и сложности",[658,659],"pricing-table",{":items":660},"[{\"title\": \"Маркетинговый сайт \u002F лендинг\", \"subtitle\": \"Быстрый, готовый к SEO, контентный\", \"price\": \"web-development\u002Flanding\", \"terms\": \"2-4 недели\", \"lines\": [\"Nuxt + SSR для полной индексации\", \"Адаптивный, mobile-first дизайн\", \"SEO-мета, Open Graph и структурированные данные\", \"Nuxt Content или Markdown-CMS\", \"Формы обратной связи и аналитика\", \"Настройка под Core Web Vitals\", \"Деплой и настройка домена\"], \"callToAction\": {\"to\": \"\u002Fcontact?intent=web-development\", \"label\": \"Начать\"}},{\"highlight\": \"Популярно\",\"title\": \"Веб-приложение\", \"subtitle\": \"Интерактивный продукт с авторизацией\", \"price\": \"web-development\u002Fapp\", \"terms\": \"1-3 месяца\", \"lines\": [\"Всё из маркетингового сайта\", \"Аутентификация пользователей (OAuth \u002F JWT)\", \"Безопасные сессии и работа с cookie\", \"Интеграция REST или GraphQL API\", \"Ролевой контроль доступа\", \"Проектирование и интеграция БД\", \"Админ-панель\"], \"callToAction\": {\"to\": \"\u002Fcontact?intent=web-development\", \"label\": \"Начать\"}},{\"title\": \"Платформа на headless CMS\", \"subtitle\": \"Контент в руках редакторов, в любом объёме\", \"price\": \"web-development\u002Fheadless-cms\", \"terms\": \"2-4 месяца\", \"lines\": [\"Бэкенд на Strapi или Nuxt Content\", \"Кастомная редакторская админка\", \"Поддержка многоязычного контента\", \"Индексируемые страницы с серверным рендерингом\", \"Управление медиа и ассетами\", \"Процесс превью и публикации\", \"Архитектура API-first\"], \"callToAction\": {\"to\": \"\u002Fcontact?intent=web-development\", \"label\": \"Начать\"}},{\"title\": \"SaaS \u002F E-commerce\", \"subtitle\": \"Сложный, масштабируемый веб-продукт\", \"price\": \"web-development\u002Fsaas\", \"terms\": \"4+ месяца\", \"lines\": [\"Все платформы и интеграции\", \"Платежи и подписки\", \"Мультитенантная архитектура\", \"Продвинутая безопасность и комплаенс\", \"Масштабируемая инфраструктура бэкенда\", \"Мониторинг и наблюдаемость\", \"Выделенная поддержка\"], \"callToAction\": {\"to\": \"\u002Fcontact?intent=web-development\", \"label\": \"Начать\"}}]",[528,662,665],{":leading-icon":663,":title":664},"lucide:dollar-sign","Доступна индивидуальная оценка",[174,666,667],{},"Каждый проект уникален. Эти диапазоны приблизительны и основаны на типовом объёме. Мы подготовим детальную оценку, когда разберёмся в ваших требованиях, интеграциях и сроках. Свяжитесь с нами для бесплатной консультации и точной оценки.",[230,669,359],{"id":358},[174,671,672],{},"Распространённые вопросы о наших услугах веб-разработки",[364,674,676],{":items":675},"[{\"title\":\"Почему вы строите на Nuxt, а не на WordPress или конструкторе сайтов?\",\"text\":\"Nuxt даёт серверный рендеринг — это значит, что поисковики и превью ссылок видят полностью собранный HTML в первом ответе, а не пустую оболочку. Вы получаете скорость и индексируемость статического сайта с мощью настоящего приложения, полный контроль версий над кодом — и никакой раздутости от плагинов и поверхности атаки, свойственных типичной установке WordPress. Для контентных сайтов мы соединяем Nuxt с headless CMS, чтобы у редакторов всё равно была удобная админка.\"},{\"title\":\"Действительно ли серверный рендеринг улучшает SEO?\",\"text\":\"Да, существенно. При SSR контент страницы, мета-теги, данные Open Graph и структурированные данные присутствуют в HTML, который отдаёт сервер, поэтому краулеры читают их без выполнения JavaScript. Single-page приложения, которые рендерятся целиком в браузере, индексируются медленнее, а некоторые краулеры и превью ссылок в соцсетях могут вовсе их пропустить. SSR — самое значимое решение на уровне фреймворка, которое можно принять ради органического поиска.\"},{\"title\":\"Можете ли вы сделать моё веб-приложение на Flutter для веба?\",\"text\":\"Можем, и для подходящего проекта это отличный вариант. Flutter web хорош для продуктов, которые ведут себя как приложение, и внутренних инструментов за логином, особенно когда у вас уже есть мобильное приложение на Flutter и вы хотите общую кодовую базу. Он плохо подходит для всего, что должно ранжироваться в Google, потому что рендерит в canvas, который краулеры читают с трудом, и отгружает тяжёлый стартовый бандл. Для публичных, контентных или e-commerce сайтов мы рекомендуем Nuxt с серверным рендерингом.\"},{\"title\":\"Как вы обеспечиваете безопасность аутентификации и данных?\",\"text\":\"Мы реализуем реальную серверную авторизацию, а не просто экран логина. Сессии используют httpOnly, secure, SameSite cookie, чтобы токены нельзя было украсть клиентскими скриптами, и мы поддерживаем потоки OAuth и JWT с ролевым контролем доступа. Согласие на cookie обрабатывается по GDPR. Если у вас есть готовое приложение, наш аудит AI-кода отдельно проверяет аутентификацию, работу с сессиями и утечки данных.\"},{\"title\":\"Что выбрать — Nuxt Content или Strapi?\",\"text\":\"Зависит от того, кто редактирует контент. Nuxt Content идеален, когда контентом управляют разработчики или технические авторы в Markdown под контролем версий, например блог или документация, без базы данных. Strapi — правильный выбор, когда нетехническим редакторам нужна удобная админка для управления товарами, объявлениями или кампаниями. Оба рендерятся на сервере через фронтенд на Nuxt, так что в любом случае сайт остаётся быстрым и индексируемым. Мы поможем выбрать под вашу команду.\"},{\"title\":\"Сколько стоит проект веб-разработки?\",\"slot\":\"cost\",\"text\":\"Быстрый маркетинговый или контентный сайт обычно стоит от 400 000 до 960 000 рублей, веб-приложение с авторизацией от 1 200 000 до 3 200 000, платформа на headless CMS от 1 600 000 до 4 000 000, а сложный SaaS или e-commerce продукт свыше 4 000 000. Итоговая сумма зависит от числа функций, интеграций и объёма дизайна. Мы даём фиксированную оценку после бесплатной консультации.\"}]",[677,678,679],"template",{"v-slot:cost_body":381},[174,680,681,682,685,686,688,689,692,693,695],{},"Быстрый маркетинговый или контентный сайт обычно стоит ",[345,683],{"format":347,"service":684},"web-development\u002Flanding",", веб-приложение с авторизацией ",[345,687],{"format":347,"service":348},", платформа на headless CMS ",[345,690],{"format":347,"service":691},"web-development\u002Fheadless-cms",", а сложный SaaS или e-commerce продукт — ",[345,694],{"format":347,"service":352},". Итоговая сумма зависит от числа функций, интеграций и объёма дизайна. Мы даём фиксированную оценку после бесплатной консультации.",[174,697,698],{},"::",{"title":381,"searchDepth":382,"depth":382,"links":700},[701,702,708,709,710,711],{"id":441,"depth":382,"text":442},{"id":472,"depth":382,"text":473,"children":703},[704,705,706,707],{"id":479,"depth":385,"text":480},{"id":486,"depth":385,"text":487},{"id":493,"depth":385,"text":494},{"id":507,"depth":385,"text":508},{"id":542,"depth":382,"text":543},{"id":593,"depth":382,"text":594},{"id":652,"depth":382,"text":653},{"id":358,"depth":382,"text":359},"Быстрые, готовые к SEO веб-приложения на Nuxt, SSR и Tailwind",{"heading":714,"text":715,"buttons":716},"Готовы сделать веб-приложение, которое ранжируется и быстро работает?","Расскажите о задаче — соберём быстрое веб-приложение, удобное пользователям и понятное поисковикам.",[717,720],{"to":718,"label":719,"leadingIcon":408,"color":409,"variant":410},"\u002Fcontact","Начать проект",{"to":721,"label":722,"color":413,"variant":414},"\u002Fportfolio","Наши работы",[724,726],{"to":718,"label":725,"leadingIcon":408,"color":413,"variant":414},"Бесплатная консультация",{"to":727,"label":728,"color":409,"variant":410},"#стоимость-веб-разработки","Посмотреть цены",{"url":730,"alt":436,"text":731},"\u002Fservices\u002Fweb-development.webp","Собрано на том же стеке, что и этот сайт",{},"Веб-разработка на Nuxt, SSR и Tailwind: быстрые, готовые к SEO, мобильные веб-приложения с аутентификацией, headless CMS и Strapi. Бесплатная консультация.","Веб-разработка — Nuxt, SSR и SEO","Веб-приложения на Nuxt и SSR, которые быстро грузятся и хорошо индексируются: авторизация, headless CMS и mobile-first вёрстка, не воюющая с браузером.",null,{"title":436,"description":712},"services\u002Fweb-development","sc_PnwHiO-YqVwRhGTp1eA5fuAk0LTgq1mdlIiW3J8A",[],[742,757,769,784,798,813,829,842,854,871,884,895,905,916,928,939,948,962,975,982,996,1011,1024,1037,1050,1061,1072,1083,1096,1106,1119,1130,1144,1155,1169,1178,1189,1202,1215,1228,1241,1253,1265,1277,1289,1301,1312,1326,1337,1349,1360,1373,1385],{"slug":743,"term":744,"definition":745,"category":746,"aliases":747,"links":749,"related":753,"readMore":-1,"target":755,"hasArticle":756},"aosp","AOSP","Android Open Source Project — Android без надстройки Google, который может форкнуть кто угодно. На его форках работают кассовые терминалы, киоски и автомобильные системы, а работа на этом уровне открывает части ОС, которых прикладной разработчик не видит.","platform",[748],"Android Open Source Project",[750],{"kind":751,"url":752},"website","https:\u002F\u002Fsource.android.com\u002F",[754],"host-card-emulation","\u002Fglossary#aosp",false,{"slug":758,"term":759,"definition":760,"category":746,"aliases":761,"links":762,"related":766,"readMore":-1,"target":768,"hasArticle":756},"app-clips","App Clips","Функция Apple, позволяющая запустить небольшую часть iOS-приложения — до 15 МБ — не устанавливая его целиком. Вызывается по QR-коду, NFC-метке или ссылке: для случаев, когда первое действие пользователя не должно требовать похода в App Store.",[],[763],{"kind":764,"url":765},"documentation","https:\u002F\u002Fdeveloper.apple.com\u002Fapp-clips\u002F",[618,767],"install-referrer","\u002Fglossary#app-clips",{"slug":770,"term":771,"definition":772,"category":746,"aliases":773,"links":774,"related":780,"readMore":-1,"target":783,"hasArticle":756},"bigquery","BigQuery","Аналитическое хранилище Google Cloud. Вы запускаете SQL по миллиардам строк, и они сканируются за секунды, а данные при этом лежат отдельно от машин, выполняющих запросы. Именно это снимает отчётность и исследование данных с базы, обслуживающей живой трафик.",[],[775,777],{"kind":751,"url":776},"https:\u002F\u002Fcloud.google.com\u002Fbigquery",{"kind":778,"url":779},"wikipedia","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBigQuery",[781,782],"object-storage","elasticsearch","\u002Fglossary#bigquery",{"slug":785,"term":786,"definition":787,"category":788,"aliases":789,"links":793,"related":796,"readMore":-1,"target":797,"hasArticle":756},"ci-cd","CI\u002FCD","Автоматизация, которая собирает, тестирует и выкладывает каждое изменение без ручного запуска команд. В мобильной разработке это то, что превращает релиз в нажатие кнопки вместо полудня ожидания, пока освободится нужный человек.","practice",[790,791,792],"CI","непрерывная интеграция","непрерывная поставка",[794],{"kind":778,"url":795},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCI\u002FCD",[],"\u002Fglossary#ci-cd",{"slug":799,"term":800,"definition":801,"category":802,"aliases":803,"links":806,"related":809,"readMore":-1,"target":812,"hasArticle":756},"crud","CRUD","Create, read, update, delete — четыре операции, стоящие почти за каждой формой и админкой. Собирательное название для рутинной половины приложения, которая управляет данными, в отличие от частей с реальной предметной логикой.","architecture",[804,805],"Create, Read, Update, Delete","создание, чтение, обновление, удаление",[807],{"kind":778,"url":808},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCreate,_read,_update_and_delete",[810,811],"rest","graphql","\u002Fglossary#crud",{"slug":814,"term":815,"definition":816,"category":788,"aliases":817,"links":821,"related":826,"readMore":-1,"target":828,"hasArticle":756},"dev-container","Dev Container","Среда разработки, описанная один раз в devcontainer.json — ОС, инструменты и версии рантаймов, которые нужны проекту, — и открываемая одинаково внутри контейнера в редакторе любого участника, вместо инструкции по установке, которую каждый понимает по-своему.",[818,819,820],"devcontainer.json","Dev Containers","VS Code Dev Containers",[822,824],{"kind":751,"url":823},"https:\u002F\u002Fcontainers.dev\u002F",{"kind":764,"url":825},"https:\u002F\u002Fcode.visualstudio.com\u002Fdocs\u002Fdevcontainers\u002Fcontainers",[827],"container-registry","\u002Fglossary#dev-container",{"slug":782,"term":830,"definition":831,"category":746,"aliases":832,"links":835,"related":840,"readMore":-1,"target":841,"hasArticle":756},"Elasticsearch","Поисковый и аналитический движок, который индексирует записи, чтобы их можно было интерактивно фильтровать и искать, а не сканировать. К нему обращаются, когда вопрос звучит как «покажи вот эти сессии с шестью фильтрами», а не «просуммируй колонку».",[833,834],"Elastic","ELK",[836,838],{"kind":751,"url":837},"https:\u002F\u002Fwww.elastic.co\u002Felasticsearch",{"kind":778,"url":839},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FElasticsearch",[770],"\u002Fglossary#elasticsearch",{"slug":843,"term":844,"definition":845,"category":802,"aliases":846,"links":849,"related":850,"readMore":-1,"target":853,"hasArticle":756},"fan-out","Fan-out","Чтение источника один раз и доставка каждого обновления всем подписанным на него клиентам. Наивная версия пишет подписчикам в цикле и встаёт, как только один из сокетов начинает тормозить; рабочая — держит отдельный буфер на каждого клиента и отключает тех, кто не успевает.",[847,848],"веерная рассылка","фан-аут",[],[263,851,852],"pub-sub","server-sent-events","\u002Fglossary#fan-out",{"slug":855,"term":856,"definition":857,"category":788,"aliases":858,"links":861,"related":866,"readMore":-1,"target":870,"hasArticle":756},"gdpr","GDPR","Регламент ЕС о персональных данных людей в ЕС: законное основание для сбора, настоящее согласие на трекинг, право увидеть и удалить свои данные. Он следует за вашими пользователями, а не за вашими серверами: где зарегистрирована компания, значения не имеет.",[859,860],"Общий регламент по защите данных","General Data Protection Regulation",[862,864],{"kind":751,"url":863},"https:\u002F\u002Fgdpr.eu\u002F",{"kind":778,"url":865},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FGeneral_Data_Protection_Regulation",[867,868,869],"pci-dss","soc-2","hipaa","\u002Fglossary#gdpr",{"slug":872,"term":873,"definition":874,"category":788,"aliases":875,"links":879,"related":882,"readMore":-1,"target":883,"hasArticle":756},"golden-test","Golden-тест","Тест, который отрисовывает виджет и сравнивает результат попиксельно с эталонным изображением. Во Flutter это самый дешёвый способ узнать, не сломал ли редизайн пустое состояние на 320pt, в тёмной теме, при 200% масштабе текста.",[876,877,878],"golden test","золотой тест","скриншотный тест",[880],{"kind":764,"url":881},"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fflutter_test\u002FmatchesGoldenFile.html",[785],"\u002Fglossary#golden-test",{"slug":811,"term":885,"definition":886,"category":802,"aliases":887,"links":888,"related":893,"readMore":-1,"target":894,"hasArticle":756},"GraphQL","Язык запросов к API, где клиент сам перечисляет нужные поля и получает один ответ ровно такой формы. Он снимает избыточную выдачу, к которой дрейфуют REST-эндпоинты, и добавляет собственный режим отказа: неограниченный запрос, обходящий всю модель данных.",[],[889,891],{"kind":751,"url":890},"https:\u002F\u002Fgraphql.org\u002F",{"kind":778,"url":892},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FGraphQL",[810],"\u002Fglossary#graphql",{"slug":869,"term":896,"definition":897,"category":788,"aliases":898,"links":900,"related":903,"readMore":-1,"target":904,"hasArticle":756},"HIPAA","Закон США о защищённой медицинской информации: как её можно хранить, передавать, логировать и раскрывать. Как и PCI-DSS, это архитектурное ограничение, которое выбирают в начале, а не документ, который дописывают перед запуском.",[899],"Health Insurance Portability and Accountability Act",[901],{"kind":778,"url":902},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHealth_Insurance_Portability_and_Accountability_Act",[867,855,868],"\u002Fglossary#hipaa",{"slug":519,"term":906,"definition":907,"category":802,"aliases":908,"links":911,"related":914,"readMore":-1,"target":915,"hasArticle":756},"Headless CMS","Система управления контентом с админкой и API, но без собственного фронтенда. Редакторы публикуют в одном месте, а сайт или приложение отрисовывает контент само — слой представления принадлежит вам, а не вендору CMS.",[909,910],"безголовая CMS","контентное API",[912],{"kind":778,"url":913},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHeadless_content_management_system",[455,810],"\u002Fglossary#headless-cms",{"slug":754,"term":917,"definition":918,"category":746,"aliases":919,"links":923,"related":926,"readMore":-1,"target":927,"hasArticle":756},"Host Card Emulation","Режим, в котором Android-телефон программно эмулирует бесконтактную карту по NFC, без аппаратного защищённого элемента. Так платит приложение-кошелёк на терминале: телефон говорит с ним по тому же протоколу EMV Contactless, что и пластиковая карта.",[920,921,922],"HCE","EMV Contactless","бесконтактные платежи",[924],{"kind":764,"url":925},"https:\u002F\u002Fdeveloper.android.com\u002Fdevelop\u002Fconnectivity\u002Fnfc\u002Fhce",[867,743],"\u002Fglossary#host-card-emulation",{"slug":929,"term":930,"definition":931,"category":746,"aliases":932,"links":933,"related":936,"readMore":-1,"target":938,"hasArticle":756},"impeller","Impeller","Движок рендеринга, на котором Flutter работает сегодня: по умолчанию на iOS с 2023 года и на Android с 2024-го. Он компилирует шейдеры заранее, а не во время первой анимации, что убрало главную видимую проблему Flutter в проде — джанк на компиляции шейдеров.",[],[934],{"kind":764,"url":935},"https:\u002F\u002Fdocs.flutter.dev\u002Fperf\u002Fimpeller",[937],"skia","\u002Fglossary#impeller",{"slug":767,"term":940,"definition":941,"category":746,"aliases":942,"links":943,"related":946,"readMore":-1,"target":947,"hasArticle":756},"Install Referrer","API Google Play, который передаёт только что установленному Android-приложению параметры кампании из ссылки, приведшей к установке. Android-половина отложенного диплинкинга и надёжный способ понять, откуда пришёл пользователь.",[],[944],{"kind":764,"url":945},"https:\u002F\u002Fdeveloper.android.com\u002Fgoogle\u002Fplay\u002Finstallreferrer",[618,758],"\u002Fglossary#install-referrer",{"slug":949,"term":950,"definition":951,"category":952,"aliases":953,"links":955,"related":960,"readMore":-1,"target":961,"hasArticle":756},"jwt","JWT","Подписанный токен, несущий свои данные внутри: сервер понимает, кому принадлежит запрос, не обращаясь к хранилищу сессий. Стандарт мобильной аутентификации. Подпись доказывает, что токен не меняли, но не скрывает его содержимое.","protocol",[954],"JSON Web Token",[956,958],{"kind":751,"url":957},"https:\u002F\u002Fjwt.io\u002F",{"kind":778,"url":959},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FJSON_Web_Token",[867],"\u002Fglossary#jwt",{"slug":963,"term":964,"definition":965,"category":788,"aliases":966,"links":970,"related":973,"readMore":-1,"target":974,"hasArticle":756},"kyc","KYC","Know Your Customer — проверки личности, которые регулируемый финансовый продукт проводит, прежде чем разрешить переводить деньги: съёмка документов, liveness, санкционный и антиотмывочный скрининг. На онбординг это влияет сильнее любого дизайн-решения.",[967,968,969],"Know Your Customer","AML","KYC\u002FAML",[971],{"kind":778,"url":972},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FKnow_your_customer",[867,855],"\u002Fglossary#kyc",{"slug":76,"term":74,"definition":976,"category":746,"aliases":977,"links":979,"related":980,"readMore":981,"target":981,"hasArticle":756},"Переиспользование бизнес-логики на Kotlin между Android, iOS и сервером, при этом интерфейс на каждой платформе остаётся нативным. Альтернатива Flutter, когда UI обязан быть нативным, а правила за ним — нет.",[978],"KMP",[],[],"\u002Ftechnologies\u002Fkmp",{"slug":983,"term":984,"definition":985,"category":986,"aliases":987,"links":990,"related":993,"readMore":-1,"target":995,"hasArticle":756},"mvp","MVP","Минимальная версия продукта, которую можно показать реальным пользователям и которая при этом отвечает на вопрос, ради которого его делали. Решение об объёме, а не о качестве: MVP всё равно обязан работать.","business",[988,989],"минимально жизнеспособный продукт","minimum viable product",[991],{"kind":778,"url":992},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMinimum_viable_product",[994],"white-label","\u002Fglossary#mvp",{"slug":997,"term":998,"definition":999,"category":952,"aliases":1000,"links":1004,"related":1009,"readMore":-1,"target":1010,"hasArticle":756},"oauth","OAuth","Стандарт, на котором держатся «Вход через Apple», Google и остальные: пользователь авторизует ваше приложение у провайдера, которому уже доверяет, а приложение получает токен вместо пароля. Никто не заводит новый пароль, и вы его не храните.",[1001,1002,1003],"OAuth 2.0","вход через соцсети","Sign in with Apple",[1005,1007],{"kind":751,"url":1006},"https:\u002F\u002Foauth.net\u002F2\u002F",{"kind":778,"url":1008},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FOAuth",[949],"\u002Fglossary#oauth",{"slug":867,"term":1012,"definition":1013,"category":788,"aliases":1014,"links":1017,"related":1022,"readMore":-1,"target":1023,"hasArticle":756},"PCI-DSS","Стандарт безопасности карточной индустрии, обязательный для всех, кто хранит, обрабатывает или передаёт данные карт. Большинство приложений намеренно остаются вне зоны его действия, отдавая ввод карты сертифицированному платёжному провайдеру.",[1015,1016],"PCI DSS","Payment Card Industry Data Security Standard",[1018,1020],{"kind":751,"url":1019},"https:\u002F\u002Fwww.pcisecuritystandards.org\u002F",{"kind":778,"url":1021},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPayment_Card_Industry_Data_Security_Standard",[949],"\u002Fglossary#pci-dss",{"slug":1025,"term":1026,"definition":1027,"category":986,"aliases":1028,"links":1031,"related":1034,"readMore":-1,"target":1036,"hasArticle":756},"product-market-fit","Product-market fit","Момент, когда продукт доказуемо нашёл своих людей: они им пользуются, возвращаются и платят. До него разработка отвечает на вопрос, после — на спрос.",[1029,1030],"PMF","соответствие продукта рынку",[1032],{"kind":778,"url":1033},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FProduct-market_fit",[983,1035],"time-to-market","\u002Fglossary#product-market-fit",{"slug":1038,"term":1039,"definition":1040,"category":788,"aliases":1041,"links":1044,"related":1047,"readMore":-1,"target":1049,"hasArticle":756},"prompt-injection","Prompt injection","Атака, при которой текст от пользователя языковая модель читает как инструкции, а не как данные, и уходит в обход собственных правил. Родственник SQL-инъекции в эпоху LLM: возникает везде, где пользовательский ввод склеивается в промпт.",[1042,1043],"инъекция промпта","инъекция в промпт",[1045],{"kind":778,"url":1046},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPrompt_injection",[1048],"rate-limiting","\u002Fglossary#prompt-injection",{"slug":851,"term":1051,"definition":1052,"category":802,"aliases":1053,"links":1056,"related":1059,"readMore":-1,"target":1060,"hasArticle":756},"Pub\u002FSub","Шаблон обмена сообщениями: производитель публикует событие, а любое число потребителей независимо читает его через стоящий между ними брокер. Производитель никогда их не ждёт — так путь запроса остаётся быстрым, а более медленная работа выполняется в фоне.",[1054,1055],"публикация\u002Fподписка","Google Cloud Pub\u002FSub",[1057],{"kind":778,"url":1058},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPublish%E2%80%93subscribe_pattern",[],"\u002Fglossary#pub-sub",{"slug":810,"term":1062,"definition":1063,"category":802,"aliases":1064,"links":1067,"related":1070,"readMore":-1,"target":1071,"hasArticle":756},"REST","Общепринятый стиль HTTP-API: URL называет ресурс, а HTTP-метод говорит, что с ним сделать. Способ по умолчанию, которым приложение общается с бэкендом, и то, что ожидает найти большинство сторонних интеграций.",[1065,1066],"REST API","Representational State Transfer",[1068],{"kind":778,"url":1069},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FREST",[263,852],"\u002Fglossary#rest",{"slug":868,"term":1073,"definition":1074,"category":788,"aliases":1075,"links":1078,"related":1081,"readMore":-1,"target":1082,"hasArticle":756},"SOC 2","Отчёт внешнего аудитора о том, как компания обращается с данными клиентов — безопасность, доступность, конфиденциальность, — а не сертификат, который можно купить. Корпоративные заказчики его требуют, а архитектуру он ограничивает задолго до самого аудита.",[1076,1077],"SOC2","System and Organization Controls",[1079],{"kind":778,"url":1080},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSystem_and_Organization_Controls",[867,855,869],"\u002Fglossary#soc-2",{"slug":1084,"term":1085,"definition":1086,"category":986,"aliases":1087,"links":1090,"related":1093,"readMore":-1,"target":1095,"hasArticle":756},"saas","SaaS","Софт, который продают как постоянную подписку на размещённый у поставщика продукт, а не как разовую лицензию для установки у себя. Поставщик держит серверы, непрерывно выкатывает обновления и берёт плату за пользователя или за объём.",[1088,1089],"Software as a Service","ПО как услуга",[1091],{"kind":778,"url":1092},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSoftware_as_a_service",[1094,994],"multi-tenancy","\u002Fglossary#saas",{"slug":852,"term":1097,"definition":1098,"category":952,"aliases":1099,"links":1101,"related":1104,"readMore":-1,"target":1105,"hasArticle":756},"Server-Sent Events","Односторонний поток от сервера к клиенту поверх обычного HTTP-соединения. Проще, чем WebSocket, и достаточен там, где только серверу есть что сказать: прогресс операции, ответ AI, приходящий токен за токеном.",[1100],"SSE",[1102],{"kind":778,"url":1103},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServer-sent_events",[263,810],"\u002Fglossary#server-sent-events",{"slug":937,"term":1107,"definition":1108,"category":746,"aliases":1109,"links":1112,"related":1117,"readMore":-1,"target":1118,"hasArticle":756},"Skia","Открытая 2D-графическая библиотека Google, которая рисует Chrome, Android и — до появления Impeller — каждый кадр Flutter. Она умеет выводить не только на экран, но и в PDF: именно это делает «печать в PDF» в Chrome.",[1110,1111],"Skia Graphics Engine","skia-safe",[1113,1115],{"kind":751,"url":1114},"https:\u002F\u002Fskia.org\u002F",{"kind":778,"url":1116},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSkia_Graphics_Engine",[929],"\u002Fglossary#skia",{"slug":1120,"term":1121,"definition":1122,"category":986,"aliases":1123,"links":1126,"related":1127,"readMore":-1,"target":1129,"hasArticle":756},"staff-augmentation","Staff augmentation","Модель найма, при которой инженеры внешнего партнёра входят в вашу команду и работают под вашим управлением — в вашем репозитории, ваших спринтах, вашем процессе, — а не сдают отдельный проект. Вы покупаете ресурс; код и контекст остаются у вас.",[1124,324,1125],"аутстаффинг","выделенные разработчики",[],[1128,1035],"total-cost-of-ownership","\u002Fglossary#staff-augmentation",{"slug":1131,"term":1132,"definition":1133,"category":952,"aliases":1134,"links":1138,"related":1141,"readMore":-1,"target":1143,"hasArticle":756},"tls","TLS","Слой шифрования под HTTPS. Он подтверждает, что сервер именно тот, о ком говорит его сертификат, согласует свежий ключ на сессию и шифрует всё дальнейшее — сеть между вами видит шифртекст и не может незаметно его изменить.",[1135,1136,1137],"SSL","HTTPS","Transport Layer Security",[1139],{"kind":778,"url":1140},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTransport_Layer_Security",[1142,949],"end-to-end-encryption","\u002Fglossary#tls",{"slug":1035,"term":1145,"definition":1146,"category":986,"aliases":1147,"links":1150,"related":1153,"readMore":-1,"target":1154,"hasArticle":756},"Time to market","Время от решения строить продукт до момента, когда им пользуются настоящие люди. Большинство споров о стеке и объёме работ — на самом деле споры об этом числе: каждая сэкономленная неделя — это неделя выручки, обратной связи и позиции на рынке.",[1148,1149],"TTM","время выхода на рынок",[1151],{"kind":778,"url":1152},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTime_to_market",[983,1128],"\u002Fglossary#time-to-market",{"slug":1156,"term":1157,"definition":1158,"category":952,"aliases":1159,"links":1161,"related":1166,"readMore":-1,"target":1168,"hasArticle":756},"webrtc","WebRTC","Браузерный и мобильный стандарт для передачи аудио, видео и данных напрямую между двумя устройствами; серверы участвуют только в том, чтобы их познакомить. На нём строят видеозвонок внутри приложения, когда не берут готовый SDK.",[1160],"Web Real-Time Communication",[1162,1164],{"kind":751,"url":1163},"https:\u002F\u002Fwebrtc.org\u002F",{"kind":778,"url":1165},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWebRTC",[1167,263],"xmpp","\u002Fglossary#webrtc",{"slug":263,"term":1170,"definition":1171,"category":952,"aliases":1172,"links":1173,"related":1176,"readMore":-1,"target":1177,"hasArticle":756},"WebSocket","Протокол, который держит одно соединение между клиентом и сервером открытым, чтобы любая сторона могла отправить данные в любой момент, а не клиент спрашивал снова и снова. На нём работают живые котировки, чаты и статусы присутствия.",[],[1174],{"kind":778,"url":1175},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWebSocket",[852,810],"\u002Fglossary#websocket",{"slug":994,"term":1179,"definition":1180,"category":986,"aliases":1181,"links":1184,"related":1187,"readMore":1188,"target":1188,"hasArticle":425},"White-label","Один продукт, выпускаемый под многими брендами. White-label платформа собирает каждому клиенту готовое к публикации приложение со своим названием, оформлением и контентом из общей кодовой базы, а не форкает проект под заказчика.",[1182,1183],"белый лейбл","мультитенантное приложение",[1185],{"kind":778,"url":1186},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWhite-label_product",[983],"\u002Fglossary\u002Fwhite-label",{"slug":1167,"term":1190,"definition":1191,"category":952,"aliases":1192,"links":1195,"related":1200,"readMore":-1,"target":1201,"hasArticle":756},"XMPP","Открытый федеративный протокол обмена сообщениями и давняя альтернатива тому, чтобы писать чат-бэкенд самому или арендовать чужой. Он покрывает статусы присутствия, индикаторы набора и передачу файлов, а зрелые клиентские библиотеки есть под любую платформу.",[1193,1194],"Jabber","Extensible Messaging and Presence Protocol",[1196,1198],{"kind":751,"url":1197},"https:\u002F\u002Fxmpp.org\u002F",{"kind":778,"url":1199},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FXMPP",[1156,263],"\u002Fglossary#xmpp",{"slug":1203,"term":1204,"definition":1205,"category":986,"aliases":1206,"links":1210,"related":1213,"readMore":-1,"target":1214,"hasArticle":756},"in-app-purchase","Встроенные покупки","Продажа цифровых товаров и подписок через биллинг Apple и Google, который оба стора требуют для цифрового контента и с которого берут комиссию. Сложность никогда не в самой покупке, а в её восстановлении на новом устройстве и в честном учёте прав доступа.",[1207,1208,1209],"in-app purchase","IAP","внутренние покупки",[1211],{"kind":764,"url":1212},"https:\u002F\u002Fdeveloper.apple.com\u002Fin-app-purchase\u002F",[1025],"\u002Fglossary#in-app-purchase",{"slug":618,"term":1216,"definition":1217,"category":746,"aliases":1218,"links":1223,"related":1226,"readMore":1227,"target":1227,"hasArticle":425},"Диплинкинг","Ссылка, которая открывает конкретный экран внутри установленного приложения, а не его главную или веб-страницу. Отложенный диплинкинг переживает установку: нажатие, прошедшее через магазин приложений, всё равно приводит на нужный экран.",[1219,1220,1221,1222],"deep linking","отложенный диплинкинг","Universal Links","Android App Links",[1224],{"kind":778,"url":1225},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMobile_deep_linking",[758,767],"\u002Fglossary\u002Fdeep-linking",{"slug":1229,"term":1230,"definition":1231,"category":802,"aliases":1232,"links":1236,"related":1239,"readMore":-1,"target":1240,"hasArticle":756},"multi-arch-image","Мультиархитектурный образ","Один тег образа, который разрешается в разные бинарники для каждой архитектуры процессора — обычно это пара linux\u002Famd64 и linux\u002Farm64, — так что один и тот же docker pull работает без изменений и на серверах Intel\u002FAMD, и на ноутбуках с Apple Silicon.",[1233,1234,1235],"мультиарх-сборка","multi-arch build","linux\u002Famd64 + linux\u002Farm64",[1237],{"kind":764,"url":1238},"https:\u002F\u002Fdocs.docker.com\u002Fbuild\u002Fbuilding\u002Fmulti-platform\u002F",[827],"\u002Fglossary#multi-arch-image",{"slug":1094,"term":1242,"definition":1243,"category":802,"aliases":1244,"links":1247,"related":1250,"readMore":-1,"target":1252,"hasArticle":756},"Мультитенантность","Один развёрнутый бэкенд обслуживает много клиентов, и каждый видит только свои данные, конфигурацию и включённые функции, потому что контекст тенанта определяется для каждого запроса. Именно это делает линейку брендированных приложений одним продуктом, а не набором форков.",[1094,1245,1246],"мультиарендность","тенант",[1248],{"kind":778,"url":1249},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMultitenancy",[994,1251],"feature-flags","\u002Fglossary#multi-tenancy",{"slug":781,"term":1254,"definition":1255,"category":802,"aliases":1256,"links":1260,"related":1263,"readMore":-1,"target":1264,"hasArticle":756},"Объектное хранилище","Хранилище, которое держит файл целиком под ключом, а не в дереве файловой системы, — Amazon S3 и множество сервисов, совместимых с его API. Дешёвое, практически безграничное, привычное место для сырых событий, бэкапов и медиа: пишется один раз, читается редко, хранится вечно.",[1257,1258,1259],"S3","S3-совместимое хранилище","блоб-хранилище",[1261],{"kind":778,"url":1262},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FObject_storage",[770],"\u002Fglossary#object-storage",{"slug":1048,"term":1266,"definition":1267,"category":788,"aliases":1268,"links":1272,"related":1275,"readMore":-1,"target":1276,"hasArticle":756},"Ограничение частоты запросов","Предел на число запросов от одного клиента за заданный интервал. Именно он не даёт одному увлечённому пользователю, скраперу или боту потратить месячный бюджет платного API за вечер, и стоять он должен на вашей стороне интеграции.",[1269,1270,1271],"rate limiting","рейт-лимит","троттлинг",[1273],{"kind":778,"url":1274},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRate_limiting",[1038],"\u002Fglossary#rate-limiting",{"slug":1278,"term":1279,"definition":1280,"category":746,"aliases":1281,"links":1284,"related":1287,"readMore":-1,"target":1288,"hasArticle":756},"platform-channels","Платформенные каналы","Мост, через который Flutter-приложение вызывает нативный код iOS и Android — Keychain и Keystore, биометрию, платёжные шторки, любой SDK без Dart-пакета. Работа рутинная, но настоящая, и первое место, где споткнётся инженер, не выходивший за пределы Dart.",[1282,1283],"platform channels","method channel",[1285],{"kind":764,"url":1286},"https:\u002F\u002Fdocs.flutter.dev\u002Fplatform-integration\u002Fplatform-channels",[76],"\u002Fglossary#platform-channels",{"slug":1290,"term":1291,"definition":1292,"category":952,"aliases":1293,"links":1296,"related":1299,"readMore":-1,"target":1300,"hasArticle":756},"post-quantum-cryptography","Постквантовая криптография","Алгоритмы шифрования, рассчитанные на устойчивость к будущему квантовому компьютеру; стандарты уже финализированы NIST. Мигрировать нужно до появления железа: трафик, записанный сегодня, расшифруют, когда такая машина появится.",[1294,1295],"PQC","постквантовое шифрование",[1297],{"kind":778,"url":1298},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPost-quantum_cryptography",[1131,1142],"\u002Fglossary#post-quantum-cryptography",{"slug":1302,"term":1303,"definition":1304,"category":788,"aliases":1305,"links":1309,"related":1310,"readMore":-1,"target":1311,"hasArticle":756},"staged-rollout","Поэтапная раскатка","Релиз сначала на небольшой процент пользователей и расширение только тогда, когда доля сессий без падений держится. Плохая сборка, пойманная на десяти процентах, — испорченный вечер; она же на ста процентах — испорченная неделя.",[1306,1307,1308],"staged rollout","phased release","канареечный релиз",[],[1251,785],"\u002Fglossary#staged-rollout",{"slug":827,"term":1313,"definition":1314,"category":802,"aliases":1315,"links":1321,"related":1324,"readMore":-1,"target":1325,"hasArticle":756},"Реестр контейнеров","Хранилище образов контейнеров, адресуемых по имени и тегу, — Docker Hub, GitHub Container Registry или собственный реестр облачного провайдера. Публикация сборки в реестр превращает «у меня работает» в образ, который любой может скачать и запустить без изменений.",[1316,1317,1318,1319,1320],"реестр образов","Docker registry","GHCR","ghcr.io","container registry",[1322],{"kind":764,"url":1323},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fpackages\u002Fworking-with-a-github-packages-registry\u002Fworking-with-the-container-registry",[814,1229],"\u002Fglossary#container-registry",{"slug":455,"term":1327,"definition":1328,"category":802,"aliases":1329,"links":1332,"related":1335,"readMore":-1,"target":1336,"hasArticle":756},"Серверный рендеринг","Сборка страницы в готовый HTML на сервере, чтобы первый же ответ содержал контент, заголовки, метатеги и структурированные данные. Краулеры, превью ссылок и медленные устройства читают это, не выполняя JavaScript.",[1330,1331],"SSR","server-side rendering",[1333],{"kind":778,"url":1334},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServer-side_scripting",[519],"\u002Fglossary#server-side-rendering",{"slug":1142,"term":1338,"definition":1339,"category":802,"aliases":1340,"links":1344,"related":1347,"readMore":-1,"target":1348,"hasArticle":756},"Сквозное шифрование","Шифрование, которое накладывается на устройстве отправителя и снимается только на устройстве получателя, так что сервис, передающий сообщение, не может его прочитать — ни по решению суда, ни после взлома. Оно защищает содержимое, но никогда — метаданные.",[1341,1342,1343],"E2EE","end-to-end encryption","оконечное шифрование",[1345],{"kind":778,"url":1346},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FEnd-to-end_encryption",[1131,949],"\u002Fglossary#end-to-end-encryption",{"slug":1128,"term":1350,"definition":1351,"category":986,"aliases":1352,"links":1355,"related":1358,"readMore":-1,"target":1359,"hasArticle":756},"Совокупная стоимость владения","Во что продукт обходится за всю жизнь, а не только на этапе разработки: поддержка, обновления, ежегодные миграции на новые ОС и правила сторов, вторая команда, чтобы две кодовые базы не расходились. Обычно больше сметы на разработку и почти никогда в неё не входит.",[1353,1354],"TCO","total cost of ownership",[1356],{"kind":778,"url":1357},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTotal_cost_of_ownership",[1035],"\u002Fglossary#total-cost-of-ownership",{"slug":1361,"term":1362,"definition":1363,"category":802,"aliases":1364,"links":1368,"related":1371,"readMore":-1,"target":1372,"hasArticle":756},"state-management","Управление состоянием","То, как приложение решает, где живёт значение, кому позволено его менять и какие части экрана перерисовываются, когда оно меняется. Во Flutter выбор между Riverpod, BLoC и Provider — одно из первых архитектурных решений и одно из самых трудных для пересмотра.",[1365,1366,1367],"state management","BLoC","Riverpod",[1369],{"kind":764,"url":1370},"https:\u002F\u002Fdocs.flutter.dev\u002Fdata-and-backend\u002Fstate-mgmt\u002Foptions",[872],"\u002Fglossary#state-management",{"slug":1251,"term":1374,"definition":1375,"category":788,"aliases":1376,"links":1380,"related":1383,"readMore":-1,"target":1384,"hasArticle":756},"Фиче-флаги","Переключатели, которые включают и выключают функциональность из конфигурации, а не из релиза. Один бинарник ведёт себя по-разному для разных брендов, рынков и пользователей, а рискованную фичу можно погасить, не отправляя новую сборку на ревью.",[1377,1378,1379],"feature flags","фиче-флаги","feature toggle",[1381],{"kind":778,"url":1382},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FFeature_toggle",[1302,994,1094],"\u002Fglossary#feature-flags",{"slug":1386,"term":1387,"definition":1388,"category":802,"aliases":1389,"links":1393,"related":1396,"readMore":-1,"target":1397,"hasArticle":756},"floating-point","Числа с плавающей точкой","Двоичный формат IEEE 754, стоящий за double и float. Он не хранит 0.1 точно, поэтому 0.1 + 0.2 даёт 0.30000000000000004 — незаметно в графике и фатально в деньгах, которым место в целых минорных единицах или в decimal-типе.",[1390,1391,1392],"IEEE 754","double","плавающая запятая",[1394],{"kind":778,"url":1395},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FIEEE_754",[],"\u002Fglossary#floating-point"]