Обновить
256K+

Веб-разработка *

Делаем веб лучше

419,84
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Multi-tenant Битрикс24 в трёх проектах: три архитектуры OAuth-токенов и лицензирование через материнский смарт-процесс

Уровень сложностиСложный
Время на прочтение11 мин
Охват и читатели8.1K

За полгода написал ряд интеграций с Битрикс24 в разных архитектурах: приложение для Маркета (PHP, 6 порталов), клиентский расчётный сервис (Node.js + PostgreSQL) и cron-синхронизатор legacy-CRM без UI и без OAuth вообще. Мультитенант везде решён по-разному, и это не случайность, ведь каждая архитектура точно закрывает свою нишу.

Внутри: сравнение трёх способов хранить OAuth-токены под 6+ порталов, разбор пяти неочевидных деталей REST API (oauth.bitrix24.tech-обход, POST vs GET на рефреше, rate limit 2 req/sec, batch на 50, буфер 5 мин), куски кода на PHP и TypeScript.

Отдельная часть — лицензирование через материнский смарт-процесс. У продукта, распределённого по клиентским порталам, нет своего backend’а, поэтому control-plane я вынес на служебный портал агентства: смарт-процесс «Лицензии», бизнес-процесс на изменение счётчика запросов, webhook approve/decline с secret. Такого паттерна в документации Битрикс24 нет — а он работает уже несколько месяцев и не требует ничего сверх штатной функциональности платформы.

Матрица «что выбирать под задачу» в конце.

Читать далее

Сегодня я для себя открыл: Pony ORM

Время на прочтение7 мин
Охват и читатели14K

Дорогие читатели, сегодня я расскажу о Pony ORM, которая во многих отношениях должна быть примером для других ORM: она дружественная к пользовалю, ведёт себя предсказуемо и, что немаловажно, имеет хорошую производительность. Речь пойдёт, в основном, не о фичах для пользователя (которых много и о которых можно узнать в этих видео 1, 2), а о внутренней архитектуре.

Читать далее

Как сделать типобезопасный клиент для Strapi: разбираем вывод типов из populate на уровне компилятора

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели13K

У любого запроса к Strapi есть неприятное свойство: форма ответа зависит от того, что вы попросили. Запросили статью без populate — в ответе только скалярные поля. Добавили populate: { category: true } — появилась вложенная категория. Добавили fields: ['name'] внутри populate — категория пришла обрезанной. Один и тот же эндпоинт возвращает десятки разных форм, и статический TypeScript-интерфейс ни одну из них честно не описывает: он либо врёт (обещает поля, которых в этом конкретном ответе нет), либо бесполезен (any).

В этой статье я разберу, как решить эту проблему кодогенерацией: как достать схему из работающего Strapi, сгенерировать по ней TypeScript-клиент и — самое интересное — как заставить систему типов вывести форму ответа прямо из аргумента populate на этапе компиляции. Подход Prisma-подобный: возвращаемый тип метода зависит от того, что вы передали в вызов. Код — на TypeScript; клиент, на примере которого я всё показываю, open-source под MIT, ссылка в конце.

Как это устроено

История Linux.org

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели9.1K

Известный в Linux-сообществе автор технической литературы Роб Кеннеди опубликовал историю создания Linux.org — одного из первых веб-сайтов, посвящённых Linux, — а также рассказал о его недавнем возрождении.

Читать далее

С июля за вход через Google и Apple штраф до 700 тысяч рублей. Кого это касается

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели7.4K

Несколько лет назад в закон «Об информации...» (149-ФЗ) добавили требования к способам авторизации пользователей.

Многие тогда обратили внимание на новость, но практических последствий почти не было — ответственности за нарушение не существовало. Если не штрафуют, значит скорость +19,9 км/ч разрешена ;)

Теперь ситуация изменилась - с июля 2026 года появилась административная ответственность, а штраф для юридических лиц 700 000 рублей.

Почитал новости, комментарии, пообщался с коллегами - оказалось, что не все до сих пор разобрались.

Например мы обсуждали:

Читать далее

pkg-cache — простой локальный кеш пакетов

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели11K

Пример реализации простого кэширующего прокси для пакетов npm, composer и pip на базе node.js для Windows и Linux.

Читать далее

Как мы делали три консоли для киберигры: опыт разработки новой версии тренажера

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели9.3K

Привет! На связи команда Далее. В этой статье расскажем, как мы взяли довольно простую игру-тренажер по кибербезопасности и сделали ее самостоятельным продуктом с тремя отдельными консолями, редактором сценариев, ботами для их проверки и аудиочатом на WebRTC.

Читать далее

Docker Fundamentals: хранение данных в Docker

Уровень сложностиПростой
Время на прочтение19 мин
Охват и читатели17K

