#640: User-Agent Client Hints & UA Reduction

Visit on Github.

Opened May 27, 2021

Hi there TAG,

I'm requesting a TAG review of User-Agent Client Hints and the plan to reduce the information available in the User-Agent header, and related JS APIs. The review in issue #467 was previously closed, but I’m requesting a new review now that Chrome is interested in pursuing this plan again.

User-Agent Client Hints defines a set of Client Hints that aim to provide developers with the ability to perform agent-based content negotiation when necessary, while avoiding the historical baggage and passive fingerprinting surface exposed by the venerable User-Agent header.

Further details:

  • I have reviewed the TAG's Web Platform Design Principles
  • The group where the work on this specification is currently being done: WICG
  • The group where standardization of this work is intended to be done (if current group is a community group or other incubation venue): W3C
  • Major unresolved issues with or opposition to this specification: There's some opposition recorded in the “Partial freezing the UA string” review
  • This work is being funded by: Google

We'd prefer the TAG provide feedback as (please delete all but the desired option):

🐛 open issues in our GitHub repo for each point of feedback

Discussions

Comment by @hober May 27, 2021 (See Github)

Hi @miketaylr!

The review in issue #467 was previously closed, but I’m requesting a new review now that Chrome is interested in pursuing this plan again.

Have there been any substantive changes since our last review? If so, could you give us a summary of them, so we know what to concentrate on? If not, I'm not sure what there is to do here.

Discussed Jun 1, 2021 (See Github)

Dan: third thing is about user agent and .. I had a post from chromium about relaunching the plan to deprecate some parts of the user agent string in favour of client hints, and wondering how does this .. what kind of information would you like from the TAG on this? How would you like us to review? How can we be helpful?

Mike: we announced we're ready to re-begin this process to reduce the user agent string, or the amount of information you can fingerprint from the UA string. We want to do this in a safe way, not our intent to break the web, UA strings are very tricky and sensitive to change. We propose an end step process, seven phases. Predicated on our ability to have an origin trial for sites to opt into and tes tproposed changes with a long period of feedback, at least 6 months, so we can discover what we're not thinking of. We've done testing, we think it's safe, but the internet is big and scary, based on this 6 month feedback period if we feel its safe to proceed we do.. first step is removing minor build patch numbers from chromium string and sending 000. It feels like a safe change and if you rely on that information you can get them from clients hints api. Then we aim to change desktop user agent string, then mobile. What you will reliably be able to get without caringa bout client hints is the name of the browser, the platform, major version, and the mobileness. We feel like that covers the majority of use cases for most web apps today. If you need something more nuanced like the device model of your phone for optimization you can request that through client hints. That's a broad overview of the plan. If you find that blog post you can follow a link to th echromium wiki and see all the ua strings at their various phases. What kind of feedback are we looking for? Should we be giving away the platform by default? Prtend everyone is on a windows device becuase its less fingerprinty, but it breaks too much of the web? Real accessibility use cases..

Dan: that information is still accessible via a client hint?

Mike: correct, get it on the next request

Yoav: information exposed by default and considered low entropy are not going to be reduced from the orignal ua string content that relies on the platform, ctrl+c vs cmd+c work even if they don't change their code to rely on the user agent client hints. that and the fact that platform is somehow still already expoed becuase of tcp level fingerprinting that won't go away.

Mike: the legacy part is also important to consider. You could upgrade your site to upgrade that platform information assuming you have a maintained site which is not true for a large part of the web.

Rossen: owe more time on the media feature ones, at least to convince ourselves that some concerns are a non issue. What else?

Dan: we're going to continue to work on this issue, on 604, and get feedback. It's the case that ua string is used for fingerprinting and its well known for years now that privacy focussed browsers are normalising the ua string including the platform. That's what Tor does. Very sympathetic to that. To what extent do small players, some of the use cases around content transcoding in africa for instance where they're using the ua string to identify .. how much are we taking into accoun those use cases? sounds like you are because you're going through this very cautious process and keeping a certain amount of the string, but has that been part of your thinking? how much have you been able to listen to the communityi?

Mike: for background, I spent the last 10 years wokring on web compatibility at mozilla and opera. "All sites must work." Very sensitive to this idea of not breaking the web for users of underdog browsers, or countries that are not 'silicon valley targets'. To the extent that we get feedback from web devs and other interested parties it's in our interest to take that seriously and try to design soultions for that. I expect that during this origin trial feedback period we may learn some uncomfortable facts that cause us to reconsider our plans. Not convinced we know all the answers yet. I'm hopful we can get to a place where passive fingerprinting thorugh the ua string is less fruitful. The client hint reliability effort - how to solve for that on the first request - would solve for use cases where an extra round trip is very expensive. Some evidence that we're trying to make this work for a lot of people.

Hadley: good to hear.

Yoav: also on the feedback front - point of feedback that already changed what's exposed by default is the platform. Mobile vs non mobile.. for the africa use case that was the first case that convinced me that that extra bit of entropy [??] expose by default in order to address the low-bandwidth networks / content adaptation case, I don't now the %, but a large portion, exposing device model by default exposes a ton of entropy. So the calculus there doesn't make sense. But client hints reliability will make it easier for folks to get that on that request. And hosting providers can get that out of the gate without requirng people to create custom server side logic for them

Dan: great to hear. Anything else we can help with right now? What's the time sensitivity of us getting back to you? Other design reviews pending that you're waiting on?

Mike: in the next week or so would help convince some of the blink api owners to be comfortable. Next two weeks is still fantastic..

User Preference Media Features Client Hints Headers - @torgo, @atanassov
Trust Token API - @hober, @torgo, @hadleybeeman, @plinss

Hadley: we left this pending editor update and we have not heard [nudges]

Realms API ECMAScript Proposal - @hober, @kenchris

Peter: tess and ken, but neither are here. [deferred]. The question is the boundary between realms. Dominic has been pushing to make it a callable boundary, that blocked a whole lot of use cases but it looks like that is moving forwad. There's a way, a shim library, which lets you fake sharing objects between realms by wrapping everything in callables. Looks like that's the approach going forward. Not sure that hard decisions were made.

Rossen: what was blocked?

Peter: if you want to ahve an object that is shared between parent and realm; have an object returend by a server along with some js that can manipulate that object but nothing else. Can change internal sate of that object but not access to the dom or navigator state. That's not easily done directly with a callable boundary. This other library they've developed lets you syntehsize something that has callable boundaries that can be passed back and forth between realms. Think we're okay, just a performance question at that point. I think dominic has concerns that without that restriction you don't get some of the security guarantees that people think realms gives you.

Digital Goods API - @hober, @hadleybeeman

Hadley: also waiting for a response [nudged]

Screen Fold API - @torgo, @plinss, @atanassov

Dan: Screen fold renamed device posture. Hasn't been that many updates. Maybe we want to ping the editors and see if there are additional updates since the issue was raised.

Rossen: i pinged them just now

WebID - @hober, @rhiaro, @hadleybeeman, @atanassov

Amy: there was a workshop that Tess attended

Hadley: we got stalled because I asked Sam for use cases. The explainer was talking about improving privacy and security and creating federated ID but not explaining what he wanted to solve. I asked and he came back with the same general words, some examples that explains ome of the problems with the ID ecosystem which are raelly interesting - too many ways of logging into something, the ossification problem that the web hasn't evolved its ID technologoies. I don't see any problems with what he's erecommending, but I'm still not clear what happens if what we're trying to do here is to make it possible to operate with 3p cookies, what happens after you log in and how that's different

Amy: Sounds like a good summary. The core is that they're not coming up with soultions yet - just exploring the problem. They are creating a CG. Maybe there is not much more we can do. Good for us to keep an eye on it. If there's a CG with broader participation that is good.

Hadley: Agreed.

Yves: can investigate the webID CG

Hadley: not really something to review... I think we can give Sam the feedback that what they are exploring makes sense and we support a CG... we'd like to see designs as group comes up with them...

Amy: I'd be "happy" to join the CG.

Dan: I have questions related to the use cases - my question in the session that we held was what cases are you really going after. THey talk a lot about federated identity, but you can still do it... they need to be specific. They know that but have a lot of discussion about cases around federated identity but they're not addressing "and these are the things that cannot be done without 3p cookies"

Amy: other things as well to get ahead of further changes after 3p cookies go away - documented in our minutes from our special session.

Dan: +

Discussed Jun 1, 2021 (See Github)

Dan: Multi-browser?

Tess: webkit did an experiment - have they addressed the issues?

Tess: one of the enginess proposing to standardize something that is happening - what the standardization change?

Dan: UA string not specified anywhere to begin with

Tess: maybe Fetch should specify it?

Dan: Mozilla position "not harmful."

Dan: they've listed some feedback from Safari's UA string freeze.

Discussed Jun 1, 2021 (See Github)

Rossen: not ready to close on this, I think we have other open discussions..

Peter: we don't have Tess or Dan, we have feedback

Comment by @miketaylr Jun 1, 2021 (See Github)

Heya @hober!

Yeah, sorry. It probably would have been useful for me to do so as I filed this 🙈 . The most substantial changes can be summed up as:

  • A more fleshed out spec exists for User-Agent Client Hints
  • The original "UA Freezing" ideas proposed that all non-mobile browsers should report as Windows 10 devices. We've since changed our thinking on this, for reasons articulated in the blink-dev intent to prototype & ship thread. Instead, our current thinking is to keep the platform exposed in the User-Agent string, for compatibility and accessibility reasons (sadly many sites rely on sniffing for platform to handle keyboard shortcut differences between OSes).

edit: perhaps more usefully, these are the major updates since the original intent filed by @yoavweiss, and the ones captured in the Blink Intent to Prototype & Ship:

  1. Sec-CH-UA-Bitness: adds a new high-entropy hint to expose the OS bitness, which may be combined with Sec-CH-UA-Arch to provide optimized binaries for download, for example.
  2. Make Sec-CH-UA-Platform a low-entropy hint: OS is passively observable at the TCP level anyways, so we plan to change this to be low-entropy and send as a default header (similar to Sec-CH-UA and Sec-CH-UA-Mobile).
  3. Include low-entropy hints by default in UADataValues (returned by getHighEntropyValues()). If a hint moves from high to low-entropy, this future proofs any code relying on it.
  4. Add a toJSON method to NavigatorUAData’s IDL. Technically a bugfix, but it is an API change (instead of returning {}, JSON.stringify(navigator.userAgentData)) will now be useful)

In addition, we've merged in 67 PRs to the spec since #467 was first filed (some more substantial than others).

Comment by @torgo Jun 2, 2021 (See Github)

An early question - where does UA Client Hints go after WICG? Is the intention to bring this into the Web Apps working group, for example? It's not clear to me what the trajectory for this is?

Comment by @marcoscaceres Jun 3, 2021 (See Github)

I think they are more of a Web Perf WG thing - hi @yoavweiss!

Comment by @marcoscaceres Jun 3, 2021 (See Github)

Having said that, we can take them in WebApps WG, but we would need to add it as a thing to our charter. Our charter is up for renewal, so it's a good time to add. However, we'd like to make sure there is a support from a second implementer and no objection from a third.

