Giter Club home page Giter Club logo

nameinator's Introduction

NAMEinator Build Status Code Climate

Are you a power-user with 5 minutes to spare? Do you want a faster internet experience?

Try out NAMEinator. It hunts down the fastest DNS servers available for your computer to use. NAMEinator runs a fair and thorough benchmark using standardized datasets in order to provide an individualized recommendation. NAMEinator is completely free and does not modify your system in any way. This project began as a 20% project at Google.

NAMEinator runs on Windows (10), Linux (tested on Ubuntu 16.04) and is available with a a command-line interface and in the near future with a graphical user interface.

This project has been forked from google/namebench. While it seems that the initial Author wanted to move the application towards GO with another application use - I just wanted to continue and maintain the python variant as it did what it should. After investigation the python code showed up some very frustrating complications, which were leading to my decision to reimplement the initial application idea - also in GO.

requirements and getting started

prerequisite: the system running this software must have the tool "nslookup" installed. windows users are fine :)

  • download and run the corresponding compiled files from releases. execute them on the desired platform

or

go get github.com/mrwiora/NAMEinator
cd $GOPATH/src/github.com/mrwiora/NAMEinator/
go build
./NAMEinator

help & start parameters

$ ./NAMEinator.exe -h
Usage of C:\Users\Administrator\go\src\NAMEinator\NAMEinator.exe:
  -contest=false
        enable or disable a contest against your locally configured DNS server (default true)
  -debug=true
        enable or disable debugging (default false)
  -domains int
        number of domains to be tested (default 100)
  -nameserver string
        specify a nameserver instead of using defaults

sample output of current version (debug off)

$ ./NAMEinator.exe
starting NAMEinator - version 0.2 alpha
understood the following configuration: {numberOfDomains:100 debug:false contest:true nameserver:}
-------------
NOTE: as this is an alpha - we rely on feedback - please report bugs and featurerequests to https://github.com/mrwiora/NAMEinator/issues and provide this output
OS: windows ARCH: amd64
-------------
trying to load nameservers from datasrc/nameserver-globals.csv
trying to load domains from datasrc/alexa-top-2000-domains.txt
LETS GO - each dot is a completed domain request against all nameservers
....................................................................................................
finished - presenting results:

172.31.0.2:
Avg. [60.109104ms], Min. [313.4µs], Max. [899.4558ms]

8.8.8.8:
Avg. [46.839882ms], Min. [266.8µs], Max. [1.3698924s]

8.8.4.4:
Avg. [38.543425ms], Min. [409.2µs], Max. [555.3005ms]

208.67.222.222:
Avg. [48.621088ms], Min. [217.6µs], Max. [614.7506ms]

2001:470:20::2:
Avg. [82.29074ms], Min. [280.1µs], Max. [1.7591384s]

156.154.71.1:
Avg. [56.059446ms], Min. [269.4µs], Max. [1.2002193s]

216.146.35.35:
Avg. [93.600686ms], Min. [441.6µs], Max. [664.3157ms]

Au revoir!

checklist

basics

  • perform DNS Requests
  • iterate through given nameservers (basic set) and measure time
  • randomly select domain names from alexa top 2000 list
  • produce cli report
  • test on windows and linux
  • release cli version

nice2have

  • implement test driven development

to subsitute namebench 1.3.1

  • support localization of execution
  • select the best suitable DNS server
  • provide basic GUI which has the CLI version as its base
  • produce html/pdf report
  • test on windows and linux
  • release gui version

reimplement functions that were planned, but did not work with namebench 1.3.1

  • detect censorship and manipulated dns entries
  • optional upload of results

new features

  • perform identification of best usable dns server not only based on location, but based also on network path traces
  • test caching - disable cache if this option is selected and ask for the domains a second time (increasing number of domains)

nameinator's People

Contributors

morgankevinj avatar mrwiora avatar smoak 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

nameinator's Issues

