Giter Site home page Giter Site logo

libp2p / website Goto Github PK

View Code? Open in Web Editor NEW
34.0 18.0 32.0 19.17 MB

Webpage of the libp2p project. A multi protocol approach for a interoperable network stack that follows the 'self description' in favor of assumptions

Home Page: https://libp2p.io

HTML 34.01% JavaScript 10.53% CSS 3.20% Makefile 4.05% Shell 1.59% Less 46.63%

website's Introduction

standard-readme compliant CircleCI branch Discourse posts

Official website for libp2p http://libp2p.io

This repository contains the source code for the libp2p website available at http://libp2p.io

This project builds out a static site to explain libp2p, ready for deployment on ipfs. It uses hugo to glue the html together. It provides an informative, public-facing website. The most important things are the words, concepts and links it presents.

Much of the site content is data-driven, take a look at the data dir where find the data behind the implementations information as json.

Install

git clone https://github.com/libp2p/website

Usage

To deploy the site libp2p.io, run:

# Build out the optimised site to ./public, where you can check it locally.
make

# Add the site to your local ipfs, you can check it via /ipfs/<hash>
make deploy

# Save your dnsimple api token as auth.token
cat "<api token here>" > auth.token

# Update the dns record for libp2p to point to the new ipfs hash.
make publish-to-domain

The following commands are available:

make

Build the optimised site to the ./public dir

make serve

Preview the production ready site at http://localhost:1313 (requires hugo on your PATH)

make dev

Start a hot-reloading dev server on http://localhost:1313 (requires hugo on your PATH)

make minfy

Optimise all the things!

make deploy

Build the site in the public dir and add to ipfs (requires hugo & ipfs on your PATH)


See the Makefile for the full list or run make help in the project root. You can pass the env var DEBUG=true to increase the verbosity of your chosen command.

Dependencies

  • Node.js and npm for build tools
  • ipfs to deploy changes
  • jq, curl and an auth.token file in the project root containing your dnsimple api token to update the dns.

All other dependencies are pulled from npm and the Makefile will run npm install for you because it's nice like that.

Contribute

Please do! Check out the issues, or open a PR!

Check out our notes on contributing for more information on how we work, and about contributing in general. Please be aware that all interactions related to libp2p are subject to the IPFS Code of Conduct.

Small note: If editing the README, please conform to the standard-readme specification.

website's People

Contributors

alanshaw avatar andyschwab avatar backkem avatar daviddias avatar dependabot[bot] avatar gnunicorn avatar ianopolous avatar jesseclay avatar johnnymatthews avatar jorropo avatar kyledrake avatar leon-do avatar libp2p-mgmt-read-write[bot] avatar lidel avatar marcopolo avatar menduist avatar mkg20001 avatar momack2 avatar mxinden avatar olizilla avatar p-shahi avatar raulk avatar richardlitt avatar richsilv avatar rlgo avatar salmad3 avatar stebalien avatar victorb avatar web-flow avatar yusefnapora 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

Watchers

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

website's Issues

Status?

Having this online can make a huge difference on how people contribute to IPFS. I often myself navigating across dozens of repos trying to make sense to the whole picture. I think having a home for libp2p with links to the implementations, specs and documentation would really ignite contributions.

Same for merkledag and bitswap. By splitting the cognitive barrier into smaller pieces people are more willing to contribute.

Let me know if you are interested on me helping on that front.

Examples page

A separate page for examples and demos. Would be great if could somehow load these demos from SCM or some external page, so the code itself doesn't live in the website.

We have a lot ideas of different kinds of demos we can do. Here is some of them:

  • Establishing encrypted connection
  • Handling multiple protocols in the same connection (multiplex connection)
  • Discovery local + remote peers

What we definitely want to have on this page:

  • Basic example - could basically be the same as the one on the landing page, but showing the code for it as well
  • Chat - Enables you to chat with the rest of the people that is visiting the same page as you

Add a link to the libp2p community / public events calendar

