Форма, которая знает слишком много: как превратить правила СХД в состояние UI
Жила-была команда, и занесло её на сложную форму для систем хранения данных. Теперь ребята выкладывают опыт: на руках три разных сценария, на выходе один интерфейс — и при этом не пришлось плодить дублирующееся состояние и утопать в обработчиках.
Читать на Habr: habr.com/ru/companies/aerodisk/articles/1083430
👉 Node.JS [ru]
Жила-была команда, и занесло её на сложную форму для систем хранения данных. Теперь ребята выкладывают опыт: на руках три разных сценария, на выходе один интерфейс — и при этом не пришлось плодить дублирующееся состояние и утопать в обработчиках.
Читать на Habr: habr.com/ru/companies/aerodisk/articles/1083430
Please open Telegram to view this post
VIEW IN TELEGRAM
Next.js, внешний API, Zod, нормализация и controlled fallback
Любой внешний API тащит свою модель данных: как названы поля, что там за вложенные объекты, где картинки, где цены, по каким правилам крутится пагинация — всё это вотчина провайдера. А UI приложения живёт в собственной модели, и с чужой она не совпадает.
Начнёшь дёргать
В App Router запрос наружу можно гонять на сервере: Server Components умеют
Читать далее
👉 Node.JS [ru]
Любой внешний API тащит свою модель данных: как названы поля, что там за вложенные объекты, где картинки, где цены, по каким правилам крутится пагинация — всё это вотчина провайдера. А UI приложения живёт в собственной модели, и с чужой она не совпадает.
Начнёшь дёргать
event._embedded.venues[0].city.name напрямую из компонента — и всё, структура внешнего ответа расползлась по интерфейсу. Провайдер поменял API — у тебя поехали карточки, detail page, search, metadata и тесты.В App Router запрос наружу можно гонять на сервере: Server Components умеют
fetch, а серверный код в клиентский bundle не просачивается. API key при такой схеме остаётся вне браузера — документация Next.js описывает server-side data fetching для App Router. В учебном проекте EventMap внешний источник событий ходит через серверный API-слой.Читать далее
Please open Telegram to view this post
VIEW IN TELEGRAM
👎1
«Я профессионально создаю библиотеки 5 лет»
Говорит, что первую свою библиотеку залил в npm 7 лет назад — custom-border-mixin. И ради этого тупо выпал из жизни на неделю: хотелось в кайф написать SCSS-миксин.
Любопытно, где в SCSS вообще можно веселиться? Глянь на хелпер.
Читать на Habr
👉 Node.JS [ru]
Говорит, что первую свою библиотеку залил в npm 7 лет назад — custom-border-mixin. И ради этого тупо выпал из жизни на неделю: хотелось в кайф написать SCSS-миксин.
Любопытно, где в SCSS вообще можно веселиться? Глянь на хелпер.
Читать на Habr
Please open Telegram to view this post
VIEW IN TELEGRAM
👎1
Diablo II, римские стратегии и Prince of Persia: чему фронтенд может поучиться у геймдева
В Diablo II статы скиллов лежат в обычных текстовых файлах — захотел покрутить баланс, пересобирать игру не придётся. В Prince of Persia 1989-го поведение героя расписано через состояния и переходы. А в градостроительных стратегиях сборщик налогов сам решает, что делать дальше, опираясь на набор правил.
Геймдев давно закрыл кучу задач, над которыми фронтенд до сих пор чешет репу. В статье — какие инженерные приёмы из игр тащат в веб и что ты с этого получишь на практике: контракты и моки, конечные автоматы, событийная модель, pattern matching и деревья поведения.
Читать далее
👉 Node.JS [ru]
В Diablo II статы скиллов лежат в обычных текстовых файлах — захотел покрутить баланс, пересобирать игру не придётся. В Prince of Persia 1989-го поведение героя расписано через состояния и переходы. А в градостроительных стратегиях сборщик налогов сам решает, что делать дальше, опираясь на набор правил.
Геймдев давно закрыл кучу задач, над которыми фронтенд до сих пор чешет репу. В статье — какие инженерные приёмы из игр тащат в веб и что ты с этого получишь на практике: контракты и моки, конечные автоматы, событийная модель, pattern matching и деревья поведения.
Читать далее
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Четверо в одной транзакции: кейс-батлы, PgBouncer под Prisma и реплика, которая показывает пустой инвентарь
Про этот сайт с кейсами CS2 уже вышло две статьи, и обе заканчивались перечислением того, чего на нём до сих пор нет: платежей, депозита предметов, кейс-баттлов, рефералки, KYC. Что ж, список теперь исчерпан. И почти вся сложная часть ужалась до одного вопроса: что вообще творится, когда несколько человек разом двигают одни и те же деньги?
Внутри — батл на четверых в рамках одной транзакции, порядок блокировок, благодаря которому дедлок не прилетает, PgBouncer под Prisma и правило про чтение с реплики, которое типом ну никак не описать.
Читать далее
👉 Node.JS [ru]
Про этот сайт с кейсами CS2 уже вышло две статьи, и обе заканчивались перечислением того, чего на нём до сих пор нет: платежей, депозита предметов, кейс-баттлов, рефералки, KYC. Что ж, список теперь исчерпан. И почти вся сложная часть ужалась до одного вопроса: что вообще творится, когда несколько человек разом двигают одни и те же деньги?
Внутри — батл на четверых в рамках одной транзакции, порядок блокировок, благодаря которому дедлок не прилетает, PgBouncer под Prisma и правило про чтение с реплики, которое типом ну никак не описать.
Читать далее
Please open Telegram to view this post
VIEW IN TELEGRAM
👎2❤1👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Кажется, у Jev нарисовался конкурент из открытого лагеря — Laya. Локальная открытая модель для принятия решений на 421 млн параметров, заточена под структурированные решения: быстрое да/нет, оценка, выбор из вариантов. Ест меньше 1 ГБ памяти, бесплатно лежит на Hugging Face, крутится на ноуте и даже на телефоне.
Теперь тест. Laya против облачного Jev — одна и та же змейка, одинаковый формат решений, 30 секунд на всё. У Laya: счёт 46, длина 52, 86,5 решений в секунду, P50 около 9 мс. У Jev: счёт 1, длина 7, 3,2 решения в секунду, полный цикл запроса к API 317 мс. На M5 Pro медиана вышла 15,3 мс у локальной Laya против 298,1 мс у облачного Jev — почти 20-кратный разрыв в этом тесте. Ключевая разница в том, что Laya решает каждый шаг на месте, а Jev на каждом шаге стоит и ждёт ответа от облачного API.
Правда, проект сам честно называет два ограничения: контекст всего 512–1024 токена, так что часть задач просто не влезет, а без дополнительной настройки Laya обобщает хуже, чем Jev. GitHub
👉 Node.JS [ru]
Теперь тест. Laya против облачного Jev — одна и та же змейка, одинаковый формат решений, 30 секунд на всё. У Laya: счёт 46, длина 52, 86,5 решений в секунду, P50 около 9 мс. У Jev: счёт 1, длина 7, 3,2 решения в секунду, полный цикл запроса к API 317 мс. На M5 Pro медиана вышла 15,3 мс у локальной Laya против 298,1 мс у облачного Jev — почти 20-кратный разрыв в этом тесте. Ключевая разница в том, что Laya решает каждый шаг на месте, а Jev на каждом шаге стоит и ждёт ответа от облачного API.
Правда, проект сам честно называет два ограничения: контекст всего 512–1024 токена, так что часть задач просто не влезет, а без дополнительной настройки Laya обобщает хуже, чем Jev. GitHub
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
This media is not supported in your browser
VIEW IN TELEGRAM
Свой localhost можно выкинуть в интернет за пару секунд. Бесплатно, силами Cloudflare.
Хватит одной команды в терминале:
Зачем это вообще нужно: гонять локальные проекты наружу, ловить вебхуки, показывать клиенту, что там у тебя работает, делать быстрые превью. Ну и пускать ИИ-агентов в приложения, которые крутятся у тебя на машине.
try.cloudflare.com
👉 Node.JS [ru]
Хватит одной команды в терминале:
cloudflared tunnel --url http://localhost:8000
Зачем это вообще нужно: гонять локальные проекты наружу, ловить вебхуки, показывать клиенту, что там у тебя работает, делать быстрые превью. Ну и пускать ИИ-агентов в приложения, которые крутятся у тебя на машине.
try.cloudflare.com
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Откуда взялась npm-либа morphing-scroll
Автор поста пишет про собственную библиотеку для npm. По его словам, на тот момент это был уже второй его npm-проект и самый замороченный из всех. Лезть с головой в код он не станет — вместо этого расскажет, как всё это появилось и что им двигало.
Читать далее: habr.com
👉 Node.JS [ru]
Автор поста пишет про собственную библиотеку для npm. По его словам, на тот момент это был уже второй его npm-проект и самый замороченный из всех. Лезть с головой в код он не станет — вместо этого расскажет, как всё это появилось и что им двигало.
Читать далее: habr.com
Please open Telegram to view this post
VIEW IN TELEGRAM
Субтитры с переводом прямо в Chrome: тянем звук вкладки на MV3 и меняем два сервиса на один поток
Расширение для Chrome рисует переведённые субтитры поверх созвона — и всё это внутри браузера. Никакой бот в звонок не заходит.
Дальше автор разбирает три места, где он убил больше всего времени: перехват звука вкладки в Manifest V3, переезд с двух сервисов на один поток, который и расшифровывает, и переводит, и косяк в счётчике минут — из-за него время утекало, пока в эфире стояла тишина.
Читать далее
👉 Node.JS [ru]
Расширение для Chrome рисует переведённые субтитры поверх созвона — и всё это внутри браузера. Никакой бот в звонок не заходит.
Дальше автор разбирает три места, где он убил больше всего времени: перехват звука вкладки в Manifest V3, переезд с двух сервисов на один поток, который и расшифровывает, и переводит, и косяк в счётчике минут — из-за него время утекало, пока в эфире стояла тишина.
Читать далее
Please open Telegram to view this post
VIEW IN TELEGRAM
[Перевод] React 19.3
React 19.3 залили в npm. View Transitions и Fragment Refs год назад приехали как экспериментальные API — а теперь в 19.3 они официально стабильные.
В статье объясняют, как оба API работают, и заодно пробегаются по остальным заметным изменениям релиза.
Читать далее
👉 Node.JS [ru]
React 19.3 залили в npm. View Transitions и Fragment Refs год назад приехали как экспериментальные API — а теперь в 19.3 они официально стабильные.
В статье объясняют, как оба API работают, и заодно пробегаются по остальным заметным изменениям релиза.
Читать далее
Please open Telegram to view this post
VIEW IN TELEGRAM
tinyjs: десктоп на JavaScript, который весит меньше 10 МБ
В свежем выпуске JavaScript Weekly #803 ковыряют tinyjs — штуку для сборки десктопных приложений на JavaScript. Внутри бэкенд на txiki.js с полным доступом к системе (FFI, разумеется, тоже на месте), рендер через нативный webview и компактные сборки под macOS, Linux и Windows. А автор обзора Tarwin Stroh-Spijer добавляет, что этот инструмент ещё и упрощает подпись с нотаризацией финального приложения.
Конкурентов в нише хватает. Electrobun умеет больше: многоконный режим и GPU — но за это платишь более жирным TypeScript-рантаймом. Хотя для крошечного нативного основного процесса никто не мешает взять Zig, Rust, Go или Odin. Perry — это AOT-компилятор TypeScript в нативный код, и его основная UI-модель рисует виджеты AppKit, Win32 и GTK4, чтобы вид был по-нативнее. Electron и экспериментальный Deno Desktop — тоже мощь, но их исполняемые файлы обычно в разы толще. Приложения на Neutralinojs бывают и меньше, чем на tinyjs, но по задумке они остаются без универсального привилегированного JavaScript-бэкенда.
В том же выпуске: Node.js 26.10.0 (Current) привозит
JavaScript Weekly #803
👉 Node.JS [ru]
В свежем выпуске JavaScript Weekly #803 ковыряют tinyjs — штуку для сборки десктопных приложений на JavaScript. Внутри бэкенд на txiki.js с полным доступом к системе (FFI, разумеется, тоже на месте), рендер через нативный webview и компактные сборки под macOS, Linux и Windows. А автор обзора Tarwin Stroh-Spijer добавляет, что этот инструмент ещё и упрощает подпись с нотаризацией финального приложения.
Конкурентов в нише хватает. Electrobun умеет больше: многоконный режим и GPU — но за это платишь более жирным TypeScript-рантаймом. Хотя для крошечного нативного основного процесса никто не мешает взять Zig, Rust, Go или Odin. Perry — это AOT-компилятор TypeScript в нативный код, и его основная UI-модель рисует виджеты AppKit, Win32 и GTK4, чтобы вид был по-нативнее. Electron и экспериментальный Deno Desktop — тоже мощь, но их исполняемые файлы обычно в разы толще. Приложения на Neutralinojs бывают и меньше, чем на tinyjs, но по задумке они остаются без универсального привилегированного JavaScript-бэкенда.
В том же выпуске: Node.js 26.10.0 (Current) привозит
util.debounce / throttle; npm даёт stage-only токены — с ними автоматизированные workflow готовят релиз, а мейнтейнер потом подтверждает его через 2FA; Turborepo 2.11 обзавёлся экспериментальной поддержкой Rust, Python и Go в графе задач и запускается до 4x быстрее, чем 2.9; ESLint 10.11.0 — очередное обновление по производительности.JavaScript Weekly #803
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Агент поддержки на LLM, который стабильно забывает сходить за заказом
Первая сборка такого агента в каждом третьем ходе не шла за заказом, а просто выдумывала его статус. Кто решал, когда дёргать тул? Сама модель. И решала мимо.
В харнесе у модели вообще нет права голоса: данные тащит код, а саму её дёргают дважды — понять, что спросили, и написать ответ. Агентский цикл, где решает модель, собирается за вечер и теряет тул в 1 ходе из 24. Продовый конвейер не теряет вообще, только роутер и сценарии под него пишет человек. 1000 диалогов на Qwen — полбакса, на Opus — тридцать долларов. Читать далее
👉 Node.JS [ru]
Первая сборка такого агента в каждом третьем ходе не шла за заказом, а просто выдумывала его статус. Кто решал, когда дёргать тул? Сама модель. И решала мимо.
В харнесе у модели вообще нет права голоса: данные тащит код, а саму её дёргают дважды — понять, что спросили, и написать ответ. Агентский цикл, где решает модель, собирается за вечер и теряет тул в 1 ходе из 24. Продовый конвейер не теряет вообще, только роутер и сценарии под него пишет человек. 1000 диалогов на Qwen — полбакса, на Opus — тридцать долларов. Читать далее
Please open Telegram to view this post
VIEW IN TELEGRAM
ИИ-агенту теперь можно отдавать задачи прямо из GitLab
В SourceCraft добавили поддержку автономных агентов: разработчик ставит задачу, агент сам выполняет её и возвращает результат на проверку. Если по ходу работы не хватает данных или нужно согласование, он сам обращается к команде.
Агента можно запускать не только из GitLab — доступны VS Code, CLI, мессенджеры и веб-интерфейс. Плюс можно подключать собственных агентов, в том числе созданных в Yandex AI Studio.
Читать далее
В SourceCraft добавили поддержку автономных агентов: разработчик ставит задачу, агент сам выполняет её и возвращает результат на проверку. Если по ходу работы не хватает данных или нужно согласование, он сам обращается к команде.
Агента можно запускать не только из GitLab — доступны VS Code, CLI, мессенджеры и веб-интерфейс. Плюс можно подключать собственных агентов, в том числе созданных в Yandex AI Studio.
Читать далее
Что не так с vue-i18n и где включается Intlayer
Пилишь мультиязычное приложение на Vue 3 или Nuxt — и рука сама тянется к vue-i18n. Годами это был дефолт, которому вообще не было конкурентов. Кадзупон (Kazupon) вместе с комьюнити оброс вокруг него взрослой жирной экосистемой, через которую прошло не одно поколение Vue-проектов.
В свежей статье разбирают, где именно у vue-i18n болит и как эту боль закрывает Intlayer.
Читать далее
👉 Node.JS [ru]
Пилишь мультиязычное приложение на Vue 3 или Nuxt — и рука сама тянется к vue-i18n. Годами это был дефолт, которому вообще не было конкурентов. Кадзупон (Kazupon) вместе с комьюнити оброс вокруг него взрослой жирной экосистемой, через которую прошло не одно поколение Vue-проектов.
В свежей статье разбирают, где именно у vue-i18n болит и как эту боль закрывает Intlayer.
Читать далее
Please open Telegram to view this post
VIEW IN TELEGRAM
12 CSS-фич, которыми можно выкинуть часть зависимостей
Frontend Focus #759, 23 сентября 2026 — внутри материал Flavio Copes «12 CSS Features You Can Use Today with No Build Step». Посыл простой: кое-что из сборочной цепочки уже сегодня можно выкинуть, потому что браузер умеет это сам. Нативная вложенность вместо Sass, :has() вместо костылей с классами-обёртками — и это далеко не всё из списка.
Сам выпуск: frontendfoc.us/issues/759
👉 Node.JS [ru]
Frontend Focus #759, 23 сентября 2026 — внутри материал Flavio Copes «12 CSS Features You Can Use Today with No Build Step». Посыл простой: кое-что из сборочной цепочки уже сегодня можно выкинуть, потому что браузер умеет это сам. Нативная вложенность вместо Sass, :has() вместо костылей с классами-обёртками — и это далеко не всё из списка.
Сам выпуск: frontendfoc.us/issues/759
Please open Telegram to view this post
VIEW IN TELEGRAM
Когда разрабов больше нуля, но меньше двух: как в одиночку удержать планку продакшна
Свой проект, который превратился в единственную работу. Автор говорит о скриптах, способных ответить «нет», и о ночных прогонах, которым чинить нельзя.
И отдельная тема — люди, которые смотрят туда, куда тесты не доползают.
Читать далее
👉 Node.JS [ru]
Свой проект, который превратился в единственную работу. Автор говорит о скриптах, способных ответить «нет», и о ночных прогонах, которым чинить нельзя.
И отдельная тема — люди, которые смотрят туда, куда тесты не доползают.
Читать далее
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Свежая пачка моделей System One: Jev и Contrastive Language Model (CLM)
Пилишь свои harness-системы? Тогда не проходи мимо новой волны моделей System One. Сначала был Jev. Теперь вот Contrastive Language Model (CLM). И шустрит он в 9 раз бодрее Jev. Выглядит так, что с ролью верификатора CLM справляется лучше — особенно когда задача растянута на длинный горизонт выполнения.
А в чём, собственно, разница между Jev и CLM? CLM учится контрастно, Jev — через Reinforcement Learning for Calibrated Decisions (RLCD). Jev на входе получает ситуацию вместе с заранее определёнными вопросами, а на выходе отдаёт типизированные решения с вероятностями. CLM работает иначе: кодирует ситуацию и возможные действия в эмбеддинги, сравнивает их сходство, после чего ранжирует или выбирает наиболее подходящий вариант.
Соль в том, что решить эту задачу можно несколькими путями, и это правда занятно. Код и веса выложены под Apache 2.0.
👉 Node.JS [ru]
Пилишь свои harness-системы? Тогда не проходи мимо новой волны моделей System One. Сначала был Jev. Теперь вот Contrastive Language Model (CLM). И шустрит он в 9 раз бодрее Jev. Выглядит так, что с ролью верификатора CLM справляется лучше — особенно когда задача растянута на длинный горизонт выполнения.
А в чём, собственно, разница между Jev и CLM? CLM учится контрастно, Jev — через Reinforcement Learning for Calibrated Decisions (RLCD). Jev на входе получает ситуацию вместе с заранее определёнными вопросами, а на выходе отдаёт типизированные решения с вероятностями. CLM работает иначе: кодирует ситуацию и возможные действия в эмбеддинги, сравнивает их сходство, после чего ранжирует или выбирает наиболее подходящий вариант.
Соль в том, что решить эту задачу можно несколькими путями, и это правда занятно. Код и веса выложены под Apache 2.0.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Калькулятор плитки: фото вместо цвета и 3D, который наконец не бесит
Третья серия про мой пет-проект — калькулятор плитки tilely.ru. Патч набежал жирный, и почти весь он крутится вокруг 3D-режима. Багов там вылезло прилично. Кучу всего пришлось перепиливать: сначала казалось, что решение максимально логичное, а на деле — сплошное неудобство.
Перед 3D речь не о нём: сначала закрыл то, что висело в очереди ещё до этого. Теперь можно подгружать фото плитки, чтобы не таращиться на однотипные прямоугольники одного цвета. Есть кнопка «применить ко всем комнатам»: если санузел и кухня идут одной плиткой, вторую фотку грузить уже не надо. Плюс можно выбрать цвет швов — раньше они всегда были одинаковые, и картинка местами сливалась.
Читать далее
👉 Node.JS [ru]
Третья серия про мой пет-проект — калькулятор плитки tilely.ru. Патч набежал жирный, и почти весь он крутится вокруг 3D-режима. Багов там вылезло прилично. Кучу всего пришлось перепиливать: сначала казалось, что решение максимально логичное, а на деле — сплошное неудобство.
Перед 3D речь не о нём: сначала закрыл то, что висело в очереди ещё до этого. Теперь можно подгружать фото плитки, чтобы не таращиться на однотипные прямоугольники одного цвета. Есть кнопка «применить ко всем комнатам»: если санузел и кухня идут одной плиткой, вторую фотку грузить уже не надо. Плюс можно выбрать цвет швов — раньше они всегда были одинаковые, и картинка местами сливалась.
Читать далее
Please open Telegram to view this post
VIEW IN TELEGRAM
Один клик — и со страницы можно выпилить всё что угодно: «пипеточный» блокер на Manifest V3
Знакомая боль: адблок вроде стоит, а толку ноль. То окно с подпиской вылезет, то плашка «мы используем cookies», то чат-виджет прилип в углу, то шапка заняла пол экрана. Под такие случаи и делали мелкое расширение ekill: тыкаешь кнопку, наводишься на элемент, кликаешь — и он пропал.
Вот только с 2019 года его никто не трогал, а в Chrome оно отвалилось, когда Google прикрыл Manifest V2. Автор портировал его на Manifest V3 под Firefox, Chrome и Edge — так на свет появился SkullClick (GitHub). Казалось бы, задачка на пять минут, но граней у неё внезапно дофига.
Источник
👉 Node.JS [ru]
Знакомая боль: адблок вроде стоит, а толку ноль. То окно с подпиской вылезет, то плашка «мы используем cookies», то чат-виджет прилип в углу, то шапка заняла пол экрана. Под такие случаи и делали мелкое расширение ekill: тыкаешь кнопку, наводишься на элемент, кликаешь — и он пропал.
Вот только с 2019 года его никто не трогал, а в Chrome оно отвалилось, когда Google прикрыл Manifest V2. Автор портировал его на Manifest V3 под Firefox, Chrome и Edge — так на свет появился SkullClick (GitHub). Казалось бы, задачка на пять минут, но граней у неё внезапно дофига.
Источник
Please open Telegram to view this post
VIEW IN TELEGRAM
Сигналы добрались до React-Redux — как раз про это в выпуске React Status #492 от 25 сентября 2026. В React-Redux 9.4 Alpha завезли опциональный
В Alpha 0 лежит полное объяснение, а Alpha 1 уже выкатили: там ключевой фикс бага и подкрученные бенчмарки.
В том же номере: Next.js 16.3.6 прикрывает критический RCE в
Источник: React Status #492
👉 Node.JS [ru]
useSignalSelector: раньше Redux дёргал каждый смонтированный селектор на каждом dispatch, и в крупных приложениях это вылезало в приличные тормоза. А селектор на сигналах смотрит, какое состояние читает каждый из них, так что после dispatch перезапускаются только те, у кого данные реально поменялись. Автор — Mark Erikson.В Alpha 0 лежит полное объяснение, а Alpha 1 уже выкатили: там ключевой фикс бага и подкрученные бенчмарки.
В том же номере: Next.js 16.3.6 прикрывает критический RCE в
ImageResponse, который цепляет v16.2+, а релиз на следующую неделю закроет ещё девять уязвимостей; интеграция React в Astro доходит до v7.0 — переезд с Babel на Oxc и поддержка React Compiler через опцию compiler: true; Vercel вывела свою bug bounty-программу в паблик.Источник: React Status #492
Please open Telegram to view this post
VIEW IN TELEGRAM
👎1