Обновить
32K+

Node.JS *

Среда для запуска JavaScript-приложений

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

Подключаем ONNX-модель скоринга email-адресов к HTTP API на TypeScript

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

Вторая часть про скоринг email-адресов.

В первой я обучил CatBoost отличать живые адреса вроде ivan.ivanov@gmail.com от сгенерированного мусора. Теперь подключаю модель к Node.js-бэкенду, без отдельного Python-сервиса.

Сама модель в ONNX запускается быстро, но основная работа в другом - переписать все признаки на TypeScript так, чтобы они совпадали с Python до последнего бита. Пришлось разбираться с длиной строк в UTF-16, \d в регулярках и прототипами у JS-объектов.

Читать далее

Новости

Карточный бой, который сервер может переиграть: детерминированный движок браузерной MMO на TypeScript

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

Мы делаем «Зархолд» — браузерную MMORPG, в которой любой бой, от первого кобольда до рейдового босса, — это пошаговая карточная дуэль. Клиент написан на React и PixiJS 8, сервер — на Fastify и PostgreSQL, а между ними лежит пакет shared с движком боя на TypeScript. Один и тот же код движка работает в браузере игрока и на сервере.

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

Читать далее

ИИ‑мастер для настольной RPG: один запрос на ход, кубик до ответа и баг, который удваивал здоровье

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

Я делаю браузерную текстовую ролевую игру, где ведущим работает языковая модель. Игрок пишет любое действие своими словами, мастер отвечает рассказом, а игра ведёт механику: здоровье, деньги, характеристики, инвентарь, броски d20. Кажется, что всё просто: отправь модели историю и лист персонажа, получи ответ. На практике самые интересные задачи оказались не в промптах вида «напиши смешно», а на стыке вероятностной модели и детерминированной игровой механики. Ниже — четыре таких места и то, как я их решил.

Стек: Node.js 24, Express, встроенный node:sqlite, модели через OpenRouter и общий для сервера и браузера модуль движка.

Читать далее

46 критериев и модель Jev: как устроен открытый индекс риска глобального конфликта

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

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

Мы тонем в новостях. Голова кругом: тут говорят одно, там — противоположное, а где правда — непонятно. Информации не мало — её слишком много. Не хватает инструмента, который показывал бы, как риск меняется во времени: по открытым данным, а не по громкости заголовка. Такого инструмента я не нашёл. Пришлось собрать самому.

Получился Индекс Кассандры — еженедельный сервис про уровень и направление риска глобального конфликта. Без регистрации, трекеров и подписок. Код, методика, данные и тесты открыты на GitHub, сайт статический (GitHub Pages).

Свежая неделя (11 октября 2026): 56, +10 к предыдущей (46). Ниже — как получается это число и как в него вошла новая модель‑классификатор Jev.

Это рассказ об инженерной задаче: как устроен расчёт, как он проверяется и что даёт машинная классификация. Политических оценок и агитации нет — только измерение сигналов и метод.

Читать далее

Скам расправил плечи: как ИИ открыл возможности для мошенников в ИТ‑найме

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

Сейчас в ИТ-сфере довольно турбулентно и непредсказуемо: экономическая нестабильность, массовые увольнения, сокращение общего числа вакансий, повсеместное внедрение ИИ, который угрожает заменить разработчиков. Все заставляет переживать работников интеллектуальной сферы. 

Совокупность всех описанных факторов распространило на рынке огромное число скам-вакансий. Не удивительно, ведь злоумышленники всегда играли на чувствах и опасениях жертв, а текущая ситуация создает огромные возможности для подобных действий. Сегодня я хочу уделить внимание конкретному виду таких схем, которая напрямую затронула и меня. 

Читать далее

UML-редактор с блок-схемами по ГОСТ — как устроено внутри

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

Я работаю системным аналитиком, и UML-диаграммы для меня это часть работы. Но официальный редактор на plantuml.com из России не открывается, а ставить Java и плагин в IDE или VPN на рабочий компьютер не хочется.

Поэтому я навайбкодил umleditor.ru - редактор UML-диаграмм в браузере. Пишешь код и сразу видишь схему. Регистрироваться не надо. Схемы рисует мой собственный PlantUML-сервер в Москве, так что код диаграмм не уходит на чужие сервисы.

Весь сайт написал Claude: интерфейс, серверную часть, скрипты для сервера, даже тексты справочника. Я объяснял, что хочу, смотрел результат, просил переделать и делал то, что нейросеть сделать не может: платил за сервер, покупал домен и вводил пароли.

