Заметки
Блог
Заметки о frontend-разработке, SEO, AI, аналитике и реальной продуктовой работе.
42 постов
Мой VPS у AVA Hosting показывал в среднем 32,73% CPU steal при заявлении «Guaranteed Resources — No Sharing»
На моём KVM VPS у AVA Hosting под обычной продакшен-нагрузкой средний CPU steal составил 32,73%, CPU idle — 0%, а CPU pressure держался около 99%. Это не негативный отзыв, а техническая история о том, что Linux реально показывал внутри виртуальной машины.
Мой VPS у FDCServers нормально отработал больше 3 ТБ трафика. Потом чтение с диска стало занимать 18 секунд
Мой VPS у FDCServers сначала нормально обслуживал реальный трафик и передал больше 3 ТБ данных. Затем обычная нагрузка начала вызывать тяжёлые зависания виртуального диска: CPU iowait доходил до 100%, I/O pressure в Linux — почти до 100%, чтение занимало до 18,7 секунды, а flush — больше 53 секунд.
Мой VPS у REGXA показывал 94% CPU steal даже без трафика
Разбираясь с серьёзными проблемами производительности на KVM VPS у REGXA, я обнаружил 92–94% CPU steal, многосекундные localhost-запросы, растущие очереди соединений и HTTP 504 спустя более двух минут. После полного снятия production-трафика CPU steal вырос до 94,17%, а REGXA позже связала проблему с конкуренцией за ресурсы на своей shared-инфраструктуре.
Два месяца с Bunny Storage за Nginx: почему я перенёс картинки, видео и аудио на отдельный медиасервер
Два месяца я использовал Bunny Storage не через Bunny CDN, а как приватный origin за собственным Nginx-кешем. Production-логи показали long-tail задержки и таймауты на холодных медиа, а с MP4 возникла отдельная проблема Nginx Slice и несовпадающих ETag; в итоге я перешёл на простой приватный media-origin.
SSIMULACRA2 при перекодировании WebP в AVIF: почему для исходников я использую 60, а для уже lossy-копий — 65
Если AVIF создаётся из WebP, который уже был сжат с потерями, SSIMULACRA2 измеряет только второе поколение деградации. Поэтому для нормальных исходников я использую 60/58, а для заведомо lossy-производных — 65/63.
DeepSeek поднял цены — тот же V4 Flash я нашёл дешевле старого тарифа
17 августа мои расходы на DeepSeek API внезапно выросли примерно в пять раз. После этого я нашёл и протестировал другого провайдера с тем же checkpoint DeepSeek-V4-Flash-0731, где текущие цены примерно на 45% ниже даже старых тарифов DeepSeek.
Как я конвертирую анимированные WebP, GIF и APNG в H.264 MP4, не ломая кадры и временную шкалу
Мой рабочий процесс восстанавливает полные кадры, которые действительно видит пользователь, сохраняет исходную временную шкалу, выбирает один CFR для каждого итогового MP4, строит минимальный общий холст без увеличения изображения, кодирует совместимые части H.264, объединяет их без второго сжатия с потерями и проверяет как сам файл, так и его HTTP-раздачу. В одном измеренном запуске 217 анимированных WebP общим объёмом 1,49 ГБ превратились в один H.264 MP4 размером 78,49 МБ.
Я алертил на всё подряд: как я превратил шум браузерных ошибок в нормальный продакшен-мониторинг
Мой фронтенд-репортёр одинаково тревожил меня из-за AdBlock, сбоев GTM, AbortError, бесполезного Script error и настоящих ошибок чанков Next.js. Я перестроил мониторинг вокруг принадлежности ошибки, влияния на пользователя, качества доказательств, корреляции и восстановления.
Почему старые вкладки Next.js ломаются после развёртывания: устаревший HTML, пропавшие чанки и рассинхронизация версий
После одного развёртывания мониторинг в продакшене зафиксировал сбой загрузки собственного чанка Next.js. Лог доказывал сам факт ошибки, но не её причину. На этом примере я разбираю старые вкладки, устаревший HTML, пропавшие ресурсы /_next/static, рассинхронизацию версий, хранение старых файлов, deploymentId, порядок публикации, мониторинг и безопасное восстановление.
Один тик, который сломал мой CFR: почему 5580 было не 5625, а 3751 — не 3750
Мой валидатор снова и снова отклонял MP4 на 16 кадрах/с из-за пакета длительностью 5580 тиков вместо 5625, а позже поймал 3751 тик там, где 24 кадра/с требовали ровно 3750. Эти две ошибки заставили меня отдельно рассматривать исходные временные данные, квантизацию CFR, временную базу MP4, PTS/DTS, мультиплексирование и проверку на уровне пакетов.
Как я уменьшил реальное видео примерно с 280 МБ до 50 МБ, оставшись на H.264
Один конкретный файл из рабочей системы после перестройки H.264-профиля уменьшился примерно с 280 МБ до 50 МБ. Новый подход сочетал CRF 28, x264 veryslow, потолок 720p-класса, полезную частоту кадров и умеренные требования к декодеру. На более раннем этапе тот же пример уже уменьшился примерно с 350 до 238 МБ, а аудит старой библиотеки показал, что H.264 с битрейтом в несколько мегабит в секунду встречался регулярно.
Я сделал Gitae, чтобы диагностировать недоступность сайта глубже, чем «работает / не работает»
Я сделал Gitae для практического вопроса: сайт действительно недоступен или проблема локальная? Инструмент объединяет внешние проверки с VDS в Москве и Хельсинки, DNS, HTTPS/TLS, порты, маршрутизацию, IP, хостинг и CMS-сигналы — и рассматривает каждый результат как свидетельство, а не как окончательный диагноз.
Почему TypeScript так хорошо работает с Codex в продакшен-разработке
В продакшене TypeScript дает Codex то, чего не даст один хороший промпт: проверяемые машиной контракты, быстрый feedback от компилятора и более безопасный путь через большие рефакторинги.
Я сделал Jurfi.com: браузерную студию для структурированных юридических черновиков
Я сделал Jurfi.com, чтобы превращать формы и шаблоны в структурированные рабочие черновики юридических документов прямо в браузере, хранить черновики локально и оставлять проверку обязательной частью процесса — без обещаний заменить юриста.
Мой первый доход от SaaS: что на самом деле доказал один платеж
Первый платеж за SaaS-продукт, который я сделал сам, был небольшим, но изменил качество доказательств, которые у меня были. Разбираю, что действительно подтверждает одна транзакция, чего она не доказывает и почему повторяемость важнее самого первого платежа.
Как я использую Codex для ревью 15 проектов и не отдаю ему финальный контроль
Ревью 15 программных проектов раньше означало утонуть в повторяющихся проверках. Codex помогает мне намного быстрее искать баги, проверять тесты, SEO, переводы, локализацию и консистентность — но каждую находку AI я воспринимаю как гипотезу, а каждое изменение всё равно проверяю сам.
Почему я трачу последние 3–5% лимита Codex в ChatGPT Plus на большие инженерные задачи — Update: летом 2026 года это перестало работать
Update: к лету 2026 года этот workflow перестал быть для меня надёжным. В моём аккаунте исчез 5-часовой счётчик, видимым остался недельный лимит, а длинная задача могла остановиться, когда недельный лимит заканчивался.
Я опубликовал 10 000 SEO-статей от AI — и в итоге сайт дошёл до нуля страниц в индексе Google
Массовая AI-генерация сначала выглядела как короткий путь: Google обошёл все 10 000 сгенерированных URL статей, но реально в индекс и поиск попало около 1 000 страниц — они показывались пользователям и приносили настоящий поисковый трафик. Затем и они начали исчезать, пока сайт не дошёл до нуля проиндексированных страниц. Этот эксперимент полностью изменил мой подход к AI, SEO, переводам и роли AI как помощника, а не автономного издателя.
Пять лет с M1 MacBook на 8/256 ГБ: почему я до сих пор его не заменил
Я купил базовый M1 MacBook с 8 ГБ памяти и SSD на 256 ГБ примерно за $1000 и использовал компьютер около 15 часов в день: разработка, видео, аудио, обработка изображений, тексты, обучение и сайд-проекты. Спустя пять лет ограничения уже видны, но об апгрейде я думаю потому, что выросла моя нагрузка, а не потому, что ноутбук перестал быть полезным.
Я перевёл блог на 20 языков с помощью ChatGPT — и начал получать поисковый трафик со всего мира
AI полностью изменил для меня экономику многоязычного блога. Вместо одного языка я стал публиковать каждую статью максимум на 20 языках, и локализованные страницы превратились в новые точки входа из органического поиска.
Я запустил QRViz как бесплатный генератор статических QR-кодов — и сделал ставку на SEO
QRViz — браузерный генератор статических QR-кодов, а не платформа для рекламных кампаний. Я запустил qrviz.com как бесплатный генератор QR-кодов без рекламного бюджета, платного привлечения и воронки монетизации. Весь расчет на SEO, поэтому главная неопределенность проекта — не разработка, а то, найдут ли его люди.
Почему привлекать клиентов мне оказалось сложнее, чем строить SaaS
Вывод из моего собственного опыта с SaaS: разработка давала понятную и проверяемую обратную связь, а дистрибуция, позиционирование, сообщения и удержание потребовали совсем другого, гораздо менее предсказуемого цикла.
Я один построил SaaS-продукт. После запуска платежей работа стала совсем другой
Я в одиночку построил этот продукт по вечерам, выходным и праздникам. Когда появились платежи, баги, онбординг, модерация, retention и доверие перестали быть задачами «на потом» и стали частью эксплуатации реального продукта.
I Got 550 Views from One Image, Voiceover, and Subtitles: What Three Shorts Tests Actually Taught Me
A simple YouTube Short built from one static image, a voiceover, and subtitles reached 550 views. After three early tests, the useful lesson was not a proven formula, but a repeatable way to experiment without confusing a promising signal with proof.
Я увидел почти 6 000 откликов на frontend-вакансию в Москве. Что это говорит — и не говорит — о рынке IT в России
В конце 2023 года рекрутеры говорили мне, что 300–500 откликов на вакансию — уже много. 20 января 2026 года я увидел московскую frontend-вакансию уровня middle, где счётчик за несколько часов приблизился к 6 000. Разбираю, о чём этот сигнал говорит на самом деле, чего он не доказывает и как я бы оценивал такие цифры со стороны кандидата.
Как DeepSeek изменил мой workflow на Node.js: 4000+ коммитов за полгода
В 2025 году мой GitHub-график прошёл путь от почти пустого до 4000+ коммитов во второй половине года. Здесь я разбираю, как AI coding изменил мой workflow в Node.js-проектах, где он реально экономил время, где ошибался и почему проверка кода осталась важнее скорости генерации.
My First TikTok at 28: What a Vertical Product Demo Taught Me About Traffic
At 28, I posted my first TikTok and cross-posted the same product demo to Reels and Shorts. The useful lesson was not the view count: it was how much a 9:16 frame changes a desktop interface, and how to measure short-form traffic without confusing reach with acquisition.
Я купил 25-летний домен — и получил 1,000+ запросов в день по мёртвым URL
После запуска сайта на домене, впервые зарегистрированном в 2000 году, я увидел больше 1,000 запросов в день к старым URL и более 900 ошибок в Yandex Webmaster за одну ночь. Разбираю, что здесь можно доказать, почему я выбрал точечные 410 и как теперь проверяю старые домены.
В Yandex было проиндексировано 12 500 страниц, а трафика из России почти не было: проблема, которую я пропустил из-за Cloudflare
Yandex проиндексировал 12 500 страниц, но трафик из России оставался почти нулевым. Я локализовал проблему на сетевом уровне, отключил прокси Cloudflare, перенёс кеширование, сжатие и базовую защиту в Nginx на своём VDS и восстановил доступность. Главный урок — не путать индексацию, доступность и трафик.
Мой статический сайт на Next.js получает тысячи сканов уязвимостей в день. Nginx почти не замечает
Логи забиты пробами WordPress, PHP-бэкдоров, .env и .git/config. На моём статическом Next.js + Nginx сайте они в основном превращаются в дешёвые промахи и 404, а нагрузка CPU оставалась прежней. Ниже — что это действительно говорит о безопасности статики, а что нет.
Yandex дал новому сайту трафик, пока Google почти не двигался
На одном и том же новом проекте Google принес лишь около 300 кликов за длительный период, а Yandex Webmaster показывал заметный рост, включая +500% кликов. Разбираю, что эти цифры действительно подтверждают, чего они не доказывают и как исследовать такой разрыв, не смешивая обход, индексацию, ранжирование и трафик.
Yandex проиндексировал 4 278 моих страниц на Next.js за ночь. Что это на самом деле доказало
Yandex почти одновременно добавил в индекс 4 278 моих статически сгенерированных страниц на Next.js. Это был реальный технический рубеж, но не доказательство ранжирования или трафика. Разбираю, что этот результат действительно говорил об SSG и programmatic SEO, а чего из него заключать нельзя.
Мой первый месяц SEO: 632 органических посетителя и проверка на бот-трафик
Я использовал личный сайд-проект, чтобы подготовиться к более крупной SEO-инициативе на работе. За месяц он получил 632 органических посетителя, но день с 83 посетителями показал, как легко подозрительный трафик и особенности аналитики искажают картину.
Я чуть не проигнорировал Yandex Webmaster. Через две недели он давал больше трафика, чем Google
Я сделал side project на Next.js, чтобы набраться практики перед рабочим проектом, где SEO будет критично. За первые две недели я увидел 58 посетителей из Google и 200 из Yandex — и понял, почему трафик, индексацию и диагностику нельзя смешивать в один показатель.
Яндекс Метрика vs Google Analytics: почему через неделю я предпочёл Метрику
Я неделю параллельно использовал Google Analytics и Яндекс Метрику на новом проекте. Метрика оказалась для меня полезнее прежде всего из-за Вебвизора: он упростил разбор конкретных пользовательских сессий. Но это вывод о моём рабочем процессе, а не доказательство того, что один сервис объективно лучше для всех.
Яндекс начал обходить мой блог без /en. 308-редиректы не дали URL превратиться в 404
После добавления примерно 3 000 страниц /en/blog/... в sitemap я увидел, что Яндекс обращается к соответствующим путям /blog/.... Заранее настроенные 308-редиректы не дали этим запросам закончиться 404. Главный вывод оказался не в том, что Яндекс «сломал» sitemap, а в том, насколько полезен аккуратный слой редиректов.
Два новых сайта резко выросли в Google — а через несколько дней трафик упал в 10 раз
На двух запусках подряд я увидел резкий рост показов в Google, а через несколько дней — примерно десятикратное падение трафика. Сам паттерн реален, но объяснение через «медовый месяц Google» я доказать не могу.
За ночь из поиска Yandex исчезли 2000 страниц. Что это доказывало — и чего не доказывало
Я открыл Yandex Webmaster и увидел, что из примерно 8000 страниц проекта 2000 больше не участвуют в поиске. Падение на 25% выглядело драматично, но главный урок оказался в другом: наблюдаемое изменение статуса страниц в поиске нельзя путать с доказанной причиной.
Я задал больше 10 вопросов на MoscowJS 66 и выиграл два приза
На MoscowJS 66 я задал больше 10 вопросов во время докладов о Telegram-ботах, LangChain.js, архитектуре конструктора сайтов и тестировании типов TypeScript. Два вопроса выбрали лучшими, и я ушёл с двумя призами.
Что я вынес с PiterJS #79: легаси-монолиты, FrontOps, веб-производительность и хорошие вопросы
PiterJS #79 в Санкт-Петербурге был посвящён поддержке уже существующих систем: легаси-монолиту, FrontOps и метрикам веб-производительности. Я ушёл с практическими заметками, двумя призами за Q&A и напоминанием, почему офлайн-митапы особенно ценны, когда в них участвуешь.
I Launched a Next.js Blog in 21 Languages. Here’s What 439 Google Impressions Actually Told Me
In its first week, my 21-language Next.js blog recorded 439 Google impressions and 5 clicks. Later, 436 of 471 pages were indexed. The useful lesson was learning to separate visibility, indexing, and actual search performance.
MoscowJS 65 после шести лет с JavaScript: зачем я всё ещё хожу на локальные митапы
5 июня 2025 года я побывал на MoscowJS 65 в Т-Банке. Четыре доклада рассматривали AI с разных сторон, но мой главный вывод оказался проще: локальные митапы всё ещё дают мне то, что документация и записи не могут полностью заменить.