Comment by @yoavweiss Jun 3, 2021 (See Github)

The mental model I had was that each feature that relies on CH could go to the most relevant WG, while the infrastructure could go to WebPerfWG, or ideally integrated directly into Fetch and HTML. For UA-CH specifically, WebApps seems appropriate.

In terms of support or lack thereof, I'll note that Mozilla considered it non-harmful and @othermaciej previously said he's personally "mildly positive" on the direction with a few reservations, but since had at least one objection. I'm hoping these reservations and objections are things that can be worked out in the WG, rather than ones that would block adoption.

Comment by @torgo Jun 14, 2021 (See Github)

As noted in today's call we'll try to prioritize getting back to you with some feedback on the platform issue.

Comment by @marcoscaceres Jun 15, 2021 (See Github)

Sent https://github.com/w3c/webappswg/pull/54 to WebAppsWG to add to charter.

Comment by @torgo Jun 21, 2021 (See Github)

@miketaylr can you give us a bit more info on how other browsers are being engaged on this issue? I see some info about other engines but is there there active engagement?

Comment by @miketaylr Jun 24, 2021 (See Github)

(pardon the delay in response, in the middle of a move)

On UA Reduction:

Mozilla has taken independent steps to begin freezing information in the User-Agent string (see [1][2]), and is positive on the concept in general (see [3]). Apple has also frozen (or capped) most information in the Safari User-Agent string (see [4][5]). We would like to document how browsers have already taken these steps in the WHATWG compat standard (to start with, anyways - it may make sense for this to ultimately live in another spec). We met with Mozilla a few months back to discuss the issue of freezing the macOS version number (we invited Apple, but nobody was able to attend due to short notice). See https://www.otsukare.info/2021/03/02/capping-user-agent-string for minutes.

Personally, I would welcome participation from any browser vendor or interested party to help here: https://github.com/whatwg/compat/issues?q=is%3Aissue+is%3Aopen+%5Buastring%5D

On UA-CH:

Mozilla is neither positive nor negative on User-Agent Client Hints ("non-harmful"). We don't have a formal position from Apple one way or the other, but @othermaciej has filed a lot of high-quality bugs on the spec (only 1 out of 16 remain unresolved, see [6]). Edge has stated that they are supportive of User-Agent Client Hints (see [7]), and have also filed some high-quality bugs on the spec (two of which I hope to address soon, see [8]).

[1] https://bugzilla.mozilla.org/show_bug.cgi?id=1679929 [2] https://bugzilla.mozilla.org/show_bug.cgi?id=1693295 [3] https://github.com/mozilla/standards-positions/issues/202#issuecomment-558294095 [4] https://webkit.org/blog/8042/release-notes-for-safari-technology-preview-46/ [5] https://twitter.com/__jakub_g/status/1398324307814752256 [6] https://github.com/WICG/ua-client-hints/issues?q=is%3Aissue+author%3Aothermaciej [7] https://twitter.com/_scottlow/status/1206831008261132289 [8] https://github.com/WICG/ua-client-hints/issues?q=is%3Aissue+author%3Aerik-anderson+

Discussed Jul 1, 2021 (See Github)

Dan: some resent comments from mike tayor addressing our questions...

Dan: cross-browser discussions important... should we try to help make them happen?

Tess: I think they are happening -- i feel there are good discussions on the open issues... good engagement... one remaining open issue from webkit folks: https://github.com/WICG/ua-client-hints/issues/151

Dan: which leads to - considering we've already fed back positivel on CH - maybe we should close this with a positive review and encourage them to documet all their findings as they progressively freeze out parts of the UA...

Tess: I'd like to say something about the remaining open issue... it would be nice if they resolved it.

Draft closing comment:

'We're largely positive on the approach that is outlined here. We've already positively reviewed client hints. We appreciate the time and effort being spent on trying to ensure a cross-browser solution and also on mitigating against ecosystem issues (breaking existing web content). The privacy benefits of this approach seem clear. We hope that you resolve issue 151 in a way that improves the multi-vendor consensus around this feature. We'd also encourage you to engage with the Privacy Interest Group to get their views. However we are happy to close this review as satisfactory.'

[NB based on further discussion in plenary we decided not to post this.

Comment by @torgo Jul 14, 2021 (See Github)

We've taken note of Mozilla's recent feedback. It looks like information is coming from implementers which would call for more thorough review. @miketaylr do you have any response to Mozilla's position?

Comment by @miketaylr Jul 14, 2021 (See Github)

Hi @torgo, I responded yesterday to some of @hsivonen's comments at https://github.com/mozilla/standards-positions/issues/552#issuecomment-879162601, as they were based on outdated information (or simple misunderstandings perhaps).

I don't fully understand what "Harmful" means in the context of his post, as the info is already available in the User-Agent header. For example, for hints such as Sec-CH-UA-Model (which Firefox does not expose in its Android mobile browser UA strings), the spec explicitly states:

User agents MAY return the empty string or a fictitious value for full version, platform architecture, platform bitness or model, for privacy, compatibility, or other reasons.

If a browser were to implement UA-CH, didn't want to expose Model, or Full Version, etc., it has the ability to respond with the empty string and be conforming - either because some privacy policy or user setting was being enforced (Privacy Budget, Firefox's ETP Strict Mode, Firefox's "Resist Fingerprinting" mode, etc.) - or just because a vendor decides that should be default value.

Perhaps Henri can explain what he means by Harmful here.

Comment by @hsivonen Jul 15, 2021 (See Github)

Perhaps Henri can explain what he means by Harmful here.

There are mainly three kinds of harmful here:

  1. Exposing detail that's not currently exposed or that would be feasible to stop exposing. (The argument that the UA can choose to return bogus values that don't really expose more detail collapses this case to the third case below.)
  2. Added structure making it harder to use lesser structure to have things be multiple ways at the same time for compat. Notably, Sec-CH-UA-Full-Version doesn't allow for a real Gecko version and a fake Chrome version such that there'd be a good chance that sites that haven't considered Gecko would end up seeing the fake Chrome version. (Notably, Chrome has benefited from being able to appear as Safari, Safari has benefited from being able to appear as a Gecko-based browser, and Gecko-based browsers have benefited from being able to appear as pre-Gecko Netscape for sniffing purposes. In that sense, the lesser structure User-Agent has been a feature rather than a bug.)
  3. I don't see the argument that something is already available as a reason to expose it in another way. That adds more bytes on the wire / more API surface / more complexity to the Web Platform, in which case the harm is the data waste or increased platform complexity and not the identifying bits exposed.

I'd like to see an explanation of why having policy/setting/request-budget-API modify the HTTP User-Agent value and the values returned by the existing navigator APIs wouldn't solve the entropy problem that User Agent Client Hints aims to solve. (As noted above, I view structuredness less of a problem that needs solving.)

Having a lot of different headers makes it easier to Vary more granularly (assuming a distant future where you could Vary exclusively on User Agent Client Hints and not on User-Agent at all), effectively leaking a CDN-side concern (since ISP-side caches are no longer a thing) to browsers, but the spec and README only hint at that parenthetically instead of framing it as the big motivation.

Having different levels of fiction exposed via the pre-existing header / APIs doesn't seem conceptually different form returning fictitious values in User Agent Client Hints. AFAICT, if returning fictitious values in User Agent Client Hints is already proposed at this point in time, we might as well not add new headers to requests and not add API surface and put the fiction, perhaps conditionally, in User-Agent and the existing navigator APIs that we already have.

Comment by @miketaylr Jul 16, 2021 (See Github)

Thanks for the reply @hsivonen.

There are mainly three kinds of harmful here:

  1. Exposing detail that's not currently exposed or that would be feasible to stop exposing. (The argument that the UA can choose to return bogus values that don't really expose more detail collapses this case to the third case below.)

For Chromium-based browsers, no additional information about the browser, OS, or device is exposed. For Firefox, I think the only thing that isn't regularly exposed, or possible to infer already is Android device model (please correct me if I'm wrong!).