Вторая часть серии статей по Docker. Разбираем все способы хранения данных в Docker: тома, bind mount и tmpfs — чем отличаются, как использовать, а также драйверы хранения, бэкап томов и работа с Compose.

Читать далее

Пользователь сменил пароль и потерял доступ. Что проворонил тестировщик?

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели9.5K

Одноразовая ссылка сработала только один раз, старый пароль больше не подходил, а все проверки прошли. И всё же пользователь снова потерял доступ к аккаунту.

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

Читать далее

Агрегатор новостей заработал, когда я перестал доверять ИИ

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели9.1K

С чего всё началось

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

Открываю один ресурс, второй, третий — реклама, баннеры, всплывающие окна. Не успеешь нажать на крестик можно вообще улететь в неизвестном направлении. Вроде ищешь события, а натыкаешь на блогеров, экспертов, мнения и особенно бесят душераздирающие истории представителей богемной тусовки.

Дальше по привычке открываю Телеграм. Там у меня десятки каналов и в каждом события дублируются раз восемь в восьми разных пересказах. А по‑настоящему важного среди всего этого набирается три‑четыре штуки в лучшем случае.

Мне не хватало не ещё одного источника — их и так достаточно. Не хватало того, чтобы кто‑то прошёлся по всему этому за меня: убрал повторы, выкинул лишнее и выдал короткий список по важности. Без экспертов, желтухи, рекламы, баннеров — чистая событийная лента.

Готового продукта с такой логикой для русскоязычного читателя я не нашёл, поэтому стал разбираться, как вообще устроены подобные системы: как они понимают, что две разные статьи — это статьи об одном и том же событии и где заканчивается работа алгоритма и начинаются редакционные решения. Читал документацию, проверял идеи на практике и постепенно собирал систему по кускам. Сначала запряг одну модель, потом две в связке, далее заменил их на третью. Спорил с ними, выбрасывал неудачные варианты, менял правила, так это медленно и превратилось в рабочую систему.

Читать далее

Попробовали подключить ИИ-агента к бизнесу и посмотреть на процесс через призму UX

Время на прочтение9 мин
Охват и читатели7.5K

Можно ли подключить AI-агента за минуту? Смоделировали путь клиента по самостоятельному подключению известного агента без помощи менеджера и специалиста, и вот что у нас получилось.

Читать далее

Почему фронтенд съедает больше времени, чем бэкенд

Время на прочтение14 мин
Охват и читатели12K

Статья про то, как построить приложение с AI-ассистентом и не застрять на самом неприятном месте, когда бэк готов, а интерфейс внезапно съедает недели.

Почему современный фронтенд сложнее, чем кажется снаружи. Особенно если вы идёте через spec-driven development, пишете требования вместо кода и ждёте, что Claude, Cursor или Kiro быстро соберут работающий продукт.

👀 Внутри: перекос фронта и бэка по объёму кода, состояние кнопок и форм, дизайн-системы, локализация, accessibility, тысячи npm-зависимостей, скучные интерфейсы от LLM, Playwright MCP, Figma MCP, визуальные тесты и планирование проекта с нормальным запасом на UI-грабли.

Заходите, читайте и делитесь своим опытом AI-разработки ❤️

Читать далее

От расшифровки звонков до собственных приложений: как ИИ взрослеет внутри CRM

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели10K

Сегодня разберём, как ИИ в CRM прошёл путь от расшифровки звонков до выполнения действий.

В конце соберём собственное приложение, которое объединяет эти возможности на платформе для вайбкодинга от Битрикс24.

Читать далее

Ближайшие события

Point0 — простой, как tRPC, полноценный фулстек-фреймворк

Уровень сложностиСредний
Время на прочтение18 мин
Охват и читатели7.2K

Хочу сравнить фреймворк Point0 и библиотеку tRPC. Делаю это, потому что квери и мутации в Point0 очень похожи по DX на tRPC, но более удобны ввиду того, что всё же Point0 это фреймворк и он может обладать возможностями, которыми библиотека не может:

Объявлять квери вместе с серверным кодом прямо в клиентских файлах, или наоборот

Автоматически гидрировать и дегидрировать квери клиент при включении SSR

В мутациях отправлять файлы автоматически превращая данные в FormData и обратно

Иметь стабильные индивидуальные урлы для квери и мутаций

Не заставлять зависать редактор кода при увеличении количества эндпоинтов

Возвращать в ответах с сервера на клиент целые серверные компоненты или интерактивные острова

Управлять внешним видом состояний загрузки на страницах и в компонентах

Кроме того, что описано в этой статье, Point0 может много чего ещё, но об этом в других статьях. Сейчас фокусируемся на сравнении с tRPC. Предполагается, что вы с tRPC более менее знакомы, но ниже я всё равно буду показывать примеры реализации на tRPC, чтобы сравнения были видимыми.

Читать далее

Как я собрал OmniBot: Discord Activity, локальный ruBERT и модерация без чёрного ящика

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели6.7K

