Checking browser support for the CSS your page actually ships

Every tool in this space checks your source code before it is bundled. None of them check the stylesheet a visitor downloads - including the parts added by your CMS, your theme and your third-party embeds.

The tooling for browser support is mature and good: Browserslist, ESLint and Stylelint rules for Baseline, editor hints, and support data in DevTools when you select a property. Every one of those runs on code you wrote, in a project you control, before the build.

The gap: what actually ships

The CSS a visitor receives is frequently not the CSS you wrote:

  • A CMS theme or page builder contributes stylesheets you never see in your repository.
  • Plugins and embeds inject their own CSS and JS with their own support baselines.
  • A build step may transpile some features and leave others untouched.
  • A dependency update can introduce a modern feature without any change on your side.

None of that passes through your linter. On a WordPress, Shopify or Webflow site there may be no build step to lint at all.

What to look for

The features most likely to ship without a fallback, and the browsers that lag on them:

FeatureTypically the last to support it
:has()Firefox
Container queriesFirefox, older Safari
subgridChrome and Edge, until relatively recently
color-mix(), oklch()Across the board until 2023
text-wrap: balanceSafari
Object.groupBy, Promise.withResolversEverything before late 2023
URLPatternFirefox and Safari, for a long time
Popover API, inert, <search>Safari and Firefox

Deciding a target, not guessing one

Baseline is the useful vocabulary here. Widely available means the feature has been interoperable across the major engines for roughly two and a half years and is safe without a fallback. Newly available means it just landed everywhere and your older visitors will not have it. Limited means at least one major engine is missing it entirely.

Pick a target explicitly - Baseline Widely available is a sane default for a public site - and check what you ship against it rather than against whichever browser you happen to develop in.

Guarding a feature you want anyway

@supports (color: color-mix(in srgb, red 50%, blue)) {
  .card { border-color: color-mix(in srgb, var(--tint) 40%, transparent); }
}
/* fallback first, so unsupported browsers get something */
.card { border-color: rgba(79, 142, 247, 0.4); }

Use the build-time tools too

If you have a build step, Stylelint and ESLint with Baseline rules will catch problems before they ship, which is strictly better than catching them afterwards. Runtime checking is for what those tools cannot see: themes, plugins, embeds and anything on a site with no build pipeline at all.

Common questions

What is Baseline?

A shared vocabulary from the WebDX Community Group for describing cross-browser support. Newly available means a feature has just become interoperable across the major engines; Widely available means roughly thirty months have passed since then, so it is safe for most sites without a fallback.

Why not just read caniuse for each feature?

You can, and it is the right reference. The problem is knowing which features are on your page in the first place - particularly the ones added by a theme, a plugin or an embed that you did not write and would not think to look up.

Does a build-time linter not already cover this?

For code in your repository, yes, and it should be your first line of defence. It cannot see CSS injected by a CMS theme, a page builder or a third-party widget, and on a site with no build step there is nothing for it to run against.

Should I stop using modern CSS?

No. Use it deliberately, with @supports guards or a fallback declaration first, and know which of your visitors get the fallback. The point of checking is to make that an informed choice rather than an accident.

Get told when it ships

A scan of the CSS and JS your live page actually serves - including theme and plugin code - against a browser target you choose.

One email when it is ready. No newsletter, no sharing, unsubscribe in one click. Questions: support@hakeemify.com

Related guides