Giter VIP home page Giter VIP logo

github / contributors Goto Github PK

View Code? Open in Web Editor NEW
88.0 86.0 13.0 358 KB

GitHub Action that given an organization or repository, produces information about the contributors over the specified time period.

Home Page: https://github.blog/2023-10-23-how-to-gain-insight-into-your-project-contributors/

License: MIT License

Dockerfile 2.15% Makefile 1.21% Python 96.64%
actions contributors github-actions ospo python hacktoberfest sponsors

contributors's Introduction

Contributors action

Python package Docker Image CI CodeQLOpenSSF Scorecard

This is a GitHub Action that given an organization or specified repositories, produces information about the contributors over the specified time period.

Similar actions to help you recognize contributors by putting them into a README or CONTRIBUTORS.md include:

This action was developed by the GitHub OSPO for our own use and developed in a way that we could open source it that it might be useful to you as well! If you want to know more about how we use it, reach out in an issue in this repository.

Example use cases

  • As a maintainer, you may want to acknowledge recent contributors in a discussion post
  • As an OSPO or maintainer, you may want to know who candidates are for new maintainers

Support

If you need support using this project or have questions about it, please open up an issue in this repository. Requests made directly to GitHub staff or support team will be redirected here to open an issue. GitHub SLA's and support/services contracts do not apply to this repository.

OSPO GitHub Actions as a Whole

All feedback regarding our GitHub Actions, as a whole, should be communicated through issues on our github-ospo repository.

What is a contributor?

Contributors have made commits to the specified repositories/organization on a default branch. Contributions can also be issue, pull request and discussion interactions. The endpoint used may return information that is a few hours old because the GitHub REST API caches contributor data to improve performance.

GitHub identifies contributors by author email address. Contribution counts are grouped by GitHub user, which includes all associated email addresses. To improve performance, only the first 500 author email addresses in the repository link to GitHub users. The rest will appear as anonymous contributors without associated GitHub user information.

Find out more in the GitHub API documentation.

Use as a GitHub Action

  1. Create a repository to host this GitHub Action or select an existing repository.
  2. Select a best fit workflow file from the examples below.
  3. Copy that example into your repository (from step 1) and into the proper directory for GitHub Actions: .github/workflows/ directory with the file extension .yml (ie. .github/workflows/contributors.yml)
  4. Edit the values (ORGANIZATION, REPOSITORY, START_DATE, END_DATE) from the sample workflow with your information.
    • If no start and end date are supplied, the action will consider the entire repository history and be unable to determine if contributors are new or returning.
    • If running on a whole organization then no repository is needed.
    • If running the action on just one repository or a list of repositories, then no organization is needed.
  5. Also edit the value for GH_ENTERPRISE_URL if you are using a GitHub Server and not using github.com. For github.com users, don't put anything in here.
  6. If you are running this action on an organization or repository other than the one where the workflow file is going to be, then update the value of GH_TOKEN.
    • Do this by creating a GitHub API token with permissions to read the repository/organization and write issues.
    • Then take the value of the API token you just created, and create a repository secret where the name of the secret is GH_TOKEN and the value of the secret the API token.
    • Then finally update the workflow file to use that repository secret by changing GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} to GH_TOKEN: ${{ secrets.GH_TOKEN }}. The name of the secret can really be anything. It just needs to match between when you create the secret name and when you refer to it in the workflow file.
  7. If you want the resulting issue with the output to appear in a different repository other than the one the workflow file runs in, update the line token: ${{ secrets.GITHUB_TOKEN }} with your own GitHub API token stored as a repository secret.
    • This process is the same as described in the step above. More info on creating secrets can be found here.
  8. Commit the workflow file to the default branch (often master or main)
  9. Wait for the action to trigger based on the schedule entry or manually trigger the workflow as shown in the documentation.

Configuration

Below are the allowed configuration options:

Authentication

This action can be configured to authenticate with GitHub App Installation or Personal Access Token (PAT). If all configuration options are provided, the GitHub App Installation configuration has precedence. You can choose one of the following methods to authenticate:

GitHub App Installation
field required default description
GH_APP_ID True "" GitHub Application ID. See documentation for more details.
GH_APP_INSTALLATION_ID True "" GitHub Application Installation ID. See documentation for more details.
GH_APP_PRIVATE_KEY True "" GitHub Application Private Key. See documentation for more details.
Personal Access Token (PAT)
field required default description
GH_TOKEN True "" The GitHub Token used to scan the repository. Must have read access to all repository you are interested in scanning.