Первая рабочая версия появилась за два часа. Потом проект рос: блок-схемы по ГОСТ со своим рендерером, редактор JSON, справочник на 70+ страниц. Ниже описание того, как это устроено внутри, с кодом и цифрами.

Читать далее

Чей номер и чей БИК: две офлайн-библиотеки на открытых реестрах Минцифры и ЦБ

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

Когда в форме нужно проверить ИНН, подсказать банк по БИК или показать оператора по номеру телефона, обычно подключают внешний API. Мне захотелось обойтись без него: все эти данные государство и так публикует открыто, и они достаточно маленькие, чтобы положить их прямо в npm-пакет.

Так появились две библиотеки. phoneoperator по реестру Минцифры определяет оператора и регион номера, bankbik по справочнику ЦБ находит банк по БИК и проверяет ИНН, СНИЛС, ОГРН и счета. Обе работают без сети и обновляются сами. Внутри: как 60 МБ реестра ужимаются до 45 КБ, почему у МТС два названия и почему сайт Минцифры не пускает GitHub.

Песочницы: phoneoperator и bankbik.

Проверить реквизиты

Таймаут в секунду, запрос на 43 секунды: пять ловушек PgBouncer в режиме транзакций

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

В настройках клиента базы стоял statement_timeout в одну секунду, а запрос выполнялся больше сорока. Таймаут выглядел включённым и не действовал. У этой поломки нашлись четыре родственницы. Пулер в тексте ошибки назвала только одна. Остальные выглядели как пропавшая таблица, недоступная база и простой после выката.

Читать далее

Как узнать длительность видео по ссылке, скачав 7% файла, и почему в заголовке MP4 бывает ноль

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

Пользователь загрузил ролик на 37 мегабайт и получил ответ: «Не удалось определить длительность видео». Ролик был обычный, открывался в любом плеере, ffprobe показывал 18 секунд. В логах ошибок при этом не было вообще. Под катом разбор того, как устроена длительность в MP4, почему в заголовке файла она бывает нулевой и как достать её тремя HTTP-запросами без ffmpeg.

Читать далее

Код-ревью самому себе через год: 8 архитектурных ошибок соло-проекта

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

Через год после закрытия соло-проекта (React, 3×NestJS, PostgreSQL, Socket.IO, Kubernetes в GKE) я устроил себе код-ревью и нашёл 8 ошибок, которые всплыли бы при первом росте трафика: двойное списание баланса, сообщения, теряющиеся между pod'ами, чужой чат по UUID, деплой, который нельзя откатить. Почти все жили не внутри технологий, а на стыках. Разбираю каждую с кодом и исправлением.

Читать разбор 8 ошибок

Как я подключил MAX и VK к Chatwoot: разбираем двусторонний мост

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

После моей статьи о рабочем месте репетитора в Chatwoot в комментариях закономерно спросили не о календаре и не о Jitsi, а о детали, которую я тогда почти не показал: как именно сообщения из MAX и VK попадают в Chatwoot и как ответ возвращается обратно.

Короткий ответ: это не скрапинг веб-версий и не автоматизация личных аккаунтов. MAX у меня подключён через официального бота, VK — через сообщения сообщества. Между ними и двумя API inbox в Chatwoot работает небольшой сервис на Node.js.

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

Читать далее

Сделал для Twitch Детектор смеха, где ИИ считывает эмоции. Рассказываю, как оно устроено внутри и делюсь цифрами

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

Решил сделать на Twitch шоу, где нельзя смеяться, с ИИ-распознованием эмоций. Рассказываю, как оно устроено внутри и с какими проблемами столкнулся.

Одновременный просмотр видео с друзьями без делея. Интеграция чтения эмоций в прямом эфире. Парсинг видео и топа комментариев, которые присылают в личку. Оверлеи и влияние зрителей на игру.

Первые цифры. Буду рад фидбеку.

Подробности о проекте и первые цифры

GitHub Actions убрал Node 20 и отключает старые раннеры: что проверить

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

23 сентября GitHub окончательно убрал Node 20 из раннеров GitHub Actions. JavaScript-экшены теперь выполняются на Node 24, а временный выключатель ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION, которым можно было вернуть Node 20, больше не работает. Через шесть дней, 29 сентября, на GitHub Enterprise Cloud включилась полная проверка версий self-hosted раннеров.

Две новости за неделю, и обе ломают тихо.

Читать далее

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

Парсер расписаний после хабратестирования: полвторого, RRULE, systemd и производственный календарь

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

