
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/">
    <channel>
        <title><![CDATA[ The Cloudflare Blog ]]></title>
        <description><![CDATA[ Get the latest news on how products at Cloudflare are built, technologies used, and join the teams helping to build a better Internet. ]]></description>
        <link>https://blog.cloudflare.com</link>
        <atom:link href="https://blog.cloudflare.com/" rel="self" type="application/rss+xml"/>
        <language>en-us</language>
        <image>
            <url>https://blog.cloudflare.com/favicon.png</url>
            <title>The Cloudflare Blog</title>
            <link>https://blog.cloudflare.com</link>
        </image>
        <lastBuildDate>Fri, 17 Apr 2026 17:14:06 GMT</lastBuildDate>
        <item>
            <title><![CDATA[Shared Dictionaries: compression that keeps up with the agentic web]]></title>
            <link>https://blog.cloudflare.com/shared-dictionaries/</link>
            <pubDate>Fri, 17 Apr 2026 13:02:00 GMT</pubDate>
            <description><![CDATA[ Today, we’re excited to give you a sneak peek of our support for shared compression dictionaries, show you how it improves page load times, and reveal when you’ll be able to try the beta yourself. 
 ]]></description>
            <content:encoded><![CDATA[ <p>Web pages have grown 6-9% <a href="https://almanac.httparchive.org/en/2024/page-weight#fig-15"><u>heavier</u></a> every year for the past decade, spurred by the web becoming more framework-driven, interactive, and media-rich. Nothing about that trajectory is changing. What <i>is</i> changing is how often those pages get rebuilt and how many clients request them. Both are skyrocketing because of agents. </p><p>Shared dictionaries shrink asset transfers from servers to browsers so pages <b>load faster with less bloat on the wire,</b> especially for returning users or visitors on a slow connection. Instead of re-downloading entire JavaScript bundles after every deploy, the browser tells the server what it already has cached, and the server only sends the file diffs. </p><p><b>Today, we’re excited to give you a sneak peek of our support for shared compression dictionaries,</b> show you what we’ve seen in early testing, and reveal when you’ll be able to try the beta yourself (hint: it’s April 30, 2026!). </p>
    <div>
      <h2>The problem: more shipping = less caching</h2>
      <a href="#the-problem-more-shipping-less-caching">
        
      </a>
    </div>
    <p>Agentic crawlers, browsers, and other tools hit endpoints repeatedly, fetching full pages, often to extract a fragment of information. Agentic actors represented just under 10% of total requests across Cloudflare's network during March 2026, up ~60% year-over-year. </p><p>Every page shipped is heavier than last year and read more often by machines than ever before. But agents aren’t just consuming the web, they’re helping to build it. AI-assisted development <b>means teams ship faster. </b>Increasing the frequency of deploys, experiments, and iterations is great for product velocity, but terrible for caching.</p><p>As agents push a one-line fix, the bundler re-chunks, filenames change, and every user on earth could re-download the entire application. Not because the code is meaningfully any different, but because the browser/client has no way to know specifically what changed. It sees a new URL and starts from zero. Traditional compression helps with the size of each download, but it can't help with the redundancy. It doesn't know the client already has 95% of the file cached. So every deploy, across every user, across every bot, sends redundant bytes again and again. Ship ten small changes a day, and you've effectively opted out of caching. This wastes bandwidth and CPU in a web where hardware is quickly becoming the bottleneck.</p><p><b>In order to scale with more requests hitting heavier pages that are re-deployed more often, compression has to get smarter. </b></p>
    <div>
      <h2>What are shared dictionaries?</h2>
      <a href="#what-are-shared-dictionaries">
        
      </a>
    </div>
    <p>A compression dictionary is a shared reference between server and client that works like a cheat sheet. Instead of compressing a response from scratch, the server says "you already know this part of the file because you’ve cached it before" and only sends what's new. The client holds the same reference and uses it to reconstruct the full response during decompression. The more the dictionary can reference content in the file, the smaller the compressed output that is transferred to the client.</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2g2NBi1d4eqLAgksGetult/ea05b48519edfa8cccde6d6531700ce1/image5.png" />
          </figure><p>This principle of compressing against what's already known is how modern compression algorithms pull ahead of their predecessors. Brotli ships with a built-in dictionary of common web patterns like HTML attributes and common phrases; Zstandard is purpose-built for custom dictionaries: you can feed it representative content samples, and it generates an optimized dictionary for the kind of content you serve. Gzip has neither; it must build dictionaries by finding patterns in real-time as it’s compressing. These “traditional compression” algorithms are already <a href="https://developers.cloudflare.com/speed/optimization/content/compression/"><u>available</u></a> on Cloudflare today. </p><p>Shared dictionaries take this principle a step further: the previously cached version of the resource<b> becomes the dictionary.</b> Remember the deploy problem where a team ships a one-line fix and every user re-downloads the full bundle? With shared dictionaries, the browser already has the old version cached. The server compresses against it, sending only the diff. That 500KB bundle with a one-line change becomes only a few kilobytes on the wire. At 100K daily users and 10 deploys a day, that's the difference between 500GB of transfer and a few hundred megabytes.</p>
    <div>
      <h3>Delta compression</h3>
      <a href="#delta-compression">
        
      </a>
    </div>
    <p>Delta compression is what turns the version the browser already has into the dictionary. The protocol looks to when the server first serves a resource, it attaches a <code>Use-As-Dictionary</code> response header, telling the browser to essentially hold onto the file because it’ll be useful later. On the next request for that resource, the browser sends an <code>Available-Dictionary</code> header back, telling the server, "here's what I've got." The server then proceeds to compress the new version against the old one and sends only the diff. No separate dictionary file needed. </p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6Hyxl74lzTdGdTczYBe3LF/4b66760c34378508e774814eba7b3c8f/image3.png" />
          </figure><p>This is where the payoff lands for real applications. Versioned JS bundles, CSS files, framework updates, and anything that changes incrementally between releases. The browser has app.bundle.v1.js cached already and the developer makes an update and deploys app.bundle.v2.js. Delta compression only sends the diff between these versions. Every subsequent version after is also just a diff. Version three compresses against version two. Version 47 compresses against version 46. The savings don't reset, they persist across the entire release history.</p><p>There's also active discussion in the community about custom and dynamic dictionaries <a href="https://dev.to/carlosmateom/beyond-static-resources-delta-compression-for-dynamic-html-3hn4"><u>for non-static </u></a>content. That's future work, but the implications are significant. We'll save that for another post.</p>
    <div>
      <h2>So why the wait?</h2>
      <a href="#so-why-the-wait">
        
      </a>
    </div>
    <p>If shared dictionaries are so powerful, why doesn't everyone use them already?</p><p>Because the last time they were tried, the implementation couldn't survive contact with the open web. </p><p><a href="https://en.wikipedia.org/wiki/SDCH"><u>Google shipped</u></a> Shared Dictionary Compression for HTTP (SDCH) in Chrome in 2008. It worked well with some early adopters reporting double-digit improvements in page load times. But SDCH accumulated problems faster than anyone was able to fix them.</p><p>The most memorable was a class of compression side-channel attacks (<a href="https://en.wikipedia.org/wiki/CRIME"><u>CRIME</u></a>, <a href="https://en.wikipedia.org/wiki/BREACH"><u>BREACH</u></a>). Researchers showed that if an attacker could inject content alongside something sensitive that gets compressed (like a session cookie, token, etc.) the size of the compressed output could leak information about the secret. The attacker could guess a byte at a time, watch whether the asset size shrank, and repeat until they extracted the whole secret. </p><p>But security wasn't the only problem, or even the main reason why adoption didn’t happen. SDCH surfaced a few architectural problems like violating the <a href="https://groups.google.com/a/chromium.org/g/blink-dev/c/nQl0ORHy7sw/m/S8BoYHQyAgAJ"><u>Same-Origin Policy</u></a> (which ironically is partially why it performed so well). Its cross-origin dictionary model <a href="https://groups.google.com/a/chromium.org/g/blink-dev/c/nQl0ORHy7sw/m/BROFrwM2AgAJ"><u>couldn't be reconciled with CORS</u></a>, and it lacked some specification regarding interactions with things like the Cache API. After a while it became clear that adoption wasn’t ready, so in 2017 Chrome (the only browser supporting at the time) <a href="https://groups.google.com/a/chromium.org/g/blink-dev/c/nQl0ORHy7sw"><u>unshipped</u></a> it. </p><p>Getting the web community to pick up the baton took a decade, but it was worth it.</p><p>The modern standard, <a href="https://datatracker.ietf.org/doc/rfc9842/"><u>RFC 9842: Compression Dictionary Transport</u></a>, closes key design gaps that made SDCH untenable. For example, it enforces that an advertised dictionary is only usable on responses from the same-origin, preventing many conditions that made side-channel compression attacks possible. </p><p><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Compression_dictionary_transport"><u>Chrome and Edge have shipped support</u></a> with <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1882979"><u>Firefox</u></a> working to follow. The standard is moving toward broad adoption, but complete cross-browser support is still catching up.</p><p>The RFC mitigates the security problems but dictionary transport has always been complex to implement. An origin may have to generate dictionaries, serve them with the right headers, check every request for an <code>Available-Dictionary</code> match, delta-compress the response on the fly, and fall back gracefully when a client doesn't have a dictionary. Caching gets complex too. Responses vary on both encoding and dictionary hash, so every dictionary version creates a separate cache variant. Mid-deploy, you have clients with the old dictionary, clients with the new one, and clients with none. Your cache is storing separate copies for each. Hit rates drop, storage climbs, and the dictionaries themselves have to stay fresh under normal HTTP caching rules.</p><p>This complexity is a coordination problem. And exactly the kind of thing that belongs at the edge. A CDN already sits in front of every request, already manages compression, and already handles cache variants (<i>watch this space for a soon-to-come announcement blog</i>).</p>
    <div>
      <h2>How Cloudflare is building shared dictionary support </h2>
      <a href="#how-cloudflare-is-building-shared-dictionary-support">
        
      </a>
    </div>
    <p>Shared dictionary compression touches every layer of the stack between the browser and the origin. We've seen strong customer interest: some people have already built their own implementations like RFC author <b>Patrick Meenan</b>'s <a href="https://github.com/pmeenan/dictionary-worker"><u>dictionary-worker</u></a>, which runs the full dictionary lifecycle inside a Cloudflare Worker using WASM-compiled Zstandard (as an example).  We want to make this accessible to everyone and as easy as possible to implement. So we’re rolling it out across the platform in three phases, starting with the plumbing.</p><p><b>Phase 1</b>: Passthrough support is currently in active development. Cloudflare forwards the headers and encodings that shared dictionaries require like <code>Use-As-Dictionary</code>, <code>Available-Dictionary</code>, and the <code>dcb</code> and <code>dcz</code> content encodings, without stripping, modifying, or recompressing them. The Cache keys are extended to vary on <code>Available-Dictionary</code> and <code>Accept-Encoding</code> so dictionary-compressed responses are cached correctly. This phase serves customers who manage their own dictionaries at the origin.</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2iQek3TT8FRu3VikQIdxDh/11f522c791e10c751f72ac8dcf293ac2/image2.png" />
          </figure><p>We plan to have an open beta of Phase 1 ready by <b>April 30, 2026</b>. To <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Compression_dictionary_transport"><u>use it</u></a>, you'll need to be on a Cloudflare zone with the feature enabled, have an origin that serves dictionary-compressed responses with the correct headers (<code>Use-As-Dictionary</code>, Content-Encoding: <code>dcb</code> or <code>dcz</code>), and your visitors need to be on a browser that advertises <code>dcb/dcz</code> in <code>Accept-Encoding</code> and sends <code>Available-Dictionary</code>. Today, that means Chrome 130+ and Edge 130+, with Firefox support in progress.</p><p>Keep your eyes fixed on the <a href="https://developers.cloudflare.com/changelog/"><u>changelog</u></a> for when this becomes available and more documentation for how to use it. </p><p>We’ve already started testing passthrough internally. In a controlled test, we deployed two js bundles in sequence. They were nearly identical except for a few localized changes between the versions representing successive deploys of the same web application. Uncompressed, the asset is 272KB. Gzip brought that down to 92.1KB, a solid 66% reduction. With shared dictionary compression over DCZ, using the previous version as the dictionary, that same asset dropped to 2.6KB. <b>That's a 97% reduction over the already compressed asset</b>. </p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4I6emVSFDBqjTBBgjIRWo3/ec4e224fdc5f8873f4758a1d6773a7c1/image7.png" />
          </figure><p>In the same lab test, we measured two timing milestones from the client: time to first byte (TTFB) and full download completion. The TTFB results are interesting for what they don't show. On a cache miss (where DCZ has to compress against the dictionary at the origin) TTFB is only about 20ms slower than gzip. The overhead is near-negligible for transmission.</p><p>The download times are where the difference is. On a cache miss, DCZ completed in 31ms versus 166ms for gzip (an 81% improvement). On a cache hit, 16ms versus 143ms (89% improvement). The response is so much smaller that even when you pay a slight penalty at the start, you finish far ahead.</p><p><i>Initial lab results simulating minimal JS bundle diffs, results will vary based on the actual delta between the dictionary and the asset.</i></p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5sNxMTZlNPMcojhiVc8J9l/b47c7241038c537b90c9c344a6904061/image8.png" />
          </figure><p><b>Phase 2</b>: This is where Cloudflare starts doing the work for you. Instead of handling dictionary headers, compression, and fallback logic on the origin, in this phase you tell Cloudflare which assets should be used as dictionaries via a rule and we manage the rest for you. We inject the Use-As-Dictionary headers, store the dictionary bytes, delta-compress new versions against old ones, and serve the right variant to each client. Your origin serves normal responses. Any dictionary complexity moves off your infrastructure and onto ours.</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1DnDwxeA5IHNLhyChs1bI8/747f87388132a3c97a3d8ae8392e3ebf/image1.png" />
          </figure>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3iFPkpibGAoixY6qqZNSKK/2ac29345dfb4782c74f4082ec1c6c9f4/image4.png" />
          </figure><p>To demonstrate this, we've built a live demo to show what this looks like in practice. <b>Try it here: </b><a href="https://canicompress.com/"><b><u>Can I Compress (with Dictionaries)?</u></b></a><b> </b></p><p>The demo deploys a new ~94KB JavaScript bundle every minute, meant to mimic a typical production single page application bundle. The bulk of the code is static between deploys; only a small configuration block changes each time, which also mirrors real-world deploys where most of the bundle is unchanged framework and library code. When the first version loads, Cloudflare's edge stores it as a dictionary. When the next deploy arrives, the browser sends the hash of the version it already has, and the edge delta-compresses the new bundle against it. The result: 94KB compresses to roughly <b>159 bytes.</b> That's a <b>99.5% reduction over gzip, </b>because the only thing on the wire is the actual diff.</p><p>The demo site includes walkthroughs so you can verify the compression ratios on your own via curl or your browser.</p><p><b>Phase 3</b>: The dictionary is automatically generated on behalf of the website. Instead of customers specifying which assets to use as dictionaries, Cloudflare identifies them automatically. Our network already sees every version of every resource that flows through it, which includes millions of sites, billions of requests, and every new deploy. The idea is that when the network observes a URL pattern where successive responses share most of their content but differ by hash, it has a strong signal that the resource is versioned and a candidate for delta compression. It stores the previous version as a dictionary and compresses subsequent versions against it. No customer configuration. No maintenance.</p><p>This is a simple idea, but is genuinely hard. Safely generating dictionaries that avoid revealing private data and identifying traffic for which dictionaries will offer the most benefit are real engineering problems. But Cloudflare has the right pieces: we see the traffic patterns across the entire network, we already manage the cache layer where dictionaries need to live, and our <a href="https://blog.cloudflare.com/the-rum-diaries-enabling-web-analytics-by-default/"><u>RUM beacon</u></a> to clients can help give us a validation loop to confirm that a dictionary actually improves compression before we commit to serving it. The combination of traffic visibility, edge storage, and synthetic testing is what makes automatic generation feasible, though there are still many pieces to figure out.</p><p>The performance and bandwidth benefits of phase 3 are the crux of our motivation. This is what makes shared dictionaries accessible to everyone using Cloudflare, including the millions of zones that would never have had the engineering time to implement custom dictionaries manually. </p>
    <div>
      <h2>The bigger picture</h2>
      <a href="#the-bigger-picture">
        
      </a>
    </div>
    <p>For most of the web's history, compression was stateless. Every response was compressed as if the client had never seen anything before. Shared dictionaries change that: they give compression a memory.</p><p>That matters more now than it would have five years ago. Agentic coding tools are compressing the interval between deploys, while also driving a growing share of the traffic that consumes them. While today AI tools can produce massive diffs, agents are gaining more context and becoming surgical in their code changes. This, coupled with more frequent releases and more automated clients means more redundant bytes on every request. Delta compression helps both sides of that equation by reducing the number of bytes per transfer, and the number of transfers that need to happen at all.</p><p>Shared Dictionaries took decades to standardize. Cloudflare is helping to build the infrastructure to make it work for every client that touches your site, human or not. Phase 1 beta opens <b>April 30</b>, and we’re excited for you to try it.</p><p>_____</p><p><sup> 1Bots = </sup><a href="https://radar.cloudflare.com/bots?dateRange=28d"><sup><u>~31.3% </u></sup></a><sup>of all HTTP requests. AI = ~</sup><a href="https://radar.cloudflare.com/explorer?dataSet=bots&amp;groupBy=bot_category"><sup><u>29-30%</u></sup></a><sup> of all Bot traffic (March 2026). </sup></p> ]]></content:encoded>
            <category><![CDATA[Agents Week]]></category>
            <category><![CDATA[Agents]]></category>
            <category><![CDATA[Compression]]></category>
            <category><![CDATA[Pingora]]></category>
            <category><![CDATA[Speed]]></category>
            <category><![CDATA[AI]]></category>
            <guid isPermaLink="false">1vrgbarIDanwhi6j2m6oNM</guid>
            <dc:creator>Alex Krivit</dc:creator>
            <dc:creator>Edward Wang</dc:creator>
            <dc:creator>Sid Chunduri</dc:creator>
        </item>
    </channel>
</rss>