Which browser is actually running your site?
An APK built from a ZIP does not contain a browser. It asks Android for the Android System WebView — a component, based on Chromium, that every app shares. Since Android 7 the WebView is updated through Google Play like an app, usually within weeks of the matching Chrome release, so on most phones it is as current as Chrome itself.
The exceptions are the long tail: Android 5 and 6 devices whose WebView stopped receiving updates, phones and tablets sold without Google Play services, kiosks and industrial devices with updates disabled. The app can install on Android 5.0 and up, so if your audience includes that tail, the newest feature in your code is the one that decides who sees a working app.
What the numbers mean
Each feature is listed with the Chromium version that first shipped it without a flag. The largest number is the minimum WebView your code needs. Anything at 80 or below is safe almost everywhere; 100–115 covers every regularly updated phone; above 115 you are relying on devices having updated in the last year or two.
Do not trust the user agent. Many WebView apps — including these — report a fixed Chrome version in the user-agent string for compatibility with sites that sniff it. Detect features (CSS.supports('selector(:has(a))'), 'structuredClone' in window), never versions.
What to do with a high number
- Build with a lower target. Vite's
build.target, esbuild's--target=chrome80or Babel's preset-env rewrite modern syntax (optional chaining, class fields, logical assignment) into older equivalents at build time. That handles most of the JavaScript rows. - Polyfill the library calls.
structuredClone,Array.prototype.at,Object.hasOwnand friends have small polyfills (core-js). Syntax cannot be polyfilled; methods can. - Make CSS degrade. Wrap
:has(), container queries andcolor-mix()in@supportswith a simpler default. Nesting is the exception: an old engine drops the whole nested rule, so preprocess it (PostCSS, Sass) if old devices matter.
Limits
This is a pattern scan, not a parser: an unusual formatting style can hide a feature, and a string that happens to contain ?. can produce a false hit. It is a quick triage — the definitive test is running the app on the oldest device you care about, with an on-device console as described in the debugging doc.