tools / inspect

WebView feature checker

Inside an app your site is rendered by the phone's Android System WebView, not by the Chrome the user keeps up to date. Most phones run a current one; some do not. This finds the newest feature your code depends on, so you know exactly which devices you are leaving behind.

Check a ZIP

Pattern-matches CSS and JavaScript (minified is fine). Numbers are the Chromium release that shipped each feature; Android System WebView shares Chromium's version numbers.

Drop a site ZIP, or .css / .js / .html files .zip, .css, .js, .html · read locally

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=chrome80 or 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.hasOwn and friends have small polyfills (core-js). Syntax cannot be polyfilled; methods can.
  • Make CSS degrade. Wrap :has(), container queries and color-mix() in @supports with 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.

Frequently asked questions

Is Android WebView the same as Chrome?

It is built from the same Chromium code and shares its version numbers, but it is a separate component with a separate update, and some Chrome features (Web Share, notifications, Web Bluetooth, payment handlers) are not included.

How do I see which WebView version a phone has?

Settings → Apps → Android System WebView (or Chrome, on some Android 7–9 phones) shows the version. Inside your app, a page can read it from navigator.userAgentData where available — but not from the user-agent string if the app overrides it.

My build tool already targets 'defaults' — am I safe?

The browserslist 'defaults' query tracks current desktop and mobile browsers, which is roughly Chromium 100+. For older WebViews, set an explicit target such as chrome 80 and rebuild.

Read in the docs

Related tools

Unzip it on a phone today

Upload the ZIP, name the app, pick an icon — and download a signed APK a few minutes later. Free builds, no watermark, no Android Studio.

Convert a ZIP — free site.zip → app-release.apk