Writing
Blog
Notes on frontend engineering, SEO, AI, analytics, and building real products.
42 posts
My AVA Hosting VPS Averaged 32.73% CPU Steal Despite “Guaranteed Resources — No Sharing”
My AVA Hosting KVM VPS averaged 32.73% CPU steal, 0% CPU idle and almost 99% CPU pressure under normal production traffic. AVA advertises guaranteed CPU resources without sharing; this is a first-hand debugging story about what Linux actually reported inside the VM.
My FDCServers VPS Worked Fine for More Than 3 TB of Traffic. Then Disk Reads Started Taking 18 Seconds
My FDCServers VPS initially handled real traffic normally and transferred more than 3 TB of data. Then ordinary workload began triggering severe virtual-disk stalls: CPU I/O wait reached 100%, Linux I/O pressure approached 100%, read latency reached 18.7 seconds, and flush latency exceeded 53 seconds.
My REGXA VPS Showed 94% CPU Steal — Even With No Traffic
I investigated severe performance problems on a REGXA KVM VPS and found 92–94% CPU steal, multi-second localhost requests, growing connection queues, and HTTP 504 responses taking more than two minutes. Removing all production traffic made CPU steal rise to 94.17%, and REGXA support later attributed it to resource contention on shared infrastructure.
Two Months with Bunny Storage Behind Nginx: Why I Moved Images, Video, and Audio to a Dedicated Media Server
For two months I used Bunny Storage as a private origin behind my own Nginx cache rather than through Bunny CDN. Production logs exposed long-tail connection timeouts on cold media and a separate MP4 problem with Nginx Slice and inconsistent ETags, which eventually led me to a simple private media origin.
SSIMULACRA2 for WebP-to-AVIF Transcoding: Why I Use 60 for Sources and 65 for Lossy Derivatives
When AVIF is encoded from an already-lossy WebP, SSIMULACRA2 measures only the second generation of loss. I ended up using 60/58 for clean sources and 65/63 for known lossy derivatives.
DeepSeek Raised Its Prices — I Found the Same V4 Flash Cheaper Than the Old Rate
On August 17, my DeepSeek API spend suddenly rose to roughly five times its usual level. I then found and tested another provider offering the same DeepSeek-V4-Flash-0731 checkpoint at prices about 45% below DeepSeek's old rates.
How I Convert Animated WebP, GIF and APNG to H.264 MP4 Without Breaking Frames or Timing
My production pipeline reconstructs the complete frames users actually see, preserves source timing, chooses one CFR for each final MP4, uses the smallest common canvas without upscaling, encodes compatible H.264 segments, concatenates them without a second lossy encode, and validates both the file and its HTTP delivery. In one measured run, 217 animated WebP files totaling 1.49 GB became one 78.49 MB H.264 MP4.
I Was Alerting on Everything: How I Turned Browser Error Spam into Useful Production Monitoring
My frontend reporter treated ad blockers, GTM failures, AbortError, opaque Script error events, and real Next.js chunk failures alike. I rebuilt the signal around ownership, user impact, evidence, correlation, and recovery.
Why Old Next.js Tabs Break After a Deployment: Stale HTML, Missing Chunks, and Version Skew
After a deployment, my production telemetry captured a failed first-party Next.js chunk. The log proved the script failed, not why. This article uses that incident to explain old tabs, stale HTML, missing /_next/static assets, version skew, retention, deploymentId, rollout order, monitoring, and controlled recovery.
The One-Tick Bug That Broke My CFR: Why 5580 Was Not 5625 and 3751 Was Not 3750
My validator repeatedly rejected a 16 fps MP4 because a packet lasted 5580 ticks instead of 5625, then later caught a 3751-tick packet where 24 fps required exactly 3750. The two failures taught me to separate source timing, CFR quantization, MP4 time base, PTS/DTS, muxing, and packet-level validation.
How I Cut a Production Video from ~280 MB to ~50 MB with H.264
One concrete production video fell from roughly 280 MB to roughly 50 MB after I rebuilt the H.264 policy around CRF 28, x264 veryslow, a 720p-class ceiling, useful frame rates, and a conservative decoder contract. An earlier stage of the same optimization had already reduced the file from about 350 MB to 238 MB, while a wider audit showed that multi-megabit H.264 files were common in the old library.
I Built Gitae to Diagnose Website Outages Beyond “Up or Down”
I built Gitae to answer a practical question: is a site really unavailable, or is the failure local? It combines external VDS checks from Moscow and Helsinki with DNS, HTTPS/TLS, ports, routing, IP, hosting, and CMS signals—and treats every result as evidence, not proof.
Why TypeScript Works So Well with Codex for Production Software
For production work, TypeScript gives Codex something prompts alone cannot: machine-checkable contracts, fast compiler feedback, and a safer path through large refactors.
I Built Jurfi.com: A Browser-Based Legal Document Studio for Structured Drafts
I built Jurfi.com to turn forms and templates into structured legal working drafts in the browser, with local draft storage, an explicit review step, and no claim that software can replace a lawyer.
My First SaaS Revenue: What One Payment Actually Proved
My first payment from a SaaS product I built myself was small, but it changed the quality of the evidence I had. Here is what one transaction can validate, what it cannot, and why repetition matters more than the milestone itself.
How I Use Codex to Review 15 Projects Without Giving Up Manual Control
Reviewing 15 software projects used to mean drowning in repetitive checks. Codex now helps me audit bugs, tests, SEO, translations, localization, and consistency much faster—but I still treat every AI finding as a lead, not a verdict, and every change as something I must verify.
Why I Spend the Last 3–5% of My ChatGPT Plus Codex Limit on Big Engineering Tasks — Update: It Stopped Working in Summer 2026
Update: by summer 2026 this stopped being a reliable workflow for me. The 5-hour counter disappeared from my account, only the weekly allowance remained visible, and long-running work could stop when that weekly allowance was exhausted.
I Published 10,000 AI SEO Articles. My Site Eventually Fell to Zero Indexed Pages
Mass AI publishing looked like a shortcut: Google crawled all 10,000 generated article URLs, but only about 1,000 were actually indexed, appeared in Search, and brought real traffic. Then those pages disappeared too, until the entire site reached zero indexed pages. Here is what that failure taught me about AI, SEO, translation, and using AI as an assistant instead of an autonomous publisher.
Five Years With an 8GB/256GB M1 MacBook: Why I Still Haven’t Replaced It
I bought the base M1 MacBook with 8GB of memory and a 256GB SSD for around $1,000 and used it roughly 15 hours a day for development, media work, writing, learning, and side projects. Five years later, I can clearly see its limits, but I’m considering an upgrade because my workload grew—not because the machine stopped being useful.
I Translated My Blog Into 20 Languages With ChatGPT — and Started Getting Search Traffic From Around the World
AI changed the economics of multilingual publishing for me. I went from writing a blog in one language to publishing each article in up to 20 languages, creating new organic search entry points for readers around the world.
I Launched QRViz as a Free Static QR Code Generator — and Bet Distribution on SEO
QRViz is a browser-based static QR code generator, not a campaign platform. I launched qrviz.com as a free QR code generator with no ad budget, paid acquisition plan, or monetization funnel. I’m relying entirely on SEO, which makes discovery the biggest uncertainty — and that is part of why this small launch matters to me.
Why Getting Customers Felt Harder Than Building a SaaS
A first-hand lesson from building a SaaS: engineering gave me clear, checkable feedback, while distribution, positioning, messaging, and retention required a different and much less predictable loop.
I Built a SaaS Product Solo. Turning On Payments Changed the Job
I built a SaaS product alone in evenings, weekends, and holidays. Once payments went live, bugs, onboarding, access, retention, reliability, and trust became part of operating a real product.
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.
I Saw Nearly 6,000 Applications on a Moscow Frontend Job. What That Does—and Doesn't—Say About Russia's IT Market
In late 2023, recruiters told me 300–500 applicants per opening was already difficult. On January 20, 2026, I saw a mid-level frontend role in Moscow approaching 6,000 applications within hours. Here is what I think that signals, what it does not prove, and how I would read those numbers as a candidate.
How DeepSeek Changed My Node.js Side-Project Workflow: 4,000+ Commits in Six Months
My 2025 GitHub graph went from nearly empty to more than 4,000 commits in the second half of the year. Here is what AI coding changed in my Node.js side-project workflow, where it saved time, where it failed, and why verification mattered more than generation speed.
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.
I Bought a 25-Year-Old Domain. Then 1,000+ Requests a Day Hit Dead URLs
After launching on a domain first registered in 2000, I saw more than 1,000 daily requests for legacy URLs and 900+ Yandex Webmaster errors overnight. Here is what I could actually prove, why I used targeted 410 responses, and how I would audit an aged domain now.
I Had 12,500 Pages Indexed in Yandex but Almost No Russian Traffic: The Cloudflare Problem I Missed
Yandex had indexed 12,500 pages, yet traffic from Russia was almost zero. I traced the problem to the network path, removed Cloudflare’s proxy, rebuilt caching, compression, and basic protection with Nginx on my VDS, and restored reachability. The important lesson was to separate indexing, user access, and traffic.
My Static Next.js Site Gets Thousands of Vulnerability Scans a Day. Nginx Barely Notices
My logs are full of probes for WordPress, PHP backdoors, .env files, and .git/config. On this static Next.js + Nginx site, they mostly become cheap misses and 404s, and the CPU load stayed flat. Here is what that does—and does not—say about static-site security.
Yandex Sent Traffic to My New Site While Google Barely Moved
On the same new project, Google Search produced only about 300 clicks over a long period while Yandex Webmaster showed a strong rise, including +500% clicks. Here is what those numbers prove, what they do not, and how I would investigate the gap without confusing crawling, indexing, ranking, and traffic.
Yandex Indexed 4,278 of My Next.js Pages Overnight — What That Actually Proved
Yandex suddenly indexed 4,278 of my statically generated Next.js pages. It was a real technical milestone, but not proof of rankings or traffic. Here is what the result did and did not tell me about SSG and programmatic SEO.
My First Month of SEO: 632 Organic Visitors and a Bot-Traffic Reality Check
I used a personal side project to prepare for a larger SEO initiative at work. After one month it had 632 organic visitors, but an 83-visitor day showed how easily suspicious traffic and analytics artifacts can distort the story.
I Almost Ignored Yandex Webmaster. Two Weeks Later, It Was Sending More Traffic Than Google
I built a Next.js side project to learn SEO before an SEO-critical work project. In the first two weeks I recorded 58 visitors from Google and 200 from Yandex—and learned why indexing, diagnostics, and traffic need to be measured separately.
Yandex Metrica vs Google Analytics: Why I Preferred Metrica After One Week
I ran Google Analytics and Yandex Metrica side by side on a new project for one week. Metrica won my attention because Webvisor made individual user journeys easier to inspect—but that is a workflow preference, not proof that one analytics platform is universally better.
Yandex Crawled My Blog Without /en. 308 Redirects Kept the URLs Alive
After I added about 3,000 /en/blog/... pages to a sitemap, I saw Yandex try the corresponding /blog/... paths. Existing 308 redirects kept those requests from becoming 404s. The useful lesson was not that Yandex “broke” my sitemap, but how much resilience a clean redirect layer can add.
Two New Sites Spiked in Google, Then Traffic Fell 10×
On two launches in a row, I saw Google impressions surge immediately and traffic fall roughly tenfold within days. The pattern was real; the popular “honeymoon” explanation is not something I can prove.
2,000 Pages Disappeared from Yandex Search Overnight. Here’s What That Actually Told Me
I opened Yandex Webmaster and found that 2,000 of roughly 8,000 pages were no longer participating in search. The 25% drop looked dramatic, but the useful lesson was learning not to confuse an observed search-status change with a proven cause.
I Asked More Than 10 Questions at MoscowJS 66—and Won Two Prizes
At MoscowJS 66, I asked more than 10 questions across talks on Telegram bots, LangChain.js, site-builder architecture, and TypeScript type testing. Two were selected as the best questions, and I left with two prizes.
What I Took From PiterJS #79: Legacy Monoliths, FrontOps, Web Performance, and Better Questions
PiterJS #79 in St. Petersburg focused on maintaining what already exists: a legacy monolith, FrontOps, and web-performance metrics. I left with practical notes, two Q&A prizes, and a reminder that offline meetups are most valuable when you participate.
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 After Six Years With JavaScript: Why I Still Go to Local Meetups
I attended MoscowJS 65 at T Bank on June 5, 2025. Its four talks approached AI from different angles, but my main takeaway was simpler: local meetups still give me something documentation and recordings cannot fully replace.