Git Product home page Git Product logo

random-user-agent's Introduction

logo

Automatically replaces the User-Agent with a randomized one.


Chrome Web Store   Firefox Add-ons   Edge Addons   Opera Addons

Random User-Agent is an open-source MIT-licensed browser extension that is designed to replace the original browser User-Agent identifier (is a sort of "fingerprint") with a randomized (based on your preferences). The extension is incredibly lightweight, using very few resources.


promo-tile

🔥 Features list

  • Incredibly lightweight (~100KiB archived)
  • Available in the official stores (chrome, firefox, edge, opera)
  • Can automatically change the User-Agent after a specified period of time
  • Change User-Agent on browser startup
  • Replaces User-Agent HTTP header
  • Protect against detection by JavaScript
  • User-Agent randomization can be customized by the user (what browsers and OS are spoofed, etc.)
  • Exceptions list (blacklist/whitelist) available with option of wildcards
  • Allows using the remote User-Agents list
  • Doesn't need initial setup - just install and forget about the real user-agent leaking

📷 Screenshots

Popup General settings Generator settings Blacklist settings
popup general generator blacklist

🧩 Installation

Follow up by one of the links at the top 👆 of this page, or download CRX (link) / XPI (link) file directly from the latest release from the releases page.

🛠 Where do I can test the functionality?

Open one of the links below with and without the extension enabled:

Resource Test
What is my User Agent ✅ 3 Passed / ❌ 3 Failed
Browser Information (BrowserSPY) ✅ Passed
whoer ✅ Passed
Browser Leaks ✅ Passed
Device Info ✅ Passed
CreepJS ❌ Failed

📡 Remote User-Agents list

Because the extension settings storage has size limitations - you don't have the option of keeping a large custom User-Agents list. Instead, you can place your list somewhere and link to it in the extension settings.

For example, you can create your own public repository/account on GitHub / GitLab / PasteBin / etc. and host your list on it.

The extension will send a GET request to the provided location URL. Supported list format is:

// will be ignored
 # will be ignored too

