WebAIM Blog

History of the browser user-agent string

September 3, 2008

In the beginning there was NCSA Mosaic, and Mosaic called itself NCSA_Mosaic/2.0 (Windows 3.1), and Mosaic displayed pictures along with text, and there was much rejoicing.

And behold, then came a new web browser known as “Mozilla”, being short for “Mosaic Killer,” but Mosaic was not amused, so the public name was changed to Netscape, and Netscape called itself Mozilla/1.0 (Win3.1), and there was more rejoicing. And Netscape supported frames, and frames became popular among the people, but Mosaic did not support frames, and so came “user agent sniffing” and to “Mozilla” webmasters sent frames, but to other browsers they sent not frames.

And Netscape said, let us make fun of Microsoft and refer to Windows as “poorly debugged device drivers,” and Microsoft was angry. And so Microsoft made their own web browser, which they called Internet Explorer, hoping for it to be a “Netscape Killer”. And Internet Explorer supported frames, and yet was not Mozilla, and so was not given frames. And Microsoft grew impatient, and did not wish to wait for webmasters to learn of IE and begin to send it frames, and so Internet Explorer declared that it was “Mozilla compatible” and began to impersonate Netscape, and called itself Mozilla/1.22 (compatible; MSIE 2.0; Windows 95), and Internet Explorer received frames, and all of Microsoft was happy, but webmasters were confused.

And Microsoft sold IE with Windows, and made it better than Netscape, and the first browser war raged upon the face of the land. And behold, Netscape was killed, and there was much rejoicing at Microsoft. But Netscape was reborn as Mozilla, and Mozilla built Gecko, and called itself Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826, and Gecko was the rendering engine, and Gecko was good. And Mozilla became Firefox, and called itself Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0, and Firefox was very good. And Gecko began to multiply, and other browsers were born that used its code, and they called themselves Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.2) Gecko/20040825 Camino/0.8.1 the one, and Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.8) Gecko/20071008 SeaMonkey/1.0 another, each pretending to be Mozilla, and all of them powered by Gecko.

And Gecko was good, and IE was not, and sniffing was reborn, and Gecko was given good web code, and other browsers were not. And the followers of Linux were much sorrowed, because they had built Konqueror, whose engine was KHTML, which they thought was as good as Gecko, but it was not Gecko, and so was not given the good pages, and so Konquerer began to pretend to be “like Gecko” to get the good pages, and called itself Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko) and there was much confusion.

Then cometh Opera and said, “surely we should allow our users to decide which browser we should impersonate,” and so Opera created a menu item, and Opera called itself Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51, or Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51, or Opera/9.51 (Windows NT 5.1; U; en) depending on which option the user selected.

And Apple built Safari, and used KHTML, but added many features, and forked the project, and called it WebKit, but wanted pages written for KHTML, and so Safari called itself Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5, and it got worse.

And Microsoft feared Firefox greatly, and Internet Explorer returned, and called itself Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) and it rendered good code, but only if webmasters commanded it to do so.

And then Google built Chrome, and Chrome used Webkit, and it was like Safari, and wanted pages built for Safari, and so pretended to be Safari. And thus Chrome used WebKit, and pretended to be Safari, and WebKit pretended to be KHTML, and KHTML pretended to be Gecko, and all browsers pretended to be Mozilla, and Chrome called itself Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13, and the user agent string was a complete mess, and near useless, and everyone pretended to be everyone else, and confusion abounded.