Когда я начал развивать Discord-сообщество, обычной команды /ban хватило совсем ненадолго. Роли настраивались в одном месте, приветствия — в другом, логи — в третьем, а за уведомления о стримах отвечал отдельный бот.

Подробнее

Просто дайте мне ввести цифры

Время на прочтение10 мин
Охват и читатели9K

Цифровая идентификация и её значение для веба в последние годы стали темой горячих обсуждений. Они привнесли с собой множество спорных моментов: законы о проверке возраста и их влияние на онлайн-анонимность; Википедия потенциально будет вынуждена верифицировать в Великобритании личность пользователей; привязка к официальным операционным системам iOS и Android стала обязательным форм-фактором для кошельков цифровой идентификации; кроме того, стоит упомянуть ситуацию, когда американские цифровые аккаунты были закрыты потому, что их пользователь был судьёй Международного уголовного суда.

В своей истории я расскажу о швейцарской правительственной системе идентификации AGOV. Этот развёрнутый в 2024 году сервис сегодня насчитывает 1,6 миллиона аккаунтов и становится всё более необходимым: через него можно получать пособие по безработице, предоставлять налоговую декларацию (а это обязательное действие!) и выполнять множество других операций. В кантоне Цюрих это единственная возможность подачи заявления на гражданство.

В конечном итоге, я был вынужден создать аккаунт AGOV. К сожалению, его регистрация была довольно сложной задачей, пока я не нашёл причины странного бага accessibility. Вдохновившись статьёй «Просто дайте мне выделить текст», хочу представить вашему вниманию «Просто дайте мне ввести цифры».

Читать далее

Вы не знаете CSS. Мои вопросы о CSS с ответами. Версия 2026 года

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели18K

Хабр, привет!

В прошлом месяце я опубликовал статью с вопросами о HTML. Неожиданно для меня, она понравилась многим и стала одной из самых популярных за последнее время. Раз так получилось, то почему бы не сделать то же самое про CSS? Вот я и пришёл со своими вопросами и, конечно, ответами.

Моя цель — это развлечь вас. Хотя вопросы связаны с практикой, на них не так просто ответить. Если вы не сможете ответить на большинство, то ничего страшного. Но, возможно, они покажутся вам легкотнёй.

Давайте посмотрим, что я вам подготовил.

Читать далее

Веб-портфолио с управлением жестами через камеру: полевой дневник

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели8.9K

Я продуктовый дизайнер. И мне захотелось поэкспериментировать: можно ли уже сейчас сделать полноценное управление сайтом с помощью жестов. Да и ИИшки уже стали достаточно мощными. Так родился этот эксперимент. Для контента взял свое портфолио.

Получилось вот что. Страница встречает полем из частиц. Разрешаешь камеру, и частицы собираются в твоё объёмное отражение. Разделы висят вокруг силуэта и открываются рукой: наводишь палец, пункт заполняется и раскрывается. Текст листается щипком, фотографии берутся в кулак и растягиваются двумя руками. Дизайн при этом намеренно тихий: монохром, костяная типографика на чёрном, единственный цвет живёт внутри 3D-формы. Вся выразительность отдана взаимодействию.

Дальше — грабли по порядку наступания.

Читать далее

ИИ убьёт твой проект, а ты и не заметишь. Часть первая: деплой

Уровень сложностиПростой
Время на прочтение11 мин
Охват и читатели6.4K

Появилась идея для серии постов про наши вайб-кодерские проблемы. Сегодня я расскажу про шишки, которые набила в самой сложной для меня части — в деплое.

Мой любимый пет-проект был про астрологию: человек присылал в один популярный мессенджер данные рождения, сервис считал натальную карту, а ИИ отвечал на вопросы по ней. За полгода проект не принёс ни цента, и в один прекрасный день в коридоре затмений я его закрыла. Зато в процессе мучений с ним я прошлась по некоторому количеству граблей и хочу поделиться ими с вами.

Итак. У тебя есть гениальная идея гениального сервиса. Ты обсудил её с ИИ, ИИ выдал код и сулит деньги рекой. Осталась мелочь: этот код пока живёт и, вероятно, работает только на твоём ноутбуке. А надо, чтобы в интернете.

Читать далее

РКН заблокировал CDN интернет-магазина. Партизанское решение через Яндекс CDN за 150 рублей (InSales)

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели7.8K

Что делать, если системный CDN вашей e-commerce платформы внезапно попал под блокировки, саппорт не помогает, а корзина и галерея на сайте умерли? Рассказываю реальный кейс, как с помощью Яндекс CDN за 150 рублей в месяц, пары сниппетов и MutationObserver удалось ускорить загрузку ядра сайта в сотни раз и вернуть интернет-магазин к жизни. Честный разбор костылей, граблей и результатов в цифрах.

Читать далее