Coder Social home page Coder Social logo

codeforboston / police-data-trust Goto Github PK

View Code? Open in Web Editor NEW
39.0 16.0 71.0 109.69 MB

A national archive of police data collected by journalists, lawyers, and activists around the country.

Home Page: https://www.nationalpolicedata.org

License: MIT License

Python 33.57% Shell 0.29% Batchfile 0.03% Dockerfile 0.23% JavaScript 2.05% TypeScript 41.65% CSS 6.21% Mako 0.08% SCSS 0.15% Jupyter Notebook 15.37% HTML 0.36% Procfile 0.01%
police-misconduct accountability transparency open-government

police-data-trust's Introduction

police-data-trust

To get started:

  1. Fork a copy of the main repo to your GitHub account.

  2. Clone your fork: git clone [email protected]:YOUR_GITHUB_NAME/police-data-trust.git

  3. Add the main repo to your remotes

cd police-data-trust
git remote add upstream https://github.com/codeforboston/police-data-trust.git
git fetch upstream

Now, whenever new code is merged you can pull in changes to your local repository:

git checkout main
git pull upstream main

Installation (Full Application)

This method uses Docker to run the complete application stack.

  1. Make sure that Docker is installed on your machine.

  2. Create a .env file by running cp .env.template .env in the root of your local project folder, and add your preferred PostgreSQL username and password:

Note When running locally, you may need to update one of the ports in the .env file if it conflicts with another application on your machine.

  1. Build and run the project with docker-compose build && docker-compose up -d && docker-compose logs -f

Installation (Frontend Only)

This method runs the frontend natively on your computer and does not require a running backend, which can be convenient.

  1. Make sure that you have node 16+ and either npm 7+ or yarn installed.
  2. Follow the install instructions in the frontend directory.

Testing with Docker

All code must pass the unit tests and style checks before it can be merged into the main branch. You can run the tests locally by opening up a comand line interface to a docker container while it's running the application:

docker exec -it "police-data-trust-api-1" /bin/bash

You'll need to replace police-data-trust-api-1 with the name of the container you'd like tro connect to. You can see the names of all currently running containers by running docker container ls

docker container ls
CONTAINER ID   IMAGE                   COMMAND                  CREATED              STATUS              PORTS                    NAMES
c0cf********   police-data-trust-api   "/bin/sh -c '/wait &…"   About a minute ago   Up About a minute   0.0.0.0:5001->5001/tcp   police-data-trust-api-1
5e6f********   postgres:16.1           "docker-entrypoint.s…"   3 days ago           Up About a minute   0.0.0.0:5432->5432/tcp   police-data-trust-db-1
dacd********   police-data-trust-web   "docker-entrypoint.s…"   3 days ago           Up About a minute   0.0.0.0:3000->3000/tcp   police-data-trust-web-1

Backend Tests

The current backend tests can be found in the GitHub Actions workflow file python-tests.yml

To run the tests locally, first start the application with docker-compose. Then open up a command line interface to the running container:

docker exec -it "police-data-trust-api-1" /bin/bash

Then run the tests:

flake8 backend/
python -m pytest

Front End Tests

The current frontend tests can be found in the GitHub Actions workflow file frontend-checks.yml

To run the tests locally, first start the application with docker-compose. Then open up a command line interface to the running container:

docker exec -it "police-data-trust-web-1" /bin/bash

Then run the tests:

npm run lint
npm run check-formatting
npm run test
npm run check-types

Documentation

Docs

Code Standards

Typescript Style Guide

This style guide is intended to act as a quick reference for the most common scenarios

Custom Types

For this codebase, we are using interfaces instead of type aliases.

Utilizing Types

  • We are aiming for a loose standard of explicitly typing as little as possible (relying on type inference or third-party library typing files to do the work whenever convenient), but as much as necessary (function params/args are a good example of what the compiler is bad at inferring). Erring on the side of 'stricter than absolutely necessary' definitely works for us!

  • The any type should never be utilized here. Prefer union types in the case of values that are initially null (such as values that come from API calls), or unknown in case of a type being truly impossible to discern ahead of time.

  • When typing primitive values declared with const, explicitly typing them will be necessary to prevent their type from being implied as the literal value of said primitive, rather than it's corresponding data type.

