Giter VIP home page Giter VIP logo

letsencrypt-gandi's Introduction

Deprecated

This plugin is no longer maintained. Gandi offers an free automated certificates for all simplehosting plans having ssl in the admin interface. This certificate is also auto-renewed automatically.

Let's Encrypt Gandi Plugin

letsencrypt-gandi is a plugin for certbot that allows you to obtain certificates from Let's Encrypt and use them with Gandi products such as Simple Hosting.

Requirements

  • certbot installed on your computer
  • A Gandi API Key, which you can get from your Gandi Account
  • Root privileges may be required to use certbot on your system (read the "Avoiding sudo" section to try to work around this limitation).

Installation

The way you install the plugin will depend on how you installed certbot on your system.

In general terms, after you have installed and configured certbot itself, you'll have to clone the plugin's repository into a local folder on your computer (or download it and extract it from a Zip file). Then, you'll have to run the appropriate command to install it on your system.

The examples below will show you how to install the plugin in different scenarios.

When using certbot from its repository

If you've cloned the certbot repository on your computer, you'll need to use the pip executable distributed with it to install the plugin.

First, run ./certbot-auto --help from inside the cloned repository's folder to ensure that the necessary files are installed on your system.

Then, proceed to downloading and installing the letsencrypt-gandi plugin.

~ $ git clone https://github.com/Gandi/letsencrypt-gandi.git
~ $ cd letsencrypt-gandi
~/letsencrypt-gandi $ ~/.local/share/letsencrypt/bin/pip install -e .

Note that the . at the end of pip install command is important.

Also note that you might have to run certbot from within its own directory, using the certbot-auto executable. In this case, replace [sudo] certbot by ./certbot-auto in the usage instructions and examples provided below.

When using a packaged version of certbot (Linux distributions)

If you installed certbot using your Linux distribution's package manager, you'll need to install and use pip to install this plugin.

Search the Web for instructions on how to install pip on your system. Once pip is installed, you should then be able to install the plugin with a simple command as exemplified below.

~ $ git clone https://github.com/Gandi/letsencrypt-gandi.git
~ $ cd letsencrypt-gandi
~/letsencrypt-gandi $ pip install -e .

Note that the . at the end of pip install -e . command is important.

When using certbot from Homebrew on Mac OS X

If you installed certbot using the Homebrew package manager on Mac OS X, you'll need to run some (ugly) commands to install the plugin inside the correct directory.

First, locate the correct directory certbot. The path we're looking for is the one that includes the libexec/ folder:

$ find /usr/local/Cellar/certbot -name site-packages
/usr/local/Cellar/certbot/0.8.0/libexec/lib/python2.7/site-packages

Now you'll need to run python setup.py install --install-purelib /path/that/you/identified, making sure you set the PYTHONPATH environment variable with that same path for that command. For example:

~ $ git clone https://github.com/Gandi/letsencrypt-gandi.git
~ $ cd letsencrypt-gandi
~/letsencrypt-gandi $ export CERTBOT_LIB="/usr/local/Cellar/certbot/0.8.0/libexec/lib/python2.7/site-packages"
~/letsencrypt-gandi $ PYTHONPATH=$CERTBOT_LIB python setup.py install --install-purelib $CERTBOT_LIB

Keep in mind that every time certbot is upgraded by Homebrew, the plugin needs to be reinstalled. As of version 0.9.3 of certbot, you can just execute the command again after replacing the correct version number to the path. Replace 'CERTBOT_VERSION_NUMBER' with the number of the last version installed by Homebrew on your system (for example '0.9.3').

~/letsencrypt-gandi $ export CERTBOT_LIB="/usr/local/Cellar/certbot/CERTBOT_VERSION_NUMBER/libexec/lib/python2.7/site-packages"
~/letsencrypt-gandi $ PYTHONPATH=$CERTBOT_LIB python setup.py install --install-purelib $CERTBOT_LIB