I'll note that it is possible to expose the device model in the Firefox for Android UA string today, but as far as I'm aware the stock browser does not ship with that enabled using the general.useragent.use_device pref (I wouldn't know if there are partner distributions or Fenix forks that do ship with that on): https://searchfox.org/mozilla-central/source/netwerk/protocol/http/nsHttpHandler.cpp#988-1004

  1. Added structure making it harder to use lesser structure to have things be multiple ways at the same time for compat. Notably, Sec-CH-UA-Full-Version doesn't allow for a real Gecko version and a fake Chrome version such that there'd be a good chance that sites that haven't considered Gecko would end up seeing the fake Chrome version.

This sounds like https://github.com/WICG/ua-client-hints/issues/196, and I agree we should fix this (this was raised by Microsoft as a possible compat foot-gun). I think the right thing to do here is deprecate Sec-CH-UA-Full-Version and adding something like Sec-CH-UA-Full-Version-List that allows for GREASEing on versions. I'm hoping we can make progress on that this quarter.

  1. I don't see the argument that something is already available as a reason to expose it in another way.

I see your point, but one of the things we're trying to achieve - beyond fixing passive fingerprinting via the UA string - is to create a more useful, ergonomic API for developers. UA string parsing is non-trivial and libraries are prone to errors (especially when new browsers are released - I worked for many years trying to get sites to update their site bugs caused by somehow incorrectly identifying the new Firefox OS, Firefox for iOS, Firefox Reality, etc. User-Agent strings). In my opinion its desirable to create a new, cleaner API to expose this information, even if it's duplicative.

I'd like to see an explanation of why having policy/setting/request-budget-API modify the HTTP User-Agent value and the values returned by the existing navigator APIs wouldn't solve the entropy problem that User Agent Client Hints aims to solve.

and

AFAICT, if returning fictitious values in User Agent Client Hints is already proposed at this point in time, we might as well not add new headers to requests and not add API surface and put the fiction, perhaps conditionally, in User-Agent and the existing navigator APIs that we already have.

I don't know how realistically solve for passive fingerprinting in a conditional fashion at the HTTP layer. I suppose you could use a list of trackers (something like DuckDuckGo's or Disconnect's tracker lists) and modify behavior on that existing list. But sites can just create new domains and you have no idea if they're creating or sharing server-side fingerprints - how would the list ever be updated to keep up?

(As noted above, I view structuredness less of a problem that needs solving.)

We'll have to disagree on this point. So many Opera Mobile and Firefox Mobile (Firefox OS and Firefox for Android) compat issues in the early days were caused by mis-parsing the UA string, or assuming all mobile browsers would have similar looking UA strings to the popular ones for a given region. I think providing a better, more predictable API is worth solving for, both for users and developers.

Comment by @eeeps Jul 16, 2021 (See Github)

In the discussion surrounding Mozilla's position change, @hsivonen stated, regarding the browser bugs use case:

This one indeed is something that browsers can’t offer designed detection surface. Still, this generally needs the major version of the engine. Not “brand”, minor OS version, or such.

I wanted to offer a few counter-examples. My employer, Cloudinary, serves a lot of media to Safari on behalf of our customers. Media decoding in Safari is largely handled by the underlying OS libraries, and we have struggled to work around a series of bugs introduced and fixed in minor macOS versions since Apple froze macOS Safari’s User-Agent header on Macintosh; Intel Mac OS X 10_15_7.

<details> <summary><em>That's the gist of it; unfold for gory details</em></summary>

@hsivonen:

An interesting question is how relevant this actually is with current version uptakes for browsers and sites having resources to pay attention to users who for whatever reason aren’t updating according to the rapid release schedule. At the time sites deploy a workaround, they can’t necessarily know what future browser version won’t have the need for the workaround. Can we guarantee only retrospective use? Do Web developers care enough about retrospective workarounds for evergreen browsers?

We never want to ship someone a broken image/video. Part of our core value proposition to customers is handling the complexity of UA-adaptive media encoding/optimization, for them. When we encountered an earlier Safari media bug introduced and fixed before the UA freezing, our flow was to:

  • Identify which types of media were affected, starting with which OS version
  • Deploy new resource generation and delivery logic, keyed on facts about the content and the requests' User-Agents, to avoid sending would-be-affected media to would-be-affected end users. Also bust a bunch of caches, so that the resources behind existing URLs get regenerated using the new logic. Affected UAs ended up getting lower-common-denominator, significantly-less-optimized resources (for instance, when JP2s with alpha started acting up: PNGs instead of JP2s)
  • Find or file browser/OS issues
  • Monitor those issues, and when a version that fixes the bug is released, update our logic again, accordingly. The workaround logic that looks for a range of affected versions then lives on ~forever in our codebase, even though affected requests dwindle over time.

When confronting the more recent macOS media-handling bugs, we can't identify the request's OS, so we create a loose, no-guarantees mapping between browser version (which Safari still reports) and OS version. Because broken media is a much worse experience than unoptimized media, we end up being rather conservative, sending fallback formats to (sometimes many) more people than we need to during the workaround period, and nervously guessing which browser version will almost guarantee a certain OS version, before flipping the fallback switch back off.

Because there are no guarantees, we are almost certainly sending broken media to a non-zero number of end users. Also, the extra cache busting and delivery of unoptimized media doesn't come without costs for us, our customers, and end users. We are very much looking forward to a future in which customers who are particularly impacted by these costs could choose to delegate OS version information to us, via the UA client hints, allowing us to send fallbacks to precisely the end users who need them.

</details>
Comment by @torgo Jul 18, 2021 (See Github)

@eeeps thank you for providing some real world cases! This is exactly the kind of info that is often missing form these discussions.

Comment by @karlcow Jul 20, 2021 (See Github)

@miketaylr wrote:

We'll have to disagree on this point. So many Opera Mobile and Firefox Mobile (Firefox OS and Firefox for Android) compat issues in the early days were caused by mis-parsing the UA string, or assuming all mobile browsers would have similar looking UA strings to the popular ones for a given region. I think providing a better, more predictable API is worth solving for, both for users and developers.

A couple of years ago (during the Firefox OS days), Dailymotion gave me a sample of HTTP user agent strings (it was around 400,000 unique UA strings and their frequency). It included every type of requests browsers and bots alike. They gave the list for access to the API, the CSS file and a static icon. This was a wonderful trove of data.

Google has Web properties with high traffic. (be careful that a sample for a limited period of time during a day will sway the data to a specific region of the world.) Is Google doing statistical analysis on the current UA strings? Are there patterns or features in this statistical set that could be explored?

My thoughts are along,

What are the UA string structure features extracted from the mass of the data (machine learning?) instead of the desired structure of the spec?

Comment by @karlcow Jul 21, 2021 (See Github)

About the cloudinary use case, this is indeed a real use case which has happened multiple times, where web developers will use the specific version number of an OS, or a browser or sometimes even a model to walk around a bug, but this has a cost too.

The optics of Cloudinary is I have a bug to fix with one browser/one OS not doing the right thing at a point in time, and I need to provide an alternate way for the users. And a well maintained Cloudinary providing a Web service to deliver to users works well. This is the poster child of a good use case.

The optics of a browser vendors is there are thousands of websites using libraries that are locally deployed. These libraries have outdated strategies, bugs, and with logics such as:

  • If browser_x, don't send this format (even if the browser_x supports the format in the future)
  • If browser_version > nn sends [this] else sends [that] (even when nn+1 changes the strategy)
  • no fallback, aka sites catering for most popular browsers.

The Webcompat team at Mozilla is catering for this kind of issues relentlessly through the webcompat.com. It takes time, it costs money and it creates a lot of frustration for users.

I agree with @miketaylr that bad parsing has always been an issue, but better parsing will not solve bad and unmaintained logic. I understand @hsivonen about increasing the variability of surface (very similar topic than Variability in Specifications) will probably increase the woes for browsers webcompat teams, issues which are affecting even more browsers with less market shares.

And we can be sure about two things:

  1. that browser implementers will lie about the values provided in Client-Hints in the future because they have to for webcompat reasons
  2. HTTP User Agent Strings will not go away because of legacy web properties.
Comment by @miketaylr Jul 30, 2021 (See Github)

Is Google doing statistical analysis on the current UA strings? Are there patterns or features in this statistical set that could be explored?

My thoughts are along,

What are the UA string structure features extracted from the mass of the data (machine learning?) instead of the desired structure of the spec?

This seems like an interesting discussion to have elsewhere, perhaps in the UA-CH spec if you'd like to file an issue: https://github.com/WICG/ua-client-hints/issues/new, or maybe in the whatwg/compat repo: https://github.com/whatwg/compat/issues/new

The optics of a browser vendors is there are thousands of websites using libraries that are locally deployed. These libraries have outdated strategies, bugs, and with logics such as:

  • If browser_x, don't send this format (even if the browser_x supports the format in the future)
  • If browser_version > nn sends [this] else sends [that] (even when nn+1 changes the strategy)
  • no fallback, aka sites catering for most popular browsers.

Yeah, these patterns are bad, and sometimes browsers or the platform can force developers into these patterns, e.g. when there aren't proper feature detection mechanisms for a given feature, the UA string becomes the proxy for feature support. Or if a browser doesn't expose the buggy OS version number, there's not a lot of great options: browser fingerprinting? not supporting that browser? abusing non-standard interfaces to "feature-detect" a browser? Those options don't seem great.

(I recall a number of years back we couldn't remove the non-standard window.controllers from Firefox because sites were using it to "feature-detect" Gecko:

https://bugzilla.mozilla.org/show_bug.cgi?id=1010577#c5

It seems that's still the case: https://searchfox.org/mozilla-central/rev/9c91451cc2392d942a42493fc895f5aeeddde45d/dom/base/nsGlobalWindowInner.cpp#3035-3037)

I agree with @miketaylr that bad parsing has always been an issue, but better parsing will not solve bad and unmaintained logic.

Yes, agree. It's impossible to fix these mistakes in the deployed web, short of writing a lot of site-specific workarounds (shout out to the Mozilla webcompat team for unbreaking sites for Firefox users).

And we can be sure about two things:

  1. that browser implementers will lie about the values provided in Client-Hints in the future because they have to for webcompat reasons
  2. HTTP User Agent Strings will not go away because of legacy web properties.

re: 1 - Yes, probably. Developers don't always have the best incentives, budget, or even knowledge to make the web work for everyone, unfortunately. But that doesn't mean we shouldn't improve the passive fingerprinting surface that HTTP UA string provides.

re: 2 - Of course. Our UA Reduction plan is designed to be pragmatic and backwards compatible. Nobody is proposing to stop sending the User-Agent header.

Discussed Aug 1, 2021 (See Github)

Dan: Mike Taylor responded 11 days ago to the feedback.. we've had discussions.. I don't see how Mike is addressing the issues raised by Henri. A key issue is about the severity of the issue they're trying to solve.. Henri is saying have you structured.. Mike is saying the UA has been misparsed or all mobile browsers have similar UA strings.. there are a lot of ways that websites misinterpret and send the wrong content because they misinterpret the users intent. The UA string plays a role in many but not all of those. I just saw a tweet from Terence Eden talking about how his portrait orientation monitor means that on some websites he gets a big notice on this monitor saying we don't have a mobile version of this site becuase they assume that if the viewport is portrait it must be mobile. I'ts an example of misunderstanding.

Peter: parsing UA strings has always been hot flaming garbage.[+1 dka] Mainly because all of them lie. Every UA is claiming to be Mozilla. As soon as sites it get it wrong the clients lie about who they are. Standardising what the UA is and doin git in a structured way that parsers are not going to misinterpret is good.

Dan: if we could get consensus on that point it'd be useful to feedback into this arguement. The rest of Henri's argument is this thing you want to make a client hint for isn't very useful and will decrease user privacy. That's an argument that needs to happen at some level, but not sure we need to get into the weeds on which thing eeds to be in the client hints vs not. Feeding that back that it would be a good thing to have more structure, and this is a good proposal for that structure, would be a positive. But I don't know. Good to talk about at plenary?

Peter: I have concerns that.. I accept that client hints break out the aspects, instead of sniffing and deciding i must be mobile because you're in portrait mode I can see you're mobile becuase you're mobile and not make these assumptions. How long is it going to be before someone is incented to lie about this too? Then this will degrade the same way as the UA string. To the extent that this is welld esigned and the dimension sthat you care about are isolated there may not be a need to lie, I hope.

Dan: another point we could ask Mike - why does Mike think that restructuring the UA in this way will incentivise people to lie less? Structurally, is it less incentive for them to lie?

Peter: there's maybe not a good reason to lie about are you mobile or not. They're still giving away I'm version x of safari and if someone makes a presumption based on that because they're doing a bug fix and they didn't check the version, and safari fixed the bug but sites are still working around it, then devices are incentivised to lie about itself. Browsers lie becuase websites make assumptions. Almost every engine claims to be almost every other engine somewhere in its UA string and is doing it to fool a website that has tailored code against their engine that they're trying to avoid.

Dan: asking that in the comment

Discussed Aug 1, 2021 (See Github)

Dan: good discussion here.. I asked about UAs telling the truth more often.. [reads response]

Rossen: is your point that you want to reduce the amount of UA impersonation?

Dan: mike talks about a "hot mess" - what's that about? isn't it the lying? There's so much nonsense in the UA string

Tess: still going to be lying in the new stuff

Rossen: a lot of times we had to impersonate other UAs just so you can get the content. Sometimes you have to pretend you're a different version of yourself because there's content targeted to a version. Content matching is defintely something needed going forward

Dan: I'm wondering if the lying that happens now, the targeting towards specific user agents or versions, is encouraged by the current UA system we have and if there is this additional roundtrip required with client hints would it intrinsically discourage that approach? Would it make i tmore likely we'd see more adoption of feature detection and other things against this trend of ua sniffing?

Ken: some is for analytics

Rossen: if you took your example to the extreme and there are no ua strings at all, everything is done through client hints and feature discoverability, that is the utopia? That way you have various user agents with variosu capabilities and they get the content based on these capabilities. Today for better or worse a lot of these capabilities are discovered through the UA string. That is just yet another capability descriptor, on a macro level. From that point of view I don't think that ua hints add or remove any of the complexity about discoverability, referred to here as 'lying'. The question you probably want to asnwer is if we wanted to have this what is the path forward, is client hints the path forward, to ultimately drop ua string?

Dan: even the proposal on the table doesn't drop the ua string entirely, it simplifies ua string and puts stuff in client hints. To engage with the feedback, part of it was that there are things that are being put into t he clien thints which are additional entropy which are not really needed from a fingerprinting perspective add problems. that's a different issue. That's what's being discussed between henri and mike. I think mike has addressed the issue that I raised.

Rossen: good conversation after it

Dan: trying to figure out how best we can engage

Rossen: conversation is still alive. Maybe best path is to let it play out for longer?

Peter: was there a client hint about what level of js is supported?

Rossen: there could still be new client hints..

Peter: one of the primary use cases for client sniffing is js detection [leaves comment]

Dan: good point about that being one of the core reasons for ua sniffing. Also interesting from an analytics perspective. Important for a minority browser. If every browser masquerades it really doesn't help browser diversity

Tess: in the case of Tor it's a minority browser that really does want to look like every other.

Dan: when you're an effort working in a company and you need to justify the existance of that thing, it's important. Different from Tor. [leaves comment]

Discussed Aug 1, 2021 (See Github)

Dan: note still in progress - i took an action to get a meeting with mike taylor and henri.

Comment by @torgo Aug 9, 2021 (See Github)

@miketaylr discussed again today. We want to try to tease this apart a little. One question that came up : currently browsers lie in the UA string because web sites make assumptions. What tells you that the CH approach will compel UAs to tell the truth more often or will somehow disincentivize them from lying?

Comment by @mcatanzaro Aug 9, 2021 (See Github)

One question that came up : currently browsers lie in the UA string because web sites make assumptions. What tells you that the CH approach will compel UAs to tell the truth more often or will somehow disincentivize them from lying?

Hi, I maintain WebKit's UA string quirks list (currently used only by WebKitGTK). I can pretty much promise that if WebKit were ever to implement CH -- which currently seems unlikely, I believe our position on CH is neutral? -- then we would definitely lie, likely beginning from day one, and likely in the same ways and for the same reasons that we lie in the UA header. How exactly depends on which hints are mandatory to implement in the final spec. We would probably hardcode Safari for the browser name, for example, and maybe let UAs override that at their peril (not recommended). We might choose to lie about CPU architecture or operating system, etc. Unfortunately, we can be certain that telling the truth will cause websites to break in the same ways they do currently with the UA string, so we have extremely low incentive to be truthful.

I'm not sure this is necessarily a bad thing, though. I don't see CH as a way to avoid lying. CH would be a more structured alternative to the UA string, to encourage web developers to avoid accidentally breaking things by misparsing the UA string. Reducing accidental breakage seems good for me. But there will always be websites that decide they do not want to allow access to FreeBSD users or s390x users (yes, these run web browsers!) or whatever, and that means we'll always need to lie.

Comment by @karlcow Aug 9, 2021 (See Github)

Same here than what @mcatanzaro said about WebKit see https://github.com/WebKit/WebKit/commits/main/Source/WebCore/page/Quirks.cpp and https://github.com/WebKit/webkit/blob/main/Source/WebCore/platform/UserAgentQuirks.cpp

and for Mozilla, our team (Mozilla Webcompat team), we do the same things. https://github.com/mozilla-extensions/webcompat-addon/blob/main/src/data/ua_overrides.js https://github.com/mozilla-extensions/webcompat-addon/blob/main/src/data/injections.js

Comment by @marcoscaceres Aug 9, 2021 (See Github)

Ok, so it really comes down to wether having the new structured data is worth the implementation effort here. There appears to be some value for developers - despite the fact that all UAs would continue to (rightfully!) lie.

Without committing to implementation, are Mozilla and WebKit supportive of moving forward with standardization?

I'm asking as Chair of the working group who would take this work on.

Comment by @mcatanzaro Aug 10, 2021 (See Github)

I can't provide an official answer for WebKit. CC: @othermaciej

Ok, so it really comes down to wether having the new structured data is worth the implementation effort here.

Personal answer: CH is surely not any worse than what we have now. But WebKit's bar for feature inclusion is pretty high, and the benefit doesn't seem great.

What would really incentivize implementation would be to combine CH with some very aggressive plan to make it harder to detect what browser is in use, e.g. remove the Sec-CH-UA hint from the spec, then pair CH with a plan to pare down existing UA strings on all browsers, even if it temporarily breaks some websites. Think "remove the string 'Chrome' from the user agent" level of change. Then I could get excited about CH. That would be a pretty huge change though, and I doubt it's in the cards.

Comment by @marcoscaceres Aug 10, 2021 (See Github)

What you propose sounds reasonable, @mcatanzaro. We should also have a similarly high bar for standardization, as per WebKit - as without implementer backing, there is little point in doing the standardization work.

@karlcow, should we drag in a few more Mozilla folks? Maybe @tantek, as he was at present at the meeting with the Google folks. I see Mozilla's position on this remains marked as "harmful", and it echos @mcatanzaro concerns above.

The relevant parts of Mozilla's objection to this proposal:

In addition to not including this information [Sec-CH-UA], we would prefer freezing the User Agent string and only providing limited information via the proposed NavigatorUAData interface JS APIs. This would also allow us to audit the callers. At this time, freezing the User Agent string without any client hints (which is not this proposal) seems worth prototyping. We look forward to learning from other vendors who implement the "GREASE-like UA Strings" proposal and its effects on site compatibility.

@miketaylr, @yoavweiss, as the folks proposing this, are you willing to reduce the design to align more closely with what WebKit and Mozilla are requesting (maybe drop Sec-CH-UA entirely, work together to freeze the UA string, and maybe just expose the JS API)?

Comment by @hsivonen Aug 10, 2021 (See Github)

@miketaylr

I don't know how realistically solve for passive fingerprinting in a conditional fashion at the HTTP layer. I suppose you could use a list of trackers (something like DuckDuckGo's or Disconnect's tracker lists) and modify behavior on that existing list. But sites can just create new domains and you have no idea if they're creating or sharing server-side fingerprints - how would the list ever be updated to keep up?

Currently, conditional exposure of low vs. high entropy UA Client Hints is being proposed. Apart from the structuredness concern, what would be worse if the same mechanism controlled low vs. high entropy User-Agent value instead?

(This should not be read as an endorsement of the proposed opt-in mechanism.)

Comment by @miketaylr Aug 10, 2021 (See Github)

Hi everyone, lots to reply to. I will try my best.

@torgo wrote:

One question that came up : currently browsers lie in the UA string because web sites make assumptions. What tells you that the CH approach will compel UAs to tell the truth more often or will somehow disincentivize them from lying?

UA-CH wasn't design to prevent browsers from lying, and I don't think any technology can account for the many constraints (technical or otherwise) that cause developers to gate experiences against allow- or block-lists for browsers (as much as we might disagree with these decisions).

To recap, UA-CH is attempting to solve 2 problems: 1) reduce passive entropy sent over the network, and 2) break free from the legacy hot mess that is the UA string by providing an actual API (HTTP and JS). However, part of 2 tries to account for the reality that sometimes browsers need to lie to get things to work. Revisiting https://wicg.github.io/ua-client-hints/#grease is probably worthwhile.

