Author Information

Brian Kardell
  • Developer Advocate at Igalia
  • Original Co-author/Co-signer of The Extensible Web Manifesto
  • Co-Founder/Chair, W3C Extensible Web CG
  • Member, W3C (OpenJS Foundation)
  • Co-author of HitchJS
  • Blogger
  • Art, Science & History Lover
  • Standards Geek
Follow Me On...
Posted on 02/09/2023

A Few Good Lies

On Wolvic’s new UA string in 1.3, things working, and frustrating intertwined problems.

Ok, let’s play a game… Imagine that you look at your server logs and see this UA string. Which browser sent it to you?

Mozilla/5.0 (Linux; Android 10; Quest 2) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/ SamsungBrowser/4.0 Chrome/106.0.5249.79 VR Safari/537.36

I won’t blame you if you don’t immediately recognize the browser that sends that string by default (it’s the OculusBrowser). It’s already a giant set of lies and there’s no intuitive way to decide which one to believe.

But... Maybe you should believe none of them! Wolvic, for example, will send that string sometimes. And sometimes the OculusBrowser will send some other string. Eek.

Okay, maybe that was just a particularly complicated example. How about this one:

Mozilla/5.0 (Android 10; Mobile VR; rv:81.0) Gecko/81.0 Firefox/81.0

Ah, Firefox for Android? Sort of! Firefox Reality used to send that. Yes, it was for AOS-based devices, but not really for your Pixel phone’s Android.

Alright, alright — this one should be easy given the last one, right? Look how similar it is…

Mozilla/5.0 (Android 10; Mobile VR; rv:105.0) Gecko/105.0 Firefox/105.0

That is… Wolvic.

At least by default. Anything where one of those numbers was over ‘81’ was probably Wolvic. At least before this week’s release.

Starting with this release, Wolvic will normally send:

Mozilla/5.0 (Android 10; Mobile VR; rv:105.0) Gecko/105.0 Firefox/105.0 Wolvic/1.3

Ah finally - the text “Wolvic” appears in the string! But also, still, some lies. And then, of course, sometimes we’ll have to tell a completely different lie.

But... I mean...WHO CARES, right!?

You might imagine that nobody cares about the UA stirng, but you would be very wrong. Everybody seems to care about it, somehow.

The lies we need to tell ourselves

It’s not just about an app that suddenly starts refusing to service HTTPS requests, except to tell them to use a different browser (maybe, for example, the one they just so happen to make).

It’s all kinds of things that people try to reason about that ultimately somehow involves the UA string — and it affects so much.

Maybe, for example, you use some CMS or tool that lets you think in simpler terms: Is it “mobile” or is it a “tablet” or is it a “desktop”? Cool, but how does it know, and by what definition? Does that definition hold forever?

Or maybe you use a library which tries to make it simple to give all different devices as good an experience as they can. Again, there is some kind of attempt at categorizing in order to determine the ‘best’ experience — and it often involves (just a little maybe!) the UA string. And again, does that hold up forever?

Even if this works perfectly with every device in the whole world (it probably doesn’t!), as soon as something changes, or doesn’t neatly fit those definitions anymore, this is probably going to give users a pretty bad result.

And guess what? We’re all users! You can imagine how it might be frustrating if you are, for example, a user of some new device or browser. Like, hypothetically, one who has bought an XR device, running an immersive operating system, and browsing the web in a broswer built for that, and the cool immersive experience link someone sent you is giving you the non-immersive experience instead. The site thinks your totally capable browser just isn’t.

That kind of shit happens, a lot, and when it happens in popular libraries or CMSes or whatever, it can affect thousands of sites.

In fact, that’s a thing that happened with Wolvic. A lot.

You know who users get mad at when that happens? Not the site, nor the library. They get mad at the browser. When that happens, browsers will start lying to your site because that makes the user happy, and stops their hate. At the end of the day, making users happy is their job.

And this isn't a new thing. My colleague Eric Meyer wrote a great post about something similar from 2002, and we did a whole Igalia chats episode about all of this.

"Making users happy is their job" is tricky though, right? Because in our case, the site or CMS or library maker probably introduced something there because they cared about users. They wanted to make sure that some browser that falls through the logic cracks gets at least the basic mobile experience or something. Which is great, until it sucks.


Even if you aren’t looking at the UA string functionally somehow, you probably still care about it for functional reasons, if you think about it.

Let’s just take a for example: Should you care about how your site looks on these XR headsets? Is it worth doing something specially interesting on those? How do you decide what is worth your energy? Probably by asking “how many users of that are there?” in general, and more specifically “how many users are using that to visit my website?”

In both cases, you’re probably relying on the UA string. Either by looking through your own server logs and trying to see, or else by looking at market share numbers, which are literally a summary of other people’s server logs.

But, it’s possible you have 1000 people all visiting your site with Wolvic or the OculusBrowser right now, and you see none of that in your logs, because the browser makers have already figured out that we have to lie about what they are.

So, this is an especially frustrating thing for new browsers and new classes of devices.

Say, for example, you’re building a new browser. Maybe you have a logo that looks like a Wolf. Hypothetically. And you’re trying to fund a handful of developers to implement features which will serve the needs of your users.

The main way that a browser can pull in some income to pay said developers, historically, is by signing a default/integrated a search deal with a search engine. However, this presents something of a chicken and egg problem. To be a worthwhile deal, the search engine wants to know what kind of market share you have — in other words, how many users? And, well, they’re certainly not going to trust your private data on this. Metrics based on the UA string are the most obvious and public ones, but as a new browser you have to lie about what you are so that your users can, you know, use websites.

Sooooo… Cool, cool, cool, cool.

Brooklyn Nine Nine Jake saying cool cool meme

I wish none of this was the way it was, but I also don’t know how to fix it except to say “we really need to talk about the funding model”.

So, please be careful. Try not to make it worse.

Use Wolvic if you can.

Test with it if you can.

Please definitely report bugs, but also please be patient with us if you’re a user, we’re fighting systemic problems sometimes.

Maybe toss some money at our collective efforts if you can and help instigate the kind of change we need… or, if not, maybe just tell someone about it.