panic: runtime error: index out of range [1] with length 1

~]$ nameinator
starting NAMEinator - version custom
understood the following configuration: {numberOfDomains:100 debug:false contest:true nameserver:}

NOTE: as this is an alpha - we rely on feedback - please report bugs and featurerequests to https://github.com/mwiora/NAMEinator/issues and provide this output
OS: linux ARCH: amd64

trying to load nameservers from datasrc/nameserver-globals.csv
panic: runtime error: index out of range [1] with length 1

goroutine 1 [running]:
main.readNameserversFromFile({0xc00009abd0, {{0x0, 0x0}, 0x0, 0x0, 0x0, 0x0}}, {0x55e42d3d7fde?, 0x0?})
NAMEinator/loader.go:52 +0x3c5
main.prepareBenchmarkNameservers({0xc00009abd0, {{0x0, 0x0}, 0x0, 0x0, 0x0, 0x0}})
NAMEinator/loader.go:17 +0xec
main.prepareBenchmark({0xc00009abd0, {{0x0, 0x0}, 0x0, 0x0, 0x0, 0x0}}, {0xc00009ac00, {{0x0, 0x0}, ...}})
NAMEinator/main.go:126 +0x118
main.main()
NAMEinator/main.go:164 +0x97

main.readNameserversFromFile(0xc000090b40, 0x0, 0x0, 0x0, 0x12d1d28, 0x1e) /home/travis/gopath/src/github.com/mwiora/NAMEinator/loader.go:52 +0x45

The result of this binary: https://github.com/mwiora/NAMEinator/releases/download/v0.0.5/NAMEinator_0.0.5_linux_amd64.tar.gz

➜  NAMEinator_0.0.5_darwin_amd64 ./NAMEinator
starting NAMEinator - version 0.0.5
understood the following configuration: {numberOfDomains:100 debug:false contest:true nameserver:}
-------------
NOTE: as this is an alpha - we rely on feedback - please report bugs and featurerequests to https://github.com/mwiora/NAMEinator/issues and provide this output
OS: darwin ARCH: amd64
-------------
trying to load nameservers from datasrc/nameserver-globals.csv
panic: runtime error: index out of range [1] with length 1

goroutine 1 [running]:
main.readNameserversFromFile(0xc000090b40, 0x0, 0x0, 0x0, 0x12d1d28, 0x1e)
	/home/travis/gopath/src/github.com/mwiora/NAMEinator/loader.go:52 +0x459
main.prepareBenchmarkNameservers(0xc000090b40, 0x0, 0x0, 0x0)
	/home/travis/gopath/src/github.com/mwiora/NAMEinator/loader.go:17 +0xc5
main.prepareBenchmark(0xc000090b40, 0x0, 0x0, 0x0, 0xc000090b70, 0x0, 0x0, 0x0)
	/home/travis/gopath/src/github.com/mwiora/NAMEinator/main.go:126 +0x45
main.main()
	/home/travis/gopath/src/github.com/mwiora/NAMEinator/main.go:164 +0xa5

But, when I built by my own, it worked.

➜  NAMEinator-master go version
go version go1.15.6 darwin/amd64
➜  NAMEinator-master go build
go: downloading github.com/miekg/dns v1.1.31
go: downloading golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe
go: downloading golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550
go: downloading golang.org/x/net v0.0.0-20190923162816-aa69164e4478
➜  NAMEinator-master ./NAMEinator
starting NAMEinator - version custom
..........

No error output with SERVFAIL

I noticed it when using the NAMEinator to the DNS server that returns SERVFAIL to all requests by upstream failure: The benchmark completed super fast (of course) and printed no error from the nslookup.
Is this an expected behavior? I think it's more user friendly if there's some warning when DNS resolution fails.

P.S. Oh I forgot to add outputs and env infos, here it is if you need:

