Coder Social home page Coder Social logo

trewknowledge / gdpr Goto Github PK

View Code? Open in Web Editor NEW
150.0 22.0 44.0 6 MB

This plugin is meant to assist a Controller, Data Processor, and Data Protection Officer (DPO) with efforts to meet the obligations and rights enacted under the GDPR.

Home Page: https://wordpress.org/plugins/gdpr/

License: GNU General Public License v2.0

PHP 81.90% CSS 8.29% JavaScript 9.81%
wordpress wordpress-plugin gdpr

gdpr's Introduction

GDPR

license Tested up to Minimum PHP version WordPress plugin WordPress plugin rating Translations

This plugin is meant to assist a Controller, Data Processor, and Data Protection Officer (DPO) with efforts to meet the obligations and rights enacted under the GDPR.

Documentation

https://github.com/trewknowledge/GDPR/wiki/

Installation

  1. Upload the plugin to the /wp-content/plugins/ directory or install directly from the [https://wordpress.org/plugins/gdpr](WordPress Plugin Repository).
  2. Activate the plugin through the 'Plugins' menu in WordPress
  3. Fill out all sections of the settings page.

Shortcodes & helper functions

https://github.com/trewknowledge/GDPR/wiki/Functions-&-Shortcodes

Features

  • Consent management
  • Privacy Preference management for Cookies with front-end preference UI & banner notifications
  • Privacy Policy page configurations with version control and re-consent management
  • Rights to erasure & deletion of website data with a double opt-in confirmation email
  • Re-assignment of user data on erasure requests & pseudonymization of user website data
  • Data Processor settings and publishing of contact information
  • Right to access data by admin dashboard with email look up and export
  • Right to access data by Data Subject with front-end requests button & double opt-in confirmation email
  • Right to portability & export of data by Admin or Data Subject in XML or JSON formats
  • Encrypted audit logs for the lifetime of Data Subject compliance activity
  • Data Subject Secret Token for two-factor decryption and recovery of data
  • Data breach notification logs and batch email notifications to Data Subjects
  • Telemetry Tracker for visualizing plugins and website data

Settings

General From the Settings options in the dashboard, you can select the Privacy Policy page for tracking and logging consent.

On login, the user must consent to the Privacy Policy outlined on the site. If the user does not consent, the user will not be registered or logged in.

If the site owner updates the Privacy Policy page content, the change will be logged and flagged to the admin that they must notify users on next login to seek re-consent. Additionally, the warning message can be dismissed in the event of a minor correction or mistake.

Additionally, under General Settings the Admin can set the outgoing email limitation which would set the batch notification email limit per hour in the event of a Breach Notification.

Cookie Preference Management Similar to consent management, users can opt in or out of cookies that are being used on the site. There are 3 formats of cookies that can be created which include:

  • Always Active: Cookies that are always active or are required for the site to function.
  • Toggled: Cookies that can be activated or blocked based on the user preference
  • Opt-Out Link: Cookies that require configuration from a third-party source in order to opt-out

Depending on the user preference setting, you can use the is_allowed_cookie( $cookie ) function to save and set the cookies. The cookie with the user approved cookies can be found at another cookie named gdpr_approved_cookies. There's also a helper function called is_allowed_cookie( $cookie ) that you can use to prevent setting up a cookie.

Consent Management

Consents can be registered on the settings page. They can be optional or not. By default, this plugin comes with a Privacy Policy consent that users need to agree with on registration.

For optional consents, there's a wrapper function have_consent( $consent_id ) to help you display or hide something on the site depending if the user gave consent or not.

Consents are logged to the user record for auditing or for access purposes.

Requests Table & Rights of Data Subject

Right to Erasure Requests

  1. The Data Subject is able to submit a request to be erased from the site using a shortcode.

  2. When a request is made, the Data Subject will receive an email confirmation to confirm the deletion request.

    1. After email confirmation, the user request is added to the requests table for review by the Administrator. The Administrator can also add a user manually with an email look up and review.
    2. If the Data Subject has content published on the site for any post types or comments, they will be added to this table. If they do not have any content, they will receive a confirmation of erasure request and be provided a 6 digit Token for safekeeping after erasure in case of recover data needs.
    3. The requests table allows the Administrator to reassign any content to another user or delete it.
    4. In the event of comments, the Data Subject’s content would be made anonymous.
  3. Admin can also manually add users to the erasure requests table with a manual email search

Right to Access Data Request & User Data Portability

  1. The Data Subject can place a request to download their data with the shortcode.
  2. After requesting their data, the user will receive a double opt-in confirmation email then the plugin will generate an XML or JSON file, which will be emailed to them for download with an expiration time of 48 hours.

Right to Rectify & Complaint Requests

  1. The Data Subject can place a request to rectify data or file a complaint with the shortcode.
  2. After making their request, the user will receive a double opt-in confirmation email and then add them to the table for admin to handle the request.

Tools

Access Data

The Access Data tool allows the Admin to look up a user email and view the data of a particular user. The Admin can download and export the data in a JSON or XML format and provide to the Data Subject if manually requested.

NOTE: This method should not be used without the Data Subject confirming their identity.

Audit Log

Everything the Data Subject does from registration, providing consent to the privacy policy, terms of service and other requests are logged and encrypted in a database. Data breach notifications are also logged to all Data Subjects upon confirmation by Controller.

  1. Using the Data Subject's email, you can look up and retrieve the user information and display it.
  2. If the Data Subject has been removed from the site, this encrypted log is deleted from the database and saved as an encrypted file inside the plugin folder.

If in the future, the Data Subject makes a complaint or there is a need to recover the data, the user can provide their email address and the 6 digit token they received from the deletion confirmation email to decrypt and retrieve the file.

Data Breach & Notifications

In case of a data breach, the Admin can generate a Data Breach Notification to users by logging the information and confirm the breach through a double opt-in confirmation email. The following information would be recorded in the audit log:

  1. Nature of the personal data breach
  2. Name and contact details of the data protection officer
  3. Likely consequences of the personal data breach
  4. Measures were taken or proposed to be taken

Once the confirmation of the breach has been confirmed via email, the website will begin a batch email notification process to all users every hour until all users receive the notification.

Telemetry Tracker

The Telemetry Tracker feature will display all data that is being sent outside of your server to another destination. It will indicate the plugin or theme responsible, file and line where the data is being sent.

WordPress Core and some plugins gather data from your install and send this data to an outside server.

WordPress Plugin Repository does not allow plugins to do that, but premium plugins are able to do this because they are not bound by the Plugin repository rules. If you did not explicitly opt-in for this feature you should make a complaint.

Important!

Activating this plugin does not guarantee that an organization is successfully meeting its responsibilities and obligations of GDPR. Individual organizations should assess their unique responsibilities and ensure extra measures are taken to meet any obligations required by law and based on a data protection impact assessment (DPIA).

Frequently Asked Questions

What is GDPR

This Regulation lays down rules relating to the protection of natural persons with regard to the processing of personal data and rules relating to the free movement of personal data.

This Regulation protects fundamental rights and freedoms of natural persons and in particular their right to the protection of personal data.

The free movement of personal data within the Union shall be neither restricted nor prohibited for reasons connected with the protection of natural persons with regard to the processing of personal data.

How do Businesses benefit from GDPR?

  • Build stronger customer relationships and trust
  • Improve the brand image of the organization and its brand reputation
  • Improve the governance and responsibility of data
  • Enhance the security and commitment to the privacy of the brand
  • Create value-added competitive advantages

Who does the GDPR affect?

The GDPR applies to all EU organisations – whether commercial business, charity or public authority – that collect, store or process EU residents’ personal data, even if they’re not EU citizens.

The GDPR applies to all organisations located within the EU, whether you are a commercial business, charity or public authority, institution and collect, store or process EU citizen data. It also applies to any organisation located outside of the EU if they also collect store or process EU citizen data.

What is considered personal data?

The GDPR defines personal data as any information or type of data that can directly or indirectly identify a natural person’s identity. This can include information such as Name, Address, Email, Photos, System Data, IP addresses, Location data, Phone numbers, and Cookies.

For other special categories of personal data, there are more strict regulations for categories such as Race, Religion, Political Views, Sexual Orientation, Health Information, Biometric and Genetic data.

What are the penalties for non-compliance?

Organizations can be fined up to 4% of annual global turnover for breaching GDPR or €20 Million. This is the maximum fine that can be imposed for the most serious infringements.

There is a tiered approach to the fines whereby a company can be fined 2% for not having their records in order (Article 28), not notifying the supervising authority and Data Subject about a security breach or for investigating and assessing the breach.

Am I compliant just by activating this plugin?

No, this plugin is meant to assist a Controller, Data Processor, and Data Protection Officer (DPO) with efforts to meet the obligations and rights enacted under the GDPR.

Activating this plugin does not guarantee that an organisation is successfully meeting its responsibilities and obligations of GDPR. Organisations should assess their unique responsibilities and ensure extra measures are taken to meet any obligations required by law and based on a data protection impact assessment (DPIA).

gdpr's People

Contributors

amooreto avatar barrans avatar brajno avatar eniocarboni avatar fclaussen avatar matthewfarlymn avatar moutushi82 avatar sandhya09 avatar skrypon avatar stuartfeldt avatar tyrann0us avatar

Stargazers

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

Watchers

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

gdpr's Issues

"Consents" section is unclear

I think these are maybe too plain, as is.

It's not really clear what they're for right away, or where they'll appear, or what a user will see, or how to manage the various individual responses to user consents.

Download My Data

Receiving this error when selecting the Download My Data button. Currently logged in as the site admin.

Currently using the "rewrite" branch.

Parse error: syntax error, unexpected 'esc_url_raw' (T_STRING) in .../wp-content/plugins/gdpr/templates/email/export-data-request.php on line 43

Add link to "Privacy Page" error message

When you first install the plugin you get a message that says "You must select a Privacy Policy Page.". It would be helpful to include a link to the setting page where you can set this.

PHP Notices Undefined Index

I installed version 0.1.1 on a brand new site. I got a admin warning to define the the TOS and Privacy page in the settings but as I did not have either I went to create them. When saving the page I got the following php notices.

Notice: Undefined index: tos-page in gdpr/admin/class-gdpr-admin.php on line 682

Notice: Undefined index: pp-page in /app/public/wp-content/plugins/gdpr/admin/class-gdpr-admin.php on line 685

Warning: Cannot modify header information - headers already sent by (output started at gdpr/admin/class-gdpr-admin.php:685) in /app/public/wp-admin/post.php on line 198

Warning: Cannot modify header information - headers already sent by (output started at gdpr/admin/class-gdpr-admin.php:685) in /app/public/wp-includes/pluggable.php on line 1216

Vertical scroll bar on website

On installing GDPR plug in, the vertical scroll bar on website disappeared. Once plug in deactivated, scroll bar returns. Tried to activate again and vertical scroll bar disappears again. Any help out there? It has latest update 1.2.0 by Trew Knowledge

String "Privacy Policy"

The string "Privacy Policy" on the pages Settings>Consent and account profile cannot be changed to other languages (within Loco Translate and translate.wordpress.org).

Audit Log showing "false information" when a user is added via wp-admin

As an admin, I manually added a user via the wp-admin. When I went to print the audit log it is showing some false information:

[2018/02/16 21:26:51] First name: Anthony
[2018/02/16 21:26:51] Last name: M
[2018/02/16 21:26:51] Email: [email protected] 

[2018/02/16 21:26:51] User registered to the site.
[2018/02/16 21:26:51] User gave explicit consent to Terms of Service
[2018/02/16 21:26:51] User gave explicit consent to Privacy Policy

In reality, this user never registered or gave consent.

We need to come up with an appropriate flow for this scenario.

Cookie Consent not redisplayed after settings update

  1. Cookie Consent displayed to new Visitor X
  2. Visitor X clicks 'I Agree'
  3. Cookie Consent recorded for the new Visitor X
  4. Admin makes a change to cookies settings e.g identifies a new cookie and adds it
  5. Admin saves cookie settings
  6. Visitor X returns to the site
  7. Cookie Consent is not redisplayed to Visitor X even though the cookies list has changed

consentArray is not defined in chrome console

Hi,
I'm using your js helper functions in order to block standard google analytics cookies before the consent is given (I'm supposed to block them, right?) - however, I noticed this error in a chrome console:

