Обновить
64K+

Node.JS *

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

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

Агент поддержки на LLM, который не может забыть сходить за заказом

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

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

Агентский цикл, где модель решает сама, поднимается за вечер и пропускает тул в 1 ходу из 24. Конвейер для прода не пропускает совсем, но роутер и сценарии для него пишет человек. Тысяча диалогов на Qwen стоит полдоллара, на Opus тридцать долларов.

Читать далее

Новости

Четверо в одной транзакции: кейс-батлы, PgBouncer под Prisma и реплика, которая показывает пустой инвентарь

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

Обе мои предыдущие статьи про этот сайт с кейсами CS2 заканчивались списком того, чего в нём нет: платежей, депозита предметов, кейс-баттлов, рефералки, KYC. Список закрыт — и почти всё сложное в нём свелось к одному вопросу: что происходит, когда несколько человек одновременно двигают одни и те же деньги. Батл на четверых в одной транзакции, порядок блокировок, из-за которого не случается дедлок, PgBouncer под Prisma и правило чтения с реплики, которое нельзя выразить типом.

Читать далее

Имя вашей внутренней библиотеки может занять кто угодно, и сборка возьмёт его версию

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

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

Первая версия - прокси-репозиторий перестал кешировать. Полез в его настройки, там всё в порядке.

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

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

Читать далее

Наблюдаемость распределенных систем. Практика

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

Привет! Я — Алексей Бондаренко, работаю в команде авторизации Банки.ру.

Сегодня хочется обсудить такую тему, как “Наблюдаемость распределенных систем”.  На эту тему уже сказано много. В данной статье не открою Америку. Но хотел бы ее рассмотреть с практической стороны. Статья предназначена для новичков.

Читать далее

Как я схлопнул 14 переводов в 5: бот для дележа расходов на голом Node без единой зависимости

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

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

Под катом три вещи: как схлопывать долги в минимум переводов, как считать чеки моделью со зрением и не гадать о расходах, и почему в проекте до сих пор ноль зависимостей.

Читать далее

Я профессионально создаю библиотеки 5 лет

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

7 лет назад я опубликовал в npm свою первую библиотеку — custom‑border‑mixin. Тогда я на неделю пропал, просто чтобы в своё удовольствие написать SCSS‑миксин. Если вам интересно, что весёлого может быть в SCSS, просто посмотрите на хелпер:

Или все-таки поменял?

Как соцсеть для Егоров превратилась в автономный город на Node.js и SQLite

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

11 недель назад я начал делать социальную сеть, в которой гражданство зависело только от имени.

Если тебя зовут Егор, Георгий или одной из форм имени, происходящего от Georgios, то это место для тебя, 100%! Остальные становятся Наблюдателями: могут читать, реагировать, писать в личку, жить в своих районах — что-то вроде ВНЖ.

На этом месте проект вполне мог закончиться хорошей шуткой, которой и являлся ИЗНАЧАЛЬНО. Но пользователи начали спрашивать, кто здесь главный.

Так в Егороде появился мэр. Потом люди спросили, кто выбирает мэра. Появились выборы.

Затем — партии, депутаты, кабинет, указы, вето и импичмент, а социальная сеть начала подозрительно напоминать государство, состоящее преимущественно из Node.js, SQLite и людей по имени Егор.

Сейчас в проекте около 11,9 тысячи регистраций, обычный DAU — примерно 30–35 человек, кодовая база выросла примерно до 210 тысяч строк, 176 таблиц и 2625 тестов.

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

Но он не может позволить себе переставать существовать, когда эти 30 человек уходят спать.

Читать далее

Steam глазами разработчика: OpenID из 2007-го, звёздочка в имени ножа и цена строкой в чужой локали

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

«Просто прикрутить вход через Steam и цены из маркета» — примерно так это выглядит из бэклога. На деле: OpenID 2.0 образца 2007 года вместо OAuth, звёздочка ★ в имени ножа, из-за которой одно и то же название готовится для двух соседних эндпоинтов противоположными способами, и цена, приходящая строкой в чужой локали. Собрал все проблемы в одном месте.

Читать далее

Я написал сайт с кейсами CS2 целиком и выложил под MIT

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

Открыл кейс — получил предмет. Между этими двумя событиями лежат HMAC, миллион тикетов и RTP, который кто-то посчитал заранее. Я написал сайт с кейсами CS2 целиком и выложил под MIT: про то, где в «provably fair» проходит граница между «проверяемым» и «выгодным», и почему 0,023% перекоса я оставил осознанно.

Читать далее

Лучший хостинг для Node.js-приложений и Next.js-сайтов с SSR в 2026

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

В статье мы рассмотрим специализированные PaaS-облака и особенности хостинга сайтов с SSR (рендерингом на стороне сервера) на React (Next.js, Remix, Astro), Vue (Nuxt.js, Quasar) и Angular. Рассмотрим сильные и слабые стороны сервисов. А также рассмотрим хостинг у VPS и Serverless-провайдеров. И приведём пример деплоя Node.js приложения с BullMQ и Redis.

Читать далее

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

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

Задача звучала просто: создать ВКС с jitsi и чатом нарисовать красивый интерфейс в корп стиле.

Решение — написать собственный тонкий веб‑клиент поверх matrix-js-sdk, который разговаривает с уже существующим Synapse‑сервером и Jitsi‑сервером, но выглядит и ведёт себя как часть внутреннего портала компании.

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

Читать далее

Рендеринг Angular‑приложения в Minecraft

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