So I think the framing is backwards a bit - with brand lists in Sec-CH-UA, we're trying to disincentivize sites from creating inflexible allow- or block-lists, or sniffing for a single ossified string. In a way, this allows for UAs to both lie and tell the truth without punishing users, e.g., you could imagine a site that is sniffing for "Chromium" in the brand list - Firefox could send:

sec-ch-ua: "Chromium";v="92", " Not A;Brand";v="99", "Firefox";v="99", "Gecko"; v="99"

That should unbreak the site, and Firefox usage doesn't disappear from the analytics of a given site, with all the expected negative consequences (which is a trade-off that needs to be considered when doing UA spoofing today). Similarly, some WebKit port could always send "Safari" in addition to "WebKitGTK" to avoid being told it wasn't supported on certain sites (or whatever the right values would be, I admit I don't know a lot about the WebKit embedder ecosystem).

Sec-CH-UA doesn't prevent sites from being inflexible - there's plenty of ways to accomplish that. But hopefully it provides useful flexibility to browsers to benefit their users.

I probably should have read @mcatanzaro's reply before writing the above, because I think we're in agreement. Particularly here:

I'm not sure this is necessarily a bad thing, though. I don't see CH as a way to avoid lying. CH would be a more structured alternative to the UA string, to encourage web developers to avoid accidentally breaking things by misparsing the UA string. Reducing accidental breakage seems good for me. But there will always be websites that decide they do not want to allow access to FreeBSD users or s390x users (yes, these run web browsers!) or whatever, and that means we'll always need to lie.

@mcatanzaro also wrote:

What would really incentivize implementation would be to combine CH with some very aggressive plan to make it harder to detect what browser is in use, e.g. remove the Sec-CH-UA hint from the spec, then pair CH with a plan to pare down existing UA strings on all browsers, even if it temporarily breaks some websites. Think "remove the string 'Chrome' from the user agent" level of change. Then I could get excited about CH. That would be a pretty huge change though, and I doubt it's in the cards.

This reminds me of a conversation I had with @yoavweiss at TPAC when I worked for Mozilla, and he proposed all browsers sending the same frozen UA string. It's certainly an interesting thought, but also a little bit scary when you consider what might break for folks to get there, especially in the long-tail of the (unmaintained) web. I also wonder if this pushes developers to get more creative in their fingerprinting techniques to work around engine bugs, or sniffing for platform features where the feature detection story isn't great. Something to think about (and a great reason to improve the feature detection story for the platform).

@marcoscaceres wrote:

I see Mozilla's position on this remains marked as "harmful"

And then quotes part of the rationale:

In addition to not including this information [Sec-CH-UA], we would prefer freezing the User Agent string and only providing limited information via the proposed NavigatorUAData interface JS APIs. This would also allow us to audit the callers. At this time, freezing the User Agent string without any client hints (which is not this proposal) seems worth prototyping. We look forward to learning from other vendors who implement the "GREASE-like UA Strings" proposal and its effects on site compatibility.

Fun fact, I helped to write that rationale back when Mozilla considered UA-CH "non-harmful", jointly with :mt, IIRC. Not sure if they meant to keep that original language, or if it was left in unintentionally (the "[w]e look forward to learning from other vendors" part in particular doesn't quite jive with "harmful"). It may be useful for someone from Mozilla to make sure it reflects their current thinking. (I'll also note that auditing origins that request client hints via Accept-CH is also possible at the HTTP level, not just the JS interface.)

@miketaylr, @yoavweiss, as the folks proposing this, are you willing to reduce the design to align more closely with what WebKit and Mozilla are requesting (maybe drop Sec-CH-UA entirely, work together to freeze the UA string, and maybe just expose the JS API)?

I'm willing to consider a lot of things, especially if there is genuine implementer interest. :) The most useful thing for folks proposing these kinds of changes would be to file issues on the repo. I think getting rid of the HTTP component of UA-CH wouldn't be an improvement, but that's a conversation that can be had in a relevant spec issue.

@hsivonen wrote:

Currently, conditional exposure of low vs. high entropy UA Client Hints is being proposed. Apart from the structuredness concern, what would be worse if the same mechanism controlled low vs. high entropy User-Agent value instead?

Are you suggesting a default low-entropy UA string (this is Chrome's current thinking for the Reduced UA string), and a client hint to opt into a high-entropy UA string? Do you think a site should get all the entropy, even if it might just need platform version, for example?

In a world where something like Privacy Budget existed, if I have a given entropy budget I would want to only request exactly what I needed to avoid going over. If my only choice is "low" vs "high" entropy UA string with more info than I need, that perhaps creates a challenge for me.

The decomposed UA client hints allow me to be more granular in my requests. For example, I can ask for device model if that's the only thing I need to verify a mobile browser is capable of handling a device-specific Android intent (feels a bit contrived, but consider the Firefox Mobile UA override for the Samsung Galaxy store).

(I might misunderstand your question or thinking, feel free to correct me).

Comment by @marcoscaceres Aug 11, 2021 (See Github)

Thanks @miketaylr. I filed a bug over in the other repo proposing this becomes two separate specs (http headers + JS API): https://github.com/WICG/ua-client-hints/issues/249

Not sure if that will make things more palatable for potential implementers, but... maybe 🤞?

Comment by @hsivonen Aug 11, 2021 (See Github)

I also wonder if this pushes developers to get more creative in their fingerprinting techniques to work around engine bugs, or sniffing for platform features where the feature detection story isn't great.

Authors assuming a correlation between e.g. engine-specific properties existing on window and a particular quirk existing indeed is more problematic to deal with after the quirk is gone than faking User-Agent or Sec-CH-UA.

Currently, conditional exposure of low vs. high entropy UA Client Hints is being proposed. Apart from the structuredness concern, what would be worse if the same mechanism controlled low vs. high entropy User-Agent value instead?

Are you suggesting a default low-entropy UA string (this is Chrome's current thinking for the Reduced UA string), and a client hint to opt into a high-entropy UA string? Do you think a site should get all the entropy, even if it might just need platform version, for example?

I'm asking what if the opt-in mechanism was the same (or functionally equivalent) to what you a proposing for high-entropy UA Client Hints. So to the extent what you are proposing is granular, I'm asking about a granular opt-in scenario for now.

Comment by @miketaylr Aug 18, 2021 (See Github)

@hsivonen Can you re-phrase, perhaps with an example? I don't fully grok your request. As I understand it, client hints is granular and allows for granular opt-in.

Comment by @hsivonen Aug 19, 2021 (See Github)

Can you re-phrase, perhaps with an example? I don't fully grok your request. As I understand it, client hints is granular and allows for granular opt-in.

Currently, UA Client Hints doesn't send Sec-CH-UA-Platform by default has an opt-in mechanism where the server sends e.g. Accept-CH: Sec-CH-UA-Platform and then the browser starts sending the platform in Sec-CH-UA-Platform.

The corresponding alternative that I'd like to understand the evaluation of would be:

  1. By default send a User-Agent header that claims Windows even on non-Windows platforms.
  2. If the server sends Accept-UA: platform (making up syntax for illustration), subsequently the browser sends a User-Agent header with the real platform (which may still be Windows). (And don't send any Sec-CH-UA-* headers.)

Currently, UA Client Hints proposes getHighEntropyValues for obtaining the platform via JS.

The corresponding alternative that I'd like to understand the evaluation of would be:

  1. By default, make navigator.platform return a value corresponding to Windows regardless of actual platform.
  2. If the page calls navigator.getHighEntropyValues(["platform"]) and the resulting promise has successfully resolved, thereafter make navigator.platform return a value corresponding to the actual platform (which could actually be Windows). (And adjust the value returned by navigator.userAgent accordingly as well.)

(The point here being that this kind of arrangement would leave less detritus around if the initiative fails whereas there is currently a real risk that if the initiative fails, the headers that Chrome now sends by default, Sec-CH-UA and Sec-CH-UA-Mobile, will stick around approximately forever.)

Comment by @miketaylr Aug 23, 2021 (See Github)

Currently, UA Client Hints doesn't send Sec-CH-UA-Platform by default has an opt-in mechanism where the server sends e.g. Accept-CH: Sec-CH-UA-Platform and then the browser starts sending the platform in Sec-CH-UA-Platform.

This used to be true. In https://github.com/WICG/ua-client-hints/pull/221, Sec-CH-UA-Platform was changed to a default, low-entropy hint (which was implemented in Chrome 93 and should ship to the stable channel later this month). The rationale can be found in the linked issue, or in this doc I wrote up (the tl;dr is compatibility concerns and platform is passively observable anyways, unless you're behind a network proxy, for example).

The corresponding alternative that I'd like to understand the evaluation of would be: By default send a User-Agent header that claims Windows even on non-Windows platforms. If the server sends Accept-UA: platform (making up syntax for illustration), subsequently the browser sends a User-Agent header with the real platform (which may still be Windows). (And don't send any Sec-CH-UA-* headers.)

This is partially the original design of UA-CH (default everything to Windows 10), but as that linked doc describes, it's not currently shippable on the web without breaking some important a11y use-cases on legacy sites (primarily keyboard shortcuts).

(Note: It's entirely possible that my conclusions are incorrect. This is where another browser engine experimenting with these ideas would be useful!)

Like @marcoscaceres suggested in https://github.com/w3ctag/design-reviews/issues/640#issuecomment-896413026, I'm open to doing the work to split the spec between HTTP and JS APIs if Mozilla would like to experiment with your proposed alternative through the JS interface. https://github.com/WICG/ua-client-hints/issues/249 would be a good place to follow up on that. If you all find that's a workable solution, I am willing to incorporate that feedback into the UA-CH spec.

Comment by @plinss Aug 25, 2021 (See Github)

These days one of the main uses of UA sniffing is to send different JS bundles, has there been consideration of a client hint that exposes the supported level of the ES spec?

Comment by @yoavweiss Aug 25, 2021 (See Github)

https://github.com/whatwg/html/issues/4432 is a relevant discussion for a related markup-based feature, that didn't go anywhere due to lack of consensus.

There have been Google-internal initial conversations about a "browser build year" hint/markup that can partially tackle that use-case, hopefully in a less controversial way. I'm hoping those conversations can be made public soon.

At the same time, I don't think this is directly related to UA client hints, but can be discussed separately.

Comment by @yoavweiss Aug 26, 2021 (See Github)

@plinss - @jridgewell just published a document on the front of ES support levels.

Discussed Sep 1, 2021 (See Github)

Mike: update on what's happened since we last chatted - we have yesterday published an update on the user agent reduction timeline. Before it was an abstract plan, now there are milestones associated with the changes (Chromium milestones). We still plan to give the ecosystem plenty of time to test. An origin trial starts next week and runs for 6 months. Sites can opt in to our vision and give us feedback and let us know - hey this breaks the web, we're doing it wrong, we'll evauate that feedback. That's the UA reduction bit, I think that's less controversial, I understand mozilla is positive onthat set of changes, but can't speak for them. In terms of user agent client hints, we've ladned a few changes since some of the feedback we recieved. Henri in particular had feedback it would be impossible to represent the real gecko version in addition to if they had to spoof as some other browser. We landed a new hint last week called the full version list hint. This is in response to feedback we received from edge team, as chromium embedders that the original design was too tightly bound to Chrome thinking.

Dan: one of the things I'm keen to hear about is the feedback on the use of client hints separate from the feedback on client hints themselves. I'm curious to know what if any is the feedback on this proposal stemming from a general antipathy towards client hints, or is there a middle ground of the use of client hints for some metadata that we could stake out a consensus view on. I may be jumping ahead of the discussion but that's a thought I had. Get under the skin of the feedback and whether or not we can drive some good discussion for consensus.

Mike: Full version list client hint allows a browser to send multiple version, eg. gecko could send a gecko version adn a chromium version if it was compatible with that set of features. Embedder like Edge which operates on different versioning schemes could do so.

Henri: the main issues are is this shuffling stuff around, can we not do the reduction in the old place and then how wasteful is this in terms of adding headers even though header comprehension exists.. added stuff to everything.. what if this catches on just enough that some sites use it but most don't, okay it didn't work out but some sites got stuck with it. How difficult is it to take a step back? One of the concerns that we had that seems now resolved that makes the objection less strong than it was is the thought that this would expose stuff that wasn't currently exposed or was otherwise going away. So that if actually it is so that this doesn't expose things that weren't previously like the specific patch level of the engine or the OS or the model of the mobile device, if that's the case, then obviously that objection isn't strong and is a misunderstanding.

Mike: Martin Thomson filed a really nice issue on github - I'll try to address that in the next week or two - to clarify we do not intend user agent client hints to be a honeypot for additional entropy or information that's not currently available. Privacy is the primary goal here. For user agents that do not currently expose some information, firefox historically has not epoxed device model, the spec will not require that they start doing that. I'll go in and try to make that extra clear. I'm happy to hear that we're aligned on that.

Henri: the issue of to what extent less structure is a bug. Clearly it is a bug in the sense that there is a long history of user agent detection going wrong because of the non structured ness of this data. But then to what extent it's a feature, all the browsers that have claimed that put the name of the previous market leader at the time of their launch in their UA string, IE did this, safari did this, chrome did this.. so clearly there is this use case of making things sniff both ways at the same time, so IE sniffs as mozilla, webkit sniffs as gecko, chrome sniffs as safari, especially the ua full version didn't have this kind of having it both ways and opened the question of if the ua full version is going to happen does it mean that it's just a complicated calendar that's based on chrome's release cycle, instead of saying a year and a month you map it to chrome's release calendar and go from there?

Mike: yeah we built a really complicated calendar, unintentially. We took that feedback about UA full version and recognised that this is not great. We updated the spec with the idea of a version list. We could represent your full version which should be different from chrome's but you could also send a chrome version for a certain site that was doing bad things the idea that you mentioned about the lack of structure being a feature not a bug we've tried to design with that princople in mind. We have this notino of a brands list, you don' thave to say hey I'm chrome. Currently al ot of browsers have user agent spoofing mechanisms, for certain sites they'll say I'm the more tested browser so the idea of this brands list and the version list is you can say I'm chrome and also firefox .. I support the same things that this other mor ewell tested browser supports so you shouldn't block me from your website.

Dan: from a perspective of the Samsung minority browser, we run into the issue of where ua sniffing locks us out because somebody goes to a website using samsung internet, it works completely fine, but they see samsung and they say you must use chrome. How does this proposal address that case?

Mike: this concept of a brands list, where you have a brand which is defined as your marketing version name - samsung, chrome. You also have these equivalency classes. You can stick as much or as little in yoru blrands list as youw ant. You might want to say I'm samsung and I'm chromium. that's true. We want to encourage sites to feature detect and care about capabilities and not strings, but in the case where they make some misguided decision where they say we require these apis that are only spuported in chromium, if samsung is presentin gits brands list as samsung and chromium and the site is looking for chromium that sholud be a better outcome. Developers are clever so they may do different weird things. But that's the intent. There's this notion of ?? in the brands list, sticking this nonsense string in there to prevent sites from hardcoding a serialised list. If you do that yo'ull fail, it changes from version to version. TO encourage people to make smart choices and not do the old style exact match ua sniffing.

Peter: from the positon of why do people sniff ua strings and one of the more common use cases is detecting what level of js so we know what version of compiled script files to send. Struck me as odd that wasn't called out in the client hints. If we're reducing ua strings the fact you can no longer get that behaviour, seems like a common use case we want to support

Yoav: I think people will still be able.. because th elevel of js support is something tha tis dependant in the broader brand and singficant version that is somethig npeople will be able to do. Ideally we would provide an alternative mechanism for them to do that. There has been a long discussion on the html issue regarding what such a mechanism may look like. there is not a lot of consensus around what we can expose and how we can claim that js support. Theoretically we could say ES18 is suported and that means something. But it's hard to get everyone to agreeon what that something would be. So i'm hopeful we'll be able to do that but this is not part of user agent client hints right now. Or in general we also talked about declarative mechanisms to do teh same thing as an attribute on script tag which would have been useful but thep roblem is defining what the thing is rather than the deliver mechanism. Once we have defined a way to do that negotiation it can be either on the client side or on the server side using client hints

Peter: wanted to make sure it's part of the pipeline. Detecting brand or engine is fragile. What happens with a new brand comes out?

Yoav: agree

Henri: one point: the documents didn't motivate - multiple headers on http caching... some edge caching concerns... to what extent is it considered - instead of browsers adding new headers - add response headers - caches adding new features to be able to vary on contents of ua string ... mobile header is a boolean - looking for mobi substring - browsers wouldn't have to send that on every request if there was a cache feature - this cache entry is for ui hearder that doesn't contain mobi, this one is...

Yoav: multiple proposals in http working group for creating a better vary - key header was a proposal and died. Now variations proposal. Generally modify how caches work is hard - and caches don't update as often. I understand it - there could be potential for better variance mechanisms - but likelylook for deployment is not high...

Henri: "lets add this stuff ot every request in browsers because this other software over here won't update" isn't that great

Yoav: not the only motivation, but.. I think we can talk about the actual cost. It's a non zero cost is true even with h2 and h3 header compression but becuase they are static request headers the cost for the first request is the full length of the header but for follow up requests, long lived collections, the cost per request is in theorder of a few bytes. Would you agree?

Henri: I havent measured it. That seems plausible in the presnce of cross request header compression.

Yoav: from that angle the extra cost doesnt' really .. assuming the headers are used the extra cost is not high. Even when they are not used they are not likely to be the extra bytes that throw the request above the threshold of an mtu and move it to the next ?? beyond the current conditon window. I suspect that event hough you're right an dthe cost is nonzero it is very close to zero in real life at least for h2 compression scenarious

Henri: since there is now a proposal for requesting these opting in on the tls layer what are the implications ... that on its own feels very complicated, should we back down if it gets this complicated? but if that complication is going to be there do these headers still need to be sent by default as opposed to the default set being empty and having to opt into each and everyone on on the tls layer

Mike: the complication is real. There's two modes to do this, we call this client hints reliability. oneis not complicated, there's a http header call critical ch - pass client hints tokens as you would accept-ch. Doesn't require any special backend knowledge, just http. If you can use client hints you can use critical-ch today. The accept_ch tls frame bits is more complex but it's no more complex than deploying h2 if you're already sending ?? strings we're effectively doing the ame thing there. Kind of a choose your own adventure - opt into a as much complexity as you need depending on your use case. Not a requried path for average web developer or ecommerce site or whatheveyou. Second part about the headers default headers?

Henri: shold the default set be empty so anyone who wants to have them in the as soon as they appear in the current default scenario that anyoen who needs them on the first request would negotiate them on the tls handshake?

Yoav: the decision from my perspective to make those headers on my default rather than off by default like all the other client hints was that they covered a good chunk of todya's use cases and therefor it seemed reasonable to continue to expose them byd efautl without requiring folks to go to the length of making sure they're tls stack supports the accept_ch frame. Also in terms of order accept_ch was added later. It's still not necessarily as easy to deploy as we would like. It's a new feature taht requires support from the tls stack. It's a new frame for h2 and h3 but it requires some tls support for th eunderlying mechanism to deliver those frames. At least for the basic case of people using passive entropy that we send by efault ain the ua string it seemed reasonable to cover most of those cases mainly bug workarounds that are based on browser version, mobile adaptation based on the mobileness bit or mobi string so people can serve a desktop site and a mobile site even though that's also not a practice i'm a fan of but this is how the web works today. The recent addition for platform which mike can speak more on the motiation behind that, but the justification for why it's okay to expose it is it's already sniffable. The entropy is already exposed through the tcp stack in many cases. there were use cases for that as well.

Henri: the reason for not to do that was considering entropy rather than considering do we want to send these bytes along

Mike: it's a privacy plus compatibility motivation. We're ranking those ahead of network cost. not saying one is not important but that's the primary thinking.

Dan: something yoav said about the mobi-ness bit - if responsive design is something we want to push people towards becuase its more inclusive and can make a better web for everybody should we b adding features to the platform that help people reinforce this bad practice of having a mobile site insteda of using the tools of responsive design? Trying to think, there are a lot of other reviews we've done of new tech wehre the somebody says we're just trying to replicate something that's happening on native and that feels almost similar. Wait a second, we're supposed to be having a higher quality bar for new things coming onto the web. i take your point about not breaking things that are working a certain way but is there a way to design this feature that could encourage, to make it more dificult.. wouldn't it be better ot add an extra step forr people who want to kno wwhether it's mobile or not vs just using the tools of responsive design to begin with?

Mike: good question. My natural thinking here is.. I don't have a great answer. One of the arguements we're making with this api is an improvement over ua parsing which is fragile. if we apply structure to whatever signal the ua string is providng that feels like an ergonmics win for developers. But I hear you is that a carrot we should be providing? If it didn't exist would people stick to the old methods that are hostile to new mobile browsers, etc? Even though in a perfect world we all just do responsive design

Henri: this goes to the core of client hints in general. If we consider a client hint for the viewport width vs media queries. In netscape 4, maybe earlier, pre gecko, there was a time when if you resized the window in netscape under certain conditions would cause a reload. With media queries all th einformation is on the clientside so if you hav ea mobile device and you rotate it the width media query matches and after you rotate it it adapts on th device instead of reloading. If you hav eaclient hint on the http layer that declares viewport width is this, then you rotate the device, do you go back to the pre gecko days of that causing a reload? or you have the request what they were before you rotated it and now you do whatever the css says within the constraints of what the requests were. If you want th efull adaptation you need to reload. The act of resizing or rotating a mobile device causing a reload is very clearly a step back. That's my general concern with client hints the original set and I think this quesiton that Dan asked is pretty much on the same theme in terms of okay there are people who ant to do this adaptation on the server but we have this stuf fin css and so forth that does it on th eclien tand it's better. But they still want to do this other thing, so do we do more specific and granualr tools to do the sort of thing, or do we tell them no you're doing it wrong and use this thing that's conceptually on the other side

Dan: my initial uesion was not about shoul dthe information be available at all, but rather should it be available by default? by making there be an extra step in order to understand that bit of information might that nudge more content to be built along responsive design means?

Yoav: Changing the way that the web is built today is not trivial. Client hints gives us a way to do that in steps in a way. Yes we can expose the mobile bit today but a few years down the road make it an opt in rather than being exposed by default, or add some cost to it. I don't know. at the same time there are also.. initially we weren't planning on exposing it by default and there were a lot of use cases and people crying otu saying that this is how they serve their site and otherwise they will just have serve bloated sites to people in developing countries and that would result in an adverse effect. there's a complex tradeoff here

Dan: there's reality vs theoretical purity..

Dan: it was good to hear Henri some of the objections seem to have been addressed or .. I'm tryign to think about this from the perspective of our review. One thing we try to focus on that we have a strong TAGvalue statement about multiple implementations. When we're reviewing something and we all are nodding our heads there oculd be a group think going on and if we then see a negative review coming from an implementer or we see signals that one implementer is interested but others aren't interested or actively think it's harmful then that's a signal that plays into our review. It's important that we're not fragmenting the web by making more code paths necessary becuase certan thing work with certain browsers, there's already too much of that. I'm interested to know is there a core of this proposal that mozilla would consider implementing?

Henri: I can't make a statement of that kind

Mike: go back and chat with your standards leaders. Marcos had a suggestion in the thread - based on the current reading it's confusing that it's harmful... path forward.. acrobatics.. an http ua ch and a js ua ch... mozilla has interestin the js side of things

Henri: considering that the navigator objects fields are already more structured than the ua string itself what do you see as the main benefit of a new js api compared to the current level of structuredness of navigator.oscpu or navigator. anything else?

Mike: really not that much structure.. user agent echoing http.. oscup which is gecko only.. navigator platform.. some notion of architecture.. appinfo.. you have if you squint structure. You still have to parse these strings and subset them and try to do clever things due to that. So structure is one of the most important arguments there. Right now the firefox people are doing experiments what happens when we hit version 100. We're starting to think about this as well. one of the bugs filed was osmeone was doing an index of and math to know which version and which codepath to take. that stuff goes away if you have clean interfaces to get at platform os etc. The other argument which i know mozilla was in favour of.. martin talked about, the standards position talked about, when you've go tthese active interfaces on the clientside the os can audit them. You can see the callers knwo the origins, something could hook nicely into enhanced trakcing protection. Strict mode doesn't get any ofthis stuff, standard mode gets low entryopy stuff. hard to do when navigator.useragent has a big old string.. you odn't know what folks are asking for and what they're trying to do. in terms of user control you can do interesting product things through this type of api

Henri: navigator.stuff is not strucutred in the right way?

Mike: you could say that.. it's a "hot mess" is how you'd say that in Texas. One of the nice things about the api that sits on top of navigator, you have this get high entroy pmethod.. we split up between low entropy and high entropy, we claim mobileness platform signficant version is low entropy, other stuff like cpu or device model .. if you're trying to provide an optimised download experience or work around a bug, you need to request that, it's an async interface, th eua can make different decisions, browsers can have differne tpolicies, you can reject it based on user choice or ua policy

Henri: is it web compatible every to reject tha tpromise as opposed to always accept it and make the apis return lies?

Mike: I'm bad at predicting the future. i would hope it's web compatible. Ithink if you have the most tested browser ships one behaviour and its the only browser that ships it for 10 years it's sailed.. if we have multiple implementations with differnet opinions developers need to make better choices. If a browser like safari has something like itp has something liek a browse rlike firefox which has something like etp or chrome which has privacy budget.. there is a possible future where developers ar etrained to get this right. Realistically though like you're saying history has not always been kind ot us and browsers have to lie.

Dan: what do we expect very privacy focussed browsers to do with this technology? is the expectation that they would 'lie'? If you're Tor you want to advertise that everybody using yoru browser is using window,s firefox, that they have this completely generic advertisement of what they are so it makes it more difficult ofr peopel tp rofile and fingerprint the users. Is that something that's allowed for?

Mike: yeah. It's allowed, you should be able to do that. the Spec explicitly carves out.. I'l try to make this more clear, but today it talks about the empty string is always a valid answer and you're allowed to return other values. Some browsers would want to lie, hide in the crowd, give as little entropy as you can. Firefox has a resist fingerprinting mode that does somethign similar. there's nothing in the spec that requires you if you wanted to pass all the tests to give away something you don't believe should be given away.

Dan: this has been a good discussion, teased out helpful stuff.. I'd love to hear more about if and how anything today changes the official mozilla standards position on this? that would deifnitely be useful to know for the purposes of resolving our review. What would you like to see TAG do next? Our default would be to continue to monitor this issue and see if consensus starts to emerge we can say it looks like things are moving and close it.. but if there continue to be major disagreements there's a role for TAG to play in trying to mediate that discussion.

Mike: sounds good. We have some feedback from mozilla that I need to address in the spec, especially around privacy and entropy. Once I do that maybe I might open a new standards position issue and say we think this should be considered?

Henri: probably better to open a new one and refer to the old one, so that whenever there's a change there is an issue for that, but point people subscribed to the old one to the new one.

Mike: I'll ask mozilla.. and we'll take it from there. I'd love to know Apple's opinions. (And then I'll ping the TAG thread with the new issue, so everyone can be aware.)

Dan: we won't take any action at this point but it's clearer where we're at.

Comment by @hsivonen Sep 13, 2021 (See Github)

In WICG/ua-client-hints#221, Sec-CH-UA-Platform was changed to a default, low-entropy hint (which was implemented in Chrome 93 and should ship to the stable channel later this month).

That the set of sent-by-default Sec-CH-UA-* headers has grown already does not look good for the notion that UA Client Hints is opt-in.

Header compression makes the number of bytes fewer than the obvious HTTP/1.x length, but even with compression, there's non-zero overhead to sending the default UA Client Hints to every site.

Comment by @miketaylr Sep 14, 2021 (See Github)

FYI, we published an update of our UA Reduction plans today with projected timelines and Chrome milestones: https://blog.chromium.org/2021/09/user-agent-reduction-origin-trial-and-dates.html

Comment by @hsivonen Sep 15, 2021 (See Github)

A couple of additional questions:

  1. Was introducing a HTTP cache feature for varying on parts of the User-Agent header considered? (For example, instead of introducing Sec-CH-UA-Mobile in order to be able to say Vary: Sec-CH-UA-Mobile, introducing a response header like Vary-User-Agent: Mobi with the semantics that the content varies based on whether the User-Agent header had the substring "Mobi".)
  2. Considering that there's a proposal to add a TLS-layer CH opt-in mechanism (which in itself looks like rather excessive complexity as the first impression), has not sending any Sec-CH-UA-* headers by default (i.e. requiring TLS opt-in even for the basic stuff) been considered?
Comment by @hsivonen Sep 22, 2021 (See Github)

Here's a consequence of header proliferation that doesn't depend on the number of bytes but on the number of headers: https://twitter.com/ericlaw/status/1440051277564551181

Comment by @eeeps Sep 22, 2021 (See Github)

@hsivonen Dug into this a little; for Apache, at least, the default limit has been 100 headers for at least 22 years. Do we have any way to see how many people may have customized this down, such that 16<n≤100 headers results in failures?

Comment by @hsivonen Sep 23, 2021 (See Github)

It turns out that the Rust httparse crate shows 16 in its README. This has been copied around. Mozilla has run into this previously.

Comment by @miketaylr Sep 23, 2021 (See Github)

It turns out that the Rust httparse crate shows 16 in its README. This has been copied around. Mozilla has run into this previously.

Ah, sad - I remember that bug...... I just filed a PR on the README to be consistent with the docs examples (which is 64): https://github.com/seanmonstar/httparse/pull/105

edit: PR was merged.

Comment by @miketaylr Sep 23, 2021 (See Github)

has not sending any Sec-CH-UA-* headers by default (i.e. requiring TLS opt-in even for the basic stuff) been considered?

This is already true for non-secure sites (for any client hints, not just UA-CH).

And I agree that ACCEPT_CH is fairly advanced for most use cases, which is why there's a plain HTTP Critical-CH mechanism to get similar functionality. But I think requiring ACCEPT_CH to get any UA-CH puts the entire feature set, and all its benefits, out of the reach of the vast majority of web developers.

Discussed Dec 1, 2021 (See Github)

Dan: Some updates from September.. no update recently. Looks like there's work ongoing.

Rossen: we discussed UA client hints..

Dan: mozilla said it was harmful, authored by henri, so we got them on a call, sounded like some softening of mozilla's position but I haven't seen.. but good discussion between them. I don't know what has happened since then.

Ken: do they want to ship this in the next version?

Dan: mozilla has changed their position to be non-harmful

Ken: in the next version of chrome they have something.. a subset that is going to ship?

Dan: I'll write a comment asking for more info.

Peter: concerns about proliferation of headers, and js versioning. Looks like they're working on it.

Comment by @torgo Dec 13, 2021 (See Github)

Hi @miketaylr can you give us an update on this? It looks like Mozilla's position has shifted and https://mozilla.github.io/standards-positions/#ua-client-hints it looks like you're shipping this in Chrome 98 https://chromestatus.com/feature/5703317813460992. Have the issues that were raised in the TAG session been taken into account? If so, we'll likely close this review positively.

Comment by @miketaylr Dec 13, 2021 (See Github)

Hi @torgo, thanks for the ping. Yes, I believe we've taken Mozilla's feedback into account, both by shipping the Sec-CH-UA-Full-Version-List hint, as well as trying to make the spec more clear that it does not require browsers to expose more entropy than they currently do in the User-Agent string.

Comment by @jorabin-51d Dec 13, 2021 (See Github)

We think that what is proposed is a very major change to the way the Web works. On the face of it what is contemplated is "merely" a change to the use of the User-Agent HTTP header field and introduction of other HTTP fields, altering the interaction between client and server.

However the consequences are much wider than this and affect almost all the related systems that go to make the Web work. We are therefore very concerned that the proposals will “break the Web” in various ways, and therefore require very close scrutiny.

• Use of the User-Agent field in its present form is understood to be an accretion of various custom and practice over many years, it is untidy but it works. • It’s understood to be a potential privacy problem as potentially exploited by unscrupulous Web site operators. It’s said to be a cause of mis-operation. It’s said to be the cause of other problems, however evidence has not been presented as to the extent or severity of any of such effects. • It’s known to be useful to honest Web site operators in detecting fraud and other unscrupulous behaviour by fraudulent Web client software, robots etc. These anti-fraud applications will cease to operate in their present form. • It is known to be widely used by benign applications to support the effective operation of the Web in other ways - e.g. CDN has been mentioned in this context. These applications also require the User-Agent in its present form.

We think that proper standardisation scrutiny of changes to established standards and their established use is required:

• The changes proposed in the form in which they have been proposed have not been justified – for example browser vendors are free to change their User-Agent header to reduce passive profiling, no change to HTTP headers is needed. • We have not seen a measured argument of how the supposed positive effects of any such changes are to be weighed against the undoubtedly negative effects of the changes. The form in which changes have been proposed stand a good chance of “breaking the Web”. • None of the proposals entailed, either at IETF or at W3C have been proposed for standards track scrutiny. Because of the highly disruptive potential of these changes, standardisation scrutiny is required.

We note that the changes discussed, although still in draft and unstandardised form are finding their way into live implementations.

We will be grateful for TAG consideration of these points.

Many thanks

Jo Rabin CTO 51Degrees

Discussed Feb 1, 2022 (See Github)

Dan: we were on the verge of closing it.. then we got some comments. Mozilla's position shifted, and it will be shipping. Response that they took feedback into account. Does not require browser to expose more entropy. Then a long comment from Jo Rabin of 51degrees, kind of rehashing a lot of the issues raised on the initial thread on 'the previous issue](https://github.com/w3ctag/design-reviews/issues/467) about the first announcement of this.. These have been addressed as far as I'm concerned. But Jo is pointing out this is not really being standardised at ietf or w3c, just sitting in wicg. Recent comment about "market is not ready", "wholesale disruption", "significant disfunction". I think Mike Taylor thinks they have addressed these concerns.

Yves: we just have to figure out if it's a sound proposal or not

Dan: There may be a reasonable request here, but not sure if it's for the TAG. I want to ask Mike to address the issues Jo has raised.

Tess: that sounds good. We should do a bit more than pass the buck to Mike. Things already addressed - maybe we could add a comment that calls out some of those things and point to PRs/etc? And ask Mike to answer others.

Dan: where did Mike point us to when they were talking about response to community feedback? We got Mike on a call and he presented this... Not the things in response to the Mozilla comments, but in response to previous 51degrees feedback. Around the how partial is partial issue. How much of the UA string would remain.

Tess: conversation on #467..

Dan: the call where Mike talked to us about this..

Hi Jo - Regarding some of the issues you raised I believe Mike and Yoav believe that these have been addressed - see the
[minutes of our call on 14-Jun from last year](https://github.com/w3ctag/meetings/blob/gh-pages/2021/telcons/06-14-minutes.md#ua-cleint-hints).  
@Yoav can you provide any further detail or comment here?

Dan: we'll keep it in play for this week

Hadley: we have enough evidence in EWP - Priority of consti.. etc... to defend [closing].

Discussed Feb 1, 2022 (See Github)

Dan: 51degrees think this is a major change that hasn't been thought out enough. One is compatibility with existing content and software layers. In June with Mike Taylor and Henri and Yoav we queried this, they said they've beenr esponsive to community feedback on this point, and the current proposal was to leave enough of the UA intact that it wuld not have this kind of impact, especially on software layers. Talking about in some countries, especially African countries as an example, are making a lot of use of transcoding platforms that make use of UA string information. Mike and Yoav think they have addressed this issue. Jo also brought up where is this being standardised? The UA client hints spec itself is in wicg. There hasn't really been any official trajectory beyond wicg. They think it's going to go somewhere in w3c. I think that's a completely valid concern. It's pretty major and it's just being incubated in wicg. Slightly mitigated by the fact we did have these discussions with the mozilla folks, they do seem to be moving on their position. From a multistakeholder perspective, I think it's a little bit better. However it still really should be moving to a proper standards group. I don't think they have a good answer to that yet. On the issue of compatibility... Mike Taylor left a response and noted.. second part of the issue, that the underlying client hints spec, is in ietf, but marked as experimental. After checking, I don't think that's an issue. Consensus around the underlying client hints mechanism itself. Cnsensus is not around where it should be applied. We've been vocal in the past about hwere it should not be applied. My proposal is to close with satisfied with concerns:

  • we want the proposers to make sure they're taking into account the wealth of existing content out there and be receptive to the community feedback about content breaking;
  • they should be moving the client hints UA spec, actively, into a w3c WG.

Yves: by freezing the UA string it removes concern about cacheability and certain content negotiation based on the UA string. I'm pretty sure they'll keep it for a while for compatiility purposes. I odn't think 3 is really an issue. Issue is nly implementation is chrome. Needs to be accepted as a standard somewhere and implemented before being widely used. Also a way to do some discovery mechanism, the UA string, need to ensure all the discoverability capabilities exist. If the other UAs are not implementing that, what are they implementing for discoverability of capabilities?

Peter: the client hints are supposed to expose what is in the UA. It's been around for a while but it's a mess, lots of things have been built on it that shouldn't. Some extent of sniffing still needs to be around. Needed more in old days becuase of the lack of interop. Situation is a lot better these days. Do share your concern Dan about where this is going to go. Wondering where all the other client hint specs are winding up, there's a bunch.

Dan: writes comment

Yves: this rfc is in the http-bis working group. Some are experimental and not in a wg but this is okay.

Peter: concerns that nobody else seems to be taking client hints up. And not this, but other client hints being abused, user preferences stuff. I'm not all in on client hints in general. But fine wiht the UA string being frozen and stripped down over time. Firefox and Safari have already been deploying this and are not providing a way to recover the information. I don't have a problem with a mechanism to get the useful information in a reliable way, but concerns some of the approaches they are talking about are just as bad as what was done with the UA string, that browsers will lie about what they are. But in general, the direction is right. Just needs to be handled more carefully.

Comment by @jorabin-51d Feb 14, 2022 (See Github)

We read that Google is proceeding with this programme as of release M101 which we understand to be scheduled for the start of Q2 2022. We are very concerned about the timeframe for this introduction and its implications on our customers and their users and the Web in general. As we describe below, we consider the timeframe to be reckless.

We operate a “device detection” service which our customers use for various purposes including enhancement of their users’ experience, fraud detection, analytics and other similar benign activities. Our customers tell us that they have not heard about or know little about the proposals. While we have adapted our product to work according to what we understand the proposals to be, our customers require time to implement any changes to their Web infrastructure and the practicality of doing so soon is very limited.

Our understanding of Google’s proposals is in any case “at a point in time”, the stability of those proposals has not yet been established (the latest version of User-Agent Client Hints is dated Feb 9) and they have not yet achieved consensus as to their nature in any standardisation forum. We were pleased to hear about the recently announced (Jan 13) User-Agent Reduction Deprecation Origin Trial that would allow maintenance of the current UA for some time, however we don’t think that our customers will have time to introduce this before Q2 given current engineering schedules and processes.

To summarise, the market is not ready for these changes. Significant parts of the Web - for example OpenRTB - which use the User-Agent header value have not been changed. The changes have the potential to cause wholesale disruption and will at least cause a considerable level of dysfunction in the established Web environment. We therefore ask Google to postpone the changes they propose, while the basis of those proposals stabilises, some form of standardisation consensus about them emerges and giving the market reasonable time to prepare for them.

We will be grateful if the TAG will please note our further views in its considerations.

Many thanks Jo Rabin CTO 51Degrees

Comment by @miketaylr Feb 14, 2022 (See Github)

We read that Google is proceeding with this programme as of release M101 which we understand to be scheduled for the start of Q2 2022.

That's correct. I posted a link in this thread last September pointing to the timelines associated with User-Agent Reduction.

Comment by @torgo Feb 14, 2022 (See Github)

Hi @jorabin-51d - Regarding some of the issues you raised I believe Mike and Yoav believe that these have been addressed - see the minutes of our call on 14-Jun from last year. @yoavweiss can you provide any further detail or comment here?

Comment by @jorabin-51d Feb 15, 2022 (See Github)

Hi @torgo   No, I don’t think the issues have been adequately addressed – here are some material points:  

  • We are weeks away from the unilateral implementation of a significant change to the operation of the Web
  • That change hasn’t been standardised and hasn’t yet had a TAG design review
  • The details of the change are still in flux (Feb 9 being the latest update)
  • We see no evidence that websites are ready for the change, indeed we think that their owners are mostly unaware that a change is needed   Many thanks Jo
Comment by @miketaylr Feb 16, 2022 (See Github)

@yoavweiss can you provide any further detail or comment here?

@yoavweiss is on PTO this week, but I’m happy to reply.

@jorabin-51d writes:

We are therefore very concerned that the proposals will “break the Web” in various ways, and therefore require very close scrutiny… …The form in which changes have been proposed stand a good chance of “breaking the Web”.

I really appreciate the concern for compatibility - it was a guiding principle when we designed UA Reduction and its phased rollout. Most of the use cases mentioned above rely on hints that are available by default (user experience improvements, analytics, etc.) and will not be reduced in the User-Agent header. A site won’t need to migrate to UA-CH if they only rely on browser name, major version, platform, or mobileness. Use cases like fraud detection would require extra hints, and migrating to UA-CH will allow those to continue to function.

That said, we haven’t received concrete evidence of site compat issues through our own testing or from users who have enabled the chrome://flags/#reduce-user-agent flag. We’ve also been running an Origin Trial since Chrome 95 (launched on October 19th of last year) but have not received reports of site breakage, either publicly or through partner channels. If @jorabin-51d does know of sites that will break, we welcome reports at https://crbug.com/new so we can work with the sites to get them fixed.

@jorabin-51d also writes:

That change hasn’t been standardised…

We hope to bring UA-CH to the W3C (and have already stated as much in this thread) once another implementer has stated an interest in implementing it.

Client Hints (which UA-CH builds upon) is standardized in the IETF.

We recently started the work to document User-Agent Reduction patterns by Firefox, Chrome, and Safari in the WHATWG. There’s more work to be done there, and it’s on my plate over the coming months.

…and hasn’t yet had a TAG design review

I’ll also note that we’re having this discussion in the middle of a TAG design review. :)

Comment by @jorabin-51d Feb 18, 2022 (See Github)

Thanks for your reply @miketaylr

I believe that this topic still requires a lot of discussion. We stand by the points we have already made about the changes proposed being reckless and that they will cause harm to the operation of the Web and associated ecosystem of services, applications etc. Rather than repeat those points, which like I say bear further discussion, I will try to keep my response as brief as I can:

A site won’t need to migrate to UA-CH if they only rely on browser name, major version, platform, or mobileness

In general that’s not the case. One of the strongest use cases is for device type, for example.

but have not received reports of site breakage, either publicly or through partner channels. If @jorabin-51d does know of sites that will break, we welcome reports at https://crbug.com/new so we can work with the sites to get them fixed.

We don’t think that gross mis-operation in the form of 500 errors etc. is the primary concern. Of more concern is user experience and optimisation. Site owners are always keen to respond quickly on first request with the best experience possible. I’m not sure I see the point of millions of sites reporting that the initial and subsequent experience for their users has become poorer, since that is a feature of the design.

We hope to bring UA-CH to the W3C (and have already stated as much in this thread) once another implementer has stated an interest in implementing it.

It is a very significant concern that there is no other implementer, since this means that the Chromium way of doing things will splinter the Web. There is a good chance that this fracture in the Web will continue indefinitely. Were another implementer to come on board it seems likely to me that the standard would move on from today’s specification with potential further disruption to website operators. We face a world of “the chromium way” and “the standard way”. We know the TAG takes a strong interest in proposals being broadly supported and of wide applicability, and we think that the evidence says this is a standard that is not reached by this proposal.

Client Hints (which UA-CH builds upon) is standardized in the IETF.

Noting that this RFC is “Experimental” and is therefore not standardised at IETF. For the convenience, here is what IETF says (RFC 2026) about Experimental:

Specifications that are not on the standards track are labeled with one of three "off-track" maturity levels: "Experimental", "Informational", or "Historic". The documents bearing these labels are not Internet Standards in any sense.

I’ll also note that we’re having this discussion in the middle of a TAG design review. :)

Noted. However the plan to proceed appears to be independent of what this TAG review will conclude.

Once again hoping that the TAG will find the content of this dialogue informative as to its findings.

Many thanks

Comment by @miketaylr Feb 18, 2022 (See Github)

Hi @jorabin-51d,

A site won’t need to migrate to UA-CH if they only rely on browser name, major version, platform, or mobileness

In general that’s not the case. One of the strongest use cases is for device type, for example.

Can you clarify what you mean by device type?

We don’t think that gross mis-operation in the form of 500 errors etc. is the primary concern. Of more concern is user experience and optimisation.

I agree that 500s are not the only kinds of concerning site breakage (and in my experience 400-level errors are more common than 500-level for UA changes). If you know about concrete UX or optimization bugs, or just things generally not working as expected please file them.

It is a very significant concern that there is no other implementer, since this means that the Chromium way of doing things will splinter the Web. There is a good chance that this fracture in the Web will continue indefinitely.

It's fairly normal for one engine to ship ahead of other engines, depending on the feature. That's not a new thing. Chrome is actually lagging when it comes to User-Agent Reduction efforts: Safari gets a gold medal from me 🥇 for being the leader, I think, with Firefox coming in second place 🥈 (reasonable people can disagree with the ordering there 🤷 ).

But I will note that other browsers like Firefox and Safari have not offered a way to recover the information lost to reduction. I'm not sure that's a better outcome for sites. That said, I'm hopeful they will see the value in the UA-CH API and eventually implement it, and am happy to work with them on the spec and in whatever eventual working group it ends up in to address their feedback.

Were another implementer to come on board it seems likely to me that the standard would move on from today’s specification with potential further disruption to website operators.

Are you saying another implementer is going to make things worse? Or am I missing the point?

Noting that this RFC is “Experimental” and is therefore not standardised at IETF.

OK. I think we have different definitions (and spellings!) in mind for standardization.

However the plan to proceed appears to be independent of what this TAG review will conclude.

Maybe there's some misunderstanding of what role TAG a review plays in the Blink Process. The Chromium project asks for the TAG's review and advice when it comes to technical designs and how they fit into the broader platform, not for advice on product decisions like shipping or timelines.

(An early review by the TAG seemed pretty positive on the concept in general, FWIW.)

Comment by @jorabin-51d Feb 19, 2022 (See Github)

Hi @miketaylr

I believe I have made my points and while I am always open to discussion regret that as a small company I do not have the resources to continue this to and fro in this forum.

Comment by @torgo Feb 21, 2022 (See Github)

Hi -

We are going to close this review with an outcome of "satisfied with concerns." In the main, we are happy with this proposal including the proposed use of client hints to make up for the lack if discoverability via the UA string.

The concerns we still have are about multi-stakeholder, compatibility and standardisation venue.

We are concerned about multi-implementation. We would like to see this taken up by other user agents.

We would like to the proposers to ensure that they are receptive to the concerns raised in the community regarding web content compatibility. We urge you to be transparent about publishing results of studies regarding compatibility. We also encourage the community to raise concerns in a transparent and dispassionate manner.

Although we're satisfied that the client hints spec itself is on a firm standards track footing, we're concerned about the venue for the standardisation of the ua-client-hints spec. We would like to see the ua-client-hints spec move to a proper w3c working group such as Web Applications.

Comment by @yoavweiss Feb 25, 2022 (See Github)

Apologies for my delayed reply here... I fully agree with what @miketaylr said.