Functions

  • Always use explicit typing in the case of function params and return types.

  • If function parameters don't get modified by the function, strongly consider making them readonly to prevent mutation and have clearer code.

React

  • Prefer the .tsx file extension when JSX is involved, and .ts when it isn't.

Props

  • Refer to the React/TypeScript Cheatsheet for examples of common propTypes.

  • In the case of components that accept other React components as props, prefer typing those as React.ReactNode.

Hooks

  • Prefer type inference for useState for simple cases. If the hook initializes with a nullish value, strongly consider a union type.

  • Since useEffect and useLayoutEffect don't return values, typing them is not necessary.

  • When typing useRef, refer to the React/TypeScript cheatsheet for guidance on your specific situation.

Forms & Events

  • Type inference should be sufficient in the case of inline event handlers.

  • IDE tooling (such as VSCode autocomplete) will offer helpful suggestions for specific event handler types.

  • The React/TypeScript cheatsheet has a list of specific event types.

Organization of props and attributes

Ordering of components —

  • Class definitions
  • Component / imports
  • Event handlers inside class

HTML Props/attributes order:

  • id, class, attributes
  • Like properties alphabetized (?)

Directory structure:

  • Pages: routable containers
  • Shared: components being used/planned to be used in multiple places
  • Compositions: components that have a single/limited specific context

police-data-trust's People

Contributors

acharliekelly avatar alexjball avatar arutfield avatar azheng1991 avatar caseydulong avatar darpham avatar dependabot[bot] avatar dmalone87 avatar dwreeves avatar dylanesque avatar e-lipman avatar etilden avatar hrauniya avatar jmstudiosjoe avatar joshua-rdrgz avatar logan-dang avatar lorenmakesgames avatar merry3750 avatar micahgoodman avatar mikeyavorsky avatar myavorsky avatar nancyyang94 avatar ren0nie0 avatar rosyntow avatar ryanmahan avatar ryegggit avatar sashamaryl avatar srsexton94 avatar stianberghansen avatar zganger 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

Watchers

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

police-data-trust's Issues

API Router/Handler

The heart of the API is a handler that receives requests from users and routes them to the proper functions. This task includes:

  • Defining the API endpoints that are available to users
  • Defining the breadth of functions that will need to accounted for
  • Building the router for said API

The user stories that will determine the APIs needed will be outlined in the comments.
Once this task is completed, subtasks will be required to build out the functions that will actually be doing the required work.

[BUG] shared-components: resizing logo fix

Describe the solution you'd like
The shared-component <LogoSVG /> should resize to fit the parent container it is displayed in.

Additional context/alternatives considered

  • adjusting width and height in NPDCLogo.svg file directly.
  • adjusting preserveAspectRatio in NPDCLogo.svg file directly.

Screenshots

Current mobile view:
image

Currently preserving original 144 x 113 dimensions; logoContainer constrained to 75px by 75px.

Current desktop view:
image

@JMStudiosJoe please let me know if I'm missing any other details from our earlier conversation today - the original shrinking issue is no longer happening for me after I recompiled, but wanted to still keep the resizing documentation.

[BUG] husky does not run when running in Docker container

Describe the bug

If the dev is running the front-end in a Docker container, husky hooks are not run when git commit is run inside the container.

To Reproduce
Steps to reproduce the behavior:

  1. Run docker compose up -d
  2. Introduce a Prettier transgression in the frontend code such as ()=>{ return; }
  3. Run git commit
  4. Prettier is not run against the file

[FEATURE] Donate Page/ Button?

Unsure if we want the “DONATE” button to link to...

  1. a custom donation page that we host directly on this website
  2. a custom donation page that we host on fundraising website
    a.GoFundMe
    b. Classy
    c. CharityNavigator
    d.Other?
  3. The Code for Boston/America donation page
  4. Project partners’ donation sites (can’t find Tubman Project donation page, unsure of others)