Usage

You'll be able to tell whether the plugin was successfully installed by running the certbot plugins command and looking for letsencrypt-gandi in the output, as in the following example:

$ [sudo] certbot plugins
* letsencrypt-gandi:gandi-shs
Description: Gandi Simple Hosting - Alpha
Interfaces: IAuthenticator, IInstaller, IPlugin
Entry point: gandi-shs = letsencrypt_gandi.shs:GandiSHSConfigurator

* [...]

If the plugin was correctly installed, you can proceed to using it.

Simple Hosting

Requirements

Limitations

  • Currently, only PHP and Ruby instances will work without modification of your code (in most cases). Simply follow the instructions and the plugin will take care of obtaining and installing the certificates for you.
  • Python and Node.js instance users must add a special route to their application prior to using the plugin (examples provided below)
Python instances

Python applications are handled through a WSGI application in Gandi so to get this plugin to work, you need to configure your application to serve a directory called .well-known statically from the application folder.

If you are using Django, you can do this by adding a route to your urls.py file:

    url(r'^\.well-known/(?P<path>.*)$', 'django.views.static.serve', {'document_root': '.well-known'}),

After doing that, deploy your application to your Simple Hosting instance and use this plugin to obtain and install a certificate.

Node.js instances

To use this plugin with Node.js applications, you will have to create a special route to serve static files from a directory called .well-known.

For example, if you're using the Express framework :

app.use(express.static('.well-known'));

Once you have added the route to the application, deploy it to your Simple Hosting instance before following the rest of the instructions.

Instructions

Run the following command from your computer and make sure you replace the placeholders with your own information.

  • SHS-NAME: the name of the instance
  • VHOST: the domain name for the certificate and of the Simple Hosting VHOST
  • API-KEY: your Gandi API key
$ [sudo] certbot run --domains VHOST \
            --authenticator letsencrypt-gandi:gandi-shs \
                --letsencrypt-gandi:gandi-shs-name SHS-NAME \
                --letsencrypt-gandi:gandi-shs-vhost VHOST \
                --letsencrypt-gandi:gandi-shs-api-key API-KEY \
            --installer letsencrypt-gandi:gandi-shs

Simply follow the steps presented on the screen to complete the process.

For certificate renewal and installation execute the same command.

Scripting

You can also create scripts to make this process easier for certificate creation and renewal.

Here's an example script created by @internationils, a Gandi customer.

Troubleshooting

Authentication issues

If you experience authentication issues, make sure you can connect to the instance via sftp from your terminal with your SSH Key and without a password.

If the connection via sftp works, but the script still has authentication issues, make sure you have added your SSH Key to ssh-agent on your computer (see the Requirements section for instructions).

In case everything seems to be set correctly, but the script is still not able to authenticate, try to run the above commands with sudo and re-run the script.

Other issues

You can also check previously reported Issues or create a new one if you need any help.

Other products

Support for other Gandi products, such as Web Accelerators and Servers, is not yet available through the plugin but may be added in the future.

You can still use Let's Encrypt certificates with any Gandi product.

Advanced usage

Here are some examples that are especially useful if you are developing the plugin itself.

Setting the API key in the environment

You can also set your API key in an environment variable. This way you don't need to use the --letsencrypt-gandi:gandi-shs-api-key flag.

export GANDI_API_KEY="l00km4im1nth3nv"

Avoiding sudo

certbot might require root privileges to run.

You can work around this requirement by specifiying different paths than the one it uses by default.

For example:

$ certbot --config-dir ~/.letsencrypt \
          --work-dir ~/.letsencrypt \
          --logs-dir ~/.letsencrypt/logs \
          ...

More information can be found in certbot's documentation.

certonly command

To only generate and download the certs from Let's Encrypt to your computer, you can use the certonly command with the letsencrypt-gandi:gandi-shs authenticator.

$ [sudo] certbot certonly --domains VHOST \
            --authenticator letsencrypt-gandi:gandi-shs \
                --letsencrypt-gandi:gandi-shs-name SHS-NAME \
                --letsencrypt-gandi:gandi-shs-vhost VHOST \
                --letsencrypt-gandi:gandi-shs-api-key API-KEY \

install command

To only install the certs downloaded to your computer on Simple hosting, you can use the install command and the letsencrypt-gandi:gandi-shs installer.

$ [sudo] certbot install --domains VHOST \
              --cert-path /path/to/cert \
              --key-path /path/to/cert \
              --installer letsencrypt-gandi:gandi-shs \
              --letsencrypt-gandi:gandi-shs-name SHS-NAME \
              --letsencrypt-gandi:gandi-shs-vhost VHOST \
              --letsencrypt-gandi:gandi-shs-api-key API-KEY \

Debugging

With the following additional flags, you'll be able to use LE's staging server and control where your local files are kept. The log file created in ~/.letsencrypt/letsencrypt.log may contain more information about your problem.

$ [sudo] certbot --config-dir $HOME/.letsencrypt \
            --work-dir $HOME/.letsencrypt \
            --logs-dir $HOME/.letsencrypt \
            run --domains VHOST \
            --server https://acme-staging.api.letsencrypt.org/directory --break-my-certs \
            --authenticator letsencrypt-gandi:gandi-shs \
                --letsencrypt-gandi:gandi-shs-name SHS-NAME \
                --letsencrypt-gandi:gandi-shs-vhost VHOST \
                --letsencrypt-gandi:gandi-shs-api-key API-KEY \
            --installer letsencrypt-gandi:gandi-shs

letsencrypt-gandi's People

Contributors

3on avatar baloo avatar bcien avatar cake17 avatar erral avatar gromnan avatar jbq avatar jcharaoui avatar sayoun avatar webcracy 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

Watchers

 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

letsencrypt-gandi's Issues

Doesn't work - unrecognized arguments

This is the command I run from the instructions and the following output:

./letsencrypt-auto run --domains mydomain.com --authenticator letsencrypt-gandi:gandi-shs --letsencrypt-gandi:gandi-shs-name INSTANCE_NAME --letsencrypt-gandi:gandi-shs-vhost mydomain.com --letsencrypt-gandi:gandi-shs-api-key TEST_KEY --installer letsencrypt-gandi:gandi-shs

( Obviously values have been changed to protect the innocent )

Resulting output:

letsencrypt: error: unrecognized arguments: --letsencrypt-gandi:gandi-shs-name INSTANCE_NAME --letsencrypt-gandi:gandi-shs-vhost mydomain.com --letsencrypt-gandi:gandi-shs-api-key TEST_KEY

certbot 0.8.0 = Invalid header

Hi,

When executing the command (./certbot-auto run ....), the following error appears:

ValueError: Invalid header value 'CertbotACMEClient/0.8.0 (darwin 10.11.5\n) Authenticator/letsencrypt-gandi:gandi-shs Installer/letsencrypt-gandi:gandi-shs'

Certbot upgraded from 0.7.0 to 0.8.0, I don't know if this is the issue.

Couldn't place file in domain

Hello,
after installing the certbot with apt-get on ubuntu 16.04 TLS and cloning/installing the repo,
i got an error after executing the following command:

letsencrypt run --domains macbroadcast.org
--authenticator letsencrypt-gandi:gandi-shs
--letsencrypt-gandi:gandi-shs-name wordpress
--letsencrypt-gandi:gandi-shs-vhost macbroadcast.org
--letsencrypt-gandi:gandi-shs-api-key myAPIkey
--installer letsencrypt-gandi:gandi-shs

error message:

letsencrypt: error: unrecognized arguments: --gandi letsencrypt-gandi:gandi-shs

I forgot a space behind the API key, after i corrected and use "sudo" i got this error:

macbroadcast@macbroadcast:~/development/letsencrypt-gandi$ sudo letsencrypt run --domains macbroadcast.org --authenticator letsencrypt-gandi:gandi-shs --letsencrypt-gandi:gandi-shs-name wordpress --letsencrypt-gandi:gandi-shs-vhost macbroadcast.org --letsencrypt-gandi:gandi-shs-api-key myAPIkey --installer letsencrypt-gandi:gandi-shs
An unexpected error occurred:
Fault: <Fault 510150: 'Error on object : OBJECT_ACCOUNT (CAUSE_NORIGHT) [Invalid API key]'>
Please see the logfiles in /var/log/letsencrypt for more details.

ok,it seems i used the wrong API key, after changing key i got this error:

[email protected]'s password:
Connected to sftp.dc1.gpaas.net.
sftp> exit
Permission denied (publickey,password).
Couldn't read packet: Connection reset by peer
Permission denied (publickey,password).
Couldn't read packet: Connection reset by peer
Permission denied (publickey,password).
Couldn't read packet: Connection reset by peer
Couldn't place file in domain: vhosts/macbroadcast.org/htdocs//.well-known/acme-challenge

But i am able to login without my password, just using keys to:

macbroadcast@macbroadcast:~$ sftp [email protected]
Connected to sftp.dc1.gpaas.net.
sftp>

Way too complicated: Just provide a checkbox for this in the Simple Hosting admin pages

I am a happy Gandi Simple Hosting costumer. I appreciated your efforts, but this is not working for me. I'll stay with the yearly Comodo reseller cert for now! This is all way too complicated. Also one would have to repeat it every 3 months (or do some scripting) to get this.

I cannot find any roadmap on what gandi has planned regarding Let's Encrypt integration. I hope this plugin here is not the full answer.

Ideally, you would just have a checkbox on the Simple Hosting admin pages with

[x] Enable https (with Let's Encrypt) for all domains linked to this Simple Hosting instance

And then all the rest is handled in the background with no need for me as a customer to do all the dirty, time consuming and errorprone work. That's how other providers do it.

Workaround to the Permission denied (publickey,password) problem

Hello,
I've read the issues #6 #23 but I still have the same problem doing it the official way.

If I use sudo I get this message, if I don't use it then I get an error for not having writting permissions in some folders.

I discovered that there are different parameters to define the folders where to write those files, so the command I'm using now is this one:

$ certbot certonly --domains VHOST \
--authenticator letsencrypt-gandi:gandi-shs \
    --letsencrypt-gandi:gandi-shs-name SHS-NAME \
    --letsencrypt-gandi:gandi-shs-vhost VHOST \
    --letsencrypt-gandi:gandi-shs-api-key APIKEY \
  --installer letsencrypt-gandi:gandi-shs \
  --logs-dir ./certbot/log --config-dir ./certbot/config --work-dir ./certbot/work

I think it can help other people to know this workaround to the official guide.

Plugin tries to remove the htdocs directory

After running the letsencrypt client, the last action made by the gandhi plugin is to remove temporary directories :

sftp> rmdir vhosts/<myvhost>/htdocs//.well-known/acme-challenge
sftp> rmdir vhosts/<myvhost>/htdocs//.well-known/
sftp> rmdir vhosts/<myvhost>/htdocs//
Couldn't remove directory: Failure

I think the last one shouldn't be there ? (even if it fails)

v5 API support

Since I'm a new customer of gandi.net my account seems not to be available in the v4.gandi.net infrastructure (including the "old" v4 RPC API).
As far as I read in the web about this there was/is/will be a big change in the API moving it to REST for the v5 infrastructure.

Since I don't have a v4 API-KEY and I'm not able to get one, I'm eventually not able to use this certbot plugin.

Fault: <Fault 510150: 'Error on object : OBJECT_ACCOUNT (CAUSE_NORIGHT) [Invalid API key]'>

ValueError: Invalid header value 'CertbotACMEClient/0.8.0

I'm on El Capitan. Fresh install of both Certbot and Gandi let's encrypt.

Was working well a couple of days ago.

./letsencrypt-auto run --domains www.domain.com --authenticator letsencrypt-gandi:gandi-shs --letsencrypt-gandi:gandi-shs-name "Personal WordPress MU" --letsencrypt-gandi:gandi-shs-vhost www.domain.com --letsencrypt-gandi:gandi-shs-api-key APIKEY

Then I see see the blue screen asking me for my email address...and then:

ValueError: Invalid header value 'CertbotACMEClient/0.8.0 (darwin 10.11.5\n) Authenticator/letsencrypt-gandi:gandi-shs Installer/letsencrypt-gandi:gandi-shs'

I have obfuscated my API key and domain on purpose

Upstream rename from letsencrypt -> certbot

Hi,

I'm the lead dev on the upstream letsencrypt client, which is about to be renamed to "certbot" tomorrow. It would be good if the letsencrypt-gandi team could check for any breakage (in theory there shouldn't be any, but we did get one report here: certbot/certbot#2957).

When Certbot launches, it will have a nifty website that asks the user to pick their OS and webserver, and provides simple instructions in response. If the letsencrypt-gandi team would like to add some instructions for their plugin, please send us a PR with instructions here (HTML + mustache) and hooks here.

(That repo will be public tomorrow, but I've invited you in the mean time).

Typo

~/letsencrypt-gandi $ ~/.local/share/letsencrypt/bin/pip install -e .

I think this is suppose to be

$ ~/.local/share/letsencrypt/bin/pip install -e ~/letsencrypt-gandi

I tried the above and it didn't work (doesn't make sense either). Bottom worked.

Need clarification about renewal

Hi,

I have been using Let's Encrypt on my Simple Hosting but I had some issues with certificate renewal. As written in the documentation, I used the following command:

[sudo] certbot certonly --domains VHOST \ --authenticator letsencrypt-gandi:gandi-shs \ --letsencrypt-gandi:gandi-shs-name SHS-NAME \ --letsencrypt-gandi:gandi-shs-vhost VHOST \ --letsencrypt-gandi:gandi-shs-api-key API-KEY \ --installer letsencrypt-gandi:gandi-shs

I got a congratulations message and everything but if I go to my website afterwards, the certificate has not been renewed and the expiration date is still the same. Actually, if I understand correctly, the new certificate is generated and had been stored locally on my computer but not installed on my hosting.

So far, the only solution I found to renew my certificates is actually to use the original command:

[sudo] certbot run --domains VHOST \ --authenticator letsencrypt-gandi:gandi-shs \ --letsencrypt-gandi:gandi-shs-name SHS-NAME \ --letsencrypt-gandi:gandi-shs-vhost VHOST \ --letsencrypt-gandi:gandi-shs-api-key API-KEY \ --installer letsencrypt-gandi:gandi-shs

Am I missing something? Is there another step I should do after using the certonly command? Or is it a bug?

Thanks,

Marius

Mac OS 10.11 and plugin install

Hello,

I'm trying to install the letsencrypt-gandi plugin and I can't find the way to install it.
I installed certbot with homebrew and I can't find the bin pip shell under /.local/share/letsencrypt/bin/pip nor under /usr/local/Cellar/certbot/0.8.0/share/certbot.

Is it possible to install this plugin easily with a Mac ?
Thanks in advance

File "/lamp0/web/vhosts/my-domain.com/htdocs/.well-known/.htaccess" not found.

It is a very little thing. But I think it should be included in the readme.

The certificate was installed, and everything seems to be working. I can even go to https://my-domain.com and I'll be able to see the green lock symbol (ssl enabled), but it didn't validate the test on https://www.ssllabs.com/ssltest/analyze.html?d=my-domain.com.

I solved it through manually creating the .htaccess file in the .well-known/ folder. And then I executed the installation script again. I assume that if the file is created before installing the plugin, everything will run just fine the first time.

Couldn't place "//.well-known/acme-challenge" file in domain

Hi everyone,

I followed every steps to install the Let's Encrypt Gandi plugin. Its works, until the installation on the server. I don't seem to have authentication issues (I can connect to my sftp through my OS X terminal and the ssh -vvv user@gpaas command shows that my SSH keys are accepted). But, I still have the same error (with or without the sudo command) :

Connected to sftp.dc2.gpaas.net.
sftp> exit
Permission denied (publickey,password).
Connection closed
Permission denied (publickey,password).
Connection closed
Permission denied (publickey,password).
Connection closed
Couldn't place file in domain: vhosts/example/htdocs//.well-known/acme-challenge

Is there anyone who would have faced the same problem and have a solution?
Thanks a lot ! :)

Certificate renewed, but not installed

For some time I have been having this problem. The cronjob I set up to renew the certificate is able to authentify and renew the certificate, but the new certificate doesn't get installed on the instance.

This is the command I use to renew (private bits changed):
certbot certonly --quiet --text --non-interactive --keep --domains example.com --authenticator letsencrypt-gandi:gandi-shs --letsencrypt-gandi:gandi-shs-name example --letsencrypt-gandi:gandi-shs-vhost example.com --letsencrypt-gandi:gandi-shs-api-key abcdef123456 --installer letsencrypt-gandi:gandi-shs

Requested domain vhost is not a FQDN

Hi,

This is error I get: "Requested domain vhost is not a FQDN".

My domain vhost is normally showing in my Gandi instance, so I don't understand.

And it's actually doing it with any domain vhost I put here:
--letsencrypt-gandi:gandi-shs-vhost toto.tld \

space in letsencrypt-gandi:gandi-shs-name

Hello

I'm testing this engine but it fails with my shs which has a space in his name.

I've tried with --letsencrypt-gandi:gandi-shs-name sito liblab,
--letsencrypt-gandi:gandi-shs-name "sito liblab" and
--letsencrypt-gandi:gandi-shs-name sito\ liblab

but it always consider liblab as a new, and unknown, parameter.

Unable to renew (or create) new certificate

Hi,

I have create a certificate on letsencrypt and I have to renew it tomorrow.

I am no more able to create or renew certificate. The only message I have is Permission denied (publickey,password)

┌──────────────────────────────────────────────────────────────────────┐
│ Saving debug log to /var/log/letsencrypt/letsencrypt.log │
api_key_from_args │
│ Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org │
│ Obtaining a new certificate │
│ Performing the following challenges: │
│ http-01 challenge for xxxxxxxx │
│ Deploying Certificate -Vp4mkIQnPQ7
-7ictjkgEdKYKA3Gb71qUJGUpalp5U: │
│ -Vp4mkIQnPQ7_-7ictjkgEdKYKA3Gb71qUJGUpalp5U.xP6PExgDqH9XBFOFOrCiNlr4 │
│ LvadIW7WINlVhs-eZs4 │
│ tmpfile = (8, '/tmp/tmpDcCbVT.letsencrypt.gandi.shs') │
│ sftp ['sftp', '-o', │
│ 'UserKnownHostsFile=/Users/xxxx/.ssh/known_hosts', │
│ '[email protected]'] │
│ sftp ['sftp', '-b', '-', '-o', │
│ 'UserKnownHostsFile=/Users/xxxx/.ssh/known_hosts', │
│ '[email protected]'] │
│ Cleaning up challenges │
│ sftp ['sftp', '-b', '-', '-o', │
│ 'UserKnownHostsFile=/Users/mickaellecoq/.ssh/known_hosts', │
│ '[email protected]'] │
└──────────────────────────────────────────────────────────────────────┘

Permission denied (publickey,password).
Connection closed
Couldn't place file in domain: vhosts/xxxx/htdocs/.well-known/acme-challenge

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.