В прошлой статье я показал cronsense, библиотеку, которая переводит расписание на русском или английском в cron: «по будням в 9:30» → 30 9 * * 1-5. Комментаторы устроили ей хабратестирование и нашли, чего она не умеет: «полвторого», «без пяти шестнадцать», «каждые полчаса», а ещё задачи, для которых cron не подходит вообще.

За несколько дней вышло семь версий. Теперь одна фраза превращается в cron, RRULE для календарей или таймер systemd, а праздники можно называть по имени. Для «последнего рабочего дня месяца» появилась вторая библиотека, prodcalendar: производственный календарь РФ, который сам обновляется в npm. Попутно сверка с rrule.js и systemd-analyze нашла баги, о которых я не знал.

Песочница

Прочитать до Нового года

BB изнутри: как устроена открытая IDE для Claude Code и Codex, которая обновляет себя без перезапуска

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

BB - это открытая программа под лицензией MIT, в которой Claude Code, Codex, Pi и ACP-агенты работают в одном окне. За 7 месяцев репозиторий собрал около 4 тысяч звёзд. Главное в BB не окно, а то, что его интерфейс достраивается плагинами и новый плагин подхватывается без перезапуска программы.

Недавно я снимал про BB ролик. Там агент за 20 минут и два промпта собрал плагин, который расшифровывает запись созвона, выделяет договорённости со сроками и пишет письмо клиенту. Ролик был про то, что это даёт пользователю, а в этой статье я разберу код и покажу, за счёт чего это работает. Всё ниже проверено по репозиторию get-bb/bb по состоянию на конец сентября 2026.

Читать далее

Сделал себе тренера на Claude Code и выложил его в open source

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

Днём я пишу код в Claude Code, вечером хожу в зал: у меня пауэрлифтинг, тренировки тяжёлые, часа по два. Тренера я сделал для себя. Хотелось, чтобы тот же Claude, в котором я работаю, вёл и мои тренировки.

Так появился claude-gym-coach, open-source тренер по силовым внутри Claude Code. Один раз рассказываете ему, кто вы и чего хотите, и дальше он ведёт сам: составляет программу под ваш зал, перед каждой тренировкой расписывает веса по вашей истории, после тренировки записывает то, что вы скажете в телефон, и раз в блок разбирает, что сработало. Если раньше был дневник, его можно перенести, и новые тренировки тренер строит от него. Отдельное приложение и отдельная подписка не нужны: всё работает внутри Claude Code, на той подписке Claude, которая у вас и так есть.

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

Читать далее

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

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

Я взял 139 имён пакетов, которые пять свежих ИИ-моделей выдумывают одинаково, и 22 сентября проверил каждое по живым PyPI и npm. Это реестры, откуда ставятся библиотеки для Python и JavaScript. Список ценен тем, что не привязан к одной нейросети: раз имя выдумывают все пять, под ударом пользователи любой из них. Список раскрыли 30 апреля 2026 года.

Занято 7 имён из 139. Под одним из них, metro-evaluator, в декабре 2025 года лежал вредоносный код: npm снял его через пять дней и поставил заглушку. Это было ещё до раскрытия списка, и совпадение это или расчёт на выдуманное имя, по реестру не видно. Остальные шесть имён заняли четыре чужих настоящих проекта, владелец бренда своей заглушкой и пустой пакет в 53 байта, который появился уже после раскрытия. По совету нейросети pip install odf поставит чей-то другой инструмент вместо нужной библиотеки.

Читать далее

Сотни Telegram‑ботов в одном процессе Node.js: общий webhook, очередь в PostgreSQL и Mini App на 5 КБ

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

Каждому пользователю моего конструктора нужен свой Telegram‑бот. Рассказываю, как держать сотни ботов в одном процессе Node.js: общий webhook, очередь в PostgreSQL на SKIP LOCKED и Mini App на 5 КБ. С замерами нагрузки и честным разбором, где у схемы потолок.

Читать далее

«По будням в 9:30» → 30 9 * * 1–5: парсер расписаний на русском, который отказывается угадывать

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

Библиотека называется cronsense. Она переводит расписание, записанное обычными словами на русском или английском, в cron‑выражение и обратно. Рассказываю, как устроен разбор, о какие ловушки cron легко споткнуться и как тесты проверяют, что описание разбирается обратно в то же расписание.

Читать далее

Событие вместо поля: как журнал медиации вернул историю, которую система стирала

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

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

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

Читать далее
1
23 ...