Uncaught ReferenceError: consentArray is not defined
    at window.is_allowed_cookie (gdpr-public.js?ver=1.3.1:1)
    at (index):3032

I checked in an incognito mode and it seems that _ga, _gat_gtag, and _gid cookies are not being blocked. I'm sure it worked previously so I just want to let you know.

IDEA: Ability to add to audit via php function

IDEA: It would be extremely useful to able to add items to the audit via php. For example, if a user edits their profile data after they are logged in. Or if they make purchases via woo-commerce. Etc.

Admin Notifications

Would it be possible to configure admin notifications to be sent when a user downloads their data, or requests to be deleted?

Resources & Reference could be in "Help" dropdown

I know a lot of people don't think to look there, but the "Help" area in WordPress Admin is the place where this kind of documentation should exist.

It declutters the page, uses an existing API for this purpose, and provides more structure where it will probably be necessary later.

Consent for Formidable Forms

Hey great work on the plugin - its appreciated!
Is it possible to request integration with Formidable in the near future?

Thanks!

Possibility to change buttons labels

Is there a way to change the default labels of buttons created with the forms generated by the shortcode? For example, there is a text="Custom label" option for the shortcode that outputs the privacy center button, so is there some way to pass custom button label to the rest of the shortcodes?

I would be grateful for any guidance!

