Блог

Статьи

Лонгриды от нашей команды. Инженерия, продукт и новости компании.

  • Product

    Многоязычный центр помощи без пустых страниц

    Готовый портал Kookee показывал все страницы на языке проекта по умолчанию, какой бы язык ни выбрал читатель. Теперь у каждого языка свой адрес, страница без перевода открывается на языке по умолчанию, а в переключателе остались только языки проекта.

  • Product

    Как сделать страницу статуса для SaaS

    Какие решения стоят за страницей статуса для SaaS: что на ней показывать, когда монитор доступности должен объявлять сбой, как писать обновления по инцидентам и где держать саму страницу. На примере страницы статуса и мониторов, которые я только что добавил в Kookee.

  • Product

    Вебхуки не должны доверять адресу, который им дали

    Вебхук — единственная функция, в которой клиент вводит адрес, а ваши серверы потом сами на него ходят. Что я сделал для вебхуков Kookee и его интеграций со Slack, GitHub и Jira, и восемь мест, где отправителю вебхуков нельзя ошибиться.

  • Product

    Центр помощи не должен начинаться с чистого листа

    У большинства команд материалы для справки уже есть: в PDF, файлах Word и старых выгрузках. Центры помощи пустуют, потому что всё это приходится перепечатывать. Что я сделал, чтобы это можно было импортировать, и семь правил, которые не дают импорту скормить чат-боту секреты.

  • oauth

    MCP-сервер не должен заставлять людей вставлять токен

    MCP-сервер Kookee хорошо работал с личными токенами — для тех, кто живёт в терминале. Чат-приложения Claude и ChatGPT подключаются иначе — через вход в аккаунт. Что я выпустил, чтобы они могли подключиться, и семь решений, которые заняли больше времени, чем код.

  • Product

    Виджет обратной связи не должен требовать регистрации

    Доска обратной связи в Kookee просит аккаунт, и для голосования это правильно. Но для посетителя, который только что наткнулся на ошибку и готов потратить на неё полминуты, это стена. Новая вкладка «Отзыв» в виджете для сайта, пять правил, по которым я её делал, и почему чат с ИИ теперь тоже можно выключить.

  • Product

    Виджет поддержки должен читать язык страницы, а не браузера

    Раньше виджет Kookee не обращал внимания на язык страницы, и сайт, который передавал pt-BR, всё равно получал английский. Шесть правил, по которым я научил его следовать странице, а не браузеру, во что обошлось каждое и чего я делать не стал.

  • Product

    Чат-виджет не должен уводить посетителя со страницы ради ответа

    Чат Kookee ссылался на нужную статью, а клик по ссылке уводил посетителя со страницы и из разговора. Я перестроил виджет вокруг вкладок «Главная», «Спросить» и «Помощь» и окна просмотра статей. Пять правил, по которым я его делал, и чего я делать не стал.

  • headless-cms

    React-компоненты вашей CMS не должны сами загружать данные

    Большинство наборов компонентов для headless CMS оборачивают приложение в провайдер и загружают данные внутри компонентов. С серверными компонентами из-за этого контента нет в первом HTML, статичные списки уходят в браузер как JavaScript, а статьи передаются дважды. Шесть правил, по которым я сделал компоненты Kookee.

  • Engineering

    React 19 перезаписывает dangerouslySetInnerHTML при каждом рендере

    Объект { __html }, созданный прямо в JSX, заставляет React 19 заменять весь HTML элемента при каждом повторном рендере родителя. Я нашёл это из-за оглавления, которое застревало на последнем заголовке. Почему так происходит, что это ломает и как это исправить одной строкой.

  • pagination

    Пагинация вашего блога, скорее всего, прячет посты от Google

    Кнопка «Показать ещё» без адресов, номер страницы в состоянии компонента, canonical на первую страницу, noindex на второй: четыре частые причины, по которым поисковики не доходят до старых постов блога. Что делать вместо этого и чек-лист.

  • security

    Ваша ссылка-приглашение — это пароль, который вы вставили в Slack

    Отправив кому-то ссылку-приглашение, вы выдали пропуск, который сработает у любого, кто его увидит. Что должно быть у такой ссылки, прежде чем её можно безопасно вставить в канал, и почему я сделал свою именно так.