<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Alexander Anufriev — Notes from real frontend work.</title>
    <link>https://anu3ev.com/blog/</link>
    <description>I build complex browser tools with Vue and TypeScript: image, text and code editors with AI features inside them, merchant workflows, and the shared libraries behind them.
For 5 years at inSales, a B2B SaaS platform for running online businesses with 60,000+ merchants, I took unclear features from first questions to production and kept them running after release.</description>
    <language>en</language>
    <atom:link href="https://anu3ev.com/rss.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>Replacing a cache timer with &quot;has this product changed?&quot;</title>
      <link>https://anu3ev.com/blog/cache-by-change-not-timer/</link>
      <guid isPermaLink="true">https://anu3ev.com/blog/cache-by-change-not-timer/</guid>
      <description>A storefront library cached product data for a fixed time, so pages either showed stale data or re-requested products that hadn&apos;t changed. Comparing each product&apos;s update timestamp cut product-data requests by about 70%.</description>
      <pubDate>Tue, 20 Oct 2026 20:00:00 GMT</pubDate>
    </item>
<item>
      <title>Teaching Monaco to read Liquid templates: the hard part is knowing the language under the cursor</title>
      <link>https://anu3ev.com/blog/monaco-liquid-tokenizer/</link>
      <guid isPermaLink="true">https://anu3ev.com/blog/monaco-liquid-tokenizer/</guid>
      <description>How a custom tokenizer for HTML with Liquid, JavaScript and CSS islands made suggestions follow the cursor, and why the editor shipped as a versioned package with a three-function browser API.</description>
      <pubDate>Tue, 20 Oct 2026 20:00:00 GMT</pubDate>
    </item>
<item>
      <title>One CAPTCHA token, two waiting forms: what invisible verification broke across a platform</title>
      <link>https://anu3ev.com/blog/one-token-two-forms/</link>
      <guid isPermaLink="true">https://anu3ev.com/blog/one-token-two-forms/</guid>
      <description>Invisible CAPTCHA looks like a script tag. Across several generations of store forms it turned into async-state bugs and a production rollback caused by a settings record that didn&apos;t exist.</description>
      <pubDate>Tue, 20 Oct 2026 20:00:00 GMT</pubDate>
    </item>
<item>
      <title>The redesign removed the sidebar, and with it the only way to fix a broken page</title>
      <link>https://anu3ev.com/blog/redesign-recovery-mode/</link>
      <guid isPermaLink="true">https://anu3ev.com/blog/redesign-recovery-mode/</guid>
      <description>A cleaner visual editor moved widget controls into the storefront preview. When custom code breaks that preview, the controls disappear with it. This is how I found that gap and the recovery mode I built for it.</description>
      <pubDate>Tue, 20 Oct 2026 20:00:00 GMT</pubDate>
    </item>
<item>
      <title>Vue 3 didn&apos;t make our autocomplete slow. 244,650 comparisons did</title>
      <link>https://anu3ev.com/blog/vue-3-proxy-deep-comparison/</link>
      <guid isPermaLink="true">https://anu3ev.com/blog/vue-3-proxy-deep-comparison/</guid>
      <description>After a Vue 3 migration, an autocomplete with 700 domain zones took about 12 seconds to open. The cause was an old quadratic deduplication that became expensive once it read every object through a reactive Proxy.</description>
      <pubDate>Tue, 20 Oct 2026 20:00:00 GMT</pubDate>
    </item>
  </channel>
</rss>