Multiple Consent Types - Not Saving Required

When adding additional consent types to the consent tab in settings if you set the consent to "required" and then click save it is un-setting the required option after saving.

Question: If multiple consent types are required that are linked to documents (in the same way as the privacy policy consent works) does the plugin ask for new consent after the linked page has been updated? For example explicit consent to terms of use? Some companies have a separate cookies policy and privacy policy for example. It might be better to have the document link next to each consent type instead of on a separate tab?

Problem with blocking cookies with javascript functions

Hi,
I just spotted one more problem. I need to block Google Analytics cookies before consent is given.
I'm using caching plugin WP Super Cache, so according to your suggestion from this page on Knowledge Base http://gdpr-wp.com/knowledge-base/enabling-or-disabling-functionality-based-on-consent-and-cookies/ I opted to use javascript function. I have cookies registered and a proper consent has id "analityka".

So I added this javascript code

<script type="text/javascript">if ( ! has_consent( 'analityka' ) || ! is_allowed_cookie( '_ga' ) ) {
  window['ga-disable-UA-xxxxx-x'] = true; // Yes, I have proper identification code here
}</script>

And unfortunately, the Google Analytics cookies are not blocked and the error I see in the console is:

"Uncaught ReferenceError: has_consent is not defined"

So it looks like this function is not available? Am I missing some important step here?