nameinator -nameserver 192.168.0.1 -debug=true -contest=false
starting NAMEinator - version custom
understood the following configuration: {numberOfDomains:100 debug:true contest:false nameserver:192.168.0.1}
-------------
NOTE: as this is an alpha - we rely on feedback - please report bugs and featurerequests to https://github.com/mwiora/NAMEinator/issues and provide this output
OS: linux ARCH: amd64
-------------
trying to load domains from datasrc/alexa-top-2000-domains.txt
LETS GO - each dot is a completed domain request against all nameservers
....................................................................................................
finished - presenting results: 

192.168.0.1: 
Avg. [1.48439ms], Min. [1.136248ms], Max. [3.33106ms] {192.168.0.1 givenByParameter LOCAL 100 0 0 1484390 [3331060 1787108 1388191 1450744 1444987 1441254 1355245 1374816 1404928 1377471 1468338 1625967 1410288 1264783 1383894 1404933 1382486 1875425 1719979 1173151 1515816 1306029 1612369 1220237 1476228 1471292 1493032 1821485 1506834 1427908 1440642 1464358 1452571 1402516 1879284 1694096 1136248 1691404 1615207 1549381 1509880 1310003 1461250 1572385 1327315 1321189 1678352 1206417 1391486 1428525 1884340 1454763 1456784 1434911 1264123 1458152 1609569 1466203 1326279 1572921 1348804 1465278 1446791 1311643 1415597 1591823 1352842 1811028 1489064 1400163 1360907 1492365 1561475 1365023 1381569 1373963 1359914 1415091 1466030 1517252 1321487 1424005 1657851 1258985 1867430 1481470 1454992 1365079 1398978 1426080 1457015 1591266 1358055 1403694 1500042 1288678 1444305 1398292 1331584 1706319] 1484390 1136248 3331060}

Actually

nslookup goo.gl 192.168.0.1
Server:         192.168.0.1
Address:        192.168.0.1#53

** server can't find goo.gl: SERVFAIL

embed datasrc in binary

Use a tool like go-bindata (github.com/kevinburke/go-bindata) to embed the datasrc in the binary. This would avoid the need to check out the source code and run the command from the NAMEinator directory.

panic error

Hello.
I run nameinator (on my distro is named so) and I got the following:

starting NAMEinator - version custom
understood the following configuration: {numberOfDomains:100 debug:false contest:true nameserver:}
trying to load nameservers from datasrc/nameserver-globals.csv
panic: runtime error: index out of range [1] with length 1

goroutine 1 [running]:
main.readNameserversFromFile({0xc000182ba0, {{0x0, 0x0}, 0x0, 0x0, 0x0, 0x0}}, {0x55ce298b81d7?, 0x0?})
	NAMEinator/loader.go:52 +0x3e5
main.prepareBenchmarkNameservers({0xc000182ba0, {{0x0, 0x0}, 0x0, 0x0, 0x0, 0x0}})
	NAMEinator/loader.go:17 +0xec
main.prepareBenchmark({0xc000182ba0, {{0x0, 0x0}, 0x0, 0x0, 0x0, 0x0}}, {0xc000182bd0, {{0x0, 0x0}, ...}})
	NAMEinator/main.go:126 +0x118
main.main()
	NAMEinator/main.go:164 +0x97

Other info:
OS: Garuda Linux x86_64
Shell: fish 3.6.0
Terminal: xfce4-terminal
Package: https://aur.archlinux.org/packages/nameinator (compiled from source)

panic: runtime error: slice bounds out of range [:100] with capacity 32

Hi - got a "panic: runtime error: slice bounds out of range [:100] with capacity 32"

Steps:
Downloaded NAMEinator_0.0.5_windows_amd64.tar.gz

Windows 11 Cmd (admin) prompt:
D:\Downloads>mkdir NAMEinator

D:\Downloads>tar -xvzf "D:\Downloads\NAMEinator_0.0.5_windows_amd64.tar.gz" -C d:\downloads\NAMEinator
x README.md
x NAMEinator.exe

