Two CSS fingerprints keep old and new cached representations separate.

Immutable assets and fingerprints

A fingerprinted asset puts a digest of its bytes into its URL. Changing a stylesheet produces a different address, so a page can request the new representation without depending on every existing cache expiring simultaneously. The useful guarantee comes from the publishing process: once an address is released, its contents must remain consistent with that digest. ...

November 25, 2026 · 5 min · XB Field Notes
A clock that adds the seconds a response has spent inside caches.

The Age header tells how long a cached copy has been around

Age is an estimate of elapsed seconds since an origin generated or successfully validated a response. It includes time in caches and in transit. It is not the object’s creation timestamp, a count of requests, or simply the time spent on the last proxy’s disk. Reading it correctly requires the response’s freshness policy and the request context. ...

November 6, 2026 · 5 min · XB Field Notes
A response marked private for the user's browser only, versus public for any cache.

Cache-Control private versus shared

Storage scope is not an identity system. Cache-Control: private tells a conforming shared cache not to store a response; it does not teach a browser which application account owns the bytes. This distinction matters when a person logs out, another account logs in, and the same browser requests the same URL again. ...

October 23, 2026 · 5 min · XB Field Notes
A cached absence can outlive record creation even while the authority already returns the new data.

Negative DNS answers preserve absence until their cache lifetime expires

DNS can return useful information by saying that data is absent. NXDOMAIN reports a name error; NODATA describes a successful response without the requested record type. In a direct query without aliases, these distinguish a nonexistent name from an existing name that lacks the requested data. Caching those results avoids repeating the same unsuccessful upstream lookup for every client request. ...

October 22, 2026 · 6 min · XB Field Notes
Two labels on one response enforcing which variants stay apart.

Content-Type and Vary work together

One URL can return JSON to an API client and plain text to another reader. Content-Type identifies the selected representation; Vary identifies request fields relevant to selecting it. A correct body label cannot prevent a cache from choosing the wrong stored response when the request-matching information is missing. ...

October 12, 2026 · 5 min · XB Field Notes
A fingerprint handed back to check whether anything changed.

ETags and conditional requests avoid work

A 304 is useful only when the old representation really remains an acceptable substitute. ETag supplies the origin’s version claim; it does not independently verify that claim. An incorrect tag can make conditional requests efficiently preserve wrong content. Test both unchanged data and meaningful changes before counting reduced transfers as a performance improvement. ...

September 26, 2026 · 5 min · XB Field Notes
Two clocks labelled freshness and validation with an ETag between them.

Cache validation is two clocks, not one freshness setting

A cache is only as coherent as the pair of conditions your headers make explicit.

August 14, 2026 · 4 min · XB Field Notes
A browser and an origin negotiating freshness and validation.

Cache headers are a two-way contract with browsers

An origin defines storage and freshness policy; a cache decides whether its stored response can satisfy the next request. When it cannot reuse that response directly, validators can make checking cheaper. These are separate decisions. Finding Cache-Control and ETag in one successful response does not prove that the next request follows the intended path. ...

July 15, 2026 · 5 min · XB Field Notes