Cookies still on browser after deactivating it

Hello,
I installed the plugin and it seams to work fine.
My question is following.
I create for the cookies a category "Performance" (always active = OFF) adding the names of the google analytics cookies separated by comma. ( _ga, gat, gid )
When I go to the page and change the setting of this cookies to on or off my browser cookies inspector still show that the cookies are loading...
Is this correct or should the cookies not load when the user deactivate them?
Is my configuration correctly with the cookie names? Or should I make some other configuration on the administration page?

Thanks for an answer.

Erasure Link not working

The link sent in the confirmation email for deleting your account is not working for me at the moment. I have updated to the latest code as you suggested which fixed the other issue.

To reproduce: Choose Close My Account, confirm, open email that is sent, click this link (domain and email modified):

https://site.local?type=delete&key=asnB4VhN0BxPHtxPKQEb&[email protected]

The result is that the homepage appears with no confirmation box, and nothing else happens.

Data breach mass email is not possible due to server limitations

We can't send mass emails to everyone in the database when using the data breach notification.
Wondering what the best solutions might be.

A setting where you can input the number of emails per hour and work with cron jobs?

There's still a problem with it being flagged as spam.

"Requests" unclear

screen shot 2018-02-16 at 3 17 07 pm

A few things:

  • No autocomplete on text input
  • Entering an invalid address provides no feedback if it worked or not
  • No indication this is only for registered user email addresses
  • What's the difference between "Cancel" and "Delete" here?