Manually created datasrc directory (as per other issues on wiki)
D:\Downloads\NAMEinator>mkdir datasrc

Manually created Alexa-top-2000-domains.txt and nameserver-globals.csv

Attempted to run:
D:\Downloads\NAMEinator>nameinator
starting NAMEinator - version 0.0.5
understood the following configuration: {numberOfDomains:100 debug:false contest:true nameserver:}

NOTE: as this is an alpha - we rely on feedback - please report bugs and featurerequests to https://github.com/mwiora/NAMEinator/issues and provide this output
OS: windows ARCH: amd64

trying to load nameservers from datasrc/nameserver-globals.csv
trying to load domains from datasrc/alexa-top-2000-domains.txt
panic: runtime error: slice bounds out of range [:100] with capacity 32

goroutine 1 [running]:
main.prepareBenchmarkDomains(0xc00007a9c0, 0x0, 0x0, 0x0)
/home/travis/gopath/src/github.com/mwiora/NAMEinator/loader.go:33 +0x1eb
main.prepareBenchmark(0xc00007a990, 0x0, 0x0, 0x0, 0xc00007a9c0, 0x0, 0x0, 0x0)
/home/travis/gopath/src/github.com/mwiora/NAMEinator/main.go:127 +0x67
main.main()
/home/travis/gopath/src/github.com/mwiora/NAMEinator/main.go:164 +0xad

Also tried running the command as follows:
D:\Downloads\NAMEinator>nameinator -nameserver 192.168.1.1
starting NAMEinator - version 0.0.5
understood the following configuration: {numberOfDomains:100 debug:false contest:true nameserver:192.168.1.1}

NOTE: as this is an alpha - we rely on feedback - please report bugs and featurerequests to https://github.com/mwiora/NAMEinator/issues and provide this output
OS: windows ARCH: amd64

trying to load domains from datasrc/alexa-top-2000-domains.txt
panic: runtime error: slice bounds out of range [:100] with capacity 32

goroutine 1 [running]:
main.prepareBenchmarkDomains(0xc00007a9f0, 0x0, 0x0, 0x0)
/home/travis/gopath/src/github.com/mwiora/NAMEinator/loader.go:33 +0x1eb
main.prepareBenchmark(0xc00007a9c0, 0x0, 0x0, 0x0, 0xc00007a9f0, 0x0, 0x0, 0x0)
/home/travis/gopath/src/github.com/mwiora/NAMEinator/main.go:127 +0x67
main.main()
/home/travis/gopath/src/github.com/mwiora/NAMEinator/main.go:164 +0xad

Files missing from published release

The contents of datasrc/ are missing from NAMEinator_0.0.3_linux_amd64.tar.gz. Had to manually add the 2 files to get the bin to run correctly.

Didn't check the releases for other targets.

use go modules

For easier build and also better packaging, introduction of go modules would be highly appreciated.
Thank you :)

panic: runtime error: index out of range [1] with length 1

I just downloaded this through Arch Linux and "yay -S nameinator". Then I tried to use the tool and I get:

trying to load nameservers from datasrc/nameserver-globals.csv
panic: runtime error: index out of range [1] with length 1

The full error is below, I haven't digged into the reason for this - but can see you appreciate feedback...

$ nameinator
starting NAMEinator - version 0.3 alpha
understood the following configuration: {numberOfDomains:100 debug:false contest:true nameserver:}
-------------
NOTE: as this is an alpha - we rely on feedback - please report bugs and featurerequests to https://github.com/mwiora/NAMEinator/issues and provide this output
OS: linux ARCH: amd64
-------------
trying to load nameservers from datasrc/nameserver-globals.csv
panic: runtime error: index out of range [1] with length 1

goroutine 1 [running]:
main.readNameserversFromFile(0xc000088b40, 0x0, 0x0, 0x0, 0x6f9f46, 0x1e)
	github.com/mwiora/nameinator/loader.go:52 +0x436
