History of the browser user-agent string

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: 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/ 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.


  1. p fasholi

    funny if your a virgling.

  2. sepercar

    AGGRESS AutoPost Test

  3. Lightkey

    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: Gecko/20071008 SeaMonkey/1.0/, and SeaMonkey was very good.

  4. tonza

    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!

  5. Gökhan

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

  6. useragent007

    Funny as hell ! will add ..

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

  7. Olga Ritchie

    Digged you. The article deserves it definitely.

  8. mauzer
  9. Serghei

    great article FireFox the best 😉

  10. kurt

    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.

  11. P

    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.

  12. WyriHaximus

    Thanks for the good laugh :D!

  13. Xyzzy

    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.

  14. Rasberry

    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..

  15. Cat

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

  16. Dženan Zukić

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

  17. Nguyen Kha Do

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

  18. Jon

    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.

  19. Cosmin

    Man this is hilarious :))

    Great writing skills, excellent story!

  20. Rikas

    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

  21. servand

    FireFox – the best! 😉

  22. Johan Douma

    Now you can add Opera 10 to the list.
    Sorry I mean Opera 9.80 to the list…

  23. Grerwaymype

    visit us!

  24. Mozilla

    …and between all of this, there were spiders, bots & others who were not any of the above but when they realized that sometimes they were unwanted, they pretended to be Mozilla & others so as to continue visiting pages instead of being blocked by robots.txt & scripts to reduce their visits…

  25. Johannes

    Hilarious! Thanks a lot for this great written article!

  26. Rene Meissner

    As I remember the first public browser with the user agent spoofing feature was OmniWeb 2.x for Nextstep. It was available in Q2/1996.

  27. steve ross

    And Internet explorer started pretending that it was Google Chrome… http://blog.chromium.org/2009/09/introducing-google-chrome-frame.html

  28. Steve

    If you are running Internet Explorer or Firefox then just change your user agent to read “Buy my product it’s the best” and avoid all that which browser is it nonsense.

  29. Derek

    Having excessive user agent values made the length passed from the browser to the web server cause my apache web application to issue a 500 Internal Server Error and the ultimate error was, “Premature end of script headers”. By removing some of the HKEY CURRENT USER, SOFTWARE, Microsoft, Windows, Current Version, Internet Settings, User Agent, Post Platform strings, I got the user agent value that is passed down to a size that wouldn’t trigger the 500 error and received the desired content. This was nasty to debug because everything I found on blogs and help sites have you check the unix file permissions and perl or CGI script – but since not every user was having the problem, one solution was to re-create a users profile which cleaned up the registry for that setting. This may be a problem for just my content management application, but others might be running into the 500 and Premature error as well.

  30. Bob

    And then came “Mozilla/5.0 (Windows; U; Windows NT 5.2; en-GB; rv:” which is probably Firefox but who knows anymore?

    Great article!

  31. jon

    “Buy my product it’s the best” string will get you problems, like websites saying

    the ‘buy my product’ browser is not supported by this site…

    The reason Opera changed its string from ‘opera 10.10′ is that websites saw ‘opera 0.1′ due to simple number scanning looking for the dot, and going ‘back one’

  32. Frank

    User-Agent was never intended to be machine parsed, or used for anything but human review of logs. That it was, is a sad and horrible mistake. No modern website should require any particular strings in the User-Agent in order to function. It is ok to look for specific, known-broken browsers using UA, and serve reduced-function code to them, but one should always code for unrecognized UA strings, and in that case serve standards-compliant html. Use javascript, but don’t make your site break if it is ignored (eg javascript disabled).

    Sites that only work for recognized UA strings, or that use javascript for links (instead of A HREF) are horribly broken.

  33. Yuhong Bao

    “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)”
    Which started with version 2.0, BTW. Version 1.0 used a different user agent.

  34. Yuhong Bao

    “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…”
    Yep, Hotmail was responsible for that particular case, BTW.

  35. Kapil

    Nice and interesting :)

  36. Hung Won Ahn

    Thanis for the “NEWER” Testament, After B.C. (Browser Creation.)
    Now just tell us which ones we can IGNORE. We’d like to match the opinions
    that we all hold.

  37. Xev

    Informative and amusing.

    Well done !

  38. mabdul

    hey, you’re blog entry is good, but then you should add that opera introduced a new and maybe better ua by dropping all and go back to the roots and identifying itself something like:

    Opera/9.80 (Macintosh; Intel Mac OS X; U; de) Presto/2.2.15 Version/10.10
    what about tha?


  39. KeV

    “Sites that only work for recognized UA strings, or that use javascript for links (instead of A HREF) are horribly broken.”

    Hear, Hear, Actually Listen don’t hear it.
    Javscript and flash should be a LAST resort and w3c should be clearer on this.

    “And Microsoft sold IE with Windows, and made it better than Netscape”

    Are you sure, I’m a bit too young to know but my parents certainly thought netscape was much better than IE.

  40. Chris

    @ KeV and a few more Ands.
    IE was good when it came out, but that is not why Netscape lost the war of course.

    >Javascript and flash should be a LAST resort
    >Sites that only work for recognized UA strings, or that use javascript for links (instead of A HREF) are horribly broken

    Amen to that!

    And IE took over the world without a battle. And MS corrupted all standards so IE6/IIS would dominate forever*. And MS said IE6 was perfect and the browser could never be made better and stopped any development.
    And Firefox came along and scared MS into working on IE7.
    And now MS is begging for corporations to move on from IE6, but they can’t because all their intranets only work with the IE6 broken standards, which is no surprise as it was MS’s original plan (see * above).

    Good write-up, thanks.

  41. Jeremy

    Well, this is my User Agent String. Nice and simple
    Midori/0.2 (X11; Linux; U; en-us) WebKit/531.2+

  42. Magnus

    Yep. And this is how my phone presents itself:

    Mozilla/5.0 (Linux; U; Android 2.1-update1; en-gb; Nexus One Build/EPE54B) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17

  43. Gift Shop

    Firefox is like this.
    Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1)

  44. ljfbdlf

    Awesome xD

  45. Joshua Issac

    IE9’s like:
    Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)

  46. KevMc

    And lo, IE8 was too powerful for some and made their old fashioned portals crumble, so to buy time while they rebuilt their homepages they crippled their customers IE8 so that it pretended to be the lowly IE6 and could be forced to inhabit the depths that are known as Quirksmode

    Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; GTB6.5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; Alexa Toolbar)

  47. Steven Shippee

    Any way one can change this string to something more meaningful? Rather than:
    HTTP/1.1 Mozilla/4.0+(compatible;+MSIE+8.0;+Windows+NT+6.0;+Trident/4.0;+MathPlayer+2.20;+SLCC1;+.NET+CLR+2.0.50727;+.NET+CLR+3.5.30729;+.NET+CLR+3.0.30729;+.NET4.0C;+.NET4.0E;+InfoPath.3;+MS-RTC+LM+8)

    I really, really don’t need to let others know I have MathPlayer or Infopath, etc., do I?

  48. TeMc

    Thanks for this article man, I laughed my ass off multiple times (gotta see the docter ;-D )

    btw, got here because it was linked from http://css-tricks.com/browser-detection-is-bad/ which was linked from http://css-tricks.com/new-poll-conditional-tags-for-all-browsers/#comment-90341 which was recently published.

  49. Nivek

    Great article, man. Now I have some insight into that LONG confusing string name each browser is using…

  50. Alex

    I did never understand, why meanwhile none of them get rid of it. Everything would be so simple:
    Firefox/4.0 (Windows NT 6.0; Gecko/2.0.1)
    MSIE/9.0 (Windows NT 6.0; Trident/5.0)
    Chrome/12.0.706.0 (Windows NT 6.0; AppleWebKit/534.25)
    Safari/5.0.4 (Windows NT 6.0; AppleWebKit/533.20.27)
    Konqueror/4.5 (Windows NT 6.0; KHTML/4.5.4)