[FEATURE] Custom Hook for password utility

When custom code needs to be more tightly integrated with hooks/state and is needed in multiple pages/components, drafting it as a custom hook is a best practice in React. This feature will create a folder for these, and implement a refactoring of @srsexton94's work on the password visibility toggle helper function into a solution that's more idiomatic to React, and will serve as a good example as to how to implement future custom hooks in the codebase.

[FEATURE] Add User DB

Is your feature request related to a problem? Please describe.
Currently, we're lacking a user object that can be used for authentication.

Describe the solution you'd like
We need to add the required DB objects to handle user authentication. A good solution will cover all of the different user types:

  • A basic user who has only provided an email address and other optional profile information
  • A Passport user who has provided some additional information and must be approved by an administrator
  • A Contributor user who has permission to update and add records to the index
  • An Admin user

[FEATURE] Make login form work

There is (or will be, pending #106) an API route for user authentication. But the login form was created by #48, which is closed; so there's no open issue for making the login form actually perform the authentication. So, that's what this is.

Requirements

Modify the login form's handleSubmit function (in pages/login/index.tsx ) so that it:

  • Sends the login fields to the API
  • Uses the response to render either the dashboard or a login failure message

[FEATURE] create US Map component

US Map component for multiple pages

us-map

Requirements

  • Recognizable image of US
  • Show data richness by state, via background color
  • Show locations of data-rich cities
  • Map must be usable as input control for search locations

edit 8/10/21

NEXT STEPS

  • create a key for the map (see figma for design, use d3)
    • include:
      color gradient block scale
      symbol guide
    • should be able to add other types of keys and additional data
    • should be reusable for other types of visualizations (not tied to map-type)
  • style markers according to the figma

UPCOMING / blocked

  • [on hold] create pop up element (see figma) waiting for design approval + content
  • [on hold] make map mobile-ready
  • [on hold] interface/import files for map-data

[FEATURE] create Search Where component

This is very similar to the initial Search Landing Page search, and can probably use the same component. It would only appear in the search flow if the user started with Search by Officer(s), and then later decided to add a location.

search-where-comp

search-where-2

Requirements

  • Single input field featuring dropdown autocomplete location search
  • Back & Next buttons

[FEATURE] create Other Search Info component

This component appears as Step 2 in searching for incident(s), and appears one of two ways, depending on the previous step. Type 1, you started with Search Incident(s):
other-search-info-1
In this case, the other search options are:

  • When it occurred
  • Who was involved
  • What happened

Type 2, you started with Search Officer(s):
other-search-info-2
In this case, the other options are:

  • When it occurred
  • Where it occurred
  • What happened

Either way, the component has:

  • 3 search options
  • Back and Next buttons to continue the search flow
  • A link for "I don't know any other information", which will end the search flow

[FEATURE] Register basic user

Register a Viewer (basic user)

Register viewer user
viewer-registration

Tooltip and visible password
viewer-registration-2

Validation
viewer-registration-validation

Requirements

  • Six input fields
    • First Name (required)
    • Last Name (required)
    • Email Address (required, email)
    • Phone Number (required, phone)
    • Create Password (required, minimum password requirements)
    • Re-enter Password (required, match)
  • Show Password
  • Submit Button
  • Link to Login Page
  • Validation for all fields

[FEATURE] Enrollment UI Design update

Currently the UIs of Login, Registration, and Application have some variability between each other and do not match the wireframes. This ticket can be worked on once PR 78 is merged.

This ticket is to make their designs consistent with each other and to match the wireframes.
Routing between these pages should also be implemented consistently and error messaging & styling should be set up behind the scenes - but error validation does not need to be fully implemented in response to user input yet.

I will know this is complete when:

  • I am an NPDC dev/designer looking at the Login, Registration, and Application pages and I can see that they match the wireframes
  • I am an NPDC user interacting with the forms, I am able to input appropriate value types
  • I am a screen reader user interacting with the forms, I am able to perform all actions and perceive all content that a sighted user can

[FEATURE] Tables for Linking Like Objects

Is your feature request related to a problem? Please describe.
Each incident may have additional objects that are related to it. For example, an incident may involve a number of officers or a legal case. Since we will be compiling data from multiple sources, it is likely that these sources will make references to the same entities. For example, a report from fatal encounters and a data entry from CPDP may refer to the same officer. We need some way to relate those entities in our database.

Describe the solution you'd like
I propose that we include two tables for each object that can be related to multiple incidents. The first will contain objects that are directly related to an incident. The second table will contain master profiles for objects and will relate to objects in the first table. For example, the second table might indicate that a number of officers in the first table are actually the same officer.

Additional context
National Police Data Coalition - Linking Like Objects.pdf

[FEATURE] create Registration response page

Response screen for after user creates a new profile. Can use one page for all possible outcomes - only the message will change, depending on type of user and response (Viewer or Passport, success or failure).

Success
profile-response

Error
profile-response-error

[FEATURE] create Search When component

This component can be used to search for either a specific date or a date range. It has individual fields for month, day, and year, and will allow searching for whatever part the user has available - no specific parts are required.

Search for specific date
search-date-comp

Search component for date range
search-date-range-comp

Validation - at least one field must be entered
search-date-range-validation

Requirements

  • Three or six input fields (month, day, year)
  • Link to switch between Specific Date and Date Range
  • Validation to ensure at least one field is provided
  • Back and Next buttons

[FEATURE] Sitewide Layout Component/Header

In the current design documents, there is no header on the page before the user signs up for or registers for an account. I'm suggesting the following change:

  • The site header/nav-element seen in the Figma docs will appear on all pages, with the adjustment of the "Search" and "Profile" links won't be visible, or routable.

This will give the site a more consistent look, and enable us to use a more conventional Layout component, that wraps everything else the site renders.

User Authentication

The database will have at least two sets of users:

  • Public Users who have general access
  • Passport holders who have expanded access

Both sets of users will need to register with the NPDC and will have an account created that denotes their level of access

When these users access the API, we'll need a system to authenticate the user before allowing them to receive a response or determining what to include in that response.

[FEATURE] create Search Results page

results-page

Components

  • Map showing geographic area searched
  • Search criteria
  • Links to edit search (Who, What, Where, When)
  • Data table with summary of incidents and link to full records

[BUG] Fix connection in scraper

Overview

On Unix systems, the script in /backend/scraper/mapping_police_violence.py doesn't work due to SSL cert issues via OpenSSL. This will be a barrier to integrating into Heroku easily with automatic filling of data as a postdeploy script. It's also a pain for me personally and a couple other volunteers, and makes it hard to contribute.

My recommendation is to download the xlsx file manually and load from that (as a hotfix), then once that's done we can create a separate issue that's about making the process more automated while dodging the SSL cert issues.

Requirements for issue:

  • Make the script load from a local version of xlsx.
  • Create new Github issue outlining a feature request for fixing the SSL cert issue.

Data Import System

For the purposes of the MVP, we'll need to have some system that will allow us to import data into the database from a CSV file. The importer should interpret the data and apply a filter in order to transform the unique schema that exists in the particular CSV file into something that comports with the shared schema of the index.

This system will eventually be used to onboard new data contributors in order to efficiently add past data from that contributor to the index.

[BUG] Remove 3rd party GitHub action for heroku deploy

Describe the bug
The current heroku.yml workflow is designed to use a 3rd party (unverified) action for deployment to Heroku. This project leverages Heroku's new Platform API and container registry.

- uses: akhileshns/[email protected] # This is the action

Code for Boston has not been able to deploy this app successfully using this action. We have not been able to get this action to authenticate with Heroku successfully.

To Reproduce
Steps to reproduce the behavior:

  1. Merge any Pull Request into main
  2. Look at the Actions tab

Expected behavior
When you merge into main, the action should at least successfully authenticate with Heroku and attempt to push a container with the latest app build.

Additional context
Using this 3rd party action should not be necessary given that the Heroku CLI comes preinstalled in Ubuntu images. See supported software

Add a Procfile

This project is connected to Heroku. In order for Heroku to run its dyno process, we need a Procfile.

[FEATURE] Create shared modal base component

I will know this is complete when:

  • There is a shared component that creates a modal dialog base
  • The modal projects supplied header & body content slots
  • The modal hosts a "close" X button in the top right corner by default
  • The modal has variable sizes determined by input, determined by a set width and minimum height
  • The modal is fully accessible (traps keyboard & screen reader use inside of itself)

[FEATURE] app.json

Overview

The app.json is a Heroku deployment manifest file for apps that are not built via the container registry.

https://devcenter.heroku.com/articles/app-json-schema

Requirements for issue:

  • Create a valid app.json.
  • Add one of those "one click deploy" buttons in the README.md.

The previous project I worked on is a good example of how to do all these things: https://github.com/codeforboston/flagging

For our project we would just want the Postgres add-on, and a SECRET_KEY I think for now.

[FEATURE] create Search Who component

Search component for Who details (Department and/or Officer involved)

search-who-comp

Component has two fields, Department and Officer. Both have dropdown auto-complete features.

Department
search-who-dept

Officer
search-who-officer

Both fields have a "There was another _ involved" link, which will add a duplicate field under the first, which will behave the same way:
search-who-others

Validation (not pictured) should require that at least one field be filled before clicking Next.
Back and Next buttons will continue the search flow.

[BUG] Build failing: Update requirements file to install dependencies

Describe the bug
Builds are failing with the following error from logs:

-----> Python app detected
-----> Using Python version specified in runtime.txt
-----> Installing python-3.8.9
-----> Installing pip 20.2.4, setuptools 47.1.1 and wheel 0.36.2
-----> Installing SQLite3
-----> Installing requirements with pip
       ERROR: Could not open requirements file: [Errno 2] No such file or directory: '/tmp/build_6a08c693/prod.txt'
 !     Push rejected, failed to compile Python app.
 !     Push failed

The build fails b/c the requirements.txt file on the main branch references a non-existent prod.txt file. Update the requirements.txt file to point to this one.

To Reproduce
Any push or merge into the main branch.

[FEATURE] create Incident Date search component

FIGMA design spec

search-date-comp

Search component for specific incident date.
Requirements

  • Input fields for specific date (month, day, & year, or whatever the user has)
  • Link to switch to Date Range
  • Back and Next buttons, which will move user through the flow

[FEATURE] create Dashboard Landing View

Location Search View (Default)
location-start-page

Officer Search View
officer-search-start

Landing page for Incident Search. Features components:

  • Link to switch between Location and Officer searches
  • Search field
    • auto-complete drop-down,
    • "I don't know _" checkbox, which will bypass this step
    • Next button
  • US Map component

This is the default starting page for a search. Next page in flow will depend on whether or not incident location/officer is known.

Reference DB

Is your feature request related to a problem? Please describe.
In addition to the public database, there should be a separate database that allows the system to link back to the original record that is held by the federated owner.

Describe the solution you'd like
Create an additional database that contains information about how records in the primary index relate to records stored by federated partners. Something like:

  • Local UID
  • Data Owner: The federated owner that has the source record
  • FO UID: The unique identifier in the remote DB
  • Last Update: Timestamp of the last update of this record
  • Last Hash: The most recent hash of the remote data

We could also opt for an append only structure. This would alter the database slightly like so:

  • Local UID
  • Data Owner: The federated owner that has the source record
  • FO UID: The unique identifier in the remote DB
  • Recorded: Timestamp of this update
  • Hash: The recorded hash of the remote data

Describe alternatives you've considered
Two alternatives are described here. Further discussion to occur at next occasion.

Dockerize It

Using docker would make the project easier to develop for and would simplify adding additional services like Elastic Search.

[FEATURE] Add Storybook

Since we're going to be making reusable components, Storybook is a good way to test them in isolation.

This feature is just adding the dev dependency (and making sure it still installs). Actually making stories (tests) for components will be a separate thing.

[FEATURE] OpenAPI Specification

Feature

We have a Pydantic model for the incidents (pending approval of #110). Now what we want is automated API documentation through a Swagger UI (example here) that defines all our models and the request/response bodies of all the routes available in our API.

Solution

Solving this unfortunately requires either:

  1. Using this library and remove flask-pydantic from our codebase. The spectree routing implementation is not as elegant as flask_pydantic's, so either we (1a.) put up with that, or (1b.) steal a bit from flask_pydantic's code to implement their view function handlers.
  2. Continue to use flask-pydantic, and implement a sort of ad hoc solution via Flasgger.
  3. Continue to use flask-pydantic, and contribute to their source code a solution to implementing Swagger. That's... a lot of work. 😬 I am personally intrigued by doing this and may do it for fun, but I imagine others may find it daunting, and in any case it'd slow down production.

Other options that are not recommended, but available:

  1. Removing Pydantic from our code base entirely, and going to the marshmallow + flask-apispec stack. (Not recommended; Marshmallow is basically a legacy library at this point.)
  2. Swapping to FastAPI (Also not recommended; I like FastAPI, but Flask is a more venerated framework with a more fleshed out ecosystem, and it judiciously uses things like proxies and thread locals to make life easier for beginner coders. These two reasons make it an appropriate framework for a project like ours that needs to reliably implement lots of bells and whistles with volunteer labor.)

Background

The Python ecosystem right now is shifting away from a pre-3.6 era to a post-3.6 era, where Python's type hint system is increasingly being used for controlling the actual logic of how applications work, rather than just for type checking. (Additionally, 3.6 implemented asyncio with async/await keywords.)

Starlette/FastAPI (ASGI web framework) + Pydantic (serialization library) is the typical combination you see out in the wild. These are relatively modern frameworks that take very full use of Python 3.6 features (both async and type hints).

Flask is a WSGI web framework that's over 10 years old and predates Python 3.6. The serialization library you typically see with Flask is Marshallow. Marshmallow is very much a pre-3.6 era library, and it definitely shows its age.

tldr:

  • Flask + Marshmallow is common
  • Starlette/FastAPI + Pydantic is common
  • Flask + Pydantic is not common

[FEATURE] create Passport registration

passport-registration

This is an advanced user registration, so they already have the basic Viewer account.

Requirements

  • Refer to user's name, which should be available from profile
  • Input fields:
    • Street Address (text, required)
    • City or town (text, required)
    • State (text, required)
    • Zip code (text, required)
    • Why are you signing up to the NPDC? (required, textarea, minimum character count)
  • Submit button

Validation
passport-registration-validation

[FEATURE] Fix up schema

Overview

We have a schema document on Google Drive. We should make sure we implement it because right now we just have a flat table.

Requirements for issue

User-login [BUG]

Sorry, this seems too small an issue to bother writing up, but the PR is already merged, so...

In frontend/pages/login.tsx, line 1, the import refers to ../user-login/user-login. But PR #83 updated the file to ../user-login/index.tsx to conform to NextJS routing conventions, so now the login page doesn't compile. localhost:3000/login. Just need to change that one line.

[FEATURE] Results data grid component

After running a search, the results are displayed as a data grid, which will look something like this:

results-grid

Exact column names may change, but should have pagination and alternating colors for readability.

[FEATURE] create Search Dashboard page

FIGMA design spec

search-dashboard-start

Requirements

  • Link to "Find your officer(s)" Search page
  • Dropdown component with auto-complete for searching by location
  • Checkbox to skip step, if location is unknown
  • US map component, allowing user to select region, and also displaying data richness
  • Next button, to proceed with flow

[FEATURE] Create map key

image

create a key for the map (see figma for design, use d3)

include:

  • color gradient block scale
  • symbol guide

should be able to accommodate other types of scales and additional data
should be reusable for other types of visualizations (not tied to map-type)

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.