Docs / Adaptive warming

Adaptive warming

A fixed interval is a guess. Adaptive warming watches how long each of your pages actually stays cached at the edge, then re-warms it right before it expires. Pages that live for days stop being re-fetched every run; pages that expire fast get warmed more often.

Why a fixed interval isn't enough

Your cache headers only state a maximum. The real lifetime of a page at the edge is decided by the CDN: memory pressure, how often the page is requested, and which colo it lands in. A press release cached for a week and a homepage that gets evicted after forty minutes both look like "cached" in a global average, but they need opposite treatment.

Warming everything on the same schedule wastes your traffic budget on pages that were never going to expire, and still lets the fast ones go cold between runs.

What we observe

Every warming request records the cache status at each edge location. Over time we see, per URL, the moment it flips from HIT to MISS at a given colo. That gap is the page's real lifetime at that location, measured instead of declared.

From those observations we compute a per-URL warm-after time. Before each run, a URL is only included if its measured lifetime says it's due. URLs with no data yet are warmed every run, exactly as before, until there's enough history to trust.

What your headers still decide

Adaptive warming doesn't override your cache rules; it respects them as the upper bound. We read s-maxage, max-age, the CDN-specific cache headers and the Expires fallback, and never schedule a URL beyond what its own headers allow.

What you see in the dashboard

Once a project has collected enough history, a note appears at the top of its page telling you how many URLs now run on their own learned schedule and how many are skipped because of no-store. Until then the note stays hidden and everything warms on your fixed interval, so there's nothing to configure and nothing to break.

You don't have to do anything. Adaptive warming is on for every project. Keep your cache headers honest and it gets more accurate with every run. If you'd rather force a fixed rhythm, set a shorter interval in the project settings; the learned schedule then just tightens around it.

Next: Deploy hooks & CI →