Done Criteria

https://libp2p.io/#communitymakes it clear that:

  1. We have a community calendar
  2. What it's purpose is (surface events for libp2p implementers and consumers)
  3. How to view it
  4. How to add items to the calendar

Notes

  1. The libp2p Public Events calendar is visible here: https://calendar.google.com/calendar/embed?src=libp2p.io_0q9682i3te7eanhe9q7ae1c58g%40group.calendar.google.com
  2. Events can be added to the libp2pcalendar by inviting [email protected]

Website missing link to libp2p/website repository

We should note on the website that it's open source and open to contributions, together with a link to the Github repository. To not confuse it with the Github link in the menu (which goes to github.com/libp2p), the link could be in the footer.

Icons for Features

Here are currently proposed icons for the "features" section of the website:

image

Some of these do a good job, others not so much. Feedback? What do you like here, what needs to be different?

(note that the description of the feature appears on mouseover.

pages don't render with latest hugo

Trying to get the website up and running, I installed latest hugo (Hugo Static Site Generator v0.46 linux/amd64 BuildDate: 2018-08-02T22:40:09+0200) and doing make serve, the main-page links to /implementations, /bundles, etc are broken (give a 404). It looks like hugo is not even rendering them at all.

media: Add content from libp2p Day

Done Criteria

Latest videos from libp2p Day are added to https://libp2p.io/media/

Introductions & Project Updates needs to add

  • Intro to libp2p: helping with real world application problems
  • A month in PL EngRes libp2p Development and how you can be involved

Create a new Browser Connectivity section and add

  • Browser connectivity state of the union and demo
  • Why WebRTC

Technical Deep Dives needs to add

  • libp2p Interoperability Testing with Testground
  • DOS defense - do’s and dont’s
  • Decentralized NAT Hole-Punching
  • The power of two choices

Create a new Community section and add

  • libp2p in Nim
  • How Pyrsia is using libp2p to take over the world
  • Satellite.im and what we're doing with IPFS and js-libp2p
  • Intro to Lodestar

Why Important

These videos contain the most up to date information about project status/implementation timelines

Update bundles array for js-ipfs & go-ipfs

Bundles are now populating from the array in the bundes_data.js file. @diasdavid @whyrusleeping mind each going through the file & making sure things look good? If any particular module is 'unstable' (not yet launched), please add it into the empty array with that status so the 'section' is not empty when selected.

Thanks!

(possibly) unclear formulation in protocols concept page

In the protocols concept page of the website, under the binary streams section it states that:

Behind the scenes, libp2p will also ensure that the stream is secure and efficiently multiplexed. This is transparent to the protocol handler, which reads and writes unencrypted binary data over the stream.

I am not a native english speaker so please excuse any missinterpretations, but if the underlying implementation (which in this context is that the stream is encrypted and multiplexed) is transparent to the protcol handler, isn't the statement "which reads and writes unencrypted binary data over the stream" contradictory? Is it not, in fact, by that definition opaque to the handler?

This is of course not a major thing, but I want to understand things correctly, so can someone please clarify the intended meaning and if it is indeed worded wrong, I can submit a PR to change it.

Thanks

Implementations page

The implementations page would list all the different kinds of implementations in many tables, with colors being used to show the status of the implementation.

  • Generic table that can be reused for all the different sections. Has
    the module name on the y axis and language on the x axis. Top of the table
    includes links to the interface.
  • Sections
    • transport
    • stream-muxer
    • discovery
    • connection-upgrades (we don't have any of these yet)
    • crypto channel
    • discovery
    • peer-routing
    • record-store

Full list: https://gist.github.com/VictorBjelkholm/2c2a1bb64e0784f0c9ac2cb1d8125a61

Use partials in html pages

There's currently a bunch of duplication throughout the site -- a lot of elements should be refactored into partials. Biggest ones that come to mind:

  • Header
  • Footer

Landing page

Landing page is the most important part of the website, to allow people to understand quickly what libp2p is about and how they can use it.

Currently planned to include:

  • Small visual demo, showing off libp2p with connecting nodes
  • Features
  • Languages supported: Go, JS + others coming (logos of the languages kind blurred out)
  • Talks & Conferences
  • Contribute & Community
  • Link to specification on Github in header
  • Link to Github entry-repo in header

Small Visual Demo
We'd love to have a visual experience above the fold of the website, showing how you as a visitor is instantly connected to other nodes.

Content needed from @diasdavid

  • Opening paragraph that we can list above the fold as well
  • Which features to list? Title + Description
  • Which videos/talks to list on landing page

For the Contribute & Community section, maybe we can reuse the one from IPLD written by @RichardLitt ?

IPLD is an open source project from the IPFS community. There are many ways you can contribute by getting involved: you can help write the specification, code implementations and tools using IPLD, craft examples and tutorials, and join our regular product calls to discuss IPLD with us.

make more pleasing footer

Even though I implemented the current footer, I think it looks weird... it's not up to the quality of the rest of the website:

image

I'd like to see a better version of this.

site down: new deploys don't seem to resolve via the gateway

I'm not sure what the cause of this is yet, but recent builds of the website (e.g. from #93) aren't resolving from the gateway, so libp2p.io is currently spinning for a while before eventually returning a 504.

I first thought it was a dnslink issue, since dig libp2p.io -t TXT doesn't show a _dnslink record:


; <<>> DiG 9.10.6 <<>> libp2p.io -t TXT
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7783
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;libp2p.io.			IN	TXT

;; ANSWER SECTION:
libp2p.io.		3599	IN	TXT	"v=spf1 a include:_spf.google.com ~all"

;; Query time: 84 msec
;; SERVER: 192.168.86.1#53(192.168.86.1)
;; WHEN: Thu Jun 20 15:08:48 EDT 2019
;; MSG SIZE  rcvd: 88

However, I also can't grab the hash (as reported by the circle build) - https://ipfs.io/ipfs/QmaYRVyPKpN8FXy9HS1t9Zhtjo4RpYXgiuNj1ins9fiLuW seems to hang forever waiting to resolve.

@olizilla is there anything weird about this site vs other sites that would cause this? the circle setup seems basically the same as for docs.libp2p.io, so idk what might be different.

Oddly, I also can't seem to resolve the last version that was published (from #92):
https://ipfs.io/ipfs/QmbD43XgQ7Tb4242yVZR5kCRUjkonmaZqBWjsfPs5eD9xm/

Content for the Website

Heey Jesseeee, here is what you askes. With ❤️ @diasdavid and @victorbjelkholm

@jesseclay

libp2p website

Sitemap

|- /        - Landing Page
|- /modules - Implementations (Modules)
|- /bundles - Bundles
`- /specs   - Examples (Demos)

Navigation

Every page should contain the same navigation bar, containing links to the subpages of the libp2p website and other places of relevant information for libp2p interested users.

The navigation bar should float with the user as they uncover the website, having the extra task of offering the users a way to get back to the beginning.

List of items in the navigation:

Pages

Landing Page

Above the fold

  • Title: libp2p logo
  • Tagline: A modular network stack, run your network applications free from runtime and address services independently of their location
  • Embedded Demo - Visual representation of several nodes (peers/machines) connected together. These machines will be the actual visitors of the website. A JavaScript example of how to achieve this can be found at: https://github.com/VictorBjelkholm/libp2p-demo.

Below the fold

  • Features. List of features found at:

    website/config.yml

    Lines 25 to 43 in 6688148

    features:
    - name: "Use several transports"
    description: Your application can use newer and more performant transports like QUIC, WebRTC while still providing TCP without having to change the way it works.
    - name: "Location independent"
    description: With libp2p, addressing is made per process which means that independently of where the process is running, you will be able to dial to it
    - name: "Runtime freedom"
    description: The libp2p interface is independent of the runtime, your app can run natively or in the browser without requiring to change how it handles the network stack
    - name: "Protocol Muxing"
    description: Reuse existing pipes to mux between protocols, reducing the delay caused by things like TCP slow start and hole punching (the same benefit present in HTTP/2).
    - name: "Work offline"
    description: libp2p is capable of discovery other peers without resourcing to centralised registries, enabling apps to work disconnected from the backbone
    - name: "Encrypted connections"
    description: Ensure that every connection that is made is using an encrypted channel by picking one of the available options.
    - name: "Upgrade without compromises"
    description: Libp2p protocol muxing enables your application to support several versions of its networked services, enabling you to have a smooth migration over time
    - name: "Work in the browser"
    description: With libp2p, you can dial out from a browser session but also dial in! Other peers in the network have the ability to route packets to the browser.
    - name: "Good for high latency scenarios"
    description: Using a packet switching routing (soon), libp2p can make your application work in networks where other transports would simply fail.

  • Bundles listing: These are the bundles available in different Runtimes.

    • Browser
    • Node.js
    • Go
    • "Create your own custom bundle" - Link to page with instructions to build a js bundle and suggesting that it can be done in other languages with the other language pieces github.com/libp2p/libp2p#custom-bundle - needs to be created)
  • Publications & Talks:

  • Community

    • invitive paragraph to the community
    • link to IRC #ipfs on freenode
    • link to community page in github.com/libp2p/community
    • link to twitter twitter.com/libp2p
  • Footer

    • Same info as ipfs.io
    • replace the ipfs twitter and github by twitter.com/libp2p and github.com/libp2p respectively

Implementations Page

The implementations page should contain several tables, each table will be dedicated to one of the type of modules, the tables should represent the state of each module. One great source of inspiration is: http://iswebrtcreadyyet.com/

Table example

Stream Multiplexer

name JavaScript Go Rust
libp2p-spdy
libp2p-yamux
libp2p-multiplex

Possible states:

  • Missing
  • Prototype (Unstable, might catch fire)
  • In progress (Usable)
  • Done

See #14 for more info.

Bundles Page

This page should included the bundles and their features listed above, but expanded with pointers to examples and how to get started with them.

More info at: #15

Examples Page

We have several examples prepared for libp2p, what we are looking for to have ready for this page is a way to present several examples in one page and a way to easily add more to these gallry

In the gallery, there should be a visual queue of what the example list and a table of contents of the examples available. Take inspiration from D3JS page, here: https://github.com/d3/d3/wiki/Gallery

Each example will have instructions to use it and some visual diagrams of what it is doing.

Inspirations

d3 Map Animation for home page

I had our designers create all the assets we should need to make a SICK map visualization for the homepage. Basically we want to take this:

https://ipfs.io/ipfs/QmZCkufaASVc8pn4XQRDQA1xi6t3Lv7rmEoZUMukXRo8ko/

and turn it into this:

image

I've included the map image, in addition to the svg files for the colored lines & hexes. The box with location info is not included, it's assumed that would be made with CSS (could be a d3 element too, maybe that makes more sense). Make the location box the same color as the hex, & randomize the colors of placed hexes. Lines should match the color of the hex it's leaving. Just match the image & ok yes I'll shut-up now.

This should be fun, who wants it @victorbjelkholm @diasdavid??

Maps (both grey & white included, I think we'll end up using white)
Hexes & lines

Sections

Things to have on the website:

  • Status
  • Examples
  • Documentation
  • Pointers to implementations
  • Tooling
  • Contribute
  • Related

Analytics: track links clicked

I just implemented basic page-view tracking, but it would be useful to see which external links are clicked from the site: "Try libp2p", "Implementations", "Specification", etc..

Can't build it

> hugo version
Hugo Static Site Generator v0.19 linux/amd64 BuildDate: 2017-02-27T13:35:55+01:00
> hugo
Started building sites ...
Error: Error building site: Failed to read data from icons/c.svg/c.svg: Data not supported for extension 'svg'

Update implementations

Creating an issue to track updates for: https://libp2p.io/implementations/

  • Some implementations are outdated and need to be updated
  • Add/remove current and outdated implementations, respectively. Think it is better to remove deprecated ones instead of keeping them on the page and labelling them deprecated
  • Reconsider matrixes

Stub out using minimal-cayman

In an attempt to get this jump started, I am stubbing out this website using minimal-cayman. This is not meant to be the final product, at all. It is a starting board.

Actionables

  • Edit _config.yml.
  • Edit index.md.
  • Replace logo with your own logo.
    • Remove old logo entirely, from src/ and assets.
  • Replace favicon with your own favicon.
  • Edit package.json if you plan on using semver to save and deploy website.
  • Remove or edit CNAME.
  • Deploy!
  • Edit this README to reflect current website.

Going live with libp2p.io (split into smaller issues)

So, let's kick in the high gear and go live with a iteration of the website that we can show people and make use of. Then we can figure out a more proper design, have some more content like demos and such.

But first things first! What we're missing for the first iteration, described with the site structure we want:

  • Landing Page
    • Small visual demo, showing off libp2p with connecting nodes
    • Features
    • Languages supported: Go, JS + others coming (logos of the languages kind blurred out)
    • Talks & Conferences
    • Contribute & Community
  • Implementations Page
    • Generic table that can be reused for all the different sections. Has
      the module name on the y axis and language on the x axis. Top of the table
      includes links to the interface. Color of the cell is either red, yellow or
      green depending on implementation status
    • Sections
      • transport
      • stream-muxer
      • discovery
      • connection-upgrades (we don't have any of these yet)
      • crypto channel
      • discovery
      • peer-routing
      • record-store
  • Bundles < Prepackaged libraries with set of features < description of what bundles
    • libp2p-browser
    • libp2p-node
    • go-libp2p
  • Examples (code snippets)
    • Quickstart < Connection to other peers, basically the same as the landing page demo
    • Establishing encrypted connection
    • Handling multiple protocols in the same connection (multiplex connection)
    • Discovery local + remote peers
  • Link to specification on Github

Sounds good?

Move token out of the repo

#52 (comment)

From @lgierth

Move the token file to something like $HOME/.protocol/dnsimple.token -- just so it's never underneath the repo directory and there's no chance of ever accidentally committing it.

You can just assume that people put it there out-of-band (dnslink.sh will fail on its own).

TLS Cert Expired

@kenshyx noted on IRC that it is time for a new one:

screenshot_12

I strongly feel this should be automated somehow, at least for *.bootstrap.libp2p.io.
Right now all the bootstrap nodes for js-ipfs seem to have expired certificates :'(

Bundles page

This page is for listing the bundles, already made configurations for simple usage.

  • Bundles < Prepackaged libraries with set of features < description of what bundles
    • libp2p-browser
    • libp2p-node
    • go-libp2p

Document browser connectivity story and roadmap

The browser connectivity site has been deployed but there are still many things to be done:


Done Criteria

A URL can be shared that answers:

  1. How a browser node can connect to other nodes (other browser nodes, other non-browser nodes), accounting for the differences amongst browsers and libp2p implementations.
  2. Sample code making these connections.
  3. How to follow along on contribute to the development tracks

If someone isn't aware of the intricacies of this topic or has outdated information, they should be able to start at this resource and quickly learn the options, the options' pros/cons, what's available today, what's coming, how to follow, and how to help.

While not end-user facing, we also need to do the following before marking this as done (or these items should move to a separate item that we also track - we need to make sure we don't drop them just because we get the content done):

The list here was moved to the top.

Why Important

The browser connectivity story has improved over the last couple of years, but there isn't a one-size-fits-all silver-bullet. We need to help developers understand the landscape so they don't oversimplify or erroneously write-off libp2p.

Not only do we want developers informed, but this is an exciting time when it comes to browser connectivity, and we'd love to capture some of that interest to help develop and test the improvements that are coming.

User/Customer

Developers using libp2p so they can understand if/where/how libp2p can help them with their browser applications.

Notes

  1. Some of this information is in https://github.com/libp2p/specs/blob/master/connections/hole-punching.md#vision. Things it doesn't include currently:
  • Status of each transport in each libp2p implementation
  • Browser vendor specifics (e.g., Chromium having WebTranport support)
  • Sample code for getting started
  1. This issue was created in the libp2p/docs repo, but that doesn't mean it needs to be solved here. If this information is authored somewhere else, we should at least have a link from the docs website to it.

Create a libp2p.io/specs website

The specs repo should be served separately similar to spec.filecoin.io

The rendered output is a nicer way to read the specifications. It matters more for casual users/new learners who are not writing/updating specs on a day to day basis.

There are existing solutions to deploy a site directly from the specs directory without needing to duplicate content or incurring maintenance overhead (aim should be zero overhead) for specs writers/maintainers.

My favorite examples are this spec site: https://internetcomputer.org/docs/current/references/ic-interface-spec/
rendered from this AsciiDoc: https://github.com/dfinity/interface-spec/blob/master/spec/index.adoc

and the Filecoin spec site https://spec.filecoin.io/

copied from: libp2p/docs#210 (comment)

@DannyS03 's notion page: https://www.notion.so/pl-strflt/libp2p-specs-site-dfec46f10d5340dc87bbf0355159f0a5

jquery needs to be updated

image

Fortunately, the Website doesn't interact with any APIs or old user data, mitigating all the possible attack vector. Nevertheless, it is better for us to update this.

@victorbjelkholm is this something you can look into?

Content requested

@victorbjelkholm couldn't find the issue where you requested this, but here it goes:

Opening line

A modular network stack, run your network applications free from runtime and address services independently of their location.

Features to highlight

Use several transports

Your application can use newer and more performant transports like QUIC, WebRTC while still providing TCP without having to change the way it works.

Location independent

With libp2p, addressing is made per process which means that independently of where the process is running, you will be able to dial to it

Runtime freedom

The libp2p interface is independent of the runtime, your app can run natively or in the browser without requiring to change how it handles the network stack

Protocol Muxing

Reuse existing pipes to mux between protocols, reducing the delay caused by things like TCP slow start and hole punching (the same benefit present in HTTP/2).

Work offline

libp2p is capable of discovery other peers without resourcing to centralised registries, enabling apps to work disconnected from the backbone

Encrypted connections

Ensure that every connection that is made is using an encrypted channel by picking one of the available options.

Upgrade without compromises

Libp2p protocol muxing enables your application to support several versions of its networked services, enabling you to have a smooth migration over time

Work in the browser

With libp2p, you can dial out from a browser session but also dial in! Other peers in the network have the ability to route packets to the browser.

Good for high latency scenarios

Using a packet switching routing (soon), libp2p can make your application work in networks where other transports would simply fail.

Projects using libp2p

  • IPFS

Videos + Talks

See the talks section : https://github.com/libp2p/js-libp2p#background

Bundles

You can find some copy at: https://github.com/libp2p/js-libp2p#bundles

More Juicy content

Implementations page is inconsistent

The implementations page is inconsistent in the implementations listed.

All categories have

  • Browser JS
  • Node JS
  • Go

All except for NAT Traversal and Discovery also include

  • Rust

Record Stores additionally has

  • C#

This seems quite confusing to me.
All implementations should be listed for all categories.

Also the Python and Java implementations are missing entirely.

Decrease cpu usage in animations

Right now the animations (particularly the collab hexes) are consuming a ton of CPU. This needs to be reduced.

I suggest:

  • remove the growing/shrinking/floating. (i think this looks really bad, too. so my motivation for killing this is dual). Just fix the grid and scroll the grid to the left all-together.
  • make sure the whole grid (whole div elem, or canvas or whatever) is being moved once, instead of the move left being applied per-hex.

LMK if the above is not clear.

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.