main.prepareBenchmarkNameservers(0xc000088b40, 0x0, 0x0, 0x0)
	github.com/mwiora/nameinator/loader.go:17 +0xc0
main.prepareBenchmark(0xc000088b40, 0x0, 0x0, 0x0, 0xc000088b70, 0x0, 0x0, 0x0)
	github.com/mwiora/nameinator/main.go:109 +0x42
main.main()
	github.com/mwiora/nameinator/main.go:146 +0xa1

install broken with go 1.16 due to go modules

go modules are on by default with 1.16, and the repo seems to incorrectly declare its import path. Trying go get results in an error:

vladimir@minim1 ~ % go get github.com/mwiora/NAMEinator
go: downloading github.com/mwiora/NAMEinator v0.0.5
go get: github.com/mwiora/[email protected] updating to
	github.com/mwiora/[email protected]: parsing go.mod:
	module declares its path as: NAMEinator
	        but was required as: github.com/mwiora/NAMEinator

reenabling UI

currently only the CLI version of namebench is maintained.

Add Markupsafe as python package dependency

I just cloned the repo from 1.3 branch on b1de8f and installed it running:
cd namebench
pip install .

This successfully installs the package but running namebench.py fails with:
ImportError: No module named markupsafe

After installing it manually with: pip install markupsafe the script runs successfully.

I'm happy to provide a PR if that is of any help.

DNS-Servers are not up2date

the nameservers list is static and is constantly running out-of-updates.
This requires the check of DNS Servers upfront to the tests which mostly fail in the end.

Update censoring check

Currenly each search results in false positive censorship-check results:

  • The current preferred DNS server.
  • www.google.com is hijacked: 74.125.136.106, 74.125.136.105, 74.125.136.99, 74.125.136.103, 74.125.136.147, 74.125.136.104
  • google.com appears incorrect: 216.58.211.46
  • twitter.com appears incorrect: 104.244.42.193, 104.244.42.65

This seems to be the result of an outdated censorship reference list.

Nameserver argument isn't working with a list on DNS

It looks like the nameserver argument isn't working with a list of DNS
NAMEinator is only using the first on the list:

./NAMEinator -nameserver 208.67.222.222 208.67.220.220

starting NAMEinator - version custom
understood the following configuration: {numberOfDomains:100 debug:false contest:true nameserver:208.67.222.222}
-------------
NOTE: as this is an alpha - we rely on feedback - please report bugs and featurerequests to https://github.com/mwiora/NAMEinator/issues and provide this output
OS: darwin ARCH: amd64
-------------
trying to load domains from datasrc/alexa-top-2000-domains.txt
LETS GO - each dot is a completed domain request against all nameservers
....................................................................................................
finished - presenting results: 

192.168.xxx.xxx: 
Avg. [51.872169ms], Min. [591.644µs], Max. [318.602376ms] 

208.67.222.222: 
Avg. [81.103397ms], Min. [10ms], Max. [1.213212674s] 

Au revoir!

Document usage of -contest

I struggled to find the correct way of disabling contest mode.
It's enabled by default, so I had to switch it off.
What I tried:

NAMEinator -contest false
NAMEinator -contest off
NAMEinator -contest no
NAMEinator -contest 0
NAMEinator -nocontest
...

What actually worked:

NAMEinator -contest=false

I suggest to document correct usage of -contest argument.

panic: runtime error: index out of range [1] with length 1

OS: linux ARCH: amd64

trying to load nameservers from datasrc/nameserver-globals.csv
panic: runtime error: index out of range [1] with length 1