Other Configuration Options

field required default description
GH_ENTERPRISE_URL False "" The GH_ENTERPRISE_URL is used to connect to an enterprise server instance of GitHub. github.com users should not enter anything here.
ORGANIZATION Required to have ORGANIZATION or REPOSITORY The name of the GitHub organization which you want the contributor information of all repos from. ie. github.com/github would be github
REPOSITORY Required to have ORGANIZATION or REPOSITORY The name of the repository and organization which you want the contributor information from. ie. github/contributors or a comma separated list of multiple repositories github/contributor,super-linter/super-linter
START_DATE False Beginning of time The date from which you want to start gathering contributor information. ie. Aug 1st, 2023 would be 2023-08-01.
END_DATE False Current Date The date at which you want to stop gathering contributor information. Must be later than the START_DATE. ie. Aug 2nd, 2023 would be 2023-08-02
SPONSOR_INFO False False If you want to include sponsor information in the output. This will include the sponsor count and the sponsor URL. This will impact action performance. ie. SPONSOR_INFO = "False" or SPONSOR_INFO = "True"
LINK_TO_PROFILE False True If you want to link usernames to their GitHub profiles in the output. ie. LINK_TO_PROFILE = "True" or LINK_TO_PROFILE = "False"

Note: If start_date and end_date are specified then the action will determine if the contributor is new. A new contributor is one that has contributed in the date range specified but not before the start date.

Performance Note: Using start and end dates will reduce speed of the action by approximately 63X. ie without dates if the action takes 1.7 seconds, it will take 1 minute and 47 seconds.

Example workflows

Be sure to change at least these values: <YOUR_ORGANIZATION_GOES_HERE>, <YOUR_GITHUB_HANDLE_HERE>

name: Monthly contributor report
on:
  workflow_dispatch:
  schedule:
    - cron: '3 2 1 * *'

permissions:
  contents: read

jobs:
  contributor_report:
    name: contributor report
    runs-on: ubuntu-latest
    permissions:
      issues: write

    steps:
      - name: Get dates for last month
        shell: bash
        run: |
          # Calculate the first day of the previous month
          start_date=$(date -d "last month" +%Y-%m-01)
  
          # Calculate the last day of the previous month
          end_date=$(date -d "$start_date +1 month -1 day" +%Y-%m-%d)
  
          #Set an environment variable with the date range
          echo "START_DATE=$start_date" >> "$GITHUB_ENV"
          echo "END_DATE=$end_date" >> "$GITHUB_ENV"
  
      - name: Run contributor action
        uses: github/contributors@v1
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          START_DATE: ${{ env.START_DATE }}
          END_DATE: ${{ env.END_DATE }}
          ORGANIZATION: <YOUR_ORGANIZATION_GOES_HERE>
          SPONSOR_INFO: "true"
  
      - name: Create issue
        uses: peter-evans/create-issue-from-file@v5
        with:
          title: Monthly contributor report
          token: ${{ secrets.GITHUB_TOKEN }}
          content-filepath: ./contributors.md
          assignees: <YOUR_GITHUB_HANDLE_HERE>

Example Markdown output with start_date and end_date supplied

# Contributors

- Date range for contributor list:  2021-01-01 to 2023-10-10
- Organization: super-linter

| Total Contributors | Total Contributions | % new contributors |
| --- | --- | --- |
| 1 | 143 | 0% |