187 Responses to “History of the browser user-agent string”

  1. Ngoc Van says:

    Excellent and hilarious!

  2. Cybaer says:

    And God^W Marc Andreessen said: If you use FRAMES, use NOFRAMES too – so there is no need for sniffing. But if you really have to know the browser, use window.opera, navigator.appName, navigator.product, navigator.vendor and other navigator attributes. And it was good.

    But people ate apples and used user-agent strings, so they were banished from web developers paradise …

  3. anonym says:

    Very Good :-)

    The new versions of Opera include the rendering-engine as well:
    > Opera/9.60 (X11; Linux x86_64; U; en) Presto/2.1.1

    But it’s still rather short compared to other monster-strings.

  4. Steve Kinney says:

    Very good – the history of web browsers in one brief entertaining essay. Bravo!

    However, I must nit pick a few small details…

    Microsoft did not make its own web browser. It licensed Mosaic’s code, and reworked it to make it look different from Mosaic. The beauty part: Under the terms of the agreement, Microsoft was to pay Mosaic’s owners a percentage of the income from sales of Internet Explorer. Microsoft knew, of course, that they would be “giving Internet Explorer away for free”, and they did include it with every operating system they have since distributed. Mosaic received no payment. The proud tradition of lying, cheating, and stealing as the foundation of success in the software and IT industries could be said to begin with this swindle.

    Whether Internet Explorer was better than Netscape is open to question. Would that be better in the sense of having more, and worse security defects, causing more real damage to users’ computer related assets? Better in the sense of breaking more web standards, having more rendering bugs, and trying harder to hijack open components like Java with Microsoft-only clones? Or just better in the sense of being dumped on the market “for free” with every copy of any Windows operating system, while Netscape still depended on income from sales to survive?

    Oh, and I seem to remember using Opera, and being very impressed, when it was still payware/adware, before Firefox was released.

    :o )

  5. Mark Aplet says:

    This is hilarious! It is even better when you read it like your the narrator for a Dr. Suess book! Awesome!

  6. rgbeast says:

    Thank you for the article. I made Russian translation: http://webew.ru/articles/1251.webew

  7. p fasholi says:

    funny if your a virgling.

  8. sepercar says:

    AGGRESS AutoPost Test

  9. [...] patienter, si ce n’est déjà fait, lisez la folle histoire des User Agent Strings (via [...]

  10. Lightkey says:

    I have a little correction as well, though I guess it is not an error but your ignorance in this matter. So here are two revised sentences:

    And Gecko began to multiply, and other browsers were born that used its code, and they called themselves /Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.2) Gecko/20040825 Camino/0.8.1/ the one, and /Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0/ another, each pretending to be Mozilla, and all of them powered by Gecko. And Mozilla became SeaMonkey, and called itself /Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.8) Gecko/20071008 SeaMonkey/1.0/, and SeaMonkey was very good.

  11. tonza says:

    And here’s the UA string for OmniWeb 5.7 on the Mac, which also tries to be Safari:

    Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/523 (KHTML, like Gecko, Safari/523.10) [%@]

    where [%@] is replaced with “OmniWeb/v621.0.99313″ or some other version number, and is actually configurably OPTIONAL! Or… you can get OmniWeb to pose as any other browser you choose (you can enter the UA string by hand if you really want to!).

    Which in itself proves your little, remarkably funny story to be closer to the ultimate truth that the UA string (and the User-Agent HTTP header) is a redundant feature of the HTTP[S] protocol and should be ignored.

    Carry on laughing. Go on!

  12. Gökhan says:

    E-X-C-E-L-L-E-N-T !

  13. useragent007 says:

    Funny as hell ! will add ..

    And then Google ..
    #doing no evil
    .. built Chrome, and Chrome used Webkit …..

  14. [...] Wollt ihr es sehen? ~Geheimnisvoller Link~ [...]

  15. Olga Ritchie says:

    Digged you. The article deserves it definitely.

  16. [...] » Die nackte Wahrheit hinter dem String Autor: Ekkard Bäuerle · Datum: 12. September 2008 [...]

  17. [...] Just read about the user-agent. [...]

  18. [...] string. There are a lot of problems with this, for a great primer, read a quick history of the user-agent string. For one thing, it’s spoofable. For another, it often makes use of technologies like [...]

  19. [...] You may think it’s easy writing website. But just knowing what your sites are being viewed in is a nightmare: see this tale of old for details. [...]

  20. [...] a bit more about the story behind some of the user agent string today’s browser use read this article from WebAIM. Funny and [...]

  21. [...] würde sagen, das hier ist mit ein Grund, warum ich nicht so gerne Web [...]

  22. [...] string. There are a lot of problems with this, for a great primer, read a quick history of the user-agent string. For one thing, it’s spoofable. For another, it often makes use of technologies like [...]

  23. [...] “user-agent” string. There are a lot of problems with this, for a great primer, read a quick history of the user-agent string. For one thing, it’s spoofable. For another, it often makes use of technologies like JavaScript, [...]

  24. Serghei says:

    great article FireFox the best ;)

  25. kurt says:

    Maybe web designers should eventually stop browser sniffing? Just use XHTML 1.1 according to the W3C definition! Then it will render nicely in any browser supporting that standard.

    This entire mess only emerged because in HTML, unlike e.g. Direct3D, there is no proper way to enumerate all available features, such as “This browser supports frames”. Otherwise, web designers could have relied on feature listings rather than user agent strings implying certain sets of features.

    Since all recent browsers on the market now support nearly all important features in its entirety, it is time to get rid of user agent strings once and for all. They should be used for creating nice statistics rather than selecting what kind of code is assigned to the renderer. Choose your favorite W3C standard, then stick to it. Internet Explorer, Firefox, Opera, Chrome, Safari and Konqueror in their recent versions are all able to render XHTML 1.1 in a proper way. Don’t make compromises for legacy browsers such as IE6 or Netscape 6, or you will only find yourself trapped in the hell of user agent detection and you might end up supporting 10 different versions of your webpage, one for each exotic browser.

  26. [...] und daher muss man eigentlich noch auf User-Agent-Strings zu sprechen kommen. Besser wie hier kann man das Thema eigentlich nicht verwursten Share on Social [...]

  27. [...] The User Agent String – an internet phenomenon. Internet Explorer 7 claims to be “Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)”, for example. Learn about the history of the user agent string in this brilliant post [...]

  28. [...] only done user-agent string sniffing once and I remember it gave me a headache… This post explains why it gave me a [...]

  29. P says:

    Ah, the irony…

    This page renders fine on Firefox 3.0.3 with its default UA string, but not so with UA string “foo”. The CSS seems missing.

  30. WyriHaximus says:

    Thanks for the good laugh :D !

  31. Xyzzy says:

    why not use jsut plain old HTML like that site? It doesnt like Safari so I am so sorry to upset a small percentage of the browser market.

  32. [...] I’ve found a nice article written in a lighthearted way about the history of the Mozilla UA string: http://www.webaim.org/blog/user-agent-string-history — Dan « Standard e-mailclient changes | [...]

  33. [...] Re: Gurgle web browser [ safe and low bandwidth ] On 03/09/2008 16:47, Jim Price wrote: > I have mozilla (seamonkey), dillo, galeon, kazehakase, midori opera and > a second install of firefox http://webaim.org/blog/user-agent-string-history/ [...]

  34. [...] WebAIM: Blog – History of the browser user-agent string (tags: webaim.org 2009 mes0 dia28 humor history desenvolvimento_web) [...]

  35. [...] History of the browser user-agent string Cet article – qui s’adresse plus aux développeurs web – est probablement un des meilleurs de l’année dernière ( mon sens). Il raconte dans un style très approprié comment ce paramètre a évolué au fil des ans pour finir complètement perverti. [...]

  36. [...] History of the browser user-agent string [...]

  37. Rasberry says:

    Don’t forget Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) … plus the .Net garbage..

  38. Cat says:

    Jesus. This is confusing. I’m sticking to Firefox and make my life easier.

  39. Dženan Zukić says:

    I always wondered why were all User Agent strings prefixed by “Mozzila/X.0″. Even IE! Now I finally know.

  40. Nguyen Kha Do says:

    Finally, I knew why all browser pretend to be Mozilla. It was a long and interesting history of user-agent string. ;)

  41. [...] what the user agent string is for, but it has become a complete mess, as described in this hilarious article. reddit_url = ‘http://akie.nl/2009/02/24/history-of-the-user-agent-string/’; [...]

  42. Jon says:

    Wow, now I know why I couldn’t find Internet Explorer’s in a user agent database…

    This is quite saddening… add it to the list of things wrong with the Internet.

  43. Cosmin says:

    Man this is hilarious :) )

    Great writing skills, excellent story!

  44. [...] have blogged before about the near-uselessness of the User Agent string (in connection with Google Chrome’s football-field-long UA string), and they have probably [...]

  45. Rikas says:

    Here’s mine:

    Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit/530.4+ (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1

  46. servand says:

    FireFox – the best! ;)

Leave a Reply





WebAIM is an initiative of:
Center for Persons with Disabilities (CPD) Utah State University