Что потребуется, чтобы Angular-приложение отображалось в Minecraft и реагировало на действия игрока? Разбор собственной платформы и Renderer2, расчёта layout через Yoga, отрисовки текста и изображений блоками. В результате получается интерактивный прогноз погоды, которым можно управлять прямо из игрового мира.

Читать далее

Claude Code — Все статуслайны показывают тебя. Я сделал тот, который показывает других

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

В два часа ночи ты упираешься в лимит модели. Сессия на середине, мысль на середине, и до сброса окна ещё полтора часа. Ты сидишь и смотришь в терминал, где написано, сколько ты потратил токенов, сколько это стоило в долларах и сколько процентов контекста съедено.

Чего там не написано — что прямо сейчас ещё шестеро сидят и ждут того же сброса. И четверо из них тоже глубоко за полночь.

Про это и получился инструмент. Одна строка в статуслайне Claude Code:

Читать далее

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

Я 22 месяца двигал ставки в Telegram Ads руками, потом написал автомат. Он воевал сам с собой

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

За 22 месяца в Telegram Ads у меня накопилось 1 043 канала, 3 000 креативов и стопка скриптов вокруг кабинета: харвест справочника, скоринг каналов языковой моделью, степпер ставок и гейт по прогнозной цене подписчика. В какой-то момент объём подписок просел на треть без видимой причины. Две недели я искал её снаружи, а нашёл внутри: степпер поднимал ставку объявлению без показов, гвард через сорок пять минут ронял её обратно, и оба скрипта писали в лог успех. Разбор с кодом, конечным автоматом и граблями, включая тихо непринятый PATCH и мёртвую зону на 250 показах.

Читать далее

V8 startup snapshot: как правильно запустить JS-код на сервере

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

Представьте типичную ситуацию. У вас есть сервер на каком-то языке (сейчас какой именно для нас не важно, но допустим, это Rust). И в нём по каким-то причинам нужно исполнить JavaScript-код. Например, фронтенд написан на React, и вы хотите рендерить HTML на сервере (SSR). Или есть бизнес-логика, которая проще пишется на JS. Или библиотека, которая существует только в npm, и переписывать её на Rust нет ни сил, ни желания. Таких примеров можно привести множество: markdown, dompurify, highlight.js и т.д.

Читать далее

Один контракт данных, разные адаптеры: как перестать писать миграцию магазина заново

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

Первый файл, который я получил при переезде своего магазина с InSales, парсер прочитал как одну длинную строку мусора. Выгрузка заказов оказалась в UTF-16 LE с BOM и табуляцией вместо запятой — ни один разумный дефолт не подошёл.

Тогда это выглядело как разовая неприятность: поправил чтение, написал скрипт, ночь работы, всё уехало, скрипт лёг в репозиторий. На следующем проекте он не переиспользовался — другая платформа, другие колонки, другие правила. На третьем стало видно, что повторяется почти вся работа: связать заказ с клиентом, не создать дублей, не потерять адреса страниц, уметь перезапуститься. Разное только на входе — кодировка, формат, названия колонок, единицы измерения.

Отсюда вывод, к которому стоит прийти раньше, чем на третьем проекте: середина должна быть одна, а платформенная специфика — жить в тонком слое на входе. Ниже — как этот каркас устроен у меня, с кодом из работающего проекта: собственного магазина, который я перевёз с InSales на свой движок на Next.js и PostgreSQL.

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

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

Читать далее

Тест проходил за миллисекунды. На настоящем файле тот же код думал минуту

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

«👋».length === 2 — это знают все. Дальше все пишут честную функцию, которая ходит по строке по символам, а не по кодовым единицам UTF-16. И почти всегда она получается квадратичной: и длина, и обращение по индексу проходят строку с начала, поэтому обычный цикл по ним — это n²/2 шагов без единого вложенного цикла в коде.

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

Внутри: замеры роста, починка через один вопрос «есть ли в строке суррогатная пара», и почему тест на время здесь бесполезен, а тест на показатель роста — нет.

Читать далее

Из генерации — в переписку: доводим ответ ИИ‑агента до клиента и CRM на n8n

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

Всем привет!) Напомню: в первой статье я показал дебаунс на Redis, который склеивает дробные сообщения клиента. Во второй — модуль привязки «чат = сделка» и то, почему вебхуки стоит держать в изолированных ключах. Обе части заканчиваются примерно одинаково: «...и текст уходит ИИ‑агенту». Это, пожалуй, тот финал, на котором обычно ставят точку и заливают демо на GitHub... Но не в данном случае!)

Читать далее

Почему Deno быстрее Node.js: расследование

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

На официальном сайте Deno (раздел Built for the real world) красуется любопытная табличка. Согласно их замерам, Deno уходит в отрыв от Node.js по HTTP аж в 1.65 раза:

Независимые тесты (denosaurs/bench, pkgpulse 2026, jsmanifest 2026) показывают похожую картину: Deno стабильно быстрее на HTTP-нагрузке. Я решил копнуть глубже и понять, где Deno получает преимущество по сравнению с Node.js.

Читать далее

Подмена страницы интернет-банка First Partner Bank на Standoff 365

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

Привет, Хабр! Будем знакомы — grizzzer, участник различных CTF-команд и независимый исследователь кибербезопасности. В этой статье разберу, как я реализовал критическое событие в банковском сегменте онлайн-полигона Standoff 365 — «Дефейс веб-сервиса ДБО First Partner Bank».

Покажу всю цепочку — от DNS-разведки до эксплуатации уязвимости server-side template injection (SSTI) в шаблонизаторе Pug и финальной подмены текста на главной странице.

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