screen shot 2018-02-16 at 3 19 12 pm

What is being reviewed or reassigned? As a new user, and new GDPR, I don't really understand what these are for or do.

Zapier integration

Hey Gurus,

I looked into the available Zapier Triggers available for MySQL and there isn't anything granular enough that I can find that will trigger when a row is updated.
zapier-mysql-triggers
I'd really love for a way to connect Zapier when a Data User initiates one of the GDPR requests through your plugin because there are actually a ton of small workflow tasks I'd like to tie together that I don't think you should try and build into your plugin, such as the Email process. For example, lots of companies will have CRM software already in place. A GDPR request should be logged in the CRM with the user's metadata that's already on file.
Ideally, the Email sequence that Data Users receive when they make a request should be handled by whatever Email layer the company has already. The easiest way I can see that happening is for your plugin to allow Zapier to write new rows to a Google Sheet with the email address and name of the User. Once a GDPR request is added to a Google Sheet row, Zapier can push that request anywhere.

Here is the base documentation for Zapier: https://github.com/zapier/zapier-platform-cli

I've reached out to Zapier to ask for some additional information for how we can make this work.

Keep up the amazing work!!!

Conflicts with my plugin, causes endless wp_remote_post loop

I installed this plugin in my local development environment to test it out for something else but coincidentally it conflicts with the plugin I develop (Post to Google My Business).

Whenever I create a new Google post through my plugin, it will start endlessly looping the same request to my API (and they get through to the API, but the local dev WordPress is stuck on a white screen, loading). I thought I had made a mistake somewhere in my development version, but then remembered I had installed this plugin and that it tracks outgoing requests from the server and figured it might be related. On the Telemetry tab I found 23 pages of errors like this:

`

  Warning: Illegal string offset 'type' in E:\xampp\htdocs\testwordpress\wp-content\plugins\gdpr\admin\class-gdpr-telemetry.php on line 250 Notice: Uninitialized string offset: 0 in E:\xampp\htdocs\testwordpress\wp-content\plugins\gdpr\admin\class-gdpr-telemetry.php on line 250 Warning: Illegal string offset 'name' in E:\xampp\htdocs\testwordpress\wp-content\plugins\gdpr\admin\class-gdpr-telemetry.php on line 251 Notice: Uninitialized string offset: 0 in E:\xampp\htdocs\testwordpress\wp-content\plugins\gdpr\admin\class-gdpr-telemetry.php on line 251 : /:0
`

Disabling the GDPR plugin fixed the issue with my plugin.

Is there something I need to change to my plugin to make it work with yours properly?

Here's the code i use for sending a post request to my API:

`
protected function do_post($endpoint, $args = array(), $json = false, $method = 'POST'){
$query_args['apiKey'] = $this->site_key;
$query_args['token'] = $this->token;
$url = add_query_arg($query_args, self::API_URL.$endpoint);

		$response = wp_remote_post($url, 
			array(
				'method' 	=> $method,
				'headers'	=> $json ? array('Content-Type' => 'application/json') : null,
				'body' 		=> $json ? json_encode($args) : $args
			)
		);

		if(is_wp_error($response)){
			$error_message = $response->get_error_message();
			set_transient('mbp_api_error', $error_message, self::ERROR_DURATION);				
		}else{
			$data = json_decode($response['body']);
			if(!isset($data->error)){					
				return $data;
			}else{
				if(is_object($data->error)){
					$error_message = nl2br($this->format_google_error($data));

				}else{
					$error_message = (string)$data->error;
				}
				
				set_transient('mbp_api_error', $error_message, self::ERROR_DURATION);
			}
		}				
	}

`

Requests Table

When searching the "Requests Table" for an email that does not exist, nothing happens. We should add a message saying "No account found for [email protected]" or something along those lines.

"Audit Log" can't find user

When entering the email address of a registered user, and not including a token, the response is misleading. Consider updating text to include why the user could not be found (likely because of missing token, or doesn't exist in audit log at all.)

screen shot 2018-02-16 at 3 20 47 pm

About the plugin still has Lorem Ipsum

Great to have a placeholder here. We should agree about what text goes there by default, and consider making this an external API call to somewhere it can be updated remotely.

Geotarget users

Apologies if this is already a feature, I read through the support pages and issue log and couldn't see it.

I'm wondering if this plugin support geotargeting, so it can be configured to only load for EU based visitors. Thanks.

Make it possible to block cookie wildcards

Some cookies append a hash or an ID to the end of it. WordPress itself does this.

comment_author_{HASH}
comment_author_email_{HASH}
comment_author_url_{HASH}

It should look like comment_author* when registering and the plugin would look for plugins %LIKE% that and block or allow them.

Accepting consent and cookies config redirect to /wp-admin/admin-post.php

Hello,

the plugin is working fine butI have a small issue/question.
I use a security plugin that hide the standard administration path /wp-admin , /wp-login.php.
When I use the GDPR plugin and a user accept the consent or make a change on the cookies configuration the path website-address.xxx/wp-admin/admin-post.php is called.
Can I make something to change this so that I can keep the security config?

Thanks in advance

Allowed analytic cookies ON/OFF - code for wp functions.php

Hi
we discuss this on a previous close Issue.
When the user turn on or off the specific category for google analytics cookies the code below show enable or disable these cookies.
I have try it but the cookies from google are not loading... Can you help me here?
I may making some mistake on the code.

  • When I turn OFF/ON on the cookie preferences the values on the gdpr[allowed_cookies] array is changing inserting/deleting the _ga, _gat, _gid values, but the cookies are not loaded.
  • Is this a issue of the name 'analytics' on the has_consent( 'analytics' ) or something with the cookie category naming?

add_action( 'wp_head', 'my_google_opt_out', 1 );
function my_google_opt_out(){
if ( ! has_consent( 'analytics' ) || ! is_allowed_cookie( '_ga' )) :
?>
<script>
window['ga-disable-UA-xxxxxx-x'] = true; // Replace 'X' for your UA numbers.
</script>

<script>
window['ga-disable-UA-xxxxx-x'] = false; // Replace 'X' for your UA numbers.
</script>
<?php
endif;
}

Thanks in advance.

Consent to embeds and iframes

From: darkmoonxarx

One of the challenges of GDPR is YouTube, facebook and instagram embeds, because they save cookies from external sources. In some cases a general “I understand” click at the beginning doesn’t suffice. So how about if your plugin could detect iframes and oEmbeds, replace them with a thumbnail with some legal info and don’t load them until they are clicked.
This is a plugin that does this with YouTube links: https://github.com/michaelzangl/wp-video-embed-privacy
Your plugin could go one step further and save the consent, so the user only has to click once. Also functionality for all oEmbeds, iFrames and potentially a shortcode to hide any type of content until permission is given would be awesome.

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.