Mozilla/5.0 (Macintosh; Intel Mac OS X 11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4619.141 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4593.122 Safari/537.36

// ...

📜 How to translate (localize) this extension?

...or fix translation mistakes. The translation process described here (related issue).

👀 Questions

Most questions can be answered by reading the issues. If the issues doesn't answer your question, open up a new discussion. If you find a bug or have a feature request, please file a new issue.

This extension may actually be making users more uniquely fingerprintable, not less?

Faking your user agent might make you more fingerprintable, not less. There are ways other than User-Agent sniffing to determine what browser you're using, so malicious sites could learn what browser you're really using through other means and then combine that with your randomly changing User-Agent to pretty effectively track you. For background, see this GitHub issue.

Hotkeys on some sites no longer work, why?

This may occur because your User-Agent simulates MacOS - in this case, some websites make an attempt to handle ⌘ cmd key instead of the ctrl. For fixing this issue just disable MacOS User-Agent in the extension generator settings.

Are keyboard shortcuts supported?

Sure - user-agent renewal (Ctrl+Shift+U by default). You can change it in your browser settings: chrome://extensions/shortcuts (in Google Chrome).

How to install it on Firefox Mobile?

Following this guide you need to specify a collection ID to install the addon:

image image

Enter 14112060 / rua. After you tap "OK", the application will close and restart.

🖥️ Run Locally

After cloning the project, open the terminal and navigate to the project root directory (since I am a Linux adept, for the following commands installed docker and make are required):

$ make install # install all node dependencies

$ make watch # watch for source changes

$ make shell # start shell into a container with node

$ make build # build the extension

After make watch command you can:

  1. Open chrome and navigate to extensions page using this URL: chrome://extensions
  2. Make sure "Developer mode" is enabled
  3. Click "Load unpacked extension" button, browse the ./dist directory and select it
  4. Write something awesome (don't forget to make a PR after that)

🦾 Contributors

I want to say a big thank you to everyone who contributed to this project:

contributors

And a special thanks to @neroux - dude, you're awesome

🛡 Privacy Policy

Random User-Agent had never collected and will never collect any personal data, browsing history etc.

Full privacy policy text can be found here.

🚀 How to publish a release

This note is for me, so as not to forget anything...

  1. Make required changes in this repository, test it locally
  2. Update changelog file and "publish" new release using repo releases page
  3. When the CI process is done - download the file random-user-agent.zip to my computer
  4. Open "Chrome Web Store Developer Dashboard" and click the "Upload new package" button, next, next... Publish
  5. Download the main.crx file from the dashboard, rename it to the random-user-agent.crx and upload to the release on GitHub
  6. Open "Mozilla add-on developer hub", "Select a file...", next, next, download the extension sources archive, upload it to hub, next, Publish
  7. Download the random_user_agent_X.X.X-blabla.xpi file from the dashboard (after getting Approved status for the version), rename it to the random-user-agent.xpi and upload to the release on GitHub
  8. Don't forget to update fkn edge and opera stores
  9. Open a bottle of beer, I've earned

random-user-agent's People

Contributors

dependabot-support avatar dependabot[bot] avatar ferdinakusumah avatar lordfoogthe4rd avatar maxgfr avatar miroslaw-zylewicz avatar nazar-pc avatar neroux avatar notgate avatar renovate[bot] avatar strugee avatar tarampampam avatar tustoz avatar xenorio avatar yfdyh000 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

random-user-agent's Issues

Canvas - AudioContext - Battery API

please block this

Block Audio Fingerprinting: (Default: disabled; prevent fingerprinting via the AudioContext API)

Block WebGL Fingerprinting: (Default: disabled; prevent fingerprinting via the WebGL API)

Block Battery Fingerprinting: (Default: disabled; prevent fingerprinting via the Battery API)

Block Device Enumeration: (Default: disabled; prevent having hardware devices detected via the WebRTC API)

Block Gamepad Enumeration: (Default: disabled; prevent having devices detected via the Gamepad API)

Block Canvas Font Access

Canvas Fingerprint
www.browserleaks.com/canvas

AudioContext Fingerprint
https://audiofingerprint.openwpm.com/

Battery API
http://techcrunch.com/2015/08/04/battery-attributes-can-be-used-to-track-web-users/

webrtc unique devices id's and ip leaks
www.browserleaks.com/webrtc

window.navigator.userAgent reveals true User Agent

Steps to reproduce:

  1. Open Chrome developer console
  2. observe the return value of window.navigator.userAgent

Expected behaviour:

Tell us what should happen

window.navigator.userAgent return value should match the extensions User Agent

Actual behaviour:

Tell us what happens instead

window.navigator.userAgent return value is the true browser User Agent. I am explicitly testing this on pages I do not have whitelisted in Random User Agent settings.


System information:

Browser version:

Version 60.0.3112.78 (Official Build) (64-bit)

Extension version:

2.1.7

Console screenshot:

Menu > Settings > More tools > Extensions > Developer mode (check) > Random User-Agent > Background Page

Console screenshot

Addon don't remember the settings.

In the add-on settings, I choose "do not sync between browsers."
Next, I note the User-Agents that I want to use.

Sometimes settings saves correct, but after several browser restarts, the settings are skewed to the original settings.

Config:

  1. FF 58.0.2 x64 at Win7 SP1 x64.
  2. Addons: AdBlock Plus, Browsec VPN - Free and Unlimited VPN, Google Translator, PureURL, YouTube No Buffer (Stop Auto-playing).
    All addons is updated.
  3. Last version of Avast.

Console log:
[Random User-Agent] Use fake User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3239.551 Safari/537.36

P.S. if you can't repeat this - it does not mean that there is no problem. I can't save settings on two different machines - at work and at home.

Add a new User agent

Hi.. How can we add a new user agent? Example I want to add chrome updated version how is it possible?

Question on website matching

I have a feeling I'm going to feel stupid when I find the answer, but could someone please explain the reasoning behind the options to "Disable agent switching when a website matches the following rules: Internet Explorer 6 / Chrome on Mac / Firefox on Mac / etc."?

I understand that the UA contains browser and OS info, but what does it mean for a website to match that?

Can I switch minutes to seconds?

Can I switch minutes to seconds?
In addition, can you add an X-Forwarded-For page that does not refresh the page automatically?

Console text color doesn't change depending on browser theme

Steps to reproduce:

  1. Use Firefox
  2. Show web console
  3. Enable dark theme in settings

Expected behaviour:

  1. Console text should use theme information and change like other console output.

Actual behaviour:

  1. Text stays black and is hard to read/has bad contrast.

System information:

Browser version:

Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0

Extension version:

For example: 2.2.0

Console screenshot:
Console screenshot

Privacy APIs, required APIs

Any plans to implement those:

In progress, maybe coming if commented that extensions like this need those:

Alot of extensions currently, but noone that covers even the minimal webextension stuff, or offers any replacement to the original RAS.

Changing request headers for better anonymity (function request)

Some sites make checks for headers such as Accept, Accept-Encoding, Accept-Language, etc and if they don't match the browser's UA it results in captcha requests and other unpleasant things. Would be useful to mask them to the current browser's UA (IE, Firefox, Safari).

Time in minutes is not saved in settings

Steps to reproduce:

  1. set time 1 minute

Expected behaviour:

Tell us what should happen
should save 1 minute

Actual behaviour:

Tell us what happens instead
returns to default 10 minutes

System information:

Browser version:

firefox 57

Extension version:
latest downloaded


*

Firefox - JavaScript value always re-written

Contrary to Chrome, Firefox appears to automatically overwrite navigator.userAgent with the value that was sent as part of User-agent in the request header.

Based on this, it might be a good idea to remove or deactivate - on Firefox - that option from the settings dialog and the script injection.

Safari Extension

Hi,

Is there any (remote!?) chance we can have this awesome add-on for Safari?

Thanks a lot

Some youtube pages are not loaded completely when the plugin is active

#I used this plugin during 2 days and noticed that sometimes youtube video pages are not loaded completely when the plugin is active. This doesn't happen all the time, but quite often. Reloading the page doesn't help, but switching off "enabled for this domain" and then reloading it helps and the page loads completely. This is quite inconvenient, I think. When the problem occurs, I see only the top part of the page with youtube logo, and nothing loads at the bottom, no matter how many times I reload the page (F5), but switching the plugin off helps to reload the page completely.

Firefox 57/Windows7

Update of browser versions

Is there a plan as to how to keep the reported version numbers up-to-date (apart from regular code updates)?

RUA is using for Firefox the versions 50 to 55 and we are currently at 53 for the release and 55 for the nightly, so for the time being it is still not that much of a problem.

For Chrome the situation is already a bit trickier as RUA uses 56 to 58 and we are already at 58 for the release version. The nightly is already at version 60. Furthermore, RUA uses x.x.2xxx as subversion while Chrome switched to 3xxx as of 58.

README doesn't communicate fingerprinting danger introduced by this extension

See prism-break/prism-break#1862 (comment) (although note that I'm not filing this with my PRISM Break contributor hat on). From the README it seems like this extension only changes the UA; is that correct? If so it may be doing more harm than good because by changing the UA but not the APIs exposed in the browser (which would let trackers determine the "real" browser version anyway), this extension may actually be making users more uniquely fingerprintable, not less.

Disabling sync prevents saving of configuration

Running Linux mint cinnamon latest version. Installed Firefox for linux and this plugin (all latest versions). The problem is that the plugin shows "User-Agent (managed by this extension) is not available", but "get new agent" button makes it work. But, after closing Firefox and starting it again, all settings are reset to default and "User-Agent (managed by this extension) is not available" is shown again. I used the same version on Windows 7 and it worked. I thought it may deal with some other plugins, so I disabled all other plugins, but the problem is still there. What can it be?

Защита от определения User-Agent'а Javascript'ом

Подскажите, пожалуйста, как вы реализовали защиту от определения User-Agent средствами JavaScript. Я в Вашем коде нашёл лишь requestHeaders'ы, но они устанавливают лишь отправляемый User-Agent.

CSP error on github.com

When opening github.com with random user agent enabled, there is Content Security Policy error
and a lot of functionality on the page is disrupted. E.g. loading the current commit, switching between HTTPS and SSH cloning or posting comments.

screenshot_20180519-095844

The error occurs even when all other extensions are disabled.

System

Name: Firefox
Version: 60.0.1
Build-ID: 20180516032328
Update-Kanal: release
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0
Betriebssystem: Linux 4.12.12-gentoo

Fake Screen Size

sen
I think changing the screen size for the browser is really necessary.
I think this will make anonymity become better.
I expect a change from you.

Random agent upon opening new tab

First - thanks for this plugin!

I use the plugin to help add "noise" to fingerprinting/tracking efforts as I browse the web. It would be useful if, in addition to the option to have the agent change after X number of minutes, you could add an option to automatically pick a random user-agent for each new tab that is opened.

Thanks!

Charlie

Support for Firefox 57+

Hello!
As is known since firefox 57 it will go to webextension and then many plugins will stop working. I tried to adapt your plug-in via Chrome store foxified but it does not work although the settings menu opens regularly. Do you plan to adapt your plug-in for firefox?

Race condition for the navigator object

Issue for #7 (comment)

Steps to reproduce:

  1. Configure the extension to return the custom user agent also for Javascript.
  2. Go to www.useragents.com

Expected behaviour:

The shown user agent should match the one generated by the extension.

Actual behaviour:

The shown user agent is the actual one.


System information:

Browser version:

Google Chrome 62.0.3175.3 (Official Build) dev (64-bit)

Extension version:

2.1.7

Chrome refuses to load RUA

Steps to reproduce:

  1. Install the extension under Chrome 59+

Expected behaviour:

The extension should be loaded by Chrome.

Actual behaviour:

The extension gets briefly loaded only to fail with the following message

image

Other extensions had similar issues (EFForg/https-everywhere#5874) when the signature check failed.

Neither removing and re-installing the extension nor clearing all possible caches helped.


System information:

Browser version: Chrome 60.0.3080.6 dev (64-bit)

Extension version: 2.1.4 (2.1.3 loaded fine)

Console screenshot: N/A

[Feature request] New Agent For Each Domain Change

Can you add the option to change the user agent for every new domain.

For example, if you search fore some thing in google you will have a set user agent but, when you visite one of the results you will have a different agent fore that domain.

Thanks

How to specify a custom User-Agent?

Steps to reproduce:

Expected behaviour:

Tell us what should happen

Actual behaviour:

Tell us what happens instead


System information:

Browser version:

For example: Google Chrome "52.0.2743.116 m", stable channel

Extension version:

For example: 2.0.1

Console screenshot:

Menu > Settings > More tools > Extensions > Developer mode (check) > Random User-Agent > Background Page

Console screenshot

New user agents

hi is There a list or options somewhere to add more user agents I know you can put in more manually but where can I find them ?

JS

Steps to reproduce:

  1. Подменить ua
  2. https://whoer.net/ru
  3. UA и данные JS не соответствуют.

Expected behaviour:

соответствовать

Actual behaviour:

не соответствует


System information:

Browser version:
Google Chrome 55.0.2883.87 m

Extension version:

2.1.0.1

Ломает отображения картинок на сайтах.

Возникла одна проблема. Включение настройки "Cкрывать настоящий User-Agent при определении средствами javascript (экспериментально)" ломает отображение картинок на некоторых сайтах (например aliexpress), при этом если добавить сайт в исключение проблема не решается пока не отключишь настройку полностью. Отключать ее не особо хочется. Можно ли это исправить?

P.S. Со временем проблема возникает снова даже если отключена соответствующая настройка. Помогает вк/выкл дополнения.

Per domain disabling option does not work

Steps to reproduce:

  1. Switch the "Enabled on this domain" to off for a given site
  2. Browse the site and see the User-Agent in server log : it changes

Expected behaviour:

The User Agent should be constant/probably should be the real one.

Actual behaviour:

I have noticed this because using ttrss, which ends my session with an explicit error message when the useragent changes.


System information:

Browser version:

Firefox 57.0.4 packaged by fedora 26 - x86-64.

Extension version:

2.2.0

Console screenshot:

Menu > Settings > More tools > Extensions > Developer mode (check) > Random User-Agent > Background Page
I don't have this menu.

Console screenshot

Doesn't randomising make you more unique?

In a number of Hacker News (news.ycombinator.com) threads I have read that randomizing the User Agent might only serve to make you stand out in the crowd. I can't find the specific discussions now, but it values considering whether or not this is the case.

A better strategy might be to set a fixed, most commonly used User Agent.

Protected `navigator.platform` and `navigator.vendor`

Steps to reproduce:

  1. Change on random user-agent with platform other than the current (if you on linux, change on window)
  2. Go to http://browserspy.dk/browser.php
  3. See navigator.platform and navigator.vendor

Expected behaviour:

Fake value, not real.

Actual behaviour:

Real value


System information:

Browser version:

Google Chrome "53.0.2785.116 (64-bit), stable channel

Extension version:
latest

Adding custom user agents

Hi .. How can we add a new user agent? I want to add newer chrome versions like "Mozilla / 5.0 (Macintosh, Apple Mac OS X 10_13_2) AppleWebKit / 537.36 (KHTML, like Gecko) Chrome / 62.0.3202.75 Safari / 537.36" from. and only use the user agent in the txt file. UAE.txt

All user agents start with "Mozilla"

I am using the Firefox under windows.
This info gives https://amiunique.org/fp as user-agent:
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_10_2; en-PH) AppleWebKit/536.10.17 (KHTML, like Gecko) Version/11.1.5 Safari/536.10.17"
Why there still possible to read Mozilla??

RUA Breaks Facebook

Do you know if Facebook is doing something to block your add-on? For the longest, longest time, my message boxes have been disappearing. One by one, I disabled all add-ons and enabled them again - finally ONLY disabling random user agent on Facebook, and the message boxes come back.

Is this a bug? Is this something Facebook did that you can fix?

Thanks much!

anoncat

Limit range of random numbers/seperators for OS string

I'm noticing that for some values being generated, the range of it goes out of the realm of realistic values. For example, if I have a Mac platform selected, the value for the OS version can show up as "Intel Mac OS X 10_19_2" which is not a real version, or it may end up as a really old version which doesn't match a relatively new browser version.

Also for Mac platforms, it doesn't seem to take into account what type browser is being used for the OS string. Firefox uses dots as separators ("Intel Mac OS X 10.11") while Chrome/Safari uses underscores ("Intel Mac OS X 10_11_6").

Fixing these inconsistencies would result would help in masking some really obvious fake UA settings.

CSP can break the injected script

Steps to reproduce:

  1. Load a site with a respective content security policy (e.g. github.com).
  2. Open the console.
  3. Evaluate navigator.userAgent.

Expected behaviour:

The user agent as defined by the extension should be returned.

Actual behaviour:

The injected script fails to execute with the message

Refused to execute inline event handler because it violates the following Content Security Policy directive: "script-src assets-cdn.github.com". Either the 'unsafe-inline' keyword, a hash ('sha256-...'), or a nonce ('nonce-...') is required to enable inline execution.

and the actual user agent is returned.


System information:

Browser version:

Google Chrome 62.0.3175.3 (Official Build) dev (64-bit)

Extension version:

2.1.7

Allow custom user agents strings

Hello, can you add a feature that allows input of unlimited custom user agent strings like it's done in this addon: gitlab.com / alexander255 / user-agent-switcher . I personally like yours because it's much lighter but without having above mentioned feature it's limited to only a few UAs. Thanks for reading.

New permissions?

Question: The new version of this plugin requires "Read and change all your data on websites you visit" permissions. For a what?

Answer: Answer: This is needed to protect against User-Agent detection by JavaScript. There's a little bit of mock execution code required to run on each page, you can find the code in file: /js/inject/content.js

sync extension setting between browsers setting not saved

Steps to reproduce:

  1. close sync extension setting between browsers
  2. restart chrome
  3. the sync extension setting between browsers are still open

Expected behaviour:

Tell us what should happen
close the sync extension setting between browsers

Actual behaviour:

Tell us what happens instead
the item not close it

System information:

Browser version: Google Chrome "57.0.2987.133"

For example: Google Chrome "52.0.2743.116 m", stable channel

Extension version: 2.1.1

For example: 2.0.1

Console screenshot:

Menu > Settings > More tools > Extensions > Developer mode (check) > Random User-Agent > Background Page
image

Console screenshot

Cannot use it with chromedriver selenium python

Normally extension works fine, but I want to use it with selenium webdriver (python bindings). Other extension work, but this isn't. I'm getting the following error:

  File "/usr/local/lib/python2.7/site-packages/selenium-3.4.3-py2.7.egg/selenium/webdriver/chrome/webdriver.py", line 69, in __init__
    desired_capabilities=desired_capabilities)
  File "/usr/local/lib/python2.7/site-packages/selenium-3.4.3-py2.7.egg/selenium/webdriver/remote/webdriver.py", line 98, in __init__
    self.start_session(desired_capabilities, browser_profile)
  File "/usr/local/lib/python2.7/site-packages/selenium-3.4.3-py2.7.egg/selenium/webdriver/remote/webdriver.py", line 188, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/usr/local/lib/python2.7/site-packages/selenium-3.4.3-py2.7.egg/selenium/webdriver/remote/webdriver.py", line 256, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python2.7/site-packages/selenium-3.4.3-py2.7.egg/selenium/webdriver/remote/errorhandler.py", line 194, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: **Message: unknown error: failed to wait for extension background page to load: chrome-extension://einpaelgookohagofgnnkcfjbkkgepnp//html/background.html
from unknown error: page could not be found: chrome-extension://einpaelgookohagofgnnkcfjbkkgepnp//html/background.html**
  (Driver info: chromedriver=2.30.478461 (8b6b2938ac9f3a090d2cf8bafbe8ca73dcbf7945),platform=Mac OS X 10.12.5 x86_64)

Where's the problem and how can I fix this?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.