goroutine 1 [running]:
main.readNameserversFromFile({0xc00010abd0, {{0x0, 0x0}, 0x0, 0x0, 0x0, 0x0}}, {0x555cd8904fde?, 0x0?})
NAMEinator/loader.go:52 +0x3c5
main.prepareBenchmarkNameservers({0xc00010abd0, {{0x0, 0x0}, 0x0, 0x0, 0x0, 0x0}})
NAMEinator/loader.go:17 +0xec
main.prepareBenchmark({0xc00010abd0, {{0x0, 0x0}, 0x0, 0x0, 0x0, 0x0}}, {0xc00010ac00, {{0x0, 0x0}, ...}})
NAMEinator/main.go:126 +0x118
main.main()
NAMEinator/main.go:164 +0x97

No GUI?

I'm running on macOS 10.12.3 and I do not get a GUI from ./namebench.py

NAMEinator_0.0.5_windows_amd64.tar.gz is missing the datasrc folder

The Win version is missing the data it needs to actually run and do anything. Has to be found in source.zip or source.tar.gz (and people unfamiliar with this sort of source-based and command-line-oriented tool may not understand they should look there for it).

PS: It doesn't make much sense to distribute Windows packages in tar.gz form. It doesn't provide any benefit, and a lot of Windows people won't know what to do with it, with what tools (nor are all of them very good for this; e.g. 7Zip, which "does everything" doesn't quite; you have to extract the gz then the tar as separate operations, as it doesn't seem smart enough to interpret it as a single archive to process in two steps). ZIP would better, as Windows Explorer has support for that built in already and pretty much everyone already knows what to do with it.

PPS: Thanks for including 1.1.1.1 and 1.0.0.1 by default. I found it irritating that the original NameBench 1.3.1 did not, and still won't run tests against them by default even after you add them to the config file; you have to manually add them to the list of servers to use in the top line of the GUI - every single time, since it doesn't save your changes to that line.

Index out of range trying to load nameservers

It seems to have problems to fetch the DNS list

╰─$ nameinator -debug                                                                                                                                                                       [2]
starting NAMEinator - version custom
understood the following configuration: {numberOfDomains:100 debug:true contest:true nameserver:}
-------------
NOTE: as this is an alpha - we rely on feedback - please report bugs and featurerequests to https://github.com/mwiora/NAMEinator/issues and provide this output
OS: linux ARCH: amd64
-------------
DEBUG: nslookup output
Server:         192.168.1.1
Address:        192.168.1.1#53

Non-authoritative answer:
*** Can't find .: No answer


DEBUG: dns server
192.168.1.1
trying to load nameservers from datasrc/nameserver-globals.csv
panic: runtime error: index out of range [1] with length 1

goroutine 1 [running]:
main.readNameserversFromFile(0xc000096bd0, 0x0, 0x0, 0x0, 0x55e1bf1af54a, 0x1e)
        NAMEinator/loader.go:52 +0x45f
main.prepareBenchmarkNameservers(0xc000096bd0, 0x0, 0x0, 0x0)
        NAMEinator/loader.go:17 +0xb9
main.prepareBenchmark(0xc000096bd0, 0x0, 0x0, 0x0, 0xc000096c00, 0x0, 0x0, 0x0)
        NAMEinator/main.go:126 +0x45
main.main()
        NAMEinator/main.go:164 +0xad

Stuck on OSX 10.9.5

In OS X 10.9.5, it takes 45 minutes to check nameserver availability "(6 threads) [.../4516]", then it begins sending queries.
Decided to close the app after 2 hours of being stuck with "Sending 250 queries 4 Servers [11/1000]"

exit status 1

Hi,

I compiled NAMEinator on ubuntu 18.10 with go1.10.4 linux/amd64

When I try to run it, I the the following result:

marc@thinkpad2:~/go/bin$ ./NAMEinator 
starting NAMEinator - version 0.3 alpha
understood the following configuration: {numberOfDomains:100 debug:false contest:true nameserver:}
-------------
NOTE: as this is an alpha - we rely on feedback - please report bugs and featurerequests to https://github.com/mwiora/NAMEinator/issues and provide this output
OS: linux ARCH: amd64
-------------
2019/03/07 12:35:23 exit status 1

any idea?

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.