| Username | Contribution Count | New Contributor | Commits |
| --- | --- | --- | --- |
| @zkoppert | 143 | False | [super-linter/super-linter](https://github.com/super-linter/super-linter/commits?author=zkoppert&since=2021-01-01&until=2023-10-10) |

Example Markdown output with no dates supplied

#### Contributors

- Organization: super-linter

| Total Contributors | Total Contributions | % new contributors |
| --- | --- | --- |
| 1 | 1913 | 0% |

| Username | Contribution Count | New Contributor | Sponsor URL | Commits |
| --- | --- | --- | --- | --- |
| @zkoppert | 1913 | False | [Sponsor Link](https://github.com/sponsors/zkoppert) | [super-linter/super-linter](https://github.com/super-linter/super-linter/commits?author=zkoppert&since=2021-09-01&until=2023-09-30) |

Local usage without Docker

  1. Make sure you have at least Python3.11 installed
  2. Copy .env-example to .env
  3. Fill out the .env file with a token from a user that has access to the organization to scan (listed below). Tokens should have at least read:org access for organization scanning and read:repository for repository scanning.
  4. Fill out the .env file with the configuration parameters you want to use
  5. pip3 install -r requirements.txt
  6. Run python3 ./contributors.py, which will output everything in the terminal

License

MIT

More OSPO Tools

Looking for more resources for your open source program office (OSPO)? Check out the github-ospo repo for a variety of tools designed to support your needs.

contributors's People

Contributors

ashleywolf avatar dependabot[bot] avatar jellllly420 avatar jmeridth avatar mikemcquaid avatar reubenj avatar zkoppert 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

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

contributors's Issues

Monthly contributor report

Contributors

  • Date range for contributor list: 2024-03-01 to 2024-03-31
  • Repository: ['github/contributors']
Total Contributors Total Contributions % New Contributors
2 164 50.0%
Username Contribution Count New Contributor Commits
@zkoppert 163 False https://github.com/github/contributors/commits?author=zkoppert&since=2024-03-01&until=2024-03-31
@jmeridth 1 True https://github.com/github/contributors/commits?author=jmeridth&since=2024-03-01&until=2024-03-31

this file was generated by the Contributors GitHub Action

Monthly contributor report

Contributors

  • Date range for contributor list: 2024-05-01 to 2024-05-31
  • Repository: ['github/contributors']
Total Contributors Total Contributions % New Contributors
2 201 0.0%
Username Contribution Count New Contributor Commits
@zkoppert 175 False https://github.com/github/contributors/commits?author=zkoppert&since=2024-05-01&until=2024-05-31
@jmeridth 26 False https://github.com/github/contributors/commits?author=jmeridth&since=2024-05-01&until=2024-05-31

this file was generated by the Contributors GitHub Action

Not showing up in contributors

Why are you seeing this issue?

This is a support escalation! You can find out more about expectations on communications and response times in the on-call docs. Thank you for doing your part to keep GitHub customers happy!

Severity

Note, for Sev1 issues always page the team first, using the PagerDuty information in the service catalog and the command .pager trigger <rotation> <reason>. Opening an issue for a Sev2 incident can come later (and can be done by the available Escalation Engineer).

  • sev1 - Engineering must respond, when paged, within their on-call SLO
  • sev2 - Engineering must respond to this issue within one business day
  • sev3 - EPD squad for the team must respond to this issue within one week

Service

contributors

Issue

A clear and concise description of what the issue is.

A customer is not sure why they are not showing up in the contributors.

I had them check the following but I'm not sure what steps to have them try next or what the issue might be.

Top 100 Contributors: The contributors graph only shows the top 100 contributors. If you're not one of the top 100 contributors, you won't appear in the graph.

Commit Branch: Your commits need to be merged into the default branch or the gh-pages branch (if the repository has project sites) to appear in the contributors graph. If all your commits are on non-default branches, they won't be included in the graph.

Email Address: The email address used to author the commits must be connected to your GitHub account. If it's not, your commits won't be linked to your account, and you won't appear in the contributors graph. You can check the email address used for a commit by adding .patch to the end of a commit URL.

Their response to the questions.

Hi Alex,

  1. I have selected the past month in the timeline graph but I still don't show up.

https://github.zendesk.com/attachments/token/BmlUNaBUzbGekV79wOPVtE3xT/?>name=Screen+Recording+2023-11-21+at+13.09.16.mov

  1. My commits are being merged into the master branch

Image

  1. Email address

Image

Customer Impact

  • Zendesk Ticket(s) - 2444619

Customer is not seeing himself show up on the one below. The other 2 he does.

Image

Image

Image

GitHub Product(s) Impacted (check appropriate boxes and provide GHES version if applicable)

  • GitHub.com (including GHEC)
  • GitHub Enterprise Server.
    If GHES, please list the version of GHES the customer is on here:
  • GHAE

To Reproduce

Steps to reproduce the behavior:
N/A

Expected behavior

He wants to see himself as a contributor. In 2 repos he does but 1 he doesn't (see screenshots above).

Screenshots

See above.

Additional context

The customer is unity3d.

cc:
@github/ospo
@product_manager

Support Squad(s): @github/support-squad-

Organization stats fail if any repo is empty

When checking an organization, any empty repo will cause the action to fail. Simply bad timing could mean a user creates a repo as the action is running.

Actual:
Exits with

Expected status_code 200 but got 204
Error getting contributors for repository: foo/bar
No more repositories will be processed. Please delete the (empty?) repository and try again.
204 [No message]

Expected;
Continues, perhaps logging

Error getting contributors for repository: foo/bar. It may be empty.

AttributeError: 'NoneType' object has no attribute 'lower' on sponsor_info

We got this error in the super-linter repo (https://github.com/super-linter/super-linter/actions/runs/6714831338/job/18248627198)

Traceback (most recent call last):
  File "/action/workspace/contributors.py", line 174, in <module>
    main()
  File "/action/workspace/contributors.py", line 23, in main
    ) = env.get_env_vars()
        ^^^^^^^^^^^^^^^^^^
  File "/action/workspace/env.py", line 56, in get_env_vars
    sponsor_info = sponsor_info.lower().strip()
                   ^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'lower'

@zkoppert can you kindly have a look? Thanks!

Show the markdown output in the GitHub Action output

Is your feature request related to a problem?

No

Describe the solution you'd like

Utilize the GitHub Actions Job Summary feature we could output the markdown as GitHub friendly markdown in the GitHub Action output.

Describe alternatives you've considered

We currently allow pushing the result to a Discussion or Issue. We definitely need to keep this but we can also output to the GitHub Actions screen

Additional context

No response

Monthly contributor report

Contributors

  • Date range for contributor list: 2024-01-01 to 2024-01-31
  • Repository: ['github/contributors']
Total Contributors Total Contributions % New Contributors
2 153 50.0%
Username Contribution Count New Contributor Sponsor URL Commits
@zkoppert 151 False Sponsor Link https://github.com/github/contributors/commits?author=zkoppert&since=2024-01-01&until=2024-01-31
@jellllly420 2 True not sponsorable https://github.com/github/contributors/commits?author=jellllly420&since=2024-01-01&until=2024-01-31

this file was generated by the Contributors GitHub Action

Monthly contributor report

Contributors

  • Date range for contributor list: 2023-10-01 to 2023-10-31
  • Repository: ['github/contributors']
Total Contributors Total Contributions % New Contributors
2 88 100.0%
Username Contribution Count New Contributor Sponsor URL Commits
zkoppert 87 True Sponsor Link https://github.com/github/contributors/commits?author=zkoppert&since=2023-10-01&until=2023-10-31
MikeMcQuaid 1 True Sponsor Link https://github.com/github/contributors/commits?author=MikeMcQuaid&since=2023-10-01&until=2023-10-31

this file was generated by the Contributors GitHub Action

Monthly contributor report

Contributors

  • Date range for contributor list: 2024-02-01 to 2024-02-29
  • Repository: ['github/contributors']
Total Contributors Total Contributions % New Contributors
2 158 50.0%
Username Contribution Count New Contributor Sponsor URL Commits
zkoppert 157 False Sponsor Link https://github.com/github/contributors/commits?author=zkoppert&since=2024-02-01&until=2024-02-29
ashleywolf 1 True not sponsorable https://github.com/github/contributors/commits?author=ashleywolf&since=2024-02-01&until=2024-02-29

this file was generated by the Contributors GitHub Action

Monthly contributor report

Contributors

  • Date range for contributor list: 2024-04-01 to 2024-04-30
  • Repository: ['github/contributors']
Total Contributors Total Contributions % New Contributors
2 178 0.0%
Username Contribution Count New Contributor Commits
@zkoppert 165 False https://github.com/github/contributors/commits?author=zkoppert&since=2024-04-01&until=2024-04-30
@jmeridth 13 False https://github.com/github/contributors/commits?author=jmeridth&since=2024-04-01&until=2024-04-30

this file was generated by the Contributors GitHub Action

contributors.md file location

When run as an action, what is the full(er) path to the contributors.md file that needs to get read and added to an Issue?

Monthly contributor report

Contributors

  • Date range for contributor list: 2024-06-01 to 2024-06-30
  • Repository: ['github/contributors']
Total Contributors Total Contributions % New Contributors
2 217 0.0%
Username Contribution Count New Contributor Commits
@zkoppert 186 False https://github.com/github/contributors/commits?author=zkoppert&since=2024-06-01&until=2024-06-30
@jmeridth 31 False https://github.com/github/contributors/commits?author=jmeridth&since=2024-06-01&until=2024-06-30

this file was generated by the Contributors GitHub Action

AttributeError: 'NoneType' object has no attribute 'lower'

It seems that there is no check on the sponsor info variable

$ ORGANIZATION=scaleway REPOSITORY=scaleway-cli GH_TOKEN=$GITHUB_COM_TOKEN python3 ./contributors.py
Traceback (most recent call last):
  File "/Users/rleone/workspace/contributors/./contributors.py", line 176, in <module>
    main()
  File "/Users/rleone/workspace/contributors/./contributors.py", line 24, in main
    ) = env.get_env_vars()
        ^^^^^^^^^^^^^^^^^^
  File "/Users/rleone/workspace/contributors/env.py", line 56, in get_env_vars
    sponsor_info = sponsor_info.lower().strip()
                   ^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'lower'

Contribution count in Org report is not limited to date range

Describe the bug

When generating the report against an Organization using start_date and end_date, the Contributions Count is equal to the all time contributions for any repos in the report

In a report created, Top contributor has contributed to one repo in the time span. See screenshots for
I would expect their Contribution Count to be ~8 in the report; not 476

To Reproduce

  • Create new repo with only this action with below code to get a short weeks period
  • Trigger report generation via workflow_dispatch
name: Weekly contributor report
on:
  workflow_dispatch:
  # schedule:
  #   - cron: '0 4 * * 1'

permissions:
  contents: read

jobs:
  contributor_report:
    name: contributor report
    runs-on: ubuntu-latest
    permissions:
      issues: write

    steps:
      - name: Get dates for last week
        shell: bash
        run: |
          # Calculate the first day of the previous week
          start_date=$(date -d "last-sunday" +%Y-%m-%d)
  
          # Calculate the last day of the previous week
          end_date=$(date -d "$start_date +1 week -1 day" +%Y-%m-%d)
  
          #Set an environment variable with the date range
          echo "START_DATE=$start_date" >> "$GITHUB_ENV"
          echo "START_DATE=$start_date"
          echo "END_DATE=$end_date" >> "$GITHUB_ENV"
          echo "END_DATE=$end_date"

  
      - name: Run contributor action
        uses: github/[email protected]
        env:
          GH_APP_ID: ${{ secrets.GH_APP_ID }}
          GH_APP_INSTALLATION_ID: ${{ secrets.GH_APP_INSTALLATION_ID }}
          GH_APP_PRIVATE_KEY: ${{ secrets.GH_APP_PRIVATE_KEY }}
          START_DATE: ${{ env.START_DATE }}
          END_DATE: ${{ env.END_DATE }}
          ORGANIZATION: "XXXX"
          SPONSOR_INFO: "false"
      - name: Create issue
        uses: peter-evans/create-issue-from-file@v5
        with:
          title: Contributor report for ${{ env.START_DATE }} - ${{ env.END_DATE }}
          content-filepath: ./contributors.md
          assignees: xxxxxxxxx

Expected behavior

  • User has contributed in the date range
  • Contribution Count reflects contributions performed only during the date range

Screenshots

Generated report for 1 week: image
image

Additional context

Referencing reports in this repo to narrow down when this changed

  • #56 seems to correctly only count contributions from the time period
  • #61 is the first report I find in this repo that shows total contribution count instead of time period
  • This makes me suspect it may have been introduced around release v1.1.2 ; however as i have installed as github app I can not downgrade to test at this time

Monthly contributor report

Contributors

  • Date range for contributor list: 2023-09-01 to 2023-09-30
  • Repository: github/contributors
Total Contributors Total Contributions % New Contributors
0 0 0%
Username Contribution Count New Contributor Sponsor URL Commits

this file was generated by the Contributors GitHub Action

Rate limiting failure

Might look into opening a PR but it currently will fail and stop running on hitting a rate limit failure and does not create even a partial report.

Add Issue Templates

To simplify user interaction with this repository we want to add GitHub Issue Templates.

  • bug report
  • feature request
  • config
    • link to discussions
    • link to github-ospo repo for overall OSPO GitHub Action issues

feature: Allow for a list of repositories

If a user wants a contributor report on 3 repositories and they aren't the only 3 in the organization, They currently need to run the action 3 separate times. This could be fixed by allowing for a comma separated list of repositories to input instead of only taking one.

Monthly contributor report

Contributors

  • Date range for contributor list: 2024-07-01 to 2024-07-31
  • Repository: ['github/contributors']
Total Contributors Total Contributions % New Contributors
3 233 33.33%
Username Contribution Count New Contributor Commits
@zkoppert 191 False https://github.com/github/contributors/commits?author=zkoppert&since=2024-07-01&until=2024-07-31
@jmeridth 40 False https://github.com/github/contributors/commits?author=jmeridth&since=2024-07-01&until=2024-07-31
@ReubenJ 2 True https://github.com/github/contributors/commits?author=ReubenJ&since=2024-07-01&until=2024-07-31

this file was generated by the Contributors GitHub Action

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.