meta: enable prettier for markdown (#5133)

* meta: enable prettier for markdown

* Ignore changelogs

* revert CHANGELOG changes

* More formatting

---------

Co-authored-by: Antoine du Hamel <duhamelantoine1995@gmail.com>
This commit is contained in:
Merlijn Vos 2024-05-02 11:35:55 +02:00 committed by GitHub
parent 2a15ba5128
commit 7d6937300a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
77 changed files with 1565 additions and 895 deletions

View file

@ -1,6 +1,8 @@
## Contributing to Uppy
Fork the repository into your own account first. See the [GitHub Help](https://help.github.com/articles/fork-a-repo/) article for instructions.
Fork the repository into your own account first. See the
[GitHub Help](https://help.github.com/articles/fork-a-repo/) article for
instructions.
After you have successfully forked the repository, clone it locally.
@ -9,8 +11,8 @@ git clone https://github.com/transloadit/uppy.git
cd uppy
```
We are using [Corepack][] to manage versions of [Yarn][].
Corepack comes pre-installed with Node.js >=16.x, or can be installed through `npm`:
We are using [Corepack][] to manage versions of [Yarn][]. Corepack comes
pre-installed with Node.js >=16.x, or can be installed through `npm`:
```sh
corepack -v || npm i -g corepack
@ -18,7 +20,6 @@ corepack enable
```
[Corepack]: https://nodejs.org/api/corepack.html
[Yarn]: https://yarnpkg.com/
## Development
@ -42,7 +43,10 @@ As you edit Uppy code, the browser will live reload the changes.
### Companion
If youd like to work on features that the basic development version of Uppy doesnt support, such as Uppy integrations with Instagram/Google Drive/Facebook etc., you need to set up your `.env` file (copy the contents of `.env.example` and adjust them based on what you need to work on), and run:
If youd like to work on features that the basic development version of Uppy
doesnt support, such as Uppy integrations with Instagram/Google Drive/Facebook
etc., you need to set up your `.env` file (copy the contents of `.env.example`
and adjust them based on what you need to work on), and run:
```bash
yarn run dev:with-companion
@ -54,42 +58,68 @@ Or, if you only want to run the Companion server:
yarn run start:companion
```
This would get the Companion instance running on `http://localhost:3020`. It uses [nodemon](https://github.com/remy/nodemon) so it will automatically restart when files are changed.
This would get the Companion instance running on `http://localhost:3020`. It
uses [nodemon](https://github.com/remy/nodemon) so it will automatically restart
when files are changed.
### Live example
An example server is running at <https://companion.uppy.io>, which is deployed with [Kubernetes](https://github.com/transloadit/uppy/blob/main/packages/%40uppy/companion/KUBERNETES.md)
An example server is running at <https://companion.uppy.io>, which is deployed
with
[Kubernetes](https://github.com/transloadit/uppy/blob/main/packages/%40uppy/companion/KUBERNETES.md)
### How the Authentication and Token mechanism works
This section describes how Authentication works between Companion and Providers. While this behaviour is the same for all Providers (Dropbox, Instagram, Google Drive, etc.), we are going to be referring to Dropbox in place of any Provider throughout this section.
This section describes how Authentication works between Companion and Providers.
While this behaviour is the same for all Providers (Dropbox, Instagram, Google
Drive, etc.), we are going to be referring to Dropbox in place of any Provider
throughout this section.
The following steps describe the actions that take place when a user Authenticates and Uploads from Dropbox through Companion:
The following steps describe the actions that take place when a user
Authenticates and Uploads from Dropbox through Companion:
* The visitor to a website with Uppy clicks `Connect to Dropbox`.
* Uppy sends a request to Companion, which in turn sends an OAuth request to Dropbox (Requires that OAuth credentials from Dropbox have been added to Companion).
* Dropbox asks the visitor to log in, and whether the Website should be allowed to access your files
* If the visitor agrees, Companion will receive a token from Dropbox, with which we can temporarily download files.
* Companion encrypts the token with a secret key and sends the encrypted token to Uppy (client)
* Every time the visitor clicks on a folder in Uppy, it asks Companion for the new list of files, with this question, the token (still encrypted by Companion) is sent along.
* Companion decrypts the token, requests the list of files from Dropbox and sends it to Uppy.
* When a file is selected for upload, Companion receives the token again according to this procedure, decrypts it again, and thereby downloads the file from Dropbox.
* As the bytes arrive, Companion uploads the bytes to the final destination (depending on the configuration: Apache, a Tus server, S3 bucket, etc).
* Companion reports progress to Uppy, as if it were a local upload.
* Completed!
- The visitor to a website with Uppy clicks `Connect to Dropbox`.
- Uppy sends a request to Companion, which in turn sends an OAuth request to
Dropbox (Requires that OAuth credentials from Dropbox have been added to
Companion).
- Dropbox asks the visitor to log in, and whether the Website should be allowed
to access your files
- If the visitor agrees, Companion will receive a token from Dropbox, with which
we can temporarily download files.
- Companion encrypts the token with a secret key and sends the encrypted token
to Uppy (client)
- Every time the visitor clicks on a folder in Uppy, it asks Companion for the
new list of files, with this question, the token (still encrypted by
Companion) is sent along.
- Companion decrypts the token, requests the list of files from Dropbox and
sends it to Uppy.
- When a file is selected for upload, Companion receives the token again
according to this procedure, decrypts it again, and thereby downloads the file
from Dropbox.
- As the bytes arrive, Companion uploads the bytes to the final destination
(depending on the configuration: Apache, a Tus server, S3 bucket, etc).
- Companion reports progress to Uppy, as if it were a local upload.
- Completed!
### Instagram integration
Even though facebook [allows using](https://developers.facebook.com/blog/post/2018/06/08/enforce-https-facebook-login/) http://localhost in dev mode, Instagram doesnt seem to support that, and seems to need a publically available domain name with HTTPS. So we will tunnel requests to localhost using `ngrok`.
Even though facebook
[allows using](https://developers.facebook.com/blog/post/2018/06/08/enforce-https-facebook-login/)
http://localhost in dev mode, Instagram doesnt seem to support that, and seems
to need a publically available domain name with HTTPS. So we will tunnel
requests to localhost using `ngrok`.
Make sure that you are using a development facebook app at <https://developers.facebook.com/apps>
Make sure that you are using a development facebook app at
<https://developers.facebook.com/apps>
Go to “Instagram Basic Display” and find `Instagram App ID` and `Instagram App Secret`. Put them in a file called `.env` in the repo root:
Go to “Instagram Basic Display” and find `Instagram App ID` and
`Instagram App Secret`. Put them in a file called `.env` in the repo root:
COMPANION_INSTAGRAM_KEY="Instagram App ID"
COMPANION_INSTAGRAM_SECRET="Instagram App Secret"
**Note!** `ngrok` seems to be blocked by Instagram now, so you may have to find an alternative.
**Note!** `ngrok` seems to be blocked by Instagram now, so you may have to find
an alternative.
Run
@ -102,7 +132,8 @@ append `/instagram/redirect` to it, such as:
https://e0c7de09808d.ngrok.io/instagram/redirect
Add this full ngrok URL to `Valid OAuth Redirect URIs` under `Instagram Basic Display`.
Add this full ngrok URL to `Valid OAuth Redirect URIs` under
`Instagram Basic Display`.
Edit `.env` and change to your ngrok URI:
@ -112,7 +143,8 @@ Edit `.env` and change to your ngrok URI:
Go to: Roles -> Roles -> Add Instagram testers -> Add your instagram account
Go to your instagram account at <https://www.instagram.com/accounts/manage_access/>
Go to your instagram account at
<https://www.instagram.com/accounts/manage_access/>
Tester invites -> Accept
@ -120,8 +152,13 @@ Now you should be able to test the Instagram integration.
### Requiring files
* If we are `require()`ing a file from the same subpackage, we can freely use relative imports as long as the required file is under the `src` directory (for example to import `@uppy/dashboard/src/utils/hi.js` from `@uppy/dashboard/src/index.js`, use `require('./utils/hi.js')`).
* But if we want to `require()` some file from another subpackage - we should use global @uppy requires, and they should always be in the form of `@uppy/:packageName/(lib instead of src)/(same path).js`
- If we are `require()`ing a file from the same subpackage, we can freely use
relative imports as long as the required file is under the `src` directory
(for example to import `@uppy/dashboard/src/utils/hi.js` from
`@uppy/dashboard/src/index.js`, use `require('./utils/hi.js')`).
- But if we want to `require()` some file from another subpackage - we should
use global @uppy requires, and they should always be in the form of
`@uppy/:packageName/(lib instead of src)/(same path).js`
## Tests
@ -135,17 +172,28 @@ yarn test:unit
### End-to-End tests
We use [Cypress](https://www.cypress.io/) for our e2e test suite. Be sure to checkout “[Writing your first test](https://docs.cypress.io/guides/getting-started/writing-your-first-test#Add-a-test-file)” and the “[Introduction to Cypress](https://docs.cypress.io/guides/core-concepts/introduction-to-cypress#Cypress-Can-Be-Simple-Sometimes)”. You should also be aware of the “[Best Practices](https://docs.cypress.io/guides/references/best-practices)”.
We use [Cypress](https://www.cypress.io/) for our e2e test suite. Be sure to
checkout
“[Writing your first test](https://docs.cypress.io/guides/getting-started/writing-your-first-test#Add-a-test-file)”
and the
“[Introduction to Cypress](https://docs.cypress.io/guides/core-concepts/introduction-to-cypress#Cypress-Can-Be-Simple-Sometimes)”.
You should also be aware of the
“[Best Practices](https://docs.cypress.io/guides/references/best-practices)”.
To get started make sure you have your `.env` set up. Copy the contents of `.env.example` to a file named `.env` and add the values relevant for the test(s) you are trying to run.
To get started make sure you have your `.env` set up. Copy the contents of
`.env.example` to a file named `.env` and add the values relevant for the
test(s) you are trying to run.
To start the testing suite run:
yarn e2e
This will run Cypress in watch-mode, and it will pick up and rebuild any changes to JS files. If you need to change other files (like CSS for example), you need to run the respective `yarn build:*` scripts.
This will run Cypress in watch-mode, and it will pick up and rebuild any changes
to JS files. If you need to change other files (like CSS for example), you need
to run the respective `yarn build:*` scripts.
Alternatively the following command is the same as the above, except it doesnt run `build` first:
Alternatively the following command is the same as the above, except it doesnt
run `build` first:
yarn e2e:skip-build
@ -155,28 +203,44 @@ To generate the boilerplate for a new test run:
## Zoom
See above Instagram instructions for setting up a tunnel, but replace `instagram` with `zoom` in the URL. Note that **you also have to add the OAuth redirect URL to `OAuth allow list`** in the Zoom Oauth app settings or it will not work.
See above Instagram instructions for setting up a tunnel, but replace
`instagram` with `zoom` in the URL. Note that **you also have to add the OAuth
redirect URL to `OAuth allow list`** in the Zoom Oauth app settings or it will
not work.
Add the following scopes: `recording:read`, `user:read`, `user_info:read`
To test recording a meeting, you need to sign up for a Zoom Pro trial (can be cancelled later), for example using their iOS app.
To test recording a meeting, you need to sign up for a Zoom Pro trial (can be
cancelled later), for example using their iOS app.
## Releases
Releases are managed by GitHub Actions, heres an overview of the process to release a new Uppy version:
Releases are managed by GitHub Actions, heres an overview of the process to
release a new Uppy version:
* Run `yarn release` on your local machine.
* Follow the instructions and select what packages to release. **Warning:** skipping packages results in those changes being “lost”, meaning they wont be picked up in the changelog automatically next release. Always try to release all.
* Before committing, check if the generated files look good.
* When asked to edit the next CHANGELOG, only include changes related to the package(s) you selected for release.
* Push to the Transloadit repository using the command given by the tool. Do not open a PR yourself, the GitHub Actions will create one and assign you to it.
* Wait for all the GitHub Actions checks to pass. If one fails, try to figure out why. Do not go ahead without consulting the rest of the team.
* Review the PR thoroughly, and if everything looks good to you, approve the PR. Do not merge it manually!
* After the PR is automatically merged, the demos on transloadit.com should also be updated. Check that some things work locally:
* the demos in the demo section work (try one that uses an import robot, and one that you need to upload to)
* the demos on the homepage work and can import from Google Drive, Instagram, Dropbox, etc.
- Run `yarn release` on your local machine.
- Follow the instructions and select what packages to release. **Warning:**
skipping packages results in those changes being “lost”, meaning they wont be
picked up in the changelog automatically next release. Always try to release
all.
- Before committing, check if the generated files look good.
- When asked to edit the next CHANGELOG, only include changes related to the
package(s) you selected for release.
- Push to the Transloadit repository using the command given by the tool. Do not
open a PR yourself, the GitHub Actions will create one and assign you to it.
- Wait for all the GitHub Actions checks to pass. If one fails, try to figure
out why. Do not go ahead without consulting the rest of the team.
- Review the PR thoroughly, and if everything looks good to you, approve the PR.
Do not merge it manually!
- After the PR is automatically merged, the demos on transloadit.com should also
be updated. Check that some things work locally:
- the demos in the demo section work (try one that uses an import robot, and
one that you need to upload to)
- the demos on the homepage work and can import from Google Drive, Instagram,
Dropbox, etc.
If you dont have access to the transloadit.com source code ping @arturi or @goto-bus-stop and well pick it up. :sparkles:
If you dont have access to the transloadit.com source code ping @arturi or
@goto-bus-stop and well pick it up. :sparkles:
### Releasing hotfix patch
@ -241,13 +305,16 @@ git push && git push --tags
#### Hotfix other packages
For other Uppy packages, the process should be like Companion,
but hasnt been documented yet. Make sure to remember to run `yarn` as well as building the package first, then you can release it.
If you do release any other packages, please update this doc.
For other Uppy packages, the process should be like Companion, but hasnt been
documented yet. Make sure to remember to run `yarn` as well as building the
package first, then you can release it. If you do release any other packages,
please update this doc.
## CSS guidelines
The CSS standards followed in this project closely resemble those from [Mediums CSS Guidelines](https://gist.github.com/fat/a47b882eb5f84293c4ed). If something is not mentioned here, follow their guidelines.
The CSS standards followed in this project closely resemble those from
[Mediums CSS Guidelines](https://gist.github.com/fat/a47b882eb5f84293c4ed). If
something is not mentioned here, follow their guidelines.
### Naming conventions
@ -286,7 +353,9 @@ Syntax: `[<namespace>-]<ComponentName>[-descendentName][--modifierName]`
### SASS
This project uses SASS, with some limitations on nesting. One-level-deep nesting is allowed, but nesting may not extend a selector by using the `&` operator. For example:
This project uses SASS, with some limitations on nesting. One-level-deep nesting
is allowed, but nesting may not extend a selector by using the `&` operator. For
example:
```sass
/* BAD */
@ -308,13 +377,14 @@ This project uses SASS, with some limitations on nesting. One-level-deep nesting
### Mobile-first responsive approach
Style to the mobile breakpoint with your selectors, then use `min-width` media queries to add any styles to the tablet or desktop breakpoints.
Style to the mobile breakpoint with your selectors, then use `min-width` media
queries to add any styles to the tablet or desktop breakpoints.
### Selector, rule ordering
* All selectors are sorted alphabetically and by type.
* HTML elements go above classes and IDs in a file.
* Rules are sorted alphabetically.
- All selectors are sorted alphabetically and by type.
- HTML elements go above classes and IDs in a file.
- Rules are sorted alphabetically.
```scss
/* BAD */
@ -350,26 +420,39 @@ h1 {
## Adding a new integration
Before opening a pull request for the new integration, open an issue to discuss said integration with the Uppy team. After discussing the integration, you can get started on it. First off, you need to construct the basic components for your integration. The following components are the current standard:
Before opening a pull request for the new integration, open an issue to discuss
said integration with the Uppy team. After discussing the integration, you can
get started on it. First off, you need to construct the basic components for
your integration. The following components are the current standard:
* `Dashboard`: Inline Dashboard (`inline: true`)
* `DashboardModal`: Dashboard as a modal
* `DragDrop`
* `ProgressBar`
* `StatusBar`
- `Dashboard`: Inline Dashboard (`inline: true`)
- `DashboardModal`: Dashboard as a modal
- `DragDrop`
- `ProgressBar`
- `StatusBar`
All these components should function as references to the normal component. Depending on how the framework youre using handles references to the DOM, your approach to creating these may be different. For example, in React, you can assign a property of the component to the reference of a component ([see here](https://github.com/transloadit/uppy/blob/425f9ecfbc8bc48ce6b734e4fc14fa60d25daa97/packages/%40uppy/react/src/Dashboard.js#L47-L54)). This may differ in your framework, but from what weve found, the concepts are generally pretty similar.
All these components should function as references to the normal component.
Depending on how the framework youre using handles references to the DOM, your
approach to creating these may be different. For example, in React, you can
assign a property of the component to the reference of a component
([see here](https://github.com/transloadit/uppy/blob/425f9ecfbc8bc48ce6b734e4fc14fa60d25daa97/packages/%40uppy/react/src/Dashboard.js#L47-L54)).
This may differ in your framework, but from what weve found, the concepts are
generally pretty similar.
If youre familiar with React, Vue or soon Svelte, it might be useful to read through the code of those integrations, as they lay out a pretty good structure. After the basic components have been built, here are a few more important tasks to get done:
If youre familiar with React, Vue or soon Svelte, it might be useful to read
through the code of those integrations, as they lay out a pretty good structure.
After the basic components have been built, here are a few more important tasks
to get done:
* Add TypeScript support in some capacity (if possible)
* Write documentation
* Add an example
* Configuring the build system
- Add TypeScript support in some capacity (if possible)
- Write documentation
- Add an example
- Configuring the build system
### Common issues
Before going into these tasks, here are a few common gotchas that you should be aware of.
Before going into these tasks, here are a few common gotchas that you should be
aware of.
#### Dependencies
@ -395,46 +478,72 @@ Your `package.json` should resemble something like this:
}
```
The most important part about this is that `@uppy/core` is a peer dependency. If your framework complains about `@uppy/core` not being resolved, you can also add it as a dev dependency
The most important part about this is that `@uppy/core` is a peer dependency. If
your framework complains about `@uppy/core` not being resolved, you can also add
it as a dev dependency
### Adding TypeScript Support
This section wont be too in-depth, because TypeScript depends on your framework. As general advice, prefer using `d.ts` files and vanilla JavaScript over TypeScript files. This is circumstantial, but it makes handling the build system a lot easier when TypeScript doesnt have to transpiled. The version of typescript in the monorepo is `4.1`.
This section wont be too in-depth, because TypeScript depends on your
framework. As general advice, prefer using `d.ts` files and vanilla JavaScript
over TypeScript files. This is circumstantial, but it makes handling the build
system a lot easier when TypeScript doesnt have to transpiled. The version of
typescript in the monorepo is `4.1`.
### Writing docs
Generally, documentation for integrations can be broken down into a few pieces that apply to every component, and then documentation for each component. The structure should look something like this:
Generally, documentation for integrations can be broken down into a few pieces
that apply to every component, and then documentation for each component. The
structure should look something like this:
* Installation
* Initializing Uppy (may vary depending on how the framework handles reactivity)
* Usage
* _For each component_
* Loading CSS
* Props
- Installation
- Initializing Uppy (may vary depending on how the framework handles reactivity)
- Usage
- _For each component_
- Loading CSS
- Props
It may be easier to copy the documentation of earlier integrations and change the parts that need to be changed rather than writing this from scratch. Preferably, keep the documentation to one page. For the front-matter, write something like:
It may be easier to copy the documentation of earlier integrations and change
the parts that need to be changed rather than writing this from scratch.
Preferably, keep the documentation to one page. For the front-matter, write
something like:
```markdown
title: Framework Name
type: docs
module: "@uppy/framework"
order: 0
category: "Other Integrations"
title: Framework Name type: docs module: "@uppy/framework" order: 0 category:
"Other Integrations"
```
This data is used to generate Uppys website.
Any change of the documentation that involves a security best practice must substantiated with an external reference. See [#3565](https://github.com/transloadit/uppy/issues/3565).
Any change of the documentation that involves a security best practice must
substantiated with an external reference. See
[#3565](https://github.com/transloadit/uppy/issues/3565).
### Adding an example
You can likely use whatever code generation tool for your framework (ex. `create-react-app`) to create this example. Make sure you add the same version of `@uppy/core` to this as your peer dependency required, or you may run into strange issues. Try to include all the components are some of their functionality. [The React example](https://github.com/transloadit/uppy/blob/main/examples/react-example/App.js) is a great... well example of how to do this well.
You can likely use whatever code generation tool for your framework (ex.
`create-react-app`) to create this example. Make sure you add the same version
of `@uppy/core` to this as your peer dependency required, or you may run into
strange issues. Try to include all the components are some of their
functionality.
[The React example](https://github.com/transloadit/uppy/blob/main/examples/react-example/App.js)
is a great... well example of how to do this well.
### Integrating the build system
The biggest part of this is understanding Uppys build system. The high level description is that `babel` goes through almost all the packages and transpiles all the Javascript files in the `src` directory to more compatible JavaScript in the `lib` folder. If youre using vanilla JavaScript for your integration (like React and Vue do), then you can use this build system and use the files generated as your entry points.
The biggest part of this is understanding Uppys build system. The high level
description is that `babel` goes through almost all the packages and transpiles
all the Javascript files in the `src` directory to more compatible JavaScript in
the `lib` folder. If youre using vanilla JavaScript for your integration (like
React and Vue do), then you can use this build system and use the files
generated as your entry points.
If youre using some kind of more abstract file format (like Svelte), then you probably want do to a few things: add the directory name to [this `IGNORE` regex](https://github.com/transloadit/uppy/blob/425f9ecfbc8bc48ce6b734e4fc14fa60d25daa97/bin/build-lib.js#L15); add all your build dependencies to the root `package.json` (try to keep this small); add a new `build:framework` script to the root `package.json`. This script usually looks something like this:
If youre using some kind of more abstract file format (like Svelte), then you
probably want do to a few things: add the directory name to
[this `IGNORE` regex](https://github.com/transloadit/uppy/blob/425f9ecfbc8bc48ce6b734e4fc14fa60d25daa97/bin/build-lib.js#L15);
add all your build dependencies to the root `package.json` (try to keep this
small); add a new `build:framework` script to the root `package.json`. This
script usually looks something like this:
```json
{
@ -444,8 +553,13 @@ If youre using some kind of more abstract file format (like Svelte), then you
}
```
Then, add this script to the `build:js` script. Try running the `build:js` script and make sure it does not error. It may also be of use to make sure that global dependencies arent being used (ex. not having rollup locally and relying on a global install), as these dependencies wont be present on the machines handling building.
Then, add this script to the `build:js` script. Try running the `build:js`
script and make sure it does not error. It may also be of use to make sure that
global dependencies arent being used (ex. not having rollup locally and relying
on a global install), as these dependencies wont be present on the machines
handling building.
## I18n and locales
For more information about how to contribute to translations, see [the `@uppy/locales` contributing guide](https://uppy.io/docs/locales/#contributing-a-new-language).
For more information about how to contribute to translations, see
[the `@uppy/locales` contributing guide](https://uppy.io/docs/locales/#contributing-a-new-language).

View file

@ -4,5 +4,5 @@ node_modules/
*.cjs
*.mjs
!private/js2ts/*
*.md
*.lock
CHANGELOG.md

View file

@ -2,84 +2,142 @@
<!--lint disable no-literal-urls no-undefined-references-->
These are ideas that are planned for specific versions or act as a backlog without a clear date.
PRs are welcome! Please do open an issue to discuss first if it's a big feature, priorities may have changed after something was added here.
These are ideas that are planned for specific versions or act as a backlog
without a clear date. PRs are welcome! Please do open an issue to discuss first
if it's a big feature, priorities may have changed after something was added
here.
## `3.0.0`
- [x] Switch to ES Modules (ESM)
- [x] @uppy/image-editor: Remove silly hack to work around non-ESM.
- [ ] Some not too breaking breaking changes. Go through TODOs (@arturi, @aduh95, @Murderlon)
- [ ] Some not too breaking breaking changes. Go through TODOs (@arturi,
@aduh95, @Murderlon)
- [ ] Companion breaking changes, like S3 keys (@mifi)
- [x] New remote-sources preset
- [x] Deprecate Robodog
- [x] Remove from 3.x branch (@aduh95)
- [x] Update docs that refer to Robodog (@arturi)
- [ ] Update Transloadit.com examples and docs to use @uppy/transloadit + @uppy/remote-sources plugins instead of @uppy/robodog (@arturi)
- [ ] Update Transloadit.com examples and docs to use @uppy/transloadit +
@uppy/remote-sources plugins instead of @uppy/robodog (@arturi)
## `4.0.0`
- [ ] core: change the preprocessing --> uploading flow to allow for files to start uploading right away after their preprocessing step has finished. See #1738 (@goto-but-stop)
- [ ] companion: add more reliable tests to catch edge cases in companion. For example testing that oauth works for multiple companion instances that use a master Oauth domain.
- [ ] Consider updating the name of @uppy/aws-s3 and @uppy/aws-s3-multipart to reflect it also supports Google Cloud Storage, Wasabi, and other cloud providers.
- [ ] Consider fixing all locale files to follow the bcp-47 standard (nl_NL --> nl-NL)
- [ ] core: change the preprocessing --> uploading flow to allow for files to
start uploading right away after their preprocessing step has finished.
See #1738 (@goto-but-stop)
- [ ] companion: add more reliable tests to catch edge cases in companion. For
example testing that oauth works for multiple companion instances that use
a master Oauth domain.
- [ ] Consider updating the name of @uppy/aws-s3 and @uppy/aws-s3-multipart to
reflect it also supports Google Cloud Storage, Wasabi, and other cloud
providers.
- [ ] Consider fixing all locale files to follow the bcp-47 standard (nl_NL -->
nl-NL)
## Unplanned
### Core
- [ ] Make sure Uppy works well in VR
- [ ] normalize file names when uploading from iOS? Can we do it with meta data? date? `image-${index}`? #678
- [ ] Can Uppy upload a lot of files at once? Seems to fail now: https://github.com/transloadit/uppy/issues/3313 (@aduh95, @Murderlon)
- [ ] Consider how we can make Uppy smaller. Replace some packages with smaller alternatives. Talk about Socket.io again (@aduh95)
- [ ] normalize file names when uploading from iOS? Can we do it with meta data?
date? `image-${index}`? #678
- [ ] Can Uppy upload a lot of files at once? Seems to fail now:
https://github.com/transloadit/uppy/issues/3313 (@aduh95, @Murderlon)
- [ ] Consider how we can make Uppy smaller. Replace some packages with smaller
alternatives. Talk about Socket.io again (@aduh95)
- [ ] Better events — more data, consistency, naming (@Murderlon)
### Dashboard
- [ ] Dashboard UI should support 20 providers (@arturi)
- [ ] Allow minimizing the Dashboard during upload (Uppy then becomes just a tiny progress indicator) (@arturi)
- [ ] Display data like image resolution on file cards. should be done by thumbnail generator maybe #783
- [ ] Possibility to edit/delete more than one file at once. example: add copyrigh info to 1000 files #118, #97
- [ ] Possibility to work on already uploaded / in progress files. We'll just provide the `fileId` to the `file-edit-complete` event so that folks can more easily roll out custom code for this themselves #112, #113, #2063
- [ ] Focus jumps weirdly if you remove a file https://github.com/transloadit/uppy/pull/2161#issuecomment-613565486
- [ ] A mini UI that features drop & progress (may involve a `mini: true` options for dashboard, may involve drop+progress or new plugin) (@arturi)
- [ ] Add a Load More button so you don't have to TAB endlessly to get to the upload button (https://github.com/transloadit/uppy/issues/1419)
- [ ] Allow minimizing the Dashboard during upload (Uppy then becomes just a
tiny progress indicator) (@arturi)
- [ ] Display data like image resolution on file cards. should be done by
thumbnail generator maybe #783
- [ ] Possibility to edit/delete more than one file at once. example: add
copyrigh info to 1000 files #118, #97
- [ ] Possibility to work on already uploaded / in progress files. We'll just
provide the `fileId` to the `file-edit-complete` event so that folks can
more easily roll out custom code for this themselves #112, #113, #2063
- [ ] Focus jumps weirdly if you remove a file
https://github.com/transloadit/uppy/pull/2161#issuecomment-613565486
- [ ] A mini UI that features drop & progress (may involve a `mini: true`
options for dashboard, may involve drop+progress or new plugin) (@arturi)
- [ ] Add a Load More button so you don't have to TAB endlessly to get to the
upload button (https://github.com/transloadit/uppy/issues/1419)
### New plugins
- [ ] WordPress Back-end plugin. Should be another Transloadit Integration based on Robodog Dashboard(?) we should add a provider, and possibly offer already-uploaded content
- [ ] WordPress Front-end Gravity Forms Uppy plugin so one form field could be an Uppy-powered file input
- [ ] A WakeLock based plugin that keeps your phone from going to sleep while an upload is ongoing https://github.com/transloadit/uppy/issues/1725
- [ ] WordPress Back-end plugin. Should be another Transloadit Integration based
on Robodog Dashboard(?) we should add a provider, and possibly offer
already-uploaded content
- [ ] WordPress Front-end Gravity Forms Uppy plugin so one form field could be
an Uppy-powered file input
- [ ] A WakeLock based plugin that keeps your phone from going to sleep while an
upload is ongoing https://github.com/transloadit/uppy/issues/1725
- [ ] Improve image editor: filters for images, no crashes (@aduh95)
### New providers
- [ ] Google Photos (#2163)
- [ ] MediaLibrary provider which shows you files that have already been uploaded #450, #1121, #1112 #362
- [ ] MediaLibrary provider which shows you files that have already been
uploaded #450, #1121, #1112 #362
- [ ] Giphy image search (on top of Unsplash plugin) ()
- [ ] Image search (via Google or Bing or DuckDuckGo): use duckduckgo-images-api or Google Search API (@arturi)
- [ ] Image search (via Google or Bing or DuckDuckGo): use duckduckgo-images-api
or Google Search API (@arturi)
- [ ] Vimeo #2872
### Miscellaneous
- [ ] goldenretriever: make it work with aws multipart https://community.transloadit.com/t/resumable-aws-s3-multipart-integration/14888 (@goto-bus-stop)
- [ ] goldenretriever: make it work with aws multipart
https://community.transloadit.com/t/resumable-aws-s3-multipart-integration/14888
(@goto-bus-stop)
- [ ] provider: add sorting (by date) #254
- [ ] qa: add one integration test (or add to existing test) that uses more exotic (tus) options such as `useFastRemoteRetry` or `removeFingerprintOnSuccess` https://github.com/transloadit/uppy/issues/1327 (@arturi, @ifedapoolarewaju)
- [x] react: Add a React Hook to manage an Uppy instance https://github.com/transloadit/uppy/pull/1247#issuecomment-458063951 (@goto-bus-stop)
- [ ] qa: add one integration test (or add to existing test) that uses more
exotic (tus) options such as `useFastRemoteRetry` or
`removeFingerprintOnSuccess`
https://github.com/transloadit/uppy/issues/1327 (@arturi,
@ifedapoolarewaju)
- [x] react: Add a React Hook to manage an Uppy instance
https://github.com/transloadit/uppy/pull/1247#issuecomment-458063951
(@goto-bus-stop)
- [ ] rn: Uppy React Native works with Expo, now let's make it work without
- [ ] rn: Uppy React Native works with Url Plugin, now let's make it work with Instagram
- [ ] security: consider iframe / more security for Transloadit/Uppy integration widget and Uppy itself. Page cant get files from Google Drive if its an iframe
- [ ] statusbar: Add a confirmation of the cancel action (https://github.com/transloadit/uppy/issues/1418) as well as ask the user if they really want to navigate away while an upload is in progress via `onbeforeunload` (@arturi)
- [ ] uploaders: consider not showing progress updates from the server after an uploads been paused. Perhaps the button can be disabled and say `Pausing..` until Companion has actually stopped transmitting updates (@arturi, @ifedapoolarewaju)
- [ ] rn: Uppy React Native works with Url Plugin, now let's make it work with
Instagram
- [ ] security: consider iframe / more security for Transloadit/Uppy integration
widget and Uppy itself. Page cant get files from Google Drive if its an
iframe
- [ ] statusbar: Add a confirmation of the cancel action
(https://github.com/transloadit/uppy/issues/1418) as well as ask the user
if they really want to navigate away while an upload is in progress via
`onbeforeunload` (@arturi)
- [ ] uploaders: consider not showing progress updates from the server after an
uploads been paused. Perhaps the button can be disabled and say
`Pausing..` until Companion has actually stopped transmitting updates
(@arturi, @ifedapoolarewaju)
- [ ] xhr: allow sending custom headers per file (as proposed in #785)
- [ ] website: It would be nice in the long run to have a dynamic package builder here right on the website where you can select the plugins you need/want and it builds and downloads a minified version of them? Sort of like jQuery UI: https://jqueryui.com/download/
- [ ] webcam: Specify the resolution of the webcam images/video. We should add a way to specify any custom 'constraints' (aspect ratio, resolution, mimetype (`/video/mp4;codec=h264`), bits per second, etc) to the Webcam plugin #876
- [ ] Constructor to build Uppy with what you need, “Dashboard example meets Transloadit Wizard”. Select language, modes, providers — get code ready to use. Maybe integrate Transloadit Wizard in there as well (@arturi, @Murderlon)
- [ ] website: It would be nice in the long run to have a dynamic package
builder here right on the website where you can select the plugins you
need/want and it builds and downloads a minified version of them? Sort of
like jQuery UI: https://jqueryui.com/download/
- [ ] webcam: Specify the resolution of the webcam images/video. We should add a
way to specify any custom 'constraints' (aspect ratio, resolution,
mimetype (`/video/mp4;codec=h264`), bits per second, etc) to the Webcam
plugin #876
- [ ] Constructor to build Uppy with what you need, “Dashboard example meets
Transloadit Wizard”. Select language, modes, providers — get code ready to
use. Maybe integrate Transloadit Wizard in there as well (@arturi,
@Murderlon)
### Needs research
- [ ] Add a prepublish test that checks if `npm pack` is not massive (@goto-bus-stop)
- [ ] Add a prepublish test that checks if `npm pack` is not massive
(@goto-bus-stop)
- [ ] Add https://github.com/pa11y/pa11y for automated accessibility testing?
- [ ] Add lighthouse for automated performance testing?
- [ ] Switch one existing e2e test to use Parcel (create-react-app already using webpack) (@arturi)
- [ ] Add typescript with JSDoc for @uppy/core https://github.com/Microsoft/TypeScript/wiki/Type-Checking-JavaScript-Files (@arturi)
- [ ] Switch one existing e2e test to use Parcel (create-react-app already using
webpack) (@arturi)
- [ ] Add typescript with JSDoc for @uppy/core
https://github.com/Microsoft/TypeScript/wiki/Type-Checking-JavaScript-Files
(@arturi)

View file

@ -1,76 +1,98 @@
# Uppy
Hi, thanks for trying out the bundled version of the Uppy File Uploader. You can use
this from a CDN (`<script src="https://releases.transloadit.com/uppy/v3.25.0/uppy.min.js"></script>`) or bundle it with your webapp.
Hi, thanks for trying out the bundled version of the Uppy File Uploader. You can
use this from a CDN
(`<script src="https://releases.transloadit.com/uppy/v3.25.0/uppy.min.js"></script>`)
or bundle it with your webapp.
Note that the recommended way to use Uppy is to install it with yarn/npm and use a
bundler like Webpack so that you can create a smaller custom build with only the
things that you need. More info on <https://uppy.io/docs/#With-a-module-bundler>.
Note that the recommended way to use Uppy is to install it with yarn/npm and use
a bundler like Webpack so that you can create a smaller custom build with only
the things that you need. More info on
<https://uppy.io/docs/#With-a-module-bundler>.
## How to use this bundle
You can extract the contents of this zip to a directory, such as `./js/uppy`.
Now you can create an HTML file, for example `./upload.html`, with the following contents:
Now you can create an HTML file, for example `./upload.html`, with the following
contents:
```html
<html>
<head>
<link rel="stylesheet" href="./js/uppy/uppy.min.css">
</head>
<head>
<link rel="stylesheet" href="./js/uppy/uppy.min.css" />
</head>
<body>
<div class="DashboardContainer"></div>
<button class="UppyModalOpenerBtn">Upload</button>
<div class="uploaded-files">
<h5>Uploaded files:</h5>
<ol></ol>
</div>
</body>
<body>
<div class="DashboardContainer"></div>
<button class="UppyModalOpenerBtn">Upload</button>
<div class="uploaded-files">
<h5>Uploaded files:</h5>
<ol></ol>
</div>
</body>
<script type="module">
import {Uppy, Dashboard, Tus} from "./js/uppy/uppy.min.mjs"
var uppy = new Uppy({
debug : true,
autoProceed: false,
})
.use(Dashboard, {
browserBackButtonClose: false,
height : 470,
inline : false,
replaceTargetContent : true,
showProgressDetails : true,
target : '.DashboardContainer',
trigger : '.UppyModalOpenerBtn',
metaFields : [
{ id: 'name', name: 'Name', placeholder: 'file name' },
{ id: 'caption', name: 'Caption', placeholder: 'describe what the image is about' }
]
<script type="module">
import { Uppy, Dashboard, Tus } from './js/uppy/uppy.min.mjs'
var uppy = new Uppy({
debug: true,
autoProceed: false,
})
.use(Tus, { endpoint: 'https://tusd.tusdemo.net/files/' })
.on('upload-success', function (file, response) {
var url = response.uploadURL
var fileName = file.name
.use(Dashboard, {
browserBackButtonClose: false,
height: 470,
inline: false,
replaceTargetContent: true,
showProgressDetails: true,
target: '.DashboardContainer',
trigger: '.UppyModalOpenerBtn',
metaFields: [
{ id: 'name', name: 'Name', placeholder: 'file name' },
{
id: 'caption',
name: 'Caption',
placeholder: 'describe what the image is about',
},
],
})
.use(Tus, { endpoint: 'https://tusd.tusdemo.net/files/' })
.on('upload-success', function (file, response) {
var url = response.uploadURL
var fileName = file.name
document.querySelector('.uploaded-files ol').innerHTML +=
'<li><a href="' + url + '" target="_blank">' + fileName + '</a></li>'
})
</script>
document.querySelector('.uploaded-files ol').innerHTML +=
'<li><a href="' + url + '" target="_blank">' + fileName + '</a></li>'
})
</script>
</html>
```
Now open `upload.html` in your browser, and the Uppy Dashboard will appear.
## Next steps
In the example you built, Uppy uploads to a demo server where files will be deleted
shortly after uploading. Youll want to target your own tusd server, S3 bucket, or Nginx/Apache server. For the latter, use the Xhr plugin: <https://uppy.io/docs/xhr-upload/> which uploads using regular multipart form posts, that youll existing Ruby or PHP backend will be able to make sense of, as if a `<input type="file">` had been used.
In the example you built, Uppy uploads to a demo server where files will be
deleted shortly after uploading. Youll want to target your own tusd server, S3
bucket, or Nginx/Apache server. For the latter, use the Xhr plugin:
<https://uppy.io/docs/xhr-upload/> which uploads using regular multipart form
posts, that youll existing Ruby or PHP backend will be able to make sense of,
as if a `<input type="file">` had been used.
The Dashboard now opens when clicking the button, but you can also draw it inline into the page. This, and many more configuration options can be found here: <https://uppy.io/docs/dashboard/>.
The Dashboard now opens when clicking the button, but you can also draw it
inline into the page. This, and many more configuration options can be found
here: <https://uppy.io/docs/dashboard/>.
Uppy has many more Plugins besides Xhr and the Dashboard. For example, you can enable Webcam, Instagram, or video encoding support. For a full list of Plugins check here: <https://uppy.io/docs/plugins/>.
Uppy has many more Plugins besides Xhr and the Dashboard. For example, you can
enable Webcam, Instagram, or video encoding support. For a full list of Plugins
check here: <https://uppy.io/docs/plugins/>.
Note that for some Plugins, you will need to run a server side component called: Companion. Those plugins are marked with a (c) symbol. Alternatively, you can sign up for a free Transloadit account. Transloadit runs Companion for you, tusd servers to handle resumable file uploads, and can post-process files to scan for viruses, recognize faces, etc. Check: <https://transloadit.com>.
Note that for some Plugins, you will need to run a server side component called:
Companion. Those plugins are marked with a (c) symbol. Alternatively, you can
sign up for a free Transloadit account. Transloadit runs Companion for you, tusd
servers to handle resumable file uploads, and can post-process files to scan for
viruses, recognize faces, etc. Check: <https://transloadit.com>.
## Getting help
Stuck with anything? Were welcoming all your questions and feedback over at <https://community.transloadit.com/c/uppy/5>.
Stuck with anything? Were welcoming all your questions and feedback over at
<https://community.transloadit.com/c/uppy/5>.

666
README.md
View file

@ -2,19 +2,24 @@
<img src="https://uppy.io/img/logo.svg" width="120" alt="Uppy logo: a smiling puppy above a pink upwards arrow" align="right">
Uppy is a sleek, modular JavaScript file uploader that integrates seamlessly with any application. Its fast, has a comprehensible API and lets you worry about more important problems than building a file uploader.
Uppy is a sleek, modular JavaScript file uploader that integrates seamlessly
with any application. Its fast, has a comprehensible API and lets you worry
about more important problems than building a file uploader.
* **Fetch** files from local disk, remote URLs, Google Drive, Dropbox, Box, Instagram or snap and record selfies with a camera
* **Preview** and edit metadata with a nice interface
* **Upload** to the final destination, optionally process/encode
- **Fetch** files from local disk, remote URLs, Google Drive, Dropbox, Box,
Instagram or snap and record selfies with a camera
- **Preview** and edit metadata with a nice interface
- **Upload** to the final destination, optionally process/encode
<img src="https://github.com/transloadit/uppy/raw/main/assets/uppy-2-0-demo-aug-2021.gif">
**[Read the docs](https://uppy.io/docs)** | **[Try Uppy](https://uppy.io/examples/dashboard/)**
**[Read the docs](https://uppy.io/docs)** |
**[Try Uppy](https://uppy.io/examples/dashboard/)**
<a href="https://transloadit.com" target="_blank"><img width="185" src="https://github.com/transloadit/uppy/raw/main/assets/developed-by-transloadit.png"></a>
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile API to handle any file in your app.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile API to handle any file in your app.
<table>
<tr><th>Tests</th><td><img src="https://github.com/transloadit/uppy/workflows/Tests/badge.svg" alt="CI status for Uppy tests"></td><td><img src="https://github.com/transloadit/uppy/workflows/Companion/badge.svg" alt="CI status for Companion tests"></td><td><img src="https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg" alt="CI status for browser tests"></td></tr>
@ -44,20 +49,28 @@ const uppy = new Uppy()
})
```
**[Try it online](https://uppy.io/examples/dashboard/)** or **[read the docs](https://uppy.io/docs)** for more details on how to use Uppy and its plugins.
**[Try it online](https://uppy.io/examples/dashboard/)** or
**[read the docs](https://uppy.io/docs)** for more details on how to use Uppy
and its plugins.
## Features
* Lightweight, modular plugin-based architecture, light on dependencies :zap:
* Resumable file uploads via the open [tus](https://tus.io/) standard, so large uploads survive network hiccups
* Supports picking files from: Webcam, Dropbox, Box, Google Drive, Instagram, bypassing the users device where possible, syncing between servers directly via [@uppy/companion](https://uppy.io/docs/companion)
* Works great with file encoding and processing backends, such as [Transloadit](https://transloadit.com), works great without (all you need is to roll your own Apache/Nginx/Node/FFmpeg/etc backend)
* Sleek user interface :sparkles:
* Optional file recovery (after a browser crash) with [Golden Retriever](https://uppy.io/docs/golden-retriever/)
* Speaks several languages (i18n) :earth\_africa:
* Built with accessibility in mind
* Free for the world, forever (as in beer 🍺, pizza 🍕, and liberty 🗽)
* Cute as a puppy, also accepts cat pictures :dog:
- Lightweight, modular plugin-based architecture, light on dependencies :zap:
- Resumable file uploads via the open [tus](https://tus.io/) standard, so large
uploads survive network hiccups
- Supports picking files from: Webcam, Dropbox, Box, Google Drive, Instagram,
bypassing the users device where possible, syncing between servers directly
via [@uppy/companion](https://uppy.io/docs/companion)
- Works great with file encoding and processing backends, such as
[Transloadit](https://transloadit.com), works great without (all you need is
to roll your own Apache/Nginx/Node/FFmpeg/etc backend)
- Sleek user interface :sparkles:
- Optional file recovery (after a browser crash) with
[Golden Retriever](https://uppy.io/docs/golden-retriever/)
- Speaks several languages (i18n) :earth_africa:
- Built with accessibility in mind
- Free for the world, forever (as in beer 🍺, pizza 🍕, and liberty 🗽)
- Cute as a puppy, also accepts cat pictures :dog:
## Installation
@ -65,20 +78,34 @@ const uppy = new Uppy()
npm install @uppy/core @uppy/dashboard @uppy/tus
```
Add CSS [uppy.min.css](https://releases.transloadit.com/uppy/v3.25.0/uppy.min.css), either to your HTML pages `<head>` or include in JS, if your bundler of choice supports it.
Add CSS
[uppy.min.css](https://releases.transloadit.com/uppy/v3.25.0/uppy.min.css),
either to your HTML pages `<head>` or include in JS, if your bundler of choice
supports it.
Alternatively, you can also use a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object.
Alternatively, you can also use a pre-built bundle from Transloadits CDN:
Edgly. In that case `Uppy` will attach itself to the global `window.Uppy`
object.
> ⚠️ The bundle consists of most Uppy plugins, so this method is not recommended for production, as your users will have to download all plugins when you are likely using only a few.
> ⚠️ The bundle consists of most Uppy plugins, so this method is not recommended
> for production, as your users will have to download all plugins when you are
> likely using only a few.
```html
<!-- 1. Add CSS to `<head>` -->
<link href="https://releases.transloadit.com/uppy/v3.25.0/uppy.min.css" rel="stylesheet">
<link
href="https://releases.transloadit.com/uppy/v3.25.0/uppy.min.css"
rel="stylesheet"
/>
<!-- 2. Initialize -->
<div id="files-drag-drop"></div>
<script type="module">
import { Uppy, Dashboard, Tus } from "https://releases.transloadit.com/uppy/v3.25.0/uppy.min.mjs"
import {
Uppy,
Dashboard,
Tus,
} from 'https://releases.transloadit.com/uppy/v3.25.0/uppy.min.mjs'
const uppy = new Uppy()
uppy.use(Dashboard, { target: '#files-drag-drop' })
@ -88,11 +115,16 @@ Alternatively, you can also use a pre-built bundle from Transloadits CDN: Edg
## Documentation
* [Uppy](https://uppy.io/docs/uppy/) — full list of options, methods and events
* [Plugins](https://uppy.io/docs/plugins/) — list of Uppy plugins and their options
* [Companion](https://uppy.io/docs/companion/) — setting up and running a Companion instance, which adds support for Instagram, Dropbox, Box, Google Drive and remote URLs
* [React](https://uppy.io/docs/react/) — components to integrate Uppy UI plugins with React apps
* [Architecture & Writing a Plugin](https://uppy.io/docs/writing-plugins/) — how to write a plugin for Uppy
- [Uppy](https://uppy.io/docs/uppy/) — full list of options, methods and events
- [Plugins](https://uppy.io/docs/plugins/) — list of Uppy plugins and their
options
- [Companion](https://uppy.io/docs/companion/) — setting up and running a
Companion instance, which adds support for Instagram, Dropbox, Box, Google
Drive and remote URLs
- [React](https://uppy.io/docs/react/) — components to integrate Uppy UI plugins
with React apps
- [Architecture & Writing a Plugin](https://uppy.io/docs/writing-plugins/) — how
to write a plugin for Uppy
## Plugins
@ -100,64 +132,92 @@ Alternatively, you can also use a pre-built bundle from Transloadits CDN: Edg
### UI Elements
* [`Dashboard`](https://uppy.io/docs/dashboard/) — universal UI with previews, progress bars, metadata editor and all the cool stuff. Required for most UI plugins like Webcam and Instagram
* [`Progress Bar`](https://uppy.io/docs/progress-bar/) — minimal progress bar that fills itself when upload progresses
* [`Status Bar`](https://uppy.io/docs/status-bar/) — more detailed progress, pause/resume/cancel buttons, percentage, speed, uploaded/total sizes (included by default with `Dashboard`)
* [`Informer`](https://uppy.io/docs/informer/) — send notifications like “smile” before taking a selfie or “upload failed” when all is lost (also included by default with `Dashboard`)
- [`Dashboard`](https://uppy.io/docs/dashboard/) — universal UI with previews,
progress bars, metadata editor and all the cool stuff. Required for most UI
plugins like Webcam and Instagram
- [`Progress Bar`](https://uppy.io/docs/progress-bar/) — minimal progress bar
that fills itself when upload progresses
- [`Status Bar`](https://uppy.io/docs/status-bar/) — more detailed progress,
pause/resume/cancel buttons, percentage, speed, uploaded/total sizes (included
by default with `Dashboard`)
- [`Informer`](https://uppy.io/docs/informer/) — send notifications like “smile”
before taking a selfie or “upload failed” when all is lost (also included by
default with `Dashboard`)
### Sources
* [`Drag & Drop`](https://uppy.io/docs/drag-drop/) — plain drag and drop area
* [`File Input`](https://uppy.io/docs/file-input/) — even plainer “select files” button
* [`Webcam`](https://uppy.io/docs/webcam/) — snap and record those selfies 📷
* ⓒ [`Google Drive`](https://uppy.io/docs/google-drive/) — import files from Google Drive
* ⓒ [`Dropbox`](https://uppy.io/docs/dropbox/) — import files from Dropbox
* ⓒ [`Box`](https://uppy.io/docs/box/) — import files from Box
* ⓒ [`Instagram`](https://uppy.io/docs/instagram/) — import images and videos from Instagram
* ⓒ [`Facebook`](https://uppy.io/docs/facebook/) — import images and videos from Facebook
* ⓒ [`OneDrive`](https://uppy.io/docs/onedrive/) — import files from Microsoft OneDrive
* ⓒ [`Import From URL`](https://uppy.io/docs/url/) — import direct URLs from anywhere on the web
- [`Drag & Drop`](https://uppy.io/docs/drag-drop/) — plain drag and drop area
- [`File Input`](https://uppy.io/docs/file-input/) — even plainer “select files”
button
- [`Webcam`](https://uppy.io/docs/webcam/) — snap and record those selfies 📷
- ⓒ [`Google Drive`](https://uppy.io/docs/google-drive/) — import files from
Google Drive
- ⓒ [`Dropbox`](https://uppy.io/docs/dropbox/) — import files from Dropbox
- ⓒ [`Box`](https://uppy.io/docs/box/) — import files from Box
- ⓒ [`Instagram`](https://uppy.io/docs/instagram/) — import images and videos
from Instagram
- ⓒ [`Facebook`](https://uppy.io/docs/facebook/) — import images and videos from
Facebook
- ⓒ [`OneDrive`](https://uppy.io/docs/onedrive/) — import files from Microsoft
OneDrive
- ⓒ [`Import From URL`](https://uppy.io/docs/url/) — import direct URLs from
anywhere on the web
The ⓒ mark means that [`@uppy/companion`](https://uppy.io/docs/companion), a server-side component, is needed for a plugin to work.
The ⓒ mark means that [`@uppy/companion`](https://uppy.io/docs/companion), a
server-side component, is needed for a plugin to work.
### Destinations
* [`Tus`](https://uppy.io/docs/tus/) — resumable uploads via the open [tus](http://tus.io) standard
* [`XHR Upload`](https://uppy.io/docs/xhr-upload/) — regular uploads for any backend out there (like Apache, Nginx)
* [`AWS S3`](https://uppy.io/docs/aws-s3/) — plain upload to AWS S3 or compatible services
* [`AWS S3 Multipart`](https://uppy.io/docs/aws-s3-multipart/) — S3-style “Multipart” upload to AWS or compatible services
- [`Tus`](https://uppy.io/docs/tus/) — resumable uploads via the open
[tus](http://tus.io) standard
- [`XHR Upload`](https://uppy.io/docs/xhr-upload/) — regular uploads for any
backend out there (like Apache, Nginx)
- [`AWS S3`](https://uppy.io/docs/aws-s3/) — plain upload to AWS S3 or
compatible services
- [`AWS S3 Multipart`](https://uppy.io/docs/aws-s3-multipart/) — S3-style
“Multipart” upload to AWS or compatible services
### File Processing
* [`Transloadit`](https://uppy.io/docs/transloadit/) — support for [Transloadit](http://transloadit.com)s robust file uploading and encoding backend
- [`Transloadit`](https://uppy.io/docs/transloadit/) — support for
[Transloadit](http://transloadit.com)s robust file uploading and encoding
backend
### Miscellaneous
* [`Golden Retriever`](https://uppy.io/docs/golden-retriever/) — restores files after a browser crash, like its nothing
* [`Thumbnail Generator`](https://uppy.io/docs/thumbnail-generator/) — generates image previews (included by default with `Dashboard`)
* [`Form`](https://uppy.io/docs/form/) — collects metadata from `<form>` right before an Uppy upload, then optionally appends results back to the form
* [`Redux`](https://uppy.io/docs/redux/) — for your emerging [time traveling](https://github.com/gaearon/redux-devtools) needs
- [`Golden Retriever`](https://uppy.io/docs/golden-retriever/) — restores files
after a browser crash, like its nothing
- [`Thumbnail Generator`](https://uppy.io/docs/thumbnail-generator/) — generates
image previews (included by default with `Dashboard`)
- [`Form`](https://uppy.io/docs/form/) — collects metadata from `<form>` right
before an Uppy upload, then optionally appends results back to the form
- [`Redux`](https://uppy.io/docs/redux/) — for your emerging
[time traveling](https://github.com/gaearon/redux-devtools) needs
## React
* [React](https://uppy.io/docs/react/) — components to integrate Uppy UI plugins with React apps
* [React Native](https://uppy.io//docs/react/native/) — basic Uppy component for React Native with Expo
- [React](https://uppy.io/docs/react/) — components to integrate Uppy UI plugins
with React apps
- [React Native](https://uppy.io//docs/react/native/) — basic Uppy component for
React Native with Expo
## Browser Support
We aim to support recent versions of Chrome, Firefox, Safari and Edge.
We still provide a bundle which should work on IE11, but we are not running tests on it.
We still provide a bundle which should work on IE11, but we are not running
tests on it.
### Polyfills
Heres a list of polyfills youll need to include to make Uppy work in older browsers, such as IE11:
Heres a list of polyfills youll need to include to make Uppy work in older
browsers, such as IE11:
* [abortcontroller-polyfill](https://github.com/mo/abortcontroller-polyfill)
* [core-js](https://github.com/zloirock/core-js)
* [md-gum-polyfill](https://github.com/mozdevs/mediaDevices-getUserMedia-polyfill)
* [resize-observer-polyfill](https://github.com/que-etc/resize-observer-polyfill)
* [whatwg-fetch](https://github.com/github/fetch)
- [abortcontroller-polyfill](https://github.com/mo/abortcontroller-polyfill)
- [core-js](https://github.com/zloirock/core-js)
- [md-gum-polyfill](https://github.com/mozdevs/mediaDevices-getUserMedia-polyfill)
- [resize-observer-polyfill](https://github.com/que-etc/resize-observer-polyfill)
- [whatwg-fetch](https://github.com/github/fetch)
If youre using a bundler, you need to import them before Uppy:
@ -176,8 +236,8 @@ export { default } from '@uppy/core'
export * from '@uppy/core'
```
If youre using Uppy from CDN, those polyfills are already included in the legacy
bundle, so no need to include anything additionally:
If youre using Uppy from CDN, those polyfills are already included in the
legacy bundle, so no need to include anything additionally:
```html
<script src="https://releases.transloadit.com/uppy/v3.25.0/uppy.legacy.min.js"></script>
@ -187,323 +247,363 @@ bundle, so no need to include anything additionally:
### Why not use `<input type="file">`?
Having no JavaScript beats having a lot of it, so thats a fair question! Running an uploading & encoding business for ten years though we found that in cases, the file input leaves some to be desired:
Having no JavaScript beats having a lot of it, so thats a fair question!
Running an uploading & encoding business for ten years though we found that in
cases, the file input leaves some to be desired:
* We received complaints about broken uploads and found that resumable uploads are important, especially for big files and to be inclusive towards people on poorer connections (we also launched [tus.io](https://tus.io) to attack that problem). Uppy uploads can survive network outages and browser crashes or accidental navigate-aways.
* Uppy supports editing meta information before uploading.
* Uppy allows cropping images before uploading.
* Theres the situation where people are using their mobile devices and want to upload on the go, but they have their picture on Instagram, files in Dropbox or a plain file URL from anywhere on the open web. Uppy allows to pick files from those and push it to the destination without downloading it to your mobile device first.
* Accurate upload progress reporting is an issue on many platforms.
* Some file validation — size, type, number of files — can be done on the client with Uppy.
* Uppy integrates webcam support, in case your users want to upload a picture/video/audio that does not exist yet :)
* A larger drag and drop surface can be pleasant to work with. Some people also like that you can control the styling, language, etc.
* Uppy is aware of encoding backends. Often after an upload, the server needs to rotate, detect faces, optimize for iPad, or what have you. Uppy can track progress of this and report back to the user in different ways.
* Sometimes you might want your uploads to happen while you continue to interact on the same single page.
- We received complaints about broken uploads and found that resumable uploads
are important, especially for big files and to be inclusive towards people on
poorer connections (we also launched [tus.io](https://tus.io) to attack that
problem). Uppy uploads can survive network outages and browser crashes or
accidental navigate-aways.
- Uppy supports editing meta information before uploading.
- Uppy allows cropping images before uploading.
- Theres the situation where people are using their mobile devices and want to
upload on the go, but they have their picture on Instagram, files in Dropbox
or a plain file URL from anywhere on the open web. Uppy allows to pick files
from those and push it to the destination without downloading it to your
mobile device first.
- Accurate upload progress reporting is an issue on many platforms.
- Some file validation — size, type, number of files — can be done on the client
with Uppy.
- Uppy integrates webcam support, in case your users want to upload a
picture/video/audio that does not exist yet :)
- A larger drag and drop surface can be pleasant to work with. Some people also
like that you can control the styling, language, etc.
- Uppy is aware of encoding backends. Often after an upload, the server needs to
rotate, detect faces, optimize for iPad, or what have you. Uppy can track
progress of this and report back to the user in different ways.
- Sometimes you might want your uploads to happen while you continue to interact
on the same single page.
Not all apps need all these features. An `<input type="file">` is fine in many situations. But these were a few things that our customers hit / asked about enough to spark us to develop Uppy.
Not all apps need all these features. An `<input type="file">` is fine in many
situations. But these were a few things that our customers hit / asked about
enough to spark us to develop Uppy.
### Why is all this goodness free?
Transloadits team is small and we have a shared ambition to make a living from open source. By giving away projects like [tus.io](https://tus.io) and [Uppy](https://uppy.io), were hoping to advance the state of the art, make life a tiny little bit better for everyone and in doing so have rewarding jobs and get some eyes on our commercial service: [a content ingestion & processing platform](https://transloadit.com).
Transloadits team is small and we have a shared ambition to make a living from
open source. By giving away projects like [tus.io](https://tus.io) and
[Uppy](https://uppy.io), were hoping to advance the state of the art, make life
a tiny little bit better for everyone and in doing so have rewarding jobs and
get some eyes on our commercial service:
[a content ingestion & processing platform](https://transloadit.com).
Our thinking is that if only a fraction of our open source userbase can see the appeal of hosted versions straight from the source, that could already be enough to sustain our work. So far this is working out! Were able to dedicate 80% of our time to open source and havent gone bankrupt yet. :D
Our thinking is that if only a fraction of our open source userbase can see the
appeal of hosted versions straight from the source, that could already be enough
to sustain our work. So far this is working out! Were able to dedicate 80% of
our time to open source and havent gone bankrupt yet. :D
### Does Uppy support S3 uploads?
Yes, please check out the [docs](https://uppy.io/docs/aws-s3/) for more information.
Yes, please check out the [docs](https://uppy.io/docs/aws-s3/) for more
information.
### Can I use Uppy with Rails/Node.js/Go/PHP?
Yes, whatever you want on the backend will work with `@uppy/xhr-upload` plugin, since it only does a `POST` or `PUT` request. Heres a [PHP backend example](https://uppy.io/docs/xhr-upload/#Uploading-to-a-PHP-Server).
Yes, whatever you want on the backend will work with `@uppy/xhr-upload` plugin,
since it only does a `POST` or `PUT` request. Heres a
[PHP backend example](https://uppy.io/docs/xhr-upload/#Uploading-to-a-PHP-Server).
If you want resumability with the Tus plugin, use [one of the tus server implementations](https://tus.io/implementations.html) 👌🏼
If you want resumability with the Tus plugin, use
[one of the tus server implementations](https://tus.io/implementations.html) 👌🏼
And youll need [`@uppy/companion`](https://uppy.io/docs/companion) if youd like your users to be able to pick files from Instagram, Google Drive, Dropbox or via direct URLs (with more services coming).
And youll need [`@uppy/companion`](https://uppy.io/docs/companion) if youd
like your users to be able to pick files from Instagram, Google Drive, Dropbox
or via direct URLs (with more services coming).
## Contributions are welcome
* Contributors guide in [`.github/CONTRIBUTING.md`](.github/CONTRIBUTING.md)
* Changelog to track our release progress (we aim to roll out a release every month): [`CHANGELOG.md`](CHANGELOG.md)
- Contributors guide in [`.github/CONTRIBUTING.md`](.github/CONTRIBUTING.md)
- Changelog to track our release progress (we aim to roll out a release every
month): [`CHANGELOG.md`](CHANGELOG.md)
## Used by
Uppy is used by: [Photobox](http://photobox.com), [Issuu](https://issuu.com/), [Law Insider](https://lawinsider.com), [Cool Tabs](https://cool-tabs.com), [Soundoff](https://soundoff.io), [Scrumi](https://www.scrumi.io/), [Crive](https://crive.co/) and others.
Uppy is used by: [Photobox](http://photobox.com), [Issuu](https://issuu.com/),
[Law Insider](https://lawinsider.com), [Cool Tabs](https://cool-tabs.com),
[Soundoff](https://soundoff.io), [Scrumi](https://www.scrumi.io/),
[Crive](https://crive.co/) and others.
Use Uppy in your project? [Let us know](https://github.com/transloadit/uppy/issues/769)!
Use Uppy in your project?
[Let us know](https://github.com/transloadit/uppy/issues/769)!
## Contributors
<!--contributors-->
[<img alt="arturi" src="https://avatars.githubusercontent.com/u/1199054?v=4&s=117" width="117">](https://github.com/arturi) |[<img alt="goto-bus-stop" src="https://avatars.githubusercontent.com/u/1006268?v=4&s=117" width="117">](https://github.com/goto-bus-stop) |[<img alt="kvz" src="https://avatars.githubusercontent.com/u/26752?v=4&s=117" width="117">](https://github.com/kvz) |[<img alt="aduh95" src="https://avatars.githubusercontent.com/u/14309773?v=4&s=117" width="117">](https://github.com/aduh95) |[<img alt="ifedapoolarewaju" src="https://avatars.githubusercontent.com/u/8383781?v=4&s=117" width="117">](https://github.com/ifedapoolarewaju) |[<img alt="hedgerh" src="https://avatars.githubusercontent.com/u/2524280?v=4&s=117" width="117">](https://github.com/hedgerh) |
:---: |:---: |:---: |:---: |:---: |:---: |
[arturi](https://github.com/arturi) |[goto-bus-stop](https://github.com/goto-bus-stop) |[kvz](https://github.com/kvz) |[aduh95](https://github.com/aduh95) |[ifedapoolarewaju](https://github.com/ifedapoolarewaju) |[hedgerh](https://github.com/hedgerh) |
| [<img alt="arturi" src="https://avatars.githubusercontent.com/u/1199054?v=4&s=117" width="117">](https://github.com/arturi) | [<img alt="goto-bus-stop" src="https://avatars.githubusercontent.com/u/1006268?v=4&s=117" width="117">](https://github.com/goto-bus-stop) | [<img alt="kvz" src="https://avatars.githubusercontent.com/u/26752?v=4&s=117" width="117">](https://github.com/kvz) | [<img alt="aduh95" src="https://avatars.githubusercontent.com/u/14309773?v=4&s=117" width="117">](https://github.com/aduh95) | [<img alt="ifedapoolarewaju" src="https://avatars.githubusercontent.com/u/8383781?v=4&s=117" width="117">](https://github.com/ifedapoolarewaju) | [<img alt="hedgerh" src="https://avatars.githubusercontent.com/u/2524280?v=4&s=117" width="117">](https://github.com/hedgerh) |
| :-------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: |
| [arturi](https://github.com/arturi) | [goto-bus-stop](https://github.com/goto-bus-stop) | [kvz](https://github.com/kvz) | [aduh95](https://github.com/aduh95) | [ifedapoolarewaju](https://github.com/ifedapoolarewaju) | [hedgerh](https://github.com/hedgerh) |
[<img alt="Murderlon" src="https://avatars.githubusercontent.com/u/9060226?v=4&s=117" width="117">](https://github.com/Murderlon) |[<img alt="AJvanLoon" src="https://avatars.githubusercontent.com/u/15716628?v=4&s=117" width="117">](https://github.com/AJvanLoon) |[<img alt="nqst" src="https://avatars.githubusercontent.com/u/375537?v=4&s=117" width="117">](https://github.com/nqst) |[<img alt="mifi" src="https://avatars.githubusercontent.com/u/402547?v=4&s=117" width="117">](https://github.com/mifi) |[<img alt="github-actions[bot]" src="https://avatars.githubusercontent.com/in/15368?v=4&s=117" width="117">](https://github.com/apps/github-actions) |[<img alt="lakesare" src="https://avatars.githubusercontent.com/u/7578559?v=4&s=117" width="117">](https://github.com/lakesare) |
:---: |:---: |:---: |:---: |:---: |:---: |
[Murderlon](https://github.com/Murderlon) |[AJvanLoon](https://github.com/AJvanLoon) |[nqst](https://github.com/nqst) |[mifi](https://github.com/mifi) |[github-actions\[bot\]](https://github.com/apps/github-actions) |[lakesare](https://github.com/lakesare) |
| [<img alt="Murderlon" src="https://avatars.githubusercontent.com/u/9060226?v=4&s=117" width="117">](https://github.com/Murderlon) | [<img alt="AJvanLoon" src="https://avatars.githubusercontent.com/u/15716628?v=4&s=117" width="117">](https://github.com/AJvanLoon) | [<img alt="nqst" src="https://avatars.githubusercontent.com/u/375537?v=4&s=117" width="117">](https://github.com/nqst) | [<img alt="mifi" src="https://avatars.githubusercontent.com/u/402547?v=4&s=117" width="117">](https://github.com/mifi) | [<img alt="github-actions[bot]" src="https://avatars.githubusercontent.com/in/15368?v=4&s=117" width="117">](https://github.com/apps/github-actions) | [<img alt="lakesare" src="https://avatars.githubusercontent.com/u/7578559?v=4&s=117" width="117">](https://github.com/lakesare) |
| :-------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: |
| [Murderlon](https://github.com/Murderlon) | [AJvanLoon](https://github.com/AJvanLoon) | [nqst](https://github.com/nqst) | [mifi](https://github.com/mifi) | [github-actions\[bot\]](https://github.com/apps/github-actions) | [lakesare](https://github.com/lakesare) |
[<img alt="dependabot[bot]" src="https://avatars.githubusercontent.com/in/29110?v=4&s=117" width="117">](https://github.com/apps/dependabot) |[<img alt="kiloreux" src="https://avatars.githubusercontent.com/u/6282557?v=4&s=117" width="117">](https://github.com/kiloreux) |[<img alt="samuelayo" src="https://avatars.githubusercontent.com/u/14964486?v=4&s=117" width="117">](https://github.com/samuelayo) |[<img alt="sadovnychyi" src="https://avatars.githubusercontent.com/u/193864?v=4&s=117" width="117">](https://github.com/sadovnychyi) |[<img alt="richardwillars" src="https://avatars.githubusercontent.com/u/291004?v=4&s=117" width="117">](https://github.com/richardwillars) |[<img alt="ajkachnic" src="https://avatars.githubusercontent.com/u/44317699?v=4&s=117" width="117">](https://github.com/ajkachnic) |
:---: |:---: |:---: |:---: |:---: |:---: |
[dependabot\[bot\]](https://github.com/apps/dependabot) |[kiloreux](https://github.com/kiloreux) |[samuelayo](https://github.com/samuelayo) |[sadovnychyi](https://github.com/sadovnychyi) |[richardwillars](https://github.com/richardwillars) |[ajkachnic](https://github.com/ajkachnic) |
| [<img alt="dependabot[bot]" src="https://avatars.githubusercontent.com/in/29110?v=4&s=117" width="117">](https://github.com/apps/dependabot) | [<img alt="kiloreux" src="https://avatars.githubusercontent.com/u/6282557?v=4&s=117" width="117">](https://github.com/kiloreux) | [<img alt="samuelayo" src="https://avatars.githubusercontent.com/u/14964486?v=4&s=117" width="117">](https://github.com/samuelayo) | [<img alt="sadovnychyi" src="https://avatars.githubusercontent.com/u/193864?v=4&s=117" width="117">](https://github.com/sadovnychyi) | [<img alt="richardwillars" src="https://avatars.githubusercontent.com/u/291004?v=4&s=117" width="117">](https://github.com/richardwillars) | [<img alt="ajkachnic" src="https://avatars.githubusercontent.com/u/44317699?v=4&s=117" width="117">](https://github.com/ajkachnic) |
| :------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: |
| [dependabot\[bot\]](https://github.com/apps/dependabot) | [kiloreux](https://github.com/kiloreux) | [samuelayo](https://github.com/samuelayo) | [sadovnychyi](https://github.com/sadovnychyi) | [richardwillars](https://github.com/richardwillars) | [ajkachnic](https://github.com/ajkachnic) |
[<img alt="zcallan" src="https://avatars.githubusercontent.com/u/13760738?v=4&s=117" width="117">](https://github.com/zcallan) |[<img alt="YukeshShr" src="https://avatars.githubusercontent.com/u/71844521?v=4&s=117" width="117">](https://github.com/YukeshShr) |[<img alt="janko" src="https://avatars.githubusercontent.com/u/795488?v=4&s=117" width="117">](https://github.com/janko) |[<img alt="oliverpool" src="https://avatars.githubusercontent.com/u/3864879?v=4&s=117" width="117">](https://github.com/oliverpool) |[<img alt="Botz" src="https://avatars.githubusercontent.com/u/2706678?v=4&s=117" width="117">](https://github.com/Botz) |[<img alt="mcallistertyler" src="https://avatars.githubusercontent.com/u/14939210?v=4&s=117" width="117">](https://github.com/mcallistertyler) |
:---: |:---: |:---: |:---: |:---: |:---: |
[zcallan](https://github.com/zcallan) |[YukeshShr](https://github.com/YukeshShr) |[janko](https://github.com/janko) |[oliverpool](https://github.com/oliverpool) |[Botz](https://github.com/Botz) |[mcallistertyler](https://github.com/mcallistertyler) |
| [<img alt="zcallan" src="https://avatars.githubusercontent.com/u/13760738?v=4&s=117" width="117">](https://github.com/zcallan) | [<img alt="YukeshShr" src="https://avatars.githubusercontent.com/u/71844521?v=4&s=117" width="117">](https://github.com/YukeshShr) | [<img alt="janko" src="https://avatars.githubusercontent.com/u/795488?v=4&s=117" width="117">](https://github.com/janko) | [<img alt="oliverpool" src="https://avatars.githubusercontent.com/u/3864879?v=4&s=117" width="117">](https://github.com/oliverpool) | [<img alt="Botz" src="https://avatars.githubusercontent.com/u/2706678?v=4&s=117" width="117">](https://github.com/Botz) | [<img alt="mcallistertyler" src="https://avatars.githubusercontent.com/u/14939210?v=4&s=117" width="117">](https://github.com/mcallistertyler) |
| :----------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------: |
| [zcallan](https://github.com/zcallan) | [YukeshShr](https://github.com/YukeshShr) | [janko](https://github.com/janko) | [oliverpool](https://github.com/oliverpool) | [Botz](https://github.com/Botz) | [mcallistertyler](https://github.com/mcallistertyler) |
[<img alt="mokutsu-coursera" src="https://avatars.githubusercontent.com/u/65177495?v=4&s=117" width="117">](https://github.com/mokutsu-coursera) |[<img alt="dschmidt" src="https://avatars.githubusercontent.com/u/448487?v=4&s=117" width="117">](https://github.com/dschmidt) |[<img alt="DJWassink" src="https://avatars.githubusercontent.com/u/1822404?v=4&s=117" width="117">](https://github.com/DJWassink) |[<img alt="mrbatista" src="https://avatars.githubusercontent.com/u/6544817?v=4&s=117" width="117">](https://github.com/mrbatista) |[<img alt="taoqf" src="https://avatars.githubusercontent.com/u/15901911?v=4&s=117" width="117">](https://github.com/taoqf) |[<img alt="timodwhit" src="https://avatars.githubusercontent.com/u/2761203?v=4&s=117" width="117">](https://github.com/timodwhit) |
:---: |:---: |:---: |:---: |:---: |:---: |
[mokutsu-coursera](https://github.com/mokutsu-coursera) |[dschmidt](https://github.com/dschmidt) |[DJWassink](https://github.com/DJWassink) |[mrbatista](https://github.com/mrbatista) |[taoqf](https://github.com/taoqf) |[timodwhit](https://github.com/timodwhit) |
| [<img alt="mokutsu-coursera" src="https://avatars.githubusercontent.com/u/65177495?v=4&s=117" width="117">](https://github.com/mokutsu-coursera) | [<img alt="dschmidt" src="https://avatars.githubusercontent.com/u/448487?v=4&s=117" width="117">](https://github.com/dschmidt) | [<img alt="DJWassink" src="https://avatars.githubusercontent.com/u/1822404?v=4&s=117" width="117">](https://github.com/DJWassink) | [<img alt="mrbatista" src="https://avatars.githubusercontent.com/u/6544817?v=4&s=117" width="117">](https://github.com/mrbatista) | [<img alt="taoqf" src="https://avatars.githubusercontent.com/u/15901911?v=4&s=117" width="117">](https://github.com/taoqf) | [<img alt="timodwhit" src="https://avatars.githubusercontent.com/u/2761203?v=4&s=117" width="117">](https://github.com/timodwhit) |
| :----------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: |
| [mokutsu-coursera](https://github.com/mokutsu-coursera) | [dschmidt](https://github.com/dschmidt) | [DJWassink](https://github.com/DJWassink) | [mrbatista](https://github.com/mrbatista) | [taoqf](https://github.com/taoqf) | [timodwhit](https://github.com/timodwhit) |
[<img alt="tim-kos" src="https://avatars.githubusercontent.com/u/15005?v=4&s=117" width="117">](https://github.com/tim-kos) |[<img alt="eltociear" src="https://avatars.githubusercontent.com/u/22633385?v=4&s=117" width="117">](https://github.com/eltociear) |[<img alt="tuoxiansp" src="https://avatars.githubusercontent.com/u/3960056?v=4&s=117" width="117">](https://github.com/tuoxiansp) |[<img alt="pauln" src="https://avatars.githubusercontent.com/u/574359?v=4&s=117" width="117">](https://github.com/pauln) |[<img alt="MikeKovarik" src="https://avatars.githubusercontent.com/u/3995401?v=4&s=117" width="117">](https://github.com/MikeKovarik) |[<img alt="toadkicker" src="https://avatars.githubusercontent.com/u/523330?v=4&s=117" width="117">](https://github.com/toadkicker) |
:---: |:---: |:---: |:---: |:---: |:---: |
[tim-kos](https://github.com/tim-kos) |[eltociear](https://github.com/eltociear) |[tuoxiansp](https://github.com/tuoxiansp) |[pauln](https://github.com/pauln) |[MikeKovarik](https://github.com/MikeKovarik) |[toadkicker](https://github.com/toadkicker) |
| [<img alt="tim-kos" src="https://avatars.githubusercontent.com/u/15005?v=4&s=117" width="117">](https://github.com/tim-kos) | [<img alt="eltociear" src="https://avatars.githubusercontent.com/u/22633385?v=4&s=117" width="117">](https://github.com/eltociear) | [<img alt="tuoxiansp" src="https://avatars.githubusercontent.com/u/3960056?v=4&s=117" width="117">](https://github.com/tuoxiansp) | [<img alt="pauln" src="https://avatars.githubusercontent.com/u/574359?v=4&s=117" width="117">](https://github.com/pauln) | [<img alt="MikeKovarik" src="https://avatars.githubusercontent.com/u/3995401?v=4&s=117" width="117">](https://github.com/MikeKovarik) | [<img alt="toadkicker" src="https://avatars.githubusercontent.com/u/523330?v=4&s=117" width="117">](https://github.com/toadkicker) |
| :-------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: |
| [tim-kos](https://github.com/tim-kos) | [eltociear](https://github.com/eltociear) | [tuoxiansp](https://github.com/tuoxiansp) | [pauln](https://github.com/pauln) | [MikeKovarik](https://github.com/MikeKovarik) | [toadkicker](https://github.com/toadkicker) |
[<img alt="ap--" src="https://avatars.githubusercontent.com/u/1463443?v=4&s=117" width="117">](https://github.com/ap--) |[<img alt="tranvansang" src="https://avatars.githubusercontent.com/u/13043196?v=4&s=117" width="117">](https://github.com/tranvansang) |[<img alt="LiviaMedeiros" src="https://avatars.githubusercontent.com/u/74449973?v=4&s=117" width="117">](https://github.com/LiviaMedeiros) |[<img alt="bertho-zero" src="https://avatars.githubusercontent.com/u/8525267?v=4&s=117" width="117">](https://github.com/bertho-zero) |[<img alt="juliangruber" src="https://avatars.githubusercontent.com/u/10247?v=4&s=117" width="117">](https://github.com/juliangruber) |[<img alt="Hawxy" src="https://avatars.githubusercontent.com/u/975824?v=4&s=117" width="117">](https://github.com/Hawxy) |
:---: |:---: |:---: |:---: |:---: |:---: |
[ap--](https://github.com/ap--) |[tranvansang](https://github.com/tranvansang) |[LiviaMedeiros](https://github.com/LiviaMedeiros) |[bertho-zero](https://github.com/bertho-zero) |[juliangruber](https://github.com/juliangruber) |[Hawxy](https://github.com/Hawxy) |
| [<img alt="ap--" src="https://avatars.githubusercontent.com/u/1463443?v=4&s=117" width="117">](https://github.com/ap--) | [<img alt="tranvansang" src="https://avatars.githubusercontent.com/u/13043196?v=4&s=117" width="117">](https://github.com/tranvansang) | [<img alt="LiviaMedeiros" src="https://avatars.githubusercontent.com/u/74449973?v=4&s=117" width="117">](https://github.com/LiviaMedeiros) | [<img alt="bertho-zero" src="https://avatars.githubusercontent.com/u/8525267?v=4&s=117" width="117">](https://github.com/bertho-zero) | [<img alt="juliangruber" src="https://avatars.githubusercontent.com/u/10247?v=4&s=117" width="117">](https://github.com/juliangruber) | [<img alt="Hawxy" src="https://avatars.githubusercontent.com/u/975824?v=4&s=117" width="117">](https://github.com/Hawxy) |
| :---------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------: |
| [ap--](https://github.com/ap--) | [tranvansang](https://github.com/tranvansang) | [LiviaMedeiros](https://github.com/LiviaMedeiros) | [bertho-zero](https://github.com/bertho-zero) | [juliangruber](https://github.com/juliangruber) | [Hawxy](https://github.com/Hawxy) |
[<img alt="gavboulton" src="https://avatars.githubusercontent.com/u/3900826?v=4&s=117" width="117">](https://github.com/gavboulton) |[<img alt="mejiaej" src="https://avatars.githubusercontent.com/u/4699893?v=4&s=117" width="117">](https://github.com/mejiaej) |[<img alt="elenalape" src="https://avatars.githubusercontent.com/u/22844059?v=4&s=117" width="117">](https://github.com/elenalape) |[<img alt="dominiceden" src="https://avatars.githubusercontent.com/u/6367692?v=4&s=117" width="117">](https://github.com/dominiceden) |[<img alt="Acconut" src="https://avatars.githubusercontent.com/u/1375043?v=4&s=117" width="117">](https://github.com/Acconut) |[<img alt="jhen0409" src="https://avatars.githubusercontent.com/u/3001525?v=4&s=117" width="117">](https://github.com/jhen0409) |
:---: |:---: |:---: |:---: |:---: |:---: |
[gavboulton](https://github.com/gavboulton) |[mejiaej](https://github.com/mejiaej) |[elenalape](https://github.com/elenalape) |[dominiceden](https://github.com/dominiceden) |[Acconut](https://github.com/Acconut) |[jhen0409](https://github.com/jhen0409) |
| [<img alt="gavboulton" src="https://avatars.githubusercontent.com/u/3900826?v=4&s=117" width="117">](https://github.com/gavboulton) | [<img alt="mejiaej" src="https://avatars.githubusercontent.com/u/4699893?v=4&s=117" width="117">](https://github.com/mejiaej) | [<img alt="elenalape" src="https://avatars.githubusercontent.com/u/22844059?v=4&s=117" width="117">](https://github.com/elenalape) | [<img alt="dominiceden" src="https://avatars.githubusercontent.com/u/6367692?v=4&s=117" width="117">](https://github.com/dominiceden) | [<img alt="Acconut" src="https://avatars.githubusercontent.com/u/1375043?v=4&s=117" width="117">](https://github.com/Acconut) | [<img alt="jhen0409" src="https://avatars.githubusercontent.com/u/3001525?v=4&s=117" width="117">](https://github.com/jhen0409) |
| :---------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: |
| [gavboulton](https://github.com/gavboulton) | [mejiaej](https://github.com/mejiaej) | [elenalape](https://github.com/elenalape) | [dominiceden](https://github.com/dominiceden) | [Acconut](https://github.com/Acconut) | [jhen0409](https://github.com/jhen0409) |
[<img alt="stephentuso" src="https://avatars.githubusercontent.com/u/11889560?v=4&s=117" width="117">](https://github.com/stephentuso) |[<img alt="bencergazda" src="https://avatars.githubusercontent.com/u/5767697?v=4&s=117" width="117">](https://github.com/bencergazda) |[<img alt="a-kriya" src="https://avatars.githubusercontent.com/u/26761352?v=4&s=117" width="117">](https://github.com/a-kriya) |[<img alt="yonahforst" src="https://avatars.githubusercontent.com/u/1440796?v=4&s=117" width="117">](https://github.com/yonahforst) |[<img alt="suchoproduction" src="https://avatars.githubusercontent.com/u/6931349?v=4&s=117" width="117">](https://github.com/suchoproduction) |[<img alt="sksavant" src="https://avatars.githubusercontent.com/u/1040701?v=4&s=117" width="117">](https://github.com/sksavant) |
:---: |:---: |:---: |:---: |:---: |:---: |
[stephentuso](https://github.com/stephentuso) |[bencergazda](https://github.com/bencergazda) |[a-kriya](https://github.com/a-kriya) |[yonahforst](https://github.com/yonahforst) |[suchoproduction](https://github.com/suchoproduction) |[sksavant](https://github.com/sksavant) |
| [<img alt="stephentuso" src="https://avatars.githubusercontent.com/u/11889560?v=4&s=117" width="117">](https://github.com/stephentuso) | [<img alt="bencergazda" src="https://avatars.githubusercontent.com/u/5767697?v=4&s=117" width="117">](https://github.com/bencergazda) | [<img alt="a-kriya" src="https://avatars.githubusercontent.com/u/26761352?v=4&s=117" width="117">](https://github.com/a-kriya) | [<img alt="yonahforst" src="https://avatars.githubusercontent.com/u/1440796?v=4&s=117" width="117">](https://github.com/yonahforst) | [<img alt="suchoproduction" src="https://avatars.githubusercontent.com/u/6931349?v=4&s=117" width="117">](https://github.com/suchoproduction) | [<img alt="sksavant" src="https://avatars.githubusercontent.com/u/1040701?v=4&s=117" width="117">](https://github.com/sksavant) |
| :------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: |
| [stephentuso](https://github.com/stephentuso) | [bencergazda](https://github.com/bencergazda) | [a-kriya](https://github.com/a-kriya) | [yonahforst](https://github.com/yonahforst) | [suchoproduction](https://github.com/suchoproduction) | [sksavant](https://github.com/sksavant) |
[<img alt="ogtfaber" src="https://avatars.githubusercontent.com/u/320955?v=4&s=117" width="117">](https://github.com/ogtfaber) |[<img alt="nndevstudio" src="https://avatars.githubusercontent.com/u/22050968?v=4&s=117" width="117">](https://github.com/nndevstudio) |[<img alt="MatthiasKunnen" src="https://avatars.githubusercontent.com/u/16807587?v=4&s=117" width="117">](https://github.com/MatthiasKunnen) |[<img alt="manuelkiessling" src="https://avatars.githubusercontent.com/u/206592?v=4&s=117" width="117">](https://github.com/manuelkiessling) |[<img alt="dargmuesli" src="https://avatars.githubusercontent.com/u/4778485?v=4&s=117" width="117">](https://github.com/dargmuesli) |[<img alt="johnnyperkins" src="https://avatars.githubusercontent.com/u/16482282?v=4&s=117" width="117">](https://github.com/johnnyperkins) |
:---: |:---: |:---: |:---: |:---: |:---: |
[ogtfaber](https://github.com/ogtfaber) |[nndevstudio](https://github.com/nndevstudio) |[MatthiasKunnen](https://github.com/MatthiasKunnen) |[manuelkiessling](https://github.com/manuelkiessling) |[dargmuesli](https://github.com/dargmuesli) |[johnnyperkins](https://github.com/johnnyperkins) |
| [<img alt="ogtfaber" src="https://avatars.githubusercontent.com/u/320955?v=4&s=117" width="117">](https://github.com/ogtfaber) | [<img alt="nndevstudio" src="https://avatars.githubusercontent.com/u/22050968?v=4&s=117" width="117">](https://github.com/nndevstudio) | [<img alt="MatthiasKunnen" src="https://avatars.githubusercontent.com/u/16807587?v=4&s=117" width="117">](https://github.com/MatthiasKunnen) | [<img alt="manuelkiessling" src="https://avatars.githubusercontent.com/u/206592?v=4&s=117" width="117">](https://github.com/manuelkiessling) | [<img alt="dargmuesli" src="https://avatars.githubusercontent.com/u/4778485?v=4&s=117" width="117">](https://github.com/dargmuesli) | [<img alt="johnnyperkins" src="https://avatars.githubusercontent.com/u/16482282?v=4&s=117" width="117">](https://github.com/johnnyperkins) |
| :----------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: |
| [ogtfaber](https://github.com/ogtfaber) | [nndevstudio](https://github.com/nndevstudio) | [MatthiasKunnen](https://github.com/MatthiasKunnen) | [manuelkiessling](https://github.com/manuelkiessling) | [dargmuesli](https://github.com/dargmuesli) | [johnnyperkins](https://github.com/johnnyperkins) |
[<img alt="ofhope" src="https://avatars.githubusercontent.com/u/1826459?v=4&s=117" width="117">](https://github.com/ofhope) |[<img alt="yaegor" src="https://avatars.githubusercontent.com/u/3315?v=4&s=117" width="117">](https://github.com/yaegor) |[<img alt="zhuangya" src="https://avatars.githubusercontent.com/u/499038?v=4&s=117" width="117">](https://github.com/zhuangya) |[<img alt="sparanoid" src="https://avatars.githubusercontent.com/u/96356?v=4&s=117" width="117">](https://github.com/sparanoid) |[<img alt="ThomasG77" src="https://avatars.githubusercontent.com/u/642120?v=4&s=117" width="117">](https://github.com/ThomasG77) |[<img alt="subha1206" src="https://avatars.githubusercontent.com/u/36275153?v=4&s=117" width="117">](https://github.com/subha1206) |
:---: |:---: |:---: |:---: |:---: |:---: |
[ofhope](https://github.com/ofhope) |[yaegor](https://github.com/yaegor) |[zhuangya](https://github.com/zhuangya) |[sparanoid](https://github.com/sparanoid) |[ThomasG77](https://github.com/ThomasG77) |[subha1206](https://github.com/subha1206) |
| [<img alt="ofhope" src="https://avatars.githubusercontent.com/u/1826459?v=4&s=117" width="117">](https://github.com/ofhope) | [<img alt="yaegor" src="https://avatars.githubusercontent.com/u/3315?v=4&s=117" width="117">](https://github.com/yaegor) | [<img alt="zhuangya" src="https://avatars.githubusercontent.com/u/499038?v=4&s=117" width="117">](https://github.com/zhuangya) | [<img alt="sparanoid" src="https://avatars.githubusercontent.com/u/96356?v=4&s=117" width="117">](https://github.com/sparanoid) | [<img alt="ThomasG77" src="https://avatars.githubusercontent.com/u/642120?v=4&s=117" width="117">](https://github.com/ThomasG77) | [<img alt="subha1206" src="https://avatars.githubusercontent.com/u/36275153?v=4&s=117" width="117">](https://github.com/subha1206) |
| :-------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: |
| [ofhope](https://github.com/ofhope) | [yaegor](https://github.com/yaegor) | [zhuangya](https://github.com/zhuangya) | [sparanoid](https://github.com/sparanoid) | [ThomasG77](https://github.com/ThomasG77) | [subha1206](https://github.com/subha1206) |
[<img alt="schonert" src="https://avatars.githubusercontent.com/u/2185697?v=4&s=117" width="117">](https://github.com/schonert) |[<img alt="SlavikTraktor" src="https://avatars.githubusercontent.com/u/11923751?v=4&s=117" width="117">](https://github.com/SlavikTraktor) |[<img alt="scottbessler" src="https://avatars.githubusercontent.com/u/293802?v=4&s=117" width="117">](https://github.com/scottbessler) |[<img alt="jrschumacher" src="https://avatars.githubusercontent.com/u/46549?v=4&s=117" width="117">](https://github.com/jrschumacher) |[<img alt="rosenfeld" src="https://avatars.githubusercontent.com/u/32246?v=4&s=117" width="117">](https://github.com/rosenfeld) |[<img alt="rdimartino" src="https://avatars.githubusercontent.com/u/11539300?v=4&s=117" width="117">](https://github.com/rdimartino) |
:---: |:---: |:---: |:---: |:---: |:---: |
[schonert](https://github.com/schonert) |[SlavikTraktor](https://github.com/SlavikTraktor) |[scottbessler](https://github.com/scottbessler) |[jrschumacher](https://github.com/jrschumacher) |[rosenfeld](https://github.com/rosenfeld) |[rdimartino](https://github.com/rdimartino) |
| [<img alt="schonert" src="https://avatars.githubusercontent.com/u/2185697?v=4&s=117" width="117">](https://github.com/schonert) | [<img alt="SlavikTraktor" src="https://avatars.githubusercontent.com/u/11923751?v=4&s=117" width="117">](https://github.com/SlavikTraktor) | [<img alt="scottbessler" src="https://avatars.githubusercontent.com/u/293802?v=4&s=117" width="117">](https://github.com/scottbessler) | [<img alt="jrschumacher" src="https://avatars.githubusercontent.com/u/46549?v=4&s=117" width="117">](https://github.com/jrschumacher) | [<img alt="rosenfeld" src="https://avatars.githubusercontent.com/u/32246?v=4&s=117" width="117">](https://github.com/rosenfeld) | [<img alt="rdimartino" src="https://avatars.githubusercontent.com/u/11539300?v=4&s=117" width="117">](https://github.com/rdimartino) |
| :-----------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: |
| [schonert](https://github.com/schonert) | [SlavikTraktor](https://github.com/SlavikTraktor) | [scottbessler](https://github.com/scottbessler) | [jrschumacher](https://github.com/jrschumacher) | [rosenfeld](https://github.com/rosenfeld) | [rdimartino](https://github.com/rdimartino) |
[<img alt="ahmedkandel" src="https://avatars.githubusercontent.com/u/28398523?v=4&s=117" width="117">](https://github.com/ahmedkandel) |[<img alt="Youssef1313" src="https://avatars.githubusercontent.com/u/31348972?v=4&s=117" width="117">](https://github.com/Youssef1313) |[<img alt="allenfantasy" src="https://avatars.githubusercontent.com/u/1009294?v=4&s=117" width="117">](https://github.com/allenfantasy) |[<img alt="Zyclotrop-j" src="https://avatars.githubusercontent.com/u/4939546?v=4&s=117" width="117">](https://github.com/Zyclotrop-j) |[<img alt="anark" src="https://avatars.githubusercontent.com/u/101184?v=4&s=117" width="117">](https://github.com/anark) |[<img alt="bdirito" src="https://avatars.githubusercontent.com/u/8117238?v=4&s=117" width="117">](https://github.com/bdirito) |
:---: |:---: |:---: |:---: |:---: |:---: |
[ahmedkandel](https://github.com/ahmedkandel) |[Youssef1313](https://github.com/Youssef1313) |[allenfantasy](https://github.com/allenfantasy) |[Zyclotrop-j](https://github.com/Zyclotrop-j) |[anark](https://github.com/anark) |[bdirito](https://github.com/bdirito) |
| [<img alt="ahmedkandel" src="https://avatars.githubusercontent.com/u/28398523?v=4&s=117" width="117">](https://github.com/ahmedkandel) | [<img alt="Youssef1313" src="https://avatars.githubusercontent.com/u/31348972?v=4&s=117" width="117">](https://github.com/Youssef1313) | [<img alt="allenfantasy" src="https://avatars.githubusercontent.com/u/1009294?v=4&s=117" width="117">](https://github.com/allenfantasy) | [<img alt="Zyclotrop-j" src="https://avatars.githubusercontent.com/u/4939546?v=4&s=117" width="117">](https://github.com/Zyclotrop-j) | [<img alt="anark" src="https://avatars.githubusercontent.com/u/101184?v=4&s=117" width="117">](https://github.com/anark) | [<img alt="bdirito" src="https://avatars.githubusercontent.com/u/8117238?v=4&s=117" width="117">](https://github.com/bdirito) |
| :------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: |
| [ahmedkandel](https://github.com/ahmedkandel) | [Youssef1313](https://github.com/Youssef1313) | [allenfantasy](https://github.com/allenfantasy) | [Zyclotrop-j](https://github.com/Zyclotrop-j) | [anark](https://github.com/anark) | [bdirito](https://github.com/bdirito) |
[<img alt="darthf1" src="https://avatars.githubusercontent.com/u/17253332?v=4&s=117" width="117">](https://github.com/darthf1) |[<img alt="fortrieb" src="https://avatars.githubusercontent.com/u/4126707?v=4&s=117" width="117">](https://github.com/fortrieb) |[<img alt="frederikhors" src="https://avatars.githubusercontent.com/u/41120635?v=4&s=117" width="117">](https://github.com/frederikhors) |[<img alt="heocoi" src="https://avatars.githubusercontent.com/u/13751011?v=4&s=117" width="117">](https://github.com/heocoi) |[<img alt="jarey" src="https://avatars.githubusercontent.com/u/5025224?v=4&s=117" width="117">](https://github.com/jarey) |[<img alt="muhammadInam" src="https://avatars.githubusercontent.com/u/7801708?v=4&s=117" width="117">](https://github.com/muhammadInam) |
:---: |:---: |:---: |:---: |:---: |:---: |
[darthf1](https://github.com/darthf1) |[fortrieb](https://github.com/fortrieb) |[frederikhors](https://github.com/frederikhors) |[heocoi](https://github.com/heocoi) |[jarey](https://github.com/jarey) |[muhammadInam](https://github.com/muhammadInam) |
| [<img alt="darthf1" src="https://avatars.githubusercontent.com/u/17253332?v=4&s=117" width="117">](https://github.com/darthf1) | [<img alt="fortrieb" src="https://avatars.githubusercontent.com/u/4126707?v=4&s=117" width="117">](https://github.com/fortrieb) | [<img alt="frederikhors" src="https://avatars.githubusercontent.com/u/41120635?v=4&s=117" width="117">](https://github.com/frederikhors) | [<img alt="heocoi" src="https://avatars.githubusercontent.com/u/13751011?v=4&s=117" width="117">](https://github.com/heocoi) | [<img alt="jarey" src="https://avatars.githubusercontent.com/u/5025224?v=4&s=117" width="117">](https://github.com/jarey) | [<img alt="muhammadInam" src="https://avatars.githubusercontent.com/u/7801708?v=4&s=117" width="117">](https://github.com/muhammadInam) |
| :----------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: |
| [darthf1](https://github.com/darthf1) | [fortrieb](https://github.com/fortrieb) | [frederikhors](https://github.com/frederikhors) | [heocoi](https://github.com/heocoi) | [jarey](https://github.com/jarey) | [muhammadInam](https://github.com/muhammadInam) |
[<img alt="rettgerst" src="https://avatars.githubusercontent.com/u/11684948?v=4&s=117" width="117">](https://github.com/rettgerst) |[<img alt="mkabatek" src="https://avatars.githubusercontent.com/u/1764486?v=4&s=117" width="117">](https://github.com/mkabatek) |[<img alt="jukakoski" src="https://avatars.githubusercontent.com/u/52720967?v=4&s=117" width="117">](https://github.com/jukakoski) |[<img alt="olemoign" src="https://avatars.githubusercontent.com/u/11632871?v=4&s=117" width="117">](https://github.com/olemoign) |[<img alt="btrice" src="https://avatars.githubusercontent.com/u/4358225?v=4&s=117" width="117">](https://github.com/btrice) |[<img alt="5idereal" src="https://avatars.githubusercontent.com/u/30827929?v=4&s=117" width="117">](https://github.com/5idereal) |
:---: |:---: |:---: |:---: |:---: |:---: |
[rettgerst](https://github.com/rettgerst) |[mkabatek](https://github.com/mkabatek) |[jukakoski](https://github.com/jukakoski) |[olemoign](https://github.com/olemoign) |[btrice](https://github.com/btrice) |[5idereal](https://github.com/5idereal) |
| [<img alt="rettgerst" src="https://avatars.githubusercontent.com/u/11684948?v=4&s=117" width="117">](https://github.com/rettgerst) | [<img alt="mkabatek" src="https://avatars.githubusercontent.com/u/1764486?v=4&s=117" width="117">](https://github.com/mkabatek) | [<img alt="jukakoski" src="https://avatars.githubusercontent.com/u/52720967?v=4&s=117" width="117">](https://github.com/jukakoski) | [<img alt="olemoign" src="https://avatars.githubusercontent.com/u/11632871?v=4&s=117" width="117">](https://github.com/olemoign) | [<img alt="btrice" src="https://avatars.githubusercontent.com/u/4358225?v=4&s=117" width="117">](https://github.com/btrice) | [<img alt="5idereal" src="https://avatars.githubusercontent.com/u/30827929?v=4&s=117" width="117">](https://github.com/5idereal) |
| :--------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: |
| [rettgerst](https://github.com/rettgerst) | [mkabatek](https://github.com/mkabatek) | [jukakoski](https://github.com/jukakoski) | [olemoign](https://github.com/olemoign) | [btrice](https://github.com/btrice) | [5idereal](https://github.com/5idereal) |
[<img alt="AndrwM" src="https://avatars.githubusercontent.com/u/565743?v=4&s=117" width="117">](https://github.com/AndrwM) |[<img alt="behnammodi" src="https://avatars.githubusercontent.com/u/1549069?v=4&s=117" width="117">](https://github.com/behnammodi) |[<img alt="BePo65" src="https://avatars.githubusercontent.com/u/6582465?v=4&s=117" width="117">](https://github.com/BePo65) |[<img alt="bradedelman" src="https://avatars.githubusercontent.com/u/124367?v=4&s=117" width="117">](https://github.com/bradedelman) |[<img alt="camiloforero" src="https://avatars.githubusercontent.com/u/6606686?v=4&s=117" width="117">](https://github.com/camiloforero) |[<img alt="command-tab" src="https://avatars.githubusercontent.com/u/3069?v=4&s=117" width="117">](https://github.com/command-tab) |
:---: |:---: |:---: |:---: |:---: |:---: |
[AndrwM](https://github.com/AndrwM) |[behnammodi](https://github.com/behnammodi) |[BePo65](https://github.com/BePo65) |[bradedelman](https://github.com/bradedelman) |[camiloforero](https://github.com/camiloforero) |[command-tab](https://github.com/command-tab) |
| [<img alt="AndrwM" src="https://avatars.githubusercontent.com/u/565743?v=4&s=117" width="117">](https://github.com/AndrwM) | [<img alt="behnammodi" src="https://avatars.githubusercontent.com/u/1549069?v=4&s=117" width="117">](https://github.com/behnammodi) | [<img alt="BePo65" src="https://avatars.githubusercontent.com/u/6582465?v=4&s=117" width="117">](https://github.com/BePo65) | [<img alt="bradedelman" src="https://avatars.githubusercontent.com/u/124367?v=4&s=117" width="117">](https://github.com/bradedelman) | [<img alt="camiloforero" src="https://avatars.githubusercontent.com/u/6606686?v=4&s=117" width="117">](https://github.com/camiloforero) | [<img alt="command-tab" src="https://avatars.githubusercontent.com/u/3069?v=4&s=117" width="117">](https://github.com/command-tab) |
| :------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: |
| [AndrwM](https://github.com/AndrwM) | [behnammodi](https://github.com/behnammodi) | [BePo65](https://github.com/BePo65) | [bradedelman](https://github.com/bradedelman) | [camiloforero](https://github.com/camiloforero) | [command-tab](https://github.com/command-tab) |
[<img alt="craig-jennings" src="https://avatars.githubusercontent.com/u/1683368?v=4&s=117" width="117">](https://github.com/craig-jennings) |[<img alt="davekiss" src="https://avatars.githubusercontent.com/u/1256071?v=4&s=117" width="117">](https://github.com/davekiss) |[<img alt="denysdesign" src="https://avatars.githubusercontent.com/u/1041797?v=4&s=117" width="117">](https://github.com/denysdesign) |[<img alt="ethanwillis" src="https://avatars.githubusercontent.com/u/182492?v=4&s=117" width="117">](https://github.com/ethanwillis) |[<img alt="frobinsonj" src="https://avatars.githubusercontent.com/u/16726902?v=4&s=117" width="117">](https://github.com/frobinsonj) |[<img alt="richartkeil" src="https://avatars.githubusercontent.com/u/8680858?v=4&s=117" width="117">](https://github.com/richartkeil) |
:---: |:---: |:---: |:---: |:---: |:---: |
[craig-jennings](https://github.com/craig-jennings) |[davekiss](https://github.com/davekiss) |[denysdesign](https://github.com/denysdesign) |[ethanwillis](https://github.com/ethanwillis) |[frobinsonj](https://github.com/frobinsonj) |[richartkeil](https://github.com/richartkeil) |
| [<img alt="craig-jennings" src="https://avatars.githubusercontent.com/u/1683368?v=4&s=117" width="117">](https://github.com/craig-jennings) | [<img alt="davekiss" src="https://avatars.githubusercontent.com/u/1256071?v=4&s=117" width="117">](https://github.com/davekiss) | [<img alt="denysdesign" src="https://avatars.githubusercontent.com/u/1041797?v=4&s=117" width="117">](https://github.com/denysdesign) | [<img alt="ethanwillis" src="https://avatars.githubusercontent.com/u/182492?v=4&s=117" width="117">](https://github.com/ethanwillis) | [<img alt="frobinsonj" src="https://avatars.githubusercontent.com/u/16726902?v=4&s=117" width="117">](https://github.com/frobinsonj) | [<img alt="richartkeil" src="https://avatars.githubusercontent.com/u/8680858?v=4&s=117" width="117">](https://github.com/richartkeil) |
| :-----------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: |
| [craig-jennings](https://github.com/craig-jennings) | [davekiss](https://github.com/davekiss) | [denysdesign](https://github.com/denysdesign) | [ethanwillis](https://github.com/ethanwillis) | [frobinsonj](https://github.com/frobinsonj) | [richartkeil](https://github.com/richartkeil) |
[<img alt="paescuj" src="https://avatars.githubusercontent.com/u/5363448?v=4&s=117" width="117">](https://github.com/paescuj) |[<img alt="richmeij" src="https://avatars.githubusercontent.com/u/9741858?v=4&s=117" width="117">](https://github.com/richmeij) |[<img alt="msand" src="https://avatars.githubusercontent.com/u/1131362?v=4&s=117" width="117">](https://github.com/msand) |[<img alt="martiuslim" src="https://avatars.githubusercontent.com/u/17944339?v=4&s=117" width="117">](https://github.com/martiuslim) |[<img alt="Martin005" src="https://avatars.githubusercontent.com/u/10096404?v=4&s=117" width="117">](https://github.com/Martin005) |[<img alt="mskelton" src="https://avatars.githubusercontent.com/u/25914066?v=4&s=117" width="117">](https://github.com/mskelton) |
:---: |:---: |:---: |:---: |:---: |:---: |
[paescuj](https://github.com/paescuj) |[richmeij](https://github.com/richmeij) |[msand](https://github.com/msand) |[martiuslim](https://github.com/martiuslim) |[Martin005](https://github.com/Martin005) |[mskelton](https://github.com/mskelton) |
| [<img alt="paescuj" src="https://avatars.githubusercontent.com/u/5363448?v=4&s=117" width="117">](https://github.com/paescuj) | [<img alt="richmeij" src="https://avatars.githubusercontent.com/u/9741858?v=4&s=117" width="117">](https://github.com/richmeij) | [<img alt="msand" src="https://avatars.githubusercontent.com/u/1131362?v=4&s=117" width="117">](https://github.com/msand) | [<img alt="martiuslim" src="https://avatars.githubusercontent.com/u/17944339?v=4&s=117" width="117">](https://github.com/martiuslim) | [<img alt="Martin005" src="https://avatars.githubusercontent.com/u/10096404?v=4&s=117" width="117">](https://github.com/Martin005) | [<img alt="mskelton" src="https://avatars.githubusercontent.com/u/25914066?v=4&s=117" width="117">](https://github.com/mskelton) |
| :---------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: |
| [paescuj](https://github.com/paescuj) | [richmeij](https://github.com/richmeij) | [msand](https://github.com/msand) | [martiuslim](https://github.com/martiuslim) | [Martin005](https://github.com/Martin005) | [mskelton](https://github.com/mskelton) |
[<img alt="mactavishz" src="https://avatars.githubusercontent.com/u/12948083?v=4&s=117" width="117">](https://github.com/mactavishz) |[<img alt="lafe" src="https://avatars.githubusercontent.com/u/4070008?v=4&s=117" width="117">](https://github.com/lafe) |[<img alt="dogrocker" src="https://avatars.githubusercontent.com/u/8379027?v=4&s=117" width="117">](https://github.com/dogrocker) |[<img alt="jedwood" src="https://avatars.githubusercontent.com/u/369060?v=4&s=117" width="117">](https://github.com/jedwood) |[<img alt="jasonbosco" src="https://avatars.githubusercontent.com/u/458383?v=4&s=117" width="117">](https://github.com/jasonbosco) |[<img alt="ghasrfakhri" src="https://avatars.githubusercontent.com/u/4945963?v=4&s=117" width="117">](https://github.com/ghasrfakhri) |
:---: |:---: |:---: |:---: |:---: |:---: |
[mactavishz](https://github.com/mactavishz) |[lafe](https://github.com/lafe) |[dogrocker](https://github.com/dogrocker) |[jedwood](https://github.com/jedwood) |[jasonbosco](https://github.com/jasonbosco) |[ghasrfakhri](https://github.com/ghasrfakhri) |
| [<img alt="mactavishz" src="https://avatars.githubusercontent.com/u/12948083?v=4&s=117" width="117">](https://github.com/mactavishz) | [<img alt="lafe" src="https://avatars.githubusercontent.com/u/4070008?v=4&s=117" width="117">](https://github.com/lafe) | [<img alt="dogrocker" src="https://avatars.githubusercontent.com/u/8379027?v=4&s=117" width="117">](https://github.com/dogrocker) | [<img alt="jedwood" src="https://avatars.githubusercontent.com/u/369060?v=4&s=117" width="117">](https://github.com/jedwood) | [<img alt="jasonbosco" src="https://avatars.githubusercontent.com/u/458383?v=4&s=117" width="117">](https://github.com/jasonbosco) | [<img alt="ghasrfakhri" src="https://avatars.githubusercontent.com/u/4945963?v=4&s=117" width="117">](https://github.com/ghasrfakhri) |
| :----------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: |
| [mactavishz](https://github.com/mactavishz) | [lafe](https://github.com/lafe) | [dogrocker](https://github.com/dogrocker) | [jedwood](https://github.com/jedwood) | [jasonbosco](https://github.com/jasonbosco) | [ghasrfakhri](https://github.com/ghasrfakhri) |
[<img alt="geertclerx" src="https://avatars.githubusercontent.com/u/1381327?v=4&s=117" width="117">](https://github.com/geertclerx) |[<img alt="eman8519" src="https://avatars.githubusercontent.com/u/2380804?v=4&s=117" width="117">](https://github.com/eman8519) |[<img alt="luarmr" src="https://avatars.githubusercontent.com/u/817416?v=4&s=117" width="117">](https://github.com/luarmr) |[<img alt="raulibanez" src="https://avatars.githubusercontent.com/u/1070825?v=4&s=117" width="117">](https://github.com/raulibanez) |[<img alt="refo" src="https://avatars.githubusercontent.com/u/1114116?v=4&s=117" width="117">](https://github.com/refo) |[<img alt="SxDx" src="https://avatars.githubusercontent.com/u/2004247?v=4&s=117" width="117">](https://github.com/SxDx) |
:---: |:---: |:---: |:---: |:---: |:---: |
[geertclerx](https://github.com/geertclerx) |[eman8519](https://github.com/eman8519) |[luarmr](https://github.com/luarmr) |[raulibanez](https://github.com/raulibanez) |[refo](https://github.com/refo) |[SxDx](https://github.com/SxDx) |
| [<img alt="geertclerx" src="https://avatars.githubusercontent.com/u/1381327?v=4&s=117" width="117">](https://github.com/geertclerx) | [<img alt="eman8519" src="https://avatars.githubusercontent.com/u/2380804?v=4&s=117" width="117">](https://github.com/eman8519) | [<img alt="luarmr" src="https://avatars.githubusercontent.com/u/817416?v=4&s=117" width="117">](https://github.com/luarmr) | [<img alt="raulibanez" src="https://avatars.githubusercontent.com/u/1070825?v=4&s=117" width="117">](https://github.com/raulibanez) | [<img alt="refo" src="https://avatars.githubusercontent.com/u/1114116?v=4&s=117" width="117">](https://github.com/refo) | [<img alt="SxDx" src="https://avatars.githubusercontent.com/u/2004247?v=4&s=117" width="117">](https://github.com/SxDx) |
| :---------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------: |
| [geertclerx](https://github.com/geertclerx) | [eman8519](https://github.com/eman8519) | [luarmr](https://github.com/luarmr) | [raulibanez](https://github.com/raulibanez) | [refo](https://github.com/refo) | [SxDx](https://github.com/SxDx) |
[<img alt="robwilson1" src="https://avatars.githubusercontent.com/u/7114944?v=4&s=117" width="117">](https://github.com/robwilson1) |[<img alt="scherroman" src="https://avatars.githubusercontent.com/u/7923938?v=4&s=117" width="117">](https://github.com/scherroman) |[<img alt="neuronet77" src="https://avatars.githubusercontent.com/u/4220037?v=4&s=117" width="117">](https://github.com/neuronet77) |[<img alt="Pzoco" src="https://avatars.githubusercontent.com/u/3101348?v=4&s=117" width="117">](https://github.com/Pzoco) |[<img alt="ppadmavilasom" src="https://avatars.githubusercontent.com/u/11167452?v=4&s=117" width="117">](https://github.com/ppadmavilasom) |[<img alt="phillipalexander" src="https://avatars.githubusercontent.com/u/1577682?v=4&s=117" width="117">](https://github.com/phillipalexander) |
:---: |:---: |:---: |:---: |:---: |:---: |
[robwilson1](https://github.com/robwilson1) |[scherroman](https://github.com/scherroman) |[neuronet77](https://github.com/neuronet77) |[Pzoco](https://github.com/Pzoco) |[ppadmavilasom](https://github.com/ppadmavilasom) |[phillipalexander](https://github.com/phillipalexander) |
| [<img alt="robwilson1" src="https://avatars.githubusercontent.com/u/7114944?v=4&s=117" width="117">](https://github.com/robwilson1) | [<img alt="scherroman" src="https://avatars.githubusercontent.com/u/7923938?v=4&s=117" width="117">](https://github.com/scherroman) | [<img alt="neuronet77" src="https://avatars.githubusercontent.com/u/4220037?v=4&s=117" width="117">](https://github.com/neuronet77) | [<img alt="Pzoco" src="https://avatars.githubusercontent.com/u/3101348?v=4&s=117" width="117">](https://github.com/Pzoco) | [<img alt="ppadmavilasom" src="https://avatars.githubusercontent.com/u/11167452?v=4&s=117" width="117">](https://github.com/ppadmavilasom) | [<img alt="phillipalexander" src="https://avatars.githubusercontent.com/u/1577682?v=4&s=117" width="117">](https://github.com/phillipalexander) |
| :---------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------: |
| [robwilson1](https://github.com/robwilson1) | [scherroman](https://github.com/scherroman) | [neuronet77](https://github.com/neuronet77) | [Pzoco](https://github.com/Pzoco) | [ppadmavilasom](https://github.com/ppadmavilasom) | [phillipalexander](https://github.com/phillipalexander) |
[<img alt="pmusaraj" src="https://avatars.githubusercontent.com/u/368961?v=4&s=117" width="117">](https://github.com/pmusaraj) |[<img alt="pedrofs" src="https://avatars.githubusercontent.com/u/56484?v=4&s=117" width="117">](https://github.com/pedrofs) |[<img alt="plneto" src="https://avatars.githubusercontent.com/u/5697434?v=4&s=117" width="117">](https://github.com/plneto) |[<img alt="patricklindsay" src="https://avatars.githubusercontent.com/u/7923681?v=4&s=117" width="117">](https://github.com/patricklindsay) |[<img alt="pascalwengerter" src="https://avatars.githubusercontent.com/u/16822008?v=4&s=117" width="117">](https://github.com/pascalwengerter) |[<img alt="ParsaArvanehPA" src="https://avatars.githubusercontent.com/u/62149413?v=4&s=117" width="117">](https://github.com/ParsaArvanehPA) |
:---: |:---: |:---: |:---: |:---: |:---: |
[pmusaraj](https://github.com/pmusaraj) |[pedrofs](https://github.com/pedrofs) |[plneto](https://github.com/plneto) |[patricklindsay](https://github.com/patricklindsay) |[pascalwengerter](https://github.com/pascalwengerter) |[ParsaArvanehPA](https://github.com/ParsaArvanehPA) |
| [<img alt="pmusaraj" src="https://avatars.githubusercontent.com/u/368961?v=4&s=117" width="117">](https://github.com/pmusaraj) | [<img alt="pedrofs" src="https://avatars.githubusercontent.com/u/56484?v=4&s=117" width="117">](https://github.com/pedrofs) | [<img alt="plneto" src="https://avatars.githubusercontent.com/u/5697434?v=4&s=117" width="117">](https://github.com/plneto) | [<img alt="patricklindsay" src="https://avatars.githubusercontent.com/u/7923681?v=4&s=117" width="117">](https://github.com/patricklindsay) | [<img alt="pascalwengerter" src="https://avatars.githubusercontent.com/u/16822008?v=4&s=117" width="117">](https://github.com/pascalwengerter) | [<img alt="ParsaArvanehPA" src="https://avatars.githubusercontent.com/u/62149413?v=4&s=117" width="117">](https://github.com/ParsaArvanehPA) |
| :----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------: |
| [pmusaraj](https://github.com/pmusaraj) | [pedrofs](https://github.com/pedrofs) | [plneto](https://github.com/plneto) | [patricklindsay](https://github.com/patricklindsay) | [pascalwengerter](https://github.com/pascalwengerter) | [ParsaArvanehPA](https://github.com/ParsaArvanehPA) |
[<img alt="taj" src="https://avatars.githubusercontent.com/u/16062635?v=4&s=117" width="117">](https://github.com/taj) |[<img alt="strayer" src="https://avatars.githubusercontent.com/u/310624?v=4&s=117" width="117">](https://github.com/strayer) |[<img alt="sjauld" src="https://avatars.githubusercontent.com/u/8232503?v=4&s=117" width="117">](https://github.com/sjauld) |[<img alt="steverob" src="https://avatars.githubusercontent.com/u/1220480?v=4&s=117" width="117">](https://github.com/steverob) |[<img alt="amaitu" src="https://avatars.githubusercontent.com/u/15688439?v=4&s=117" width="117">](https://github.com/amaitu) |[<img alt="quigebo" src="https://avatars.githubusercontent.com/u/741?v=4&s=117" width="117">](https://github.com/quigebo) |
:---: |:---: |:---: |:---: |:---: |:---: |
[taj](https://github.com/taj) |[strayer](https://github.com/strayer) |[sjauld](https://github.com/sjauld) |[steverob](https://github.com/steverob) |[amaitu](https://github.com/amaitu) |[quigebo](https://github.com/quigebo) |
| [<img alt="taj" src="https://avatars.githubusercontent.com/u/16062635?v=4&s=117" width="117">](https://github.com/taj) | [<img alt="strayer" src="https://avatars.githubusercontent.com/u/310624?v=4&s=117" width="117">](https://github.com/strayer) | [<img alt="sjauld" src="https://avatars.githubusercontent.com/u/8232503?v=4&s=117" width="117">](https://github.com/sjauld) | [<img alt="steverob" src="https://avatars.githubusercontent.com/u/1220480?v=4&s=117" width="117">](https://github.com/steverob) | [<img alt="amaitu" src="https://avatars.githubusercontent.com/u/15688439?v=4&s=117" width="117">](https://github.com/amaitu) | [<img alt="quigebo" src="https://avatars.githubusercontent.com/u/741?v=4&s=117" width="117">](https://github.com/quigebo) |
| :--------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------: |
| [taj](https://github.com/taj) | [strayer](https://github.com/strayer) | [sjauld](https://github.com/sjauld) | [steverob](https://github.com/steverob) | [amaitu](https://github.com/amaitu) | [quigebo](https://github.com/quigebo) |
[<img alt="waptik" src="https://avatars.githubusercontent.com/u/1687551?v=4&s=117" width="117">](https://github.com/waptik) |[<img alt="SpazzMarticus" src="https://avatars.githubusercontent.com/u/5716457?v=4&s=117" width="117">](https://github.com/SpazzMarticus) |[<img alt="szh" src="https://avatars.githubusercontent.com/u/546965?v=4&s=117" width="117">](https://github.com/szh) |[<img alt="sergei-zelinsky" src="https://avatars.githubusercontent.com/u/19428086?v=4&s=117" width="117">](https://github.com/sergei-zelinsky) |[<img alt="sebasegovia01" src="https://avatars.githubusercontent.com/u/35777287?v=4&s=117" width="117">](https://github.com/sebasegovia01) |[<img alt="sdebacker" src="https://avatars.githubusercontent.com/u/134503?v=4&s=117" width="117">](https://github.com/sdebacker) |
:---: |:---: |:---: |:---: |:---: |:---: |
[waptik](https://github.com/waptik) |[SpazzMarticus](https://github.com/SpazzMarticus) |[szh](https://github.com/szh) |[sergei-zelinsky](https://github.com/sergei-zelinsky) |[sebasegovia01](https://github.com/sebasegovia01) |[sdebacker](https://github.com/sdebacker) |
| [<img alt="waptik" src="https://avatars.githubusercontent.com/u/1687551?v=4&s=117" width="117">](https://github.com/waptik) | [<img alt="SpazzMarticus" src="https://avatars.githubusercontent.com/u/5716457?v=4&s=117" width="117">](https://github.com/SpazzMarticus) | [<img alt="szh" src="https://avatars.githubusercontent.com/u/546965?v=4&s=117" width="117">](https://github.com/szh) | [<img alt="sergei-zelinsky" src="https://avatars.githubusercontent.com/u/19428086?v=4&s=117" width="117">](https://github.com/sergei-zelinsky) | [<img alt="sebasegovia01" src="https://avatars.githubusercontent.com/u/35777287?v=4&s=117" width="117">](https://github.com/sebasegovia01) | [<img alt="sdebacker" src="https://avatars.githubusercontent.com/u/134503?v=4&s=117" width="117">](https://github.com/sdebacker) |
| :-------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: |
| [waptik](https://github.com/waptik) | [SpazzMarticus](https://github.com/SpazzMarticus) | [szh](https://github.com/szh) | [sergei-zelinsky](https://github.com/sergei-zelinsky) | [sebasegovia01](https://github.com/sebasegovia01) | [sdebacker](https://github.com/sdebacker) |
[<img alt="samuelcolburn" src="https://avatars.githubusercontent.com/u/9741902?v=4&s=117" width="117">](https://github.com/samuelcolburn) |[<img alt="fortunto2" src="https://avatars.githubusercontent.com/u/1236751?v=4&s=117" width="117">](https://github.com/fortunto2) |[<img alt="GNURub" src="https://avatars.githubusercontent.com/u/1318648?v=4&s=117" width="117">](https://github.com/GNURub) |[<img alt="rart" src="https://avatars.githubusercontent.com/u/3928341?v=4&s=117" width="117">](https://github.com/rart) |[<img alt="rossng" src="https://avatars.githubusercontent.com/u/565371?v=4&s=117" width="117">](https://github.com/rossng) |[<img alt="mkopinsky" src="https://avatars.githubusercontent.com/u/591435?v=4&s=117" width="117">](https://github.com/mkopinsky) |
:---: |:---: |:---: |:---: |:---: |:---: |
[samuelcolburn](https://github.com/samuelcolburn) |[fortunto2](https://github.com/fortunto2) |[GNURub](https://github.com/GNURub) |[rart](https://github.com/rart) |[rossng](https://github.com/rossng) |[mkopinsky](https://github.com/mkopinsky) |
| [<img alt="samuelcolburn" src="https://avatars.githubusercontent.com/u/9741902?v=4&s=117" width="117">](https://github.com/samuelcolburn) | [<img alt="fortunto2" src="https://avatars.githubusercontent.com/u/1236751?v=4&s=117" width="117">](https://github.com/fortunto2) | [<img alt="GNURub" src="https://avatars.githubusercontent.com/u/1318648?v=4&s=117" width="117">](https://github.com/GNURub) | [<img alt="rart" src="https://avatars.githubusercontent.com/u/3928341?v=4&s=117" width="117">](https://github.com/rart) | [<img alt="rossng" src="https://avatars.githubusercontent.com/u/565371?v=4&s=117" width="117">](https://github.com/rossng) | [<img alt="mkopinsky" src="https://avatars.githubusercontent.com/u/591435?v=4&s=117" width="117">](https://github.com/mkopinsky) |
| :---------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: |
| [samuelcolburn](https://github.com/samuelcolburn) | [fortunto2](https://github.com/fortunto2) | [GNURub](https://github.com/GNURub) | [rart](https://github.com/rart) | [rossng](https://github.com/rossng) | [mkopinsky](https://github.com/mkopinsky) |
[<img alt="mhulet" src="https://avatars.githubusercontent.com/u/293355?v=4&s=117" width="117">](https://github.com/mhulet) |[<img alt="hrsh" src="https://avatars.githubusercontent.com/u/1929359?v=4&s=117" width="117">](https://github.com/hrsh) |[<img alt="mauricioribeiro" src="https://avatars.githubusercontent.com/u/2589856?v=4&s=117" width="117">](https://github.com/mauricioribeiro) |[<img alt="matthewhartstonge" src="https://avatars.githubusercontent.com/u/6119549?v=4&s=117" width="117">](https://github.com/matthewhartstonge) |[<img alt="mjesuele" src="https://avatars.githubusercontent.com/u/871117?v=4&s=117" width="117">](https://github.com/mjesuele) |[<img alt="mattfik" src="https://avatars.githubusercontent.com/u/1638028?v=4&s=117" width="117">](https://github.com/mattfik) |
:---: |:---: |:---: |:---: |:---: |:---: |
[mhulet](https://github.com/mhulet) |[hrsh](https://github.com/hrsh) |[mauricioribeiro](https://github.com/mauricioribeiro) |[matthewhartstonge](https://github.com/matthewhartstonge) |[mjesuele](https://github.com/mjesuele) |[mattfik](https://github.com/mattfik) |
| [<img alt="mhulet" src="https://avatars.githubusercontent.com/u/293355?v=4&s=117" width="117">](https://github.com/mhulet) | [<img alt="hrsh" src="https://avatars.githubusercontent.com/u/1929359?v=4&s=117" width="117">](https://github.com/hrsh) | [<img alt="mauricioribeiro" src="https://avatars.githubusercontent.com/u/2589856?v=4&s=117" width="117">](https://github.com/mauricioribeiro) | [<img alt="matthewhartstonge" src="https://avatars.githubusercontent.com/u/6119549?v=4&s=117" width="117">](https://github.com/matthewhartstonge) | [<img alt="mjesuele" src="https://avatars.githubusercontent.com/u/871117?v=4&s=117" width="117">](https://github.com/mjesuele) | [<img alt="mattfik" src="https://avatars.githubusercontent.com/u/1638028?v=4&s=117" width="117">](https://github.com/mattfik) |
| :------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: |
| [mhulet](https://github.com/mhulet) | [hrsh](https://github.com/hrsh) | [mauricioribeiro](https://github.com/mauricioribeiro) | [matthewhartstonge](https://github.com/matthewhartstonge) | [mjesuele](https://github.com/mjesuele) | [mattfik](https://github.com/mattfik) |
[<img alt="mateuscruz" src="https://avatars.githubusercontent.com/u/8962842?v=4&s=117" width="117">](https://github.com/mateuscruz) |[<img alt="masumulu28" src="https://avatars.githubusercontent.com/u/49063256?v=4&s=117" width="117">](https://github.com/masumulu28) |[<img alt="masaok" src="https://avatars.githubusercontent.com/u/1320083?v=4&s=117" width="117">](https://github.com/masaok) |[<img alt="martin-brennan" src="https://avatars.githubusercontent.com/u/920448?v=4&s=117" width="117">](https://github.com/martin-brennan) |[<img alt="marcusforsberg" src="https://avatars.githubusercontent.com/u/1009069?v=4&s=117" width="117">](https://github.com/marcusforsberg) |[<img alt="marcosthejew" src="https://avatars.githubusercontent.com/u/1500967?v=4&s=117" width="117">](https://github.com/marcosthejew) |
:---: |:---: |:---: |:---: |:---: |:---: |
[mateuscruz](https://github.com/mateuscruz) |[masumulu28](https://github.com/masumulu28) |[masaok](https://github.com/masaok) |[martin-brennan](https://github.com/martin-brennan) |[marcusforsberg](https://github.com/marcusforsberg) |[marcosthejew](https://github.com/marcosthejew) |
| [<img alt="mateuscruz" src="https://avatars.githubusercontent.com/u/8962842?v=4&s=117" width="117">](https://github.com/mateuscruz) | [<img alt="masumulu28" src="https://avatars.githubusercontent.com/u/49063256?v=4&s=117" width="117">](https://github.com/masumulu28) | [<img alt="masaok" src="https://avatars.githubusercontent.com/u/1320083?v=4&s=117" width="117">](https://github.com/masaok) | [<img alt="martin-brennan" src="https://avatars.githubusercontent.com/u/920448?v=4&s=117" width="117">](https://github.com/martin-brennan) | [<img alt="marcusforsberg" src="https://avatars.githubusercontent.com/u/1009069?v=4&s=117" width="117">](https://github.com/marcusforsberg) | [<img alt="marcosthejew" src="https://avatars.githubusercontent.com/u/1500967?v=4&s=117" width="117">](https://github.com/marcosthejew) |
| :---------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: |
| [mateuscruz](https://github.com/mateuscruz) | [masumulu28](https://github.com/masumulu28) | [masaok](https://github.com/masaok) | [martin-brennan](https://github.com/martin-brennan) | [marcusforsberg](https://github.com/marcusforsberg) | [marcosthejew](https://github.com/marcosthejew) |
[<img alt="mperrando" src="https://avatars.githubusercontent.com/u/525572?v=4&s=117" width="117">](https://github.com/mperrando) |[<img alt="onhate" src="https://avatars.githubusercontent.com/u/980905?v=4&s=117" width="117">](https://github.com/onhate) |[<img alt="marc-mabe" src="https://avatars.githubusercontent.com/u/302689?v=4&s=117" width="117">](https://github.com/marc-mabe) |[<img alt="Lucklj521" src="https://avatars.githubusercontent.com/u/93632042?v=4&s=117" width="117">](https://github.com/Lucklj521) |[<img alt="cryptic022" src="https://avatars.githubusercontent.com/u/18145703?v=4&s=117" width="117">](https://github.com/cryptic022) |[<img alt="Ozodbek1405" src="https://avatars.githubusercontent.com/u/86141593?v=4&s=117" width="117">](https://github.com/Ozodbek1405) |
:---: |:---: |:---: |:---: |:---: |:---: |
[mperrando](https://github.com/mperrando) |[onhate](https://github.com/onhate) |[marc-mabe](https://github.com/marc-mabe) |[Lucklj521](https://github.com/Lucklj521) |[cryptic022](https://github.com/cryptic022) |[Ozodbek1405](https://github.com/Ozodbek1405) |
| [<img alt="mperrando" src="https://avatars.githubusercontent.com/u/525572?v=4&s=117" width="117">](https://github.com/mperrando) | [<img alt="onhate" src="https://avatars.githubusercontent.com/u/980905?v=4&s=117" width="117">](https://github.com/onhate) | [<img alt="marc-mabe" src="https://avatars.githubusercontent.com/u/302689?v=4&s=117" width="117">](https://github.com/marc-mabe) | [<img alt="Lucklj521" src="https://avatars.githubusercontent.com/u/93632042?v=4&s=117" width="117">](https://github.com/Lucklj521) | [<img alt="cryptic022" src="https://avatars.githubusercontent.com/u/18145703?v=4&s=117" width="117">](https://github.com/cryptic022) | [<img alt="Ozodbek1405" src="https://avatars.githubusercontent.com/u/86141593?v=4&s=117" width="117">](https://github.com/Ozodbek1405) |
| :------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: |
| [mperrando](https://github.com/mperrando) | [onhate](https://github.com/onhate) | [marc-mabe](https://github.com/marc-mabe) | [Lucklj521](https://github.com/Lucklj521) | [cryptic022](https://github.com/cryptic022) | [Ozodbek1405](https://github.com/Ozodbek1405) |
[<img alt="leftdevel" src="https://avatars.githubusercontent.com/u/843337?v=4&s=117" width="117">](https://github.com/leftdevel) |[<img alt="nil1511" src="https://avatars.githubusercontent.com/u/2058170?v=4&s=117" width="117">](https://github.com/nil1511) |[<img alt="coreprocess" src="https://avatars.githubusercontent.com/u/1226918?v=4&s=117" width="117">](https://github.com/coreprocess) |[<img alt="nicojones" src="https://avatars.githubusercontent.com/u/6078915?v=4&s=117" width="117">](https://github.com/nicojones) |[<img alt="trungcva10a6tn" src="https://avatars.githubusercontent.com/u/18293783?v=4&s=117" width="117">](https://github.com/trungcva10a6tn) |[<img alt="naveed-ahmad" src="https://avatars.githubusercontent.com/u/701567?v=4&s=117" width="117">](https://github.com/naveed-ahmad) |
:---: |:---: |:---: |:---: |:---: |:---: |
[leftdevel](https://github.com/leftdevel) |[nil1511](https://github.com/nil1511) |[coreprocess](https://github.com/coreprocess) |[nicojones](https://github.com/nicojones) |[trungcva10a6tn](https://github.com/trungcva10a6tn) |[naveed-ahmad](https://github.com/naveed-ahmad) |
| [<img alt="leftdevel" src="https://avatars.githubusercontent.com/u/843337?v=4&s=117" width="117">](https://github.com/leftdevel) | [<img alt="nil1511" src="https://avatars.githubusercontent.com/u/2058170?v=4&s=117" width="117">](https://github.com/nil1511) | [<img alt="coreprocess" src="https://avatars.githubusercontent.com/u/1226918?v=4&s=117" width="117">](https://github.com/coreprocess) | [<img alt="nicojones" src="https://avatars.githubusercontent.com/u/6078915?v=4&s=117" width="117">](https://github.com/nicojones) | [<img alt="trungcva10a6tn" src="https://avatars.githubusercontent.com/u/18293783?v=4&s=117" width="117">](https://github.com/trungcva10a6tn) | [<img alt="naveed-ahmad" src="https://avatars.githubusercontent.com/u/701567?v=4&s=117" width="117">](https://github.com/naveed-ahmad) |
| :------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: |
| [leftdevel](https://github.com/leftdevel) | [nil1511](https://github.com/nil1511) | [coreprocess](https://github.com/coreprocess) | [nicojones](https://github.com/nicojones) | [trungcva10a6tn](https://github.com/trungcva10a6tn) | [naveed-ahmad](https://github.com/naveed-ahmad) |
[<img alt="pleasespammelater" src="https://avatars.githubusercontent.com/u/11870394?v=4&s=117" width="117">](https://github.com/pleasespammelater) |[<img alt="marton-laszlo-attila" src="https://avatars.githubusercontent.com/u/73295321?v=4&s=117" width="117">](https://github.com/marton-laszlo-attila) |[<img alt="navruzm" src="https://avatars.githubusercontent.com/u/168341?v=4&s=117" width="117">](https://github.com/navruzm) |[<img alt="mogzol" src="https://avatars.githubusercontent.com/u/11789801?v=4&s=117" width="117">](https://github.com/mogzol) |[<img alt="shahimclt" src="https://avatars.githubusercontent.com/u/8318002?v=4&s=117" width="117">](https://github.com/shahimclt) |[<img alt="mnafees" src="https://avatars.githubusercontent.com/u/1763885?v=4&s=117" width="117">](https://github.com/mnafees) |
:---: |:---: |:---: |:---: |:---: |:---: |
[pleasespammelater](https://github.com/pleasespammelater) |[marton-laszlo-attila](https://github.com/marton-laszlo-attila) |[navruzm](https://github.com/navruzm) |[mogzol](https://github.com/mogzol) |[shahimclt](https://github.com/shahimclt) |[mnafees](https://github.com/mnafees) |
| [<img alt="pleasespammelater" src="https://avatars.githubusercontent.com/u/11870394?v=4&s=117" width="117">](https://github.com/pleasespammelater) | [<img alt="marton-laszlo-attila" src="https://avatars.githubusercontent.com/u/73295321?v=4&s=117" width="117">](https://github.com/marton-laszlo-attila) | [<img alt="navruzm" src="https://avatars.githubusercontent.com/u/168341?v=4&s=117" width="117">](https://github.com/navruzm) | [<img alt="mogzol" src="https://avatars.githubusercontent.com/u/11789801?v=4&s=117" width="117">](https://github.com/mogzol) | [<img alt="shahimclt" src="https://avatars.githubusercontent.com/u/8318002?v=4&s=117" width="117">](https://github.com/shahimclt) | [<img alt="mnafees" src="https://avatars.githubusercontent.com/u/1763885?v=4&s=117" width="117">](https://github.com/mnafees) |
| :------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: |
| [pleasespammelater](https://github.com/pleasespammelater) | [marton-laszlo-attila](https://github.com/marton-laszlo-attila) | [navruzm](https://github.com/navruzm) | [mogzol](https://github.com/mogzol) | [shahimclt](https://github.com/shahimclt) | [mnafees](https://github.com/mnafees) |
[<img alt="boudra" src="https://avatars.githubusercontent.com/u/711886?v=4&s=117" width="117">](https://github.com/boudra) |[<img alt="achmiral" src="https://avatars.githubusercontent.com/u/10906059?v=4&s=117" width="117">](https://github.com/achmiral) |[<img alt="ken-kuro" src="https://avatars.githubusercontent.com/u/47441476?v=4&s=117" width="117">](https://github.com/ken-kuro) |[<img alt="mosi-kha" src="https://avatars.githubusercontent.com/u/35611016?v=4&s=117" width="117">](https://github.com/mosi-kha) |[<img alt="maddy-jo" src="https://avatars.githubusercontent.com/u/3241493?v=4&s=117" width="117">](https://github.com/maddy-jo) |[<img alt="mdxiaohu" src="https://avatars.githubusercontent.com/u/42248614?v=4&s=117" width="117">](https://github.com/mdxiaohu) |
:---: |:---: |:---: |:---: |:---: |:---: |
[boudra](https://github.com/boudra) |[achmiral](https://github.com/achmiral) |[ken-kuro](https://github.com/ken-kuro) |[mosi-kha](https://github.com/mosi-kha) |[maddy-jo](https://github.com/maddy-jo) |[mdxiaohu](https://github.com/mdxiaohu) |
| [<img alt="boudra" src="https://avatars.githubusercontent.com/u/711886?v=4&s=117" width="117">](https://github.com/boudra) | [<img alt="achmiral" src="https://avatars.githubusercontent.com/u/10906059?v=4&s=117" width="117">](https://github.com/achmiral) | [<img alt="ken-kuro" src="https://avatars.githubusercontent.com/u/47441476?v=4&s=117" width="117">](https://github.com/ken-kuro) | [<img alt="mosi-kha" src="https://avatars.githubusercontent.com/u/35611016?v=4&s=117" width="117">](https://github.com/mosi-kha) | [<img alt="maddy-jo" src="https://avatars.githubusercontent.com/u/3241493?v=4&s=117" width="117">](https://github.com/maddy-jo) | [<img alt="mdxiaohu" src="https://avatars.githubusercontent.com/u/42248614?v=4&s=117" width="117">](https://github.com/mdxiaohu) |
| :------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: |
| [boudra](https://github.com/boudra) | [achmiral](https://github.com/achmiral) | [ken-kuro](https://github.com/ken-kuro) | [mosi-kha](https://github.com/mosi-kha) | [maddy-jo](https://github.com/maddy-jo) | [mdxiaohu](https://github.com/mdxiaohu) |
[<img alt="magumbo" src="https://avatars.githubusercontent.com/u/6683765?v=4&s=117" width="117">](https://github.com/magumbo) |[<img alt="jx-zyf" src="https://avatars.githubusercontent.com/u/26456842?v=4&s=117" width="117">](https://github.com/jx-zyf) |[<img alt="kode-ninja" src="https://avatars.githubusercontent.com/u/7857611?v=4&s=117" width="117">](https://github.com/kode-ninja) |[<img alt="sontixyou" src="https://avatars.githubusercontent.com/u/19817196?v=4&s=117" width="117">](https://github.com/sontixyou) |[<img alt="jur-ng" src="https://avatars.githubusercontent.com/u/111122756?v=4&s=117" width="117">](https://github.com/jur-ng) |[<img alt="johnmanjiro13" src="https://avatars.githubusercontent.com/u/28798279?v=4&s=117" width="117">](https://github.com/johnmanjiro13) |
:---: |:---: |:---: |:---: |:---: |:---: |
[magumbo](https://github.com/magumbo) |[jx-zyf](https://github.com/jx-zyf) |[kode-ninja](https://github.com/kode-ninja) |[sontixyou](https://github.com/sontixyou) |[jur-ng](https://github.com/jur-ng) |[johnmanjiro13](https://github.com/johnmanjiro13) |
| [<img alt="magumbo" src="https://avatars.githubusercontent.com/u/6683765?v=4&s=117" width="117">](https://github.com/magumbo) | [<img alt="jx-zyf" src="https://avatars.githubusercontent.com/u/26456842?v=4&s=117" width="117">](https://github.com/jx-zyf) | [<img alt="kode-ninja" src="https://avatars.githubusercontent.com/u/7857611?v=4&s=117" width="117">](https://github.com/kode-ninja) | [<img alt="sontixyou" src="https://avatars.githubusercontent.com/u/19817196?v=4&s=117" width="117">](https://github.com/sontixyou) | [<img alt="jur-ng" src="https://avatars.githubusercontent.com/u/111122756?v=4&s=117" width="117">](https://github.com/jur-ng) | [<img alt="johnmanjiro13" src="https://avatars.githubusercontent.com/u/28798279?v=4&s=117" width="117">](https://github.com/johnmanjiro13) |
| :---------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: |
| [magumbo](https://github.com/magumbo) | [jx-zyf](https://github.com/jx-zyf) | [kode-ninja](https://github.com/kode-ninja) | [sontixyou](https://github.com/sontixyou) | [jur-ng](https://github.com/jur-ng) | [johnmanjiro13](https://github.com/johnmanjiro13) |
[<img alt="jyoungblood" src="https://avatars.githubusercontent.com/u/56104?v=4&s=117" width="117">](https://github.com/jyoungblood) |[<img alt="green-mike" src="https://avatars.githubusercontent.com/u/5584225?v=4&s=117" width="117">](https://github.com/green-mike) |[<img alt="gaelicwinter" src="https://avatars.githubusercontent.com/u/6510266?v=4&s=117" width="117">](https://github.com/gaelicwinter) |[<img alt="franckl" src="https://avatars.githubusercontent.com/u/3875803?v=4&s=117" width="117">](https://github.com/franckl) |[<img alt="fingul" src="https://avatars.githubusercontent.com/u/894739?v=4&s=117" width="117">](https://github.com/fingul) |[<img alt="elliotsayes" src="https://avatars.githubusercontent.com/u/7699058?v=4&s=117" width="117">](https://github.com/elliotsayes) |
:---: |:---: |:---: |:---: |:---: |:---: |
[jyoungblood](https://github.com/jyoungblood) |[green-mike](https://github.com/green-mike) |[gaelicwinter](https://github.com/gaelicwinter) |[franckl](https://github.com/franckl) |[fingul](https://github.com/fingul) |[elliotsayes](https://github.com/elliotsayes) |
| [<img alt="jyoungblood" src="https://avatars.githubusercontent.com/u/56104?v=4&s=117" width="117">](https://github.com/jyoungblood) | [<img alt="green-mike" src="https://avatars.githubusercontent.com/u/5584225?v=4&s=117" width="117">](https://github.com/green-mike) | [<img alt="gaelicwinter" src="https://avatars.githubusercontent.com/u/6510266?v=4&s=117" width="117">](https://github.com/gaelicwinter) | [<img alt="franckl" src="https://avatars.githubusercontent.com/u/3875803?v=4&s=117" width="117">](https://github.com/franckl) | [<img alt="fingul" src="https://avatars.githubusercontent.com/u/894739?v=4&s=117" width="117">](https://github.com/fingul) | [<img alt="elliotsayes" src="https://avatars.githubusercontent.com/u/7699058?v=4&s=117" width="117">](https://github.com/elliotsayes) |
| :---------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: |
| [jyoungblood](https://github.com/jyoungblood) | [green-mike](https://github.com/green-mike) | [gaelicwinter](https://github.com/gaelicwinter) | [franckl](https://github.com/franckl) | [fingul](https://github.com/fingul) | [elliotsayes](https://github.com/elliotsayes) |
[<img alt="dzcpy" src="https://avatars.githubusercontent.com/u/203980?v=4&s=117" width="117">](https://github.com/dzcpy) |[<img alt="xhocquet" src="https://avatars.githubusercontent.com/u/8116516?v=4&s=117" width="117">](https://github.com/xhocquet) |[<img alt="JimmyLv" src="https://avatars.githubusercontent.com/u/4997466?v=4&s=117" width="117">](https://github.com/JimmyLv) |[<img alt="zanzlender" src="https://avatars.githubusercontent.com/u/44570474?v=4&s=117" width="117">](https://github.com/zanzlender) |[<img alt="olitomas" src="https://avatars.githubusercontent.com/u/6918659?v=4&s=117" width="117">](https://github.com/olitomas) |[<img alt="yoann-hellopret" src="https://avatars.githubusercontent.com/u/46525558?v=4&s=117" width="117">](https://github.com/yoann-hellopret) |
:---: |:---: |:---: |:---: |:---: |:---: |
[dzcpy](https://github.com/dzcpy) |[xhocquet](https://github.com/xhocquet) |[JimmyLv](https://github.com/JimmyLv) |[zanzlender](https://github.com/zanzlender) |[olitomas](https://github.com/olitomas) |[yoann-hellopret](https://github.com/yoann-hellopret) |
| [<img alt="dzcpy" src="https://avatars.githubusercontent.com/u/203980?v=4&s=117" width="117">](https://github.com/dzcpy) | [<img alt="xhocquet" src="https://avatars.githubusercontent.com/u/8116516?v=4&s=117" width="117">](https://github.com/xhocquet) | [<img alt="JimmyLv" src="https://avatars.githubusercontent.com/u/4997466?v=4&s=117" width="117">](https://github.com/JimmyLv) | [<img alt="zanzlender" src="https://avatars.githubusercontent.com/u/44570474?v=4&s=117" width="117">](https://github.com/zanzlender) | [<img alt="olitomas" src="https://avatars.githubusercontent.com/u/6918659?v=4&s=117" width="117">](https://github.com/olitomas) | [<img alt="yoann-hellopret" src="https://avatars.githubusercontent.com/u/46525558?v=4&s=117" width="117">](https://github.com/yoann-hellopret) |
| :----------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------: |
| [dzcpy](https://github.com/dzcpy) | [xhocquet](https://github.com/xhocquet) | [JimmyLv](https://github.com/JimmyLv) | [zanzlender](https://github.com/zanzlender) | [olitomas](https://github.com/olitomas) | [yoann-hellopret](https://github.com/yoann-hellopret) |
[<img alt="vedran555" src="https://avatars.githubusercontent.com/u/38395951?v=4&s=117" width="117">](https://github.com/vedran555) |[<img alt="tusharjkhunt" src="https://avatars.githubusercontent.com/u/31904234?v=4&s=117" width="117">](https://github.com/tusharjkhunt) |[<img alt="thanhthot" src="https://avatars.githubusercontent.com/u/50633205?v=4&s=117" width="117">](https://github.com/thanhthot) |[<img alt="stduhpf" src="https://avatars.githubusercontent.com/u/28208228?v=4&s=117" width="117">](https://github.com/stduhpf) |[<img alt="slawexxx44" src="https://avatars.githubusercontent.com/u/11180644?v=4&s=117" width="117">](https://github.com/slawexxx44) |[<img alt="rtaieb" src="https://avatars.githubusercontent.com/u/35224301?v=4&s=117" width="117">](https://github.com/rtaieb) |
:---: |:---: |:---: |:---: |:---: |:---: |
[vedran555](https://github.com/vedran555) |[tusharjkhunt](https://github.com/tusharjkhunt) |[thanhthot](https://github.com/thanhthot) |[stduhpf](https://github.com/stduhpf) |[slawexxx44](https://github.com/slawexxx44) |[rtaieb](https://github.com/rtaieb) |
| [<img alt="vedran555" src="https://avatars.githubusercontent.com/u/38395951?v=4&s=117" width="117">](https://github.com/vedran555) | [<img alt="tusharjkhunt" src="https://avatars.githubusercontent.com/u/31904234?v=4&s=117" width="117">](https://github.com/tusharjkhunt) | [<img alt="thanhthot" src="https://avatars.githubusercontent.com/u/50633205?v=4&s=117" width="117">](https://github.com/thanhthot) | [<img alt="stduhpf" src="https://avatars.githubusercontent.com/u/28208228?v=4&s=117" width="117">](https://github.com/stduhpf) | [<img alt="slawexxx44" src="https://avatars.githubusercontent.com/u/11180644?v=4&s=117" width="117">](https://github.com/slawexxx44) | [<img alt="rtaieb" src="https://avatars.githubusercontent.com/u/35224301?v=4&s=117" width="117">](https://github.com/rtaieb) |
| :--------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: |
| [vedran555](https://github.com/vedran555) | [tusharjkhunt](https://github.com/tusharjkhunt) | [thanhthot](https://github.com/thanhthot) | [stduhpf](https://github.com/stduhpf) | [slawexxx44](https://github.com/slawexxx44) | [rtaieb](https://github.com/rtaieb) |
[<img alt="rmoura-92" src="https://avatars.githubusercontent.com/u/419044?v=4&s=117" width="117">](https://github.com/rmoura-92) |[<img alt="rlebosse" src="https://avatars.githubusercontent.com/u/2794137?v=4&s=117" width="117">](https://github.com/rlebosse) |[<img alt="rhymes" src="https://avatars.githubusercontent.com/u/146201?v=4&s=117" width="117">](https://github.com/rhymes) |[<img alt="luntta" src="https://avatars.githubusercontent.com/u/14221637?v=4&s=117" width="117">](https://github.com/luntta) |[<img alt="phil714" src="https://avatars.githubusercontent.com/u/7584581?v=4&s=117" width="117">](https://github.com/phil714) |[<img alt="ordago" src="https://avatars.githubusercontent.com/u/6376814?v=4&s=117" width="117">](https://github.com/ordago) |
:---: |:---: |:---: |:---: |:---: |:---: |
[rmoura-92](https://github.com/rmoura-92) |[rlebosse](https://github.com/rlebosse) |[rhymes](https://github.com/rhymes) |[luntta](https://github.com/luntta) |[phil714](https://github.com/phil714) |[ordago](https://github.com/ordago) |
| [<img alt="rmoura-92" src="https://avatars.githubusercontent.com/u/419044?v=4&s=117" width="117">](https://github.com/rmoura-92) | [<img alt="rlebosse" src="https://avatars.githubusercontent.com/u/2794137?v=4&s=117" width="117">](https://github.com/rlebosse) | [<img alt="rhymes" src="https://avatars.githubusercontent.com/u/146201?v=4&s=117" width="117">](https://github.com/rhymes) | [<img alt="luntta" src="https://avatars.githubusercontent.com/u/14221637?v=4&s=117" width="117">](https://github.com/luntta) | [<img alt="phil714" src="https://avatars.githubusercontent.com/u/7584581?v=4&s=117" width="117">](https://github.com/phil714) | [<img alt="ordago" src="https://avatars.githubusercontent.com/u/6376814?v=4&s=117" width="117">](https://github.com/ordago) |
| :------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: |
| [rmoura-92](https://github.com/rmoura-92) | [rlebosse](https://github.com/rlebosse) | [rhymes](https://github.com/rhymes) | [luntta](https://github.com/luntta) | [phil714](https://github.com/phil714) | [ordago](https://github.com/ordago) |
[<img alt="odselsevier" src="https://avatars.githubusercontent.com/u/95745934?v=4&s=117" width="117">](https://github.com/odselsevier) |[<img alt="ninesalt" src="https://avatars.githubusercontent.com/u/7952255?v=4&s=117" width="117">](https://github.com/ninesalt) |[<img alt="willycamargo" src="https://avatars.githubusercontent.com/u/5041887?v=4&s=117" width="117">](https://github.com/willycamargo) |[<img alt="weston-sankey-mark43" src="https://avatars.githubusercontent.com/u/97678695?v=4&s=117" width="117">](https://github.com/weston-sankey-mark43) |[<img alt="dwnste" src="https://avatars.githubusercontent.com/u/17119722?v=4&s=117" width="117">](https://github.com/dwnste) |[<img alt="nagyv" src="https://avatars.githubusercontent.com/u/126671?v=4&s=117" width="117">](https://github.com/nagyv) |
:---: |:---: |:---: |:---: |:---: |:---: |
[odselsevier](https://github.com/odselsevier) |[ninesalt](https://github.com/ninesalt) |[willycamargo](https://github.com/willycamargo) |[weston-sankey-mark43](https://github.com/weston-sankey-mark43) |[dwnste](https://github.com/dwnste) |[nagyv](https://github.com/nagyv) |
| [<img alt="odselsevier" src="https://avatars.githubusercontent.com/u/95745934?v=4&s=117" width="117">](https://github.com/odselsevier) | [<img alt="ninesalt" src="https://avatars.githubusercontent.com/u/7952255?v=4&s=117" width="117">](https://github.com/ninesalt) | [<img alt="willycamargo" src="https://avatars.githubusercontent.com/u/5041887?v=4&s=117" width="117">](https://github.com/willycamargo) | [<img alt="weston-sankey-mark43" src="https://avatars.githubusercontent.com/u/97678695?v=4&s=117" width="117">](https://github.com/weston-sankey-mark43) | [<img alt="dwnste" src="https://avatars.githubusercontent.com/u/17119722?v=4&s=117" width="117">](https://github.com/dwnste) | [<img alt="nagyv" src="https://avatars.githubusercontent.com/u/126671?v=4&s=117" width="117">](https://github.com/nagyv) |
| :------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------: |
| [odselsevier](https://github.com/odselsevier) | [ninesalt](https://github.com/ninesalt) | [willycamargo](https://github.com/willycamargo) | [weston-sankey-mark43](https://github.com/weston-sankey-mark43) | [dwnste](https://github.com/dwnste) | [nagyv](https://github.com/nagyv) |
[<img alt="stiig" src="https://avatars.githubusercontent.com/u/8639922?v=4&s=117" width="117">](https://github.com/stiig) |[<img alt="valentinoli" src="https://avatars.githubusercontent.com/u/23453691?v=4&s=117" width="117">](https://github.com/valentinoli) |[<img alt="vially" src="https://avatars.githubusercontent.com/u/433598?v=4&s=117" width="117">](https://github.com/vially) |[<img alt="trivikr" src="https://avatars.githubusercontent.com/u/16024985?v=4&s=117" width="117">](https://github.com/trivikr) |[<img alt="top-master" src="https://avatars.githubusercontent.com/u/31405473?v=4&s=117" width="117">](https://github.com/top-master) |[<img alt="tvaliasek" src="https://avatars.githubusercontent.com/u/8644946?v=4&s=117" width="117">](https://github.com/tvaliasek) |
:---: |:---: |:---: |:---: |:---: |:---: |
[stiig](https://github.com/stiig) |[valentinoli](https://github.com/valentinoli) |[vially](https://github.com/vially) |[trivikr](https://github.com/trivikr) |[top-master](https://github.com/top-master) |[tvaliasek](https://github.com/tvaliasek) |
| [<img alt="stiig" src="https://avatars.githubusercontent.com/u/8639922?v=4&s=117" width="117">](https://github.com/stiig) | [<img alt="valentinoli" src="https://avatars.githubusercontent.com/u/23453691?v=4&s=117" width="117">](https://github.com/valentinoli) | [<img alt="vially" src="https://avatars.githubusercontent.com/u/433598?v=4&s=117" width="117">](https://github.com/vially) | [<img alt="trivikr" src="https://avatars.githubusercontent.com/u/16024985?v=4&s=117" width="117">](https://github.com/trivikr) | [<img alt="top-master" src="https://avatars.githubusercontent.com/u/31405473?v=4&s=117" width="117">](https://github.com/top-master) | [<img alt="tvaliasek" src="https://avatars.githubusercontent.com/u/8644946?v=4&s=117" width="117">](https://github.com/tvaliasek) |
| :-----------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: |
| [stiig](https://github.com/stiig) | [valentinoli](https://github.com/valentinoli) | [vially](https://github.com/vially) | [trivikr](https://github.com/trivikr) | [top-master](https://github.com/top-master) | [tvaliasek](https://github.com/tvaliasek) |
[<img alt="tomekp" src="https://avatars.githubusercontent.com/u/1856393?v=4&s=117" width="117">](https://github.com/tomekp) |[<img alt="tomsaleeba" src="https://avatars.githubusercontent.com/u/1773838?v=4&s=117" width="117">](https://github.com/tomsaleeba) |[<img alt="WIStudent" src="https://avatars.githubusercontent.com/u/2707930?v=4&s=117" width="117">](https://github.com/WIStudent) |[<img alt="tmaier" src="https://avatars.githubusercontent.com/u/350038?v=4&s=117" width="117">](https://github.com/tmaier) |[<img alt="twarlop" src="https://avatars.githubusercontent.com/u/2856082?v=4&s=117" width="117">](https://github.com/twarlop) |[<img alt="tcgj" src="https://avatars.githubusercontent.com/u/7994529?v=4&s=117" width="117">](https://github.com/tcgj) |
:---: |:---: |:---: |:---: |:---: |:---: |
[tomekp](https://github.com/tomekp) |[tomsaleeba](https://github.com/tomsaleeba) |[WIStudent](https://github.com/WIStudent) |[tmaier](https://github.com/tmaier) |[twarlop](https://github.com/twarlop) |[tcgj](https://github.com/tcgj) |
| [<img alt="tomekp" src="https://avatars.githubusercontent.com/u/1856393?v=4&s=117" width="117">](https://github.com/tomekp) | [<img alt="tomsaleeba" src="https://avatars.githubusercontent.com/u/1773838?v=4&s=117" width="117">](https://github.com/tomsaleeba) | [<img alt="WIStudent" src="https://avatars.githubusercontent.com/u/2707930?v=4&s=117" width="117">](https://github.com/WIStudent) | [<img alt="tmaier" src="https://avatars.githubusercontent.com/u/350038?v=4&s=117" width="117">](https://github.com/tmaier) | [<img alt="twarlop" src="https://avatars.githubusercontent.com/u/2856082?v=4&s=117" width="117">](https://github.com/twarlop) | [<img alt="tcgj" src="https://avatars.githubusercontent.com/u/7994529?v=4&s=117" width="117">](https://github.com/tcgj) |
| :-------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------: |
| [tomekp](https://github.com/tomekp) | [tomsaleeba](https://github.com/tomsaleeba) | [WIStudent](https://github.com/WIStudent) | [tmaier](https://github.com/tmaier) | [twarlop](https://github.com/twarlop) | [tcgj](https://github.com/tcgj) |
[<img alt="Tashows" src="https://avatars.githubusercontent.com/u/16656928?v=4&s=117" width="117">](https://github.com/Tashows) |[<img alt="dkisic" src="https://avatars.githubusercontent.com/u/32257921?v=4&s=117" width="117">](https://github.com/dkisic) |[<img alt="craigcbrunner" src="https://avatars.githubusercontent.com/u/2780521?v=4&s=117" width="117">](https://github.com/craigcbrunner) |[<img alt="codehero7386" src="https://avatars.githubusercontent.com/u/56253286?v=4&s=117" width="117">](https://github.com/codehero7386) |[<img alt="christianwengert" src="https://avatars.githubusercontent.com/u/12936057?v=4&s=117" width="117">](https://github.com/christianwengert) |[<img alt="cgoinglove" src="https://avatars.githubusercontent.com/u/86150470?v=4&s=117" width="117">](https://github.com/cgoinglove) |
:---: |:---: |:---: |:---: |:---: |:---: |
[Tashows](https://github.com/Tashows) |[dkisic](https://github.com/dkisic) |[craigcbrunner](https://github.com/craigcbrunner) |[codehero7386](https://github.com/codehero7386) |[christianwengert](https://github.com/christianwengert) |[cgoinglove](https://github.com/cgoinglove) |
| [<img alt="Tashows" src="https://avatars.githubusercontent.com/u/16656928?v=4&s=117" width="117">](https://github.com/Tashows) | [<img alt="dkisic" src="https://avatars.githubusercontent.com/u/32257921?v=4&s=117" width="117">](https://github.com/dkisic) | [<img alt="craigcbrunner" src="https://avatars.githubusercontent.com/u/2780521?v=4&s=117" width="117">](https://github.com/craigcbrunner) | [<img alt="codehero7386" src="https://avatars.githubusercontent.com/u/56253286?v=4&s=117" width="117">](https://github.com/codehero7386) | [<img alt="christianwengert" src="https://avatars.githubusercontent.com/u/12936057?v=4&s=117" width="117">](https://github.com/christianwengert) | [<img alt="cgoinglove" src="https://avatars.githubusercontent.com/u/86150470?v=4&s=117" width="117">](https://github.com/cgoinglove) |
| :----------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: |
| [Tashows](https://github.com/Tashows) | [dkisic](https://github.com/dkisic) | [craigcbrunner](https://github.com/craigcbrunner) | [codehero7386](https://github.com/codehero7386) | [christianwengert](https://github.com/christianwengert) | [cgoinglove](https://github.com/cgoinglove) |
[<img alt="canvasbh" src="https://avatars.githubusercontent.com/u/44477734?v=4&s=117" width="117">](https://github.com/canvasbh) |[<img alt="c0b41" src="https://avatars.githubusercontent.com/u/2834954?v=4&s=117" width="117">](https://github.com/c0b41) |[<img alt="avalla" src="https://avatars.githubusercontent.com/u/986614?v=4&s=117" width="117">](https://github.com/avalla) |[<img alt="arggh" src="https://avatars.githubusercontent.com/u/17210302?v=4&s=117" width="117">](https://github.com/arggh) |[<img alt="alfatv" src="https://avatars.githubusercontent.com/u/62238673?v=4&s=117" width="117">](https://github.com/alfatv) |[<img alt="agreene-coursera" src="https://avatars.githubusercontent.com/u/30501355?v=4&s=117" width="117">](https://github.com/agreene-coursera) |
:---: |:---: |:---: |:---: |:---: |:---: |
[canvasbh](https://github.com/canvasbh) |[c0b41](https://github.com/c0b41) |[avalla](https://github.com/avalla) |[arggh](https://github.com/arggh) |[alfatv](https://github.com/alfatv) |[agreene-coursera](https://github.com/agreene-coursera) |
| [<img alt="canvasbh" src="https://avatars.githubusercontent.com/u/44477734?v=4&s=117" width="117">](https://github.com/canvasbh) | [<img alt="c0b41" src="https://avatars.githubusercontent.com/u/2834954?v=4&s=117" width="117">](https://github.com/c0b41) | [<img alt="avalla" src="https://avatars.githubusercontent.com/u/986614?v=4&s=117" width="117">](https://github.com/avalla) | [<img alt="arggh" src="https://avatars.githubusercontent.com/u/17210302?v=4&s=117" width="117">](https://github.com/arggh) | [<img alt="alfatv" src="https://avatars.githubusercontent.com/u/62238673?v=4&s=117" width="117">](https://github.com/alfatv) | [<img alt="agreene-coursera" src="https://avatars.githubusercontent.com/u/30501355?v=4&s=117" width="117">](https://github.com/agreene-coursera) |
| :------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------: |
| [canvasbh](https://github.com/canvasbh) | [c0b41](https://github.com/c0b41) | [avalla](https://github.com/avalla) | [arggh](https://github.com/arggh) | [alfatv](https://github.com/alfatv) | [agreene-coursera](https://github.com/agreene-coursera) |
[<img alt="aduh95-test-account" src="https://avatars.githubusercontent.com/u/93441190?v=4&s=117" width="117">](https://github.com/aduh95-test-account) |[<img alt="sartoshi-foot-dao" src="https://avatars.githubusercontent.com/u/99770068?v=4&s=117" width="117">](https://github.com/sartoshi-foot-dao) |[<img alt="zackbloom" src="https://avatars.githubusercontent.com/u/55347?v=4&s=117" width="117">](https://github.com/zackbloom) |[<img alt="zlawson-ut" src="https://avatars.githubusercontent.com/u/7375444?v=4&s=117" width="117">](https://github.com/zlawson-ut) |[<img alt="zachconner" src="https://avatars.githubusercontent.com/u/11339326?v=4&s=117" width="117">](https://github.com/zachconner) |[<img alt="yafkari" src="https://avatars.githubusercontent.com/u/41365655?v=4&s=117" width="117">](https://github.com/yafkari) |
:---: |:---: |:---: |:---: |:---: |:---: |
[aduh95-test-account](https://github.com/aduh95-test-account) |[sartoshi-foot-dao](https://github.com/sartoshi-foot-dao) |[zackbloom](https://github.com/zackbloom) |[zlawson-ut](https://github.com/zlawson-ut) |[zachconner](https://github.com/zachconner) |[yafkari](https://github.com/yafkari) |
| [<img alt="aduh95-test-account" src="https://avatars.githubusercontent.com/u/93441190?v=4&s=117" width="117">](https://github.com/aduh95-test-account) | [<img alt="sartoshi-foot-dao" src="https://avatars.githubusercontent.com/u/99770068?v=4&s=117" width="117">](https://github.com/sartoshi-foot-dao) | [<img alt="zackbloom" src="https://avatars.githubusercontent.com/u/55347?v=4&s=117" width="117">](https://github.com/zackbloom) | [<img alt="zlawson-ut" src="https://avatars.githubusercontent.com/u/7375444?v=4&s=117" width="117">](https://github.com/zlawson-ut) | [<img alt="zachconner" src="https://avatars.githubusercontent.com/u/11339326?v=4&s=117" width="117">](https://github.com/zachconner) | [<img alt="yafkari" src="https://avatars.githubusercontent.com/u/41365655?v=4&s=117" width="117">](https://github.com/yafkari) |
| :----------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: |
| [aduh95-test-account](https://github.com/aduh95-test-account) | [sartoshi-foot-dao](https://github.com/sartoshi-foot-dao) | [zackbloom](https://github.com/zackbloom) | [zlawson-ut](https://github.com/zlawson-ut) | [zachconner](https://github.com/zachconner) | [yafkari](https://github.com/yafkari) |
[<img alt="YehudaKremer" src="https://avatars.githubusercontent.com/u/946652?v=4&s=117" width="117">](https://github.com/YehudaKremer) |[<img alt="sercraig" src="https://avatars.githubusercontent.com/u/24261518?v=4&s=117" width="117">](https://github.com/sercraig) |[<img alt="ardeois" src="https://avatars.githubusercontent.com/u/1867939?v=4&s=117" width="117">](https://github.com/ardeois) |[<img alt="CommanderRoot" src="https://avatars.githubusercontent.com/u/4395417?v=4&s=117" width="117">](https://github.com/CommanderRoot) |[<img alt="czj" src="https://avatars.githubusercontent.com/u/14306?v=4&s=117" width="117">](https://github.com/czj) |[<img alt="cbush06" src="https://avatars.githubusercontent.com/u/15720146?v=4&s=117" width="117">](https://github.com/cbush06) |
:---: |:---: |:---: |:---: |:---: |:---: |
[YehudaKremer](https://github.com/YehudaKremer) |[sercraig](https://github.com/sercraig) |[ardeois](https://github.com/ardeois) |[CommanderRoot](https://github.com/CommanderRoot) |[czj](https://github.com/czj) |[cbush06](https://github.com/cbush06) |
| [<img alt="YehudaKremer" src="https://avatars.githubusercontent.com/u/946652?v=4&s=117" width="117">](https://github.com/YehudaKremer) | [<img alt="sercraig" src="https://avatars.githubusercontent.com/u/24261518?v=4&s=117" width="117">](https://github.com/sercraig) | [<img alt="ardeois" src="https://avatars.githubusercontent.com/u/1867939?v=4&s=117" width="117">](https://github.com/ardeois) | [<img alt="CommanderRoot" src="https://avatars.githubusercontent.com/u/4395417?v=4&s=117" width="117">](https://github.com/CommanderRoot) | [<img alt="czj" src="https://avatars.githubusercontent.com/u/14306?v=4&s=117" width="117">](https://github.com/czj) | [<img alt="cbush06" src="https://avatars.githubusercontent.com/u/15720146?v=4&s=117" width="117">](https://github.com/cbush06) |
| :------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: |
| [YehudaKremer](https://github.com/YehudaKremer) | [sercraig](https://github.com/sercraig) | [ardeois](https://github.com/ardeois) | [CommanderRoot](https://github.com/CommanderRoot) | [czj](https://github.com/czj) | [cbush06](https://github.com/cbush06) |
[<img alt="Aarbel" src="https://avatars.githubusercontent.com/u/25119847?v=4&s=117" width="117">](https://github.com/Aarbel) |[<img alt="cfra" src="https://avatars.githubusercontent.com/u/1347051?v=4&s=117" width="117">](https://github.com/cfra) |[<img alt="csprance" src="https://avatars.githubusercontent.com/u/7902617?v=4&s=117" width="117">](https://github.com/csprance) |[<img alt="prattcmp" src="https://avatars.githubusercontent.com/u/1497950?v=4&s=117" width="117">](https://github.com/prattcmp) |[<img alt="subvertallchris" src="https://avatars.githubusercontent.com/u/4097271?v=4&s=117" width="117">](https://github.com/subvertallchris) |[<img alt="charlybillaud" src="https://avatars.githubusercontent.com/u/31970410?v=4&s=117" width="117">](https://github.com/charlybillaud) |
:---: |:---: |:---: |:---: |:---: |:---: |
[Aarbel](https://github.com/Aarbel) |[cfra](https://github.com/cfra) |[csprance](https://github.com/csprance) |[prattcmp](https://github.com/prattcmp) |[subvertallchris](https://github.com/subvertallchris) |[charlybillaud](https://github.com/charlybillaud) |
| [<img alt="Aarbel" src="https://avatars.githubusercontent.com/u/25119847?v=4&s=117" width="117">](https://github.com/Aarbel) | [<img alt="cfra" src="https://avatars.githubusercontent.com/u/1347051?v=4&s=117" width="117">](https://github.com/cfra) | [<img alt="csprance" src="https://avatars.githubusercontent.com/u/7902617?v=4&s=117" width="117">](https://github.com/csprance) | [<img alt="prattcmp" src="https://avatars.githubusercontent.com/u/1497950?v=4&s=117" width="117">](https://github.com/prattcmp) | [<img alt="subvertallchris" src="https://avatars.githubusercontent.com/u/4097271?v=4&s=117" width="117">](https://github.com/subvertallchris) | [<img alt="charlybillaud" src="https://avatars.githubusercontent.com/u/31970410?v=4&s=117" width="117">](https://github.com/charlybillaud) |
| :--------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: |
| [Aarbel](https://github.com/Aarbel) | [cfra](https://github.com/cfra) | [csprance](https://github.com/csprance) | [prattcmp](https://github.com/prattcmp) | [subvertallchris](https://github.com/subvertallchris) | [charlybillaud](https://github.com/charlybillaud) |
[<img alt="Cretezy" src="https://avatars.githubusercontent.com/u/2672503?v=4&s=117" width="117">](https://github.com/Cretezy) |[<img alt="chao" src="https://avatars.githubusercontent.com/u/55872?v=4&s=117" width="117">](https://github.com/chao) |[<img alt="cellvinchung" src="https://avatars.githubusercontent.com/u/5347394?v=4&s=117" width="117">](https://github.com/cellvinchung) |[<img alt="cartfisk" src="https://avatars.githubusercontent.com/u/8764375?v=4&s=117" width="117">](https://github.com/cartfisk) |[<img alt="cyu" src="https://avatars.githubusercontent.com/u/2431?v=4&s=117" width="117">](https://github.com/cyu) |[<img alt="bryanjswift" src="https://avatars.githubusercontent.com/u/9911?v=4&s=117" width="117">](https://github.com/bryanjswift) |
:---: |:---: |:---: |:---: |:---: |:---: |
[Cretezy](https://github.com/Cretezy) |[chao](https://github.com/chao) |[cellvinchung](https://github.com/cellvinchung) |[cartfisk](https://github.com/cartfisk) |[cyu](https://github.com/cyu) |[bryanjswift](https://github.com/bryanjswift) |
| [<img alt="Cretezy" src="https://avatars.githubusercontent.com/u/2672503?v=4&s=117" width="117">](https://github.com/Cretezy) | [<img alt="chao" src="https://avatars.githubusercontent.com/u/55872?v=4&s=117" width="117">](https://github.com/chao) | [<img alt="cellvinchung" src="https://avatars.githubusercontent.com/u/5347394?v=4&s=117" width="117">](https://github.com/cellvinchung) | [<img alt="cartfisk" src="https://avatars.githubusercontent.com/u/8764375?v=4&s=117" width="117">](https://github.com/cartfisk) | [<img alt="cyu" src="https://avatars.githubusercontent.com/u/2431?v=4&s=117" width="117">](https://github.com/cyu) | [<img alt="bryanjswift" src="https://avatars.githubusercontent.com/u/9911?v=4&s=117" width="117">](https://github.com/bryanjswift) |
| :---------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: |
| [Cretezy](https://github.com/Cretezy) | [chao](https://github.com/chao) | [cellvinchung](https://github.com/cellvinchung) | [cartfisk](https://github.com/cartfisk) | [cyu](https://github.com/cyu) | [bryanjswift](https://github.com/bryanjswift) |
[<img alt="functino" src="https://avatars.githubusercontent.com/u/415498?v=4&s=117" width="117">](https://github.com/functino) |[<img alt="firesharkstudios" src="https://avatars.githubusercontent.com/u/17069637?v=4&s=117" width="117">](https://github.com/firesharkstudios) |[<img alt="yoldar" src="https://avatars.githubusercontent.com/u/1597578?v=4&s=117" width="117">](https://github.com/yoldar) |[<img alt="efbautista" src="https://avatars.githubusercontent.com/u/35430671?v=4&s=117" width="117">](https://github.com/efbautista) |[<img alt="emuell" src="https://avatars.githubusercontent.com/u/11521600?v=4&s=117" width="117">](https://github.com/emuell) |[<img alt="EdgarSantiago93" src="https://avatars.githubusercontent.com/u/14806877?v=4&s=117" width="117">](https://github.com/EdgarSantiago93) |
:---: |:---: |:---: |:---: |:---: |:---: |
[functino](https://github.com/functino) |[firesharkstudios](https://github.com/firesharkstudios) |[yoldar](https://github.com/yoldar) |[efbautista](https://github.com/efbautista) |[emuell](https://github.com/emuell) |[EdgarSantiago93](https://github.com/EdgarSantiago93) |
| [<img alt="functino" src="https://avatars.githubusercontent.com/u/415498?v=4&s=117" width="117">](https://github.com/functino) | [<img alt="firesharkstudios" src="https://avatars.githubusercontent.com/u/17069637?v=4&s=117" width="117">](https://github.com/firesharkstudios) | [<img alt="yoldar" src="https://avatars.githubusercontent.com/u/1597578?v=4&s=117" width="117">](https://github.com/yoldar) | [<img alt="efbautista" src="https://avatars.githubusercontent.com/u/35430671?v=4&s=117" width="117">](https://github.com/efbautista) | [<img alt="emuell" src="https://avatars.githubusercontent.com/u/11521600?v=4&s=117" width="117">](https://github.com/emuell) | [<img alt="EdgarSantiago93" src="https://avatars.githubusercontent.com/u/14806877?v=4&s=117" width="117">](https://github.com/EdgarSantiago93) |
| :----------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------: |
| [functino](https://github.com/functino) | [firesharkstudios](https://github.com/firesharkstudios) | [yoldar](https://github.com/yoldar) | [efbautista](https://github.com/efbautista) | [emuell](https://github.com/emuell) | [EdgarSantiago93](https://github.com/EdgarSantiago93) |
[<img alt="sweetro" src="https://avatars.githubusercontent.com/u/6228717?v=4&s=117" width="117">](https://github.com/sweetro) |[<img alt="jeetiss" src="https://avatars.githubusercontent.com/u/6726016?v=4&s=117" width="117">](https://github.com/jeetiss) |[<img alt="DennisKofflard" src="https://avatars.githubusercontent.com/u/8669129?v=4&s=117" width="117">](https://github.com/DennisKofflard) |[<img alt="hoangsvit" src="https://avatars.githubusercontent.com/u/11882322?v=4&s=117" width="117">](https://github.com/hoangsvit) |[<img alt="davilima6" src="https://avatars.githubusercontent.com/u/422130?v=4&s=117" width="117">](https://github.com/davilima6) |[<img alt="akizor" src="https://avatars.githubusercontent.com/u/1052439?v=4&s=117" width="117">](https://github.com/akizor) |
:---: |:---: |:---: |:---: |:---: |:---: |
[sweetro](https://github.com/sweetro) |[jeetiss](https://github.com/jeetiss) |[DennisKofflard](https://github.com/DennisKofflard) |[hoangsvit](https://github.com/hoangsvit) |[davilima6](https://github.com/davilima6) |[akizor](https://github.com/akizor) |
| [<img alt="sweetro" src="https://avatars.githubusercontent.com/u/6228717?v=4&s=117" width="117">](https://github.com/sweetro) | [<img alt="jeetiss" src="https://avatars.githubusercontent.com/u/6726016?v=4&s=117" width="117">](https://github.com/jeetiss) | [<img alt="DennisKofflard" src="https://avatars.githubusercontent.com/u/8669129?v=4&s=117" width="117">](https://github.com/DennisKofflard) | [<img alt="hoangsvit" src="https://avatars.githubusercontent.com/u/11882322?v=4&s=117" width="117">](https://github.com/hoangsvit) | [<img alt="davilima6" src="https://avatars.githubusercontent.com/u/422130?v=4&s=117" width="117">](https://github.com/davilima6) | [<img alt="akizor" src="https://avatars.githubusercontent.com/u/1052439?v=4&s=117" width="117">](https://github.com/akizor) |
| :---------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: |
| [sweetro](https://github.com/sweetro) | [jeetiss](https://github.com/jeetiss) | [DennisKofflard](https://github.com/DennisKofflard) | [hoangsvit](https://github.com/hoangsvit) | [davilima6](https://github.com/davilima6) | [akizor](https://github.com/akizor) |
[<img alt="KaminskiDaniell" src="https://avatars.githubusercontent.com/u/27357868?v=4&s=117" width="117">](https://github.com/KaminskiDaniell) |[<img alt="Cantabar" src="https://avatars.githubusercontent.com/u/6812207?v=4&s=117" width="117">](https://github.com/Cantabar) |[<img alt="mrboomer" src="https://avatars.githubusercontent.com/u/5942912?v=4&s=117" width="117">](https://github.com/mrboomer) |[<img alt="danilat" src="https://avatars.githubusercontent.com/u/22763?v=4&s=117" width="117">](https://github.com/danilat) |[<img alt="danschalow" src="https://avatars.githubusercontent.com/u/3527437?v=4&s=117" width="117">](https://github.com/danschalow) |[<img alt="danmichaelo" src="https://avatars.githubusercontent.com/u/434495?v=4&s=117" width="117">](https://github.com/danmichaelo) |
:---: |:---: |:---: |:---: |:---: |:---: |
[KaminskiDaniell](https://github.com/KaminskiDaniell) |[Cantabar](https://github.com/Cantabar) |[mrboomer](https://github.com/mrboomer) |[danilat](https://github.com/danilat) |[danschalow](https://github.com/danschalow) |[danmichaelo](https://github.com/danmichaelo) |
| [<img alt="KaminskiDaniell" src="https://avatars.githubusercontent.com/u/27357868?v=4&s=117" width="117">](https://github.com/KaminskiDaniell) | [<img alt="Cantabar" src="https://avatars.githubusercontent.com/u/6812207?v=4&s=117" width="117">](https://github.com/Cantabar) | [<img alt="mrboomer" src="https://avatars.githubusercontent.com/u/5942912?v=4&s=117" width="117">](https://github.com/mrboomer) | [<img alt="danilat" src="https://avatars.githubusercontent.com/u/22763?v=4&s=117" width="117">](https://github.com/danilat) | [<img alt="danschalow" src="https://avatars.githubusercontent.com/u/3527437?v=4&s=117" width="117">](https://github.com/danschalow) | [<img alt="danmichaelo" src="https://avatars.githubusercontent.com/u/434495?v=4&s=117" width="117">](https://github.com/danmichaelo) |
| :--------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: |
| [KaminskiDaniell](https://github.com/KaminskiDaniell) | [Cantabar](https://github.com/Cantabar) | [mrboomer](https://github.com/mrboomer) | [danilat](https://github.com/danilat) | [danschalow](https://github.com/danschalow) | [danmichaelo](https://github.com/danmichaelo) |
[<img alt="Cruaier" src="https://avatars.githubusercontent.com/u/5204940?v=4&s=117" width="117">](https://github.com/Cruaier) |[<img alt="amitport" src="https://avatars.githubusercontent.com/u/1131991?v=4&s=117" width="117">](https://github.com/amitport) |[<img alt="tekacs" src="https://avatars.githubusercontent.com/u/63247?v=4&s=117" width="117">](https://github.com/tekacs) |[<img alt="Dogfalo" src="https://avatars.githubusercontent.com/u/2775751?v=4&s=117" width="117">](https://github.com/Dogfalo) |[<img alt="alirezahi" src="https://avatars.githubusercontent.com/u/16666064?v=4&s=117" width="117">](https://github.com/alirezahi) |[<img alt="aalepis" src="https://avatars.githubusercontent.com/u/35684834?v=4&s=117" width="117">](https://github.com/aalepis) |
:---: |:---: |:---: |:---: |:---: |:---: |
[Cruaier](https://github.com/Cruaier) |[amitport](https://github.com/amitport) |[tekacs](https://github.com/tekacs) |[Dogfalo](https://github.com/Dogfalo) |[alirezahi](https://github.com/alirezahi) |[aalepis](https://github.com/aalepis) |
| [<img alt="Cruaier" src="https://avatars.githubusercontent.com/u/5204940?v=4&s=117" width="117">](https://github.com/Cruaier) | [<img alt="amitport" src="https://avatars.githubusercontent.com/u/1131991?v=4&s=117" width="117">](https://github.com/amitport) | [<img alt="tekacs" src="https://avatars.githubusercontent.com/u/63247?v=4&s=117" width="117">](https://github.com/tekacs) | [<img alt="Dogfalo" src="https://avatars.githubusercontent.com/u/2775751?v=4&s=117" width="117">](https://github.com/Dogfalo) | [<img alt="alirezahi" src="https://avatars.githubusercontent.com/u/16666064?v=4&s=117" width="117">](https://github.com/alirezahi) | [<img alt="aalepis" src="https://avatars.githubusercontent.com/u/35684834?v=4&s=117" width="117">](https://github.com/aalepis) |
| :---------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: |
| [Cruaier](https://github.com/Cruaier) | [amitport](https://github.com/amitport) | [tekacs](https://github.com/tekacs) | [Dogfalo](https://github.com/Dogfalo) | [alirezahi](https://github.com/alirezahi) | [aalepis](https://github.com/aalepis) |
[<img alt="alexnj" src="https://avatars.githubusercontent.com/u/683500?v=4&s=117" width="117">](https://github.com/alexnj) |[<img alt="asmt3" src="https://avatars.githubusercontent.com/u/1777709?v=4&s=117" width="117">](https://github.com/asmt3) |[<img alt="ahmadissa" src="https://avatars.githubusercontent.com/u/9936573?v=4&s=117" width="117">](https://github.com/ahmadissa) |[<img alt="adritasharma" src="https://avatars.githubusercontent.com/u/29271635?v=4&s=117" width="117">](https://github.com/adritasharma) |[<img alt="Adrrei" src="https://avatars.githubusercontent.com/u/22191685?v=4&s=117" width="117">](https://github.com/Adrrei) |[<img alt="adityapatadia" src="https://avatars.githubusercontent.com/u/1086617?v=4&s=117" width="117">](https://github.com/adityapatadia) |
:---: |:---: |:---: |:---: |:---: |:---: |
[alexnj](https://github.com/alexnj) |[asmt3](https://github.com/asmt3) |[ahmadissa](https://github.com/ahmadissa) |[adritasharma](https://github.com/adritasharma) |[Adrrei](https://github.com/Adrrei) |[adityapatadia](https://github.com/adityapatadia) |
| [<img alt="alexnj" src="https://avatars.githubusercontent.com/u/683500?v=4&s=117" width="117">](https://github.com/alexnj) | [<img alt="asmt3" src="https://avatars.githubusercontent.com/u/1777709?v=4&s=117" width="117">](https://github.com/asmt3) | [<img alt="ahmadissa" src="https://avatars.githubusercontent.com/u/9936573?v=4&s=117" width="117">](https://github.com/ahmadissa) | [<img alt="adritasharma" src="https://avatars.githubusercontent.com/u/29271635?v=4&s=117" width="117">](https://github.com/adritasharma) | [<img alt="Adrrei" src="https://avatars.githubusercontent.com/u/22191685?v=4&s=117" width="117">](https://github.com/Adrrei) | [<img alt="adityapatadia" src="https://avatars.githubusercontent.com/u/1086617?v=4&s=117" width="117">](https://github.com/adityapatadia) |
| :------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------: |
| [alexnj](https://github.com/alexnj) | [asmt3](https://github.com/asmt3) | [ahmadissa](https://github.com/ahmadissa) | [adritasharma](https://github.com/adritasharma) | [Adrrei](https://github.com/Adrrei) | [adityapatadia](https://github.com/adityapatadia) |
[<img alt="adamvigneault" src="https://avatars.githubusercontent.com/u/18236120?v=4&s=117" width="117">](https://github.com/adamvigneault) |[<img alt="ajh-sr" src="https://avatars.githubusercontent.com/u/71472057?v=4&s=117" width="117">](https://github.com/ajh-sr) |[<img alt="adamdottv" src="https://avatars.githubusercontent.com/u/2363879?v=4&s=117" width="117">](https://github.com/adamdottv) |[<img alt="abannach" src="https://avatars.githubusercontent.com/u/43150303?v=4&s=117" width="117">](https://github.com/abannach) |[<img alt="superhawk610" src="https://avatars.githubusercontent.com/u/18172185?v=4&s=117" width="117">](https://github.com/superhawk610) |[<img alt="ajschmidt8" src="https://avatars.githubusercontent.com/u/7400326?v=4&s=117" width="117">](https://github.com/ajschmidt8) |
:---: |:---: |:---: |:---: |:---: |:---: |
[adamvigneault](https://github.com/adamvigneault) |[ajh-sr](https://github.com/ajh-sr) |[adamdottv](https://github.com/adamdottv) |[abannach](https://github.com/abannach) |[superhawk610](https://github.com/superhawk610) |[ajschmidt8](https://github.com/ajschmidt8) |
| [<img alt="adamvigneault" src="https://avatars.githubusercontent.com/u/18236120?v=4&s=117" width="117">](https://github.com/adamvigneault) | [<img alt="ajh-sr" src="https://avatars.githubusercontent.com/u/71472057?v=4&s=117" width="117">](https://github.com/ajh-sr) | [<img alt="adamdottv" src="https://avatars.githubusercontent.com/u/2363879?v=4&s=117" width="117">](https://github.com/adamdottv) | [<img alt="abannach" src="https://avatars.githubusercontent.com/u/43150303?v=4&s=117" width="117">](https://github.com/abannach) | [<img alt="superhawk610" src="https://avatars.githubusercontent.com/u/18172185?v=4&s=117" width="117">](https://github.com/superhawk610) | [<img alt="ajschmidt8" src="https://avatars.githubusercontent.com/u/7400326?v=4&s=117" width="117">](https://github.com/ajschmidt8) |
| :----------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: |
| [adamvigneault](https://github.com/adamvigneault) | [ajh-sr](https://github.com/ajh-sr) | [adamdottv](https://github.com/adamdottv) | [abannach](https://github.com/abannach) | [superhawk610](https://github.com/superhawk610) | [ajschmidt8](https://github.com/ajschmidt8) |
[<img alt="bedgerotto" src="https://avatars.githubusercontent.com/u/4459657?v=4&s=117" width="117">](https://github.com/bedgerotto) |[<img alt="wbaaron" src="https://avatars.githubusercontent.com/u/1048988?v=4&s=117" width="117">](https://github.com/wbaaron) |[<img alt="Quorafind" src="https://avatars.githubusercontent.com/u/13215013?v=4&s=117" width="117">](https://github.com/Quorafind) |[<img alt="bducharme" src="https://avatars.githubusercontent.com/u/4173569?v=4&s=117" width="117">](https://github.com/bducharme) |[<img alt="azizk" src="https://avatars.githubusercontent.com/u/37282?v=4&s=117" width="117">](https://github.com/azizk) |[<img alt="azeemba" src="https://avatars.githubusercontent.com/u/2160795?v=4&s=117" width="117">](https://github.com/azeemba) |
:---: |:---: |:---: |:---: |:---: |:---: |
[bedgerotto](https://github.com/bedgerotto) |[wbaaron](https://github.com/wbaaron) |[Quorafind](https://github.com/Quorafind) |[bducharme](https://github.com/bducharme) |[azizk](https://github.com/azizk) |[azeemba](https://github.com/azeemba) |
| [<img alt="bedgerotto" src="https://avatars.githubusercontent.com/u/4459657?v=4&s=117" width="117">](https://github.com/bedgerotto) | [<img alt="wbaaron" src="https://avatars.githubusercontent.com/u/1048988?v=4&s=117" width="117">](https://github.com/wbaaron) | [<img alt="Quorafind" src="https://avatars.githubusercontent.com/u/13215013?v=4&s=117" width="117">](https://github.com/Quorafind) | [<img alt="bducharme" src="https://avatars.githubusercontent.com/u/4173569?v=4&s=117" width="117">](https://github.com/bducharme) | [<img alt="azizk" src="https://avatars.githubusercontent.com/u/37282?v=4&s=117" width="117">](https://github.com/azizk) | [<img alt="azeemba" src="https://avatars.githubusercontent.com/u/2160795?v=4&s=117" width="117">](https://github.com/azeemba) |
| :---------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: |
| [bedgerotto](https://github.com/bedgerotto) | [wbaaron](https://github.com/wbaaron) | [Quorafind](https://github.com/Quorafind) | [bducharme](https://github.com/bducharme) | [azizk](https://github.com/azizk) | [azeemba](https://github.com/azeemba) |
[<img alt="ayhankesicioglu" src="https://avatars.githubusercontent.com/u/36304312?v=4&s=117" width="117">](https://github.com/ayhankesicioglu) |[<img alt="atsawin" src="https://avatars.githubusercontent.com/u/666663?v=4&s=117" width="117">](https://github.com/atsawin) |[<img alt="ash-jc-allen" src="https://avatars.githubusercontent.com/u/39652331?v=4&s=117" width="117">](https://github.com/ash-jc-allen) |[<img alt="apuyou" src="https://avatars.githubusercontent.com/u/520053?v=4&s=117" width="117">](https://github.com/apuyou) |[<img alt="arthurdenner" src="https://avatars.githubusercontent.com/u/13774309?v=4&s=117" width="117">](https://github.com/arthurdenner) |[<img alt="Abourass" src="https://avatars.githubusercontent.com/u/39917231?v=4&s=117" width="117">](https://github.com/Abourass) |
:---: |:---: |:---: |:---: |:---: |:---: |
[ayhankesicioglu](https://github.com/ayhankesicioglu) |[atsawin](https://github.com/atsawin) |[ash-jc-allen](https://github.com/ash-jc-allen) |[apuyou](https://github.com/apuyou) |[arthurdenner](https://github.com/arthurdenner) |[Abourass](https://github.com/Abourass) |
| [<img alt="ayhankesicioglu" src="https://avatars.githubusercontent.com/u/36304312?v=4&s=117" width="117">](https://github.com/ayhankesicioglu) | [<img alt="atsawin" src="https://avatars.githubusercontent.com/u/666663?v=4&s=117" width="117">](https://github.com/atsawin) | [<img alt="ash-jc-allen" src="https://avatars.githubusercontent.com/u/39652331?v=4&s=117" width="117">](https://github.com/ash-jc-allen) | [<img alt="apuyou" src="https://avatars.githubusercontent.com/u/520053?v=4&s=117" width="117">](https://github.com/apuyou) | [<img alt="arthurdenner" src="https://avatars.githubusercontent.com/u/13774309?v=4&s=117" width="117">](https://github.com/arthurdenner) | [<img alt="Abourass" src="https://avatars.githubusercontent.com/u/39917231?v=4&s=117" width="117">](https://github.com/Abourass) |
| :--------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: |
| [ayhankesicioglu](https://github.com/ayhankesicioglu) | [atsawin](https://github.com/atsawin) | [ash-jc-allen](https://github.com/ash-jc-allen) | [apuyou](https://github.com/apuyou) | [arthurdenner](https://github.com/arthurdenner) | [Abourass](https://github.com/Abourass) |
[<img alt="tyndria" src="https://avatars.githubusercontent.com/u/17138916?v=4&s=117" width="117">](https://github.com/tyndria) |[<img alt="anthony0030" src="https://avatars.githubusercontent.com/u/13033263?v=4&s=117" width="117">](https://github.com/anthony0030) |[<img alt="andychongyz" src="https://avatars.githubusercontent.com/u/12697240?v=4&s=117" width="117">](https://github.com/andychongyz) |[<img alt="andrii-bodnar" src="https://avatars.githubusercontent.com/u/29282228?v=4&s=117" width="117">](https://github.com/andrii-bodnar) |[<img alt="superandrew213" src="https://avatars.githubusercontent.com/u/13059204?v=4&s=117" width="117">](https://github.com/superandrew213) |[<img alt="radarhere" src="https://avatars.githubusercontent.com/u/3112309?v=4&s=117" width="117">](https://github.com/radarhere) |
:---: |:---: |:---: |:---: |:---: |:---: |
[tyndria](https://github.com/tyndria) |[anthony0030](https://github.com/anthony0030) |[andychongyz](https://github.com/andychongyz) |[andrii-bodnar](https://github.com/andrii-bodnar) |[superandrew213](https://github.com/superandrew213) |[radarhere](https://github.com/radarhere) |
| [<img alt="tyndria" src="https://avatars.githubusercontent.com/u/17138916?v=4&s=117" width="117">](https://github.com/tyndria) | [<img alt="anthony0030" src="https://avatars.githubusercontent.com/u/13033263?v=4&s=117" width="117">](https://github.com/anthony0030) | [<img alt="andychongyz" src="https://avatars.githubusercontent.com/u/12697240?v=4&s=117" width="117">](https://github.com/andychongyz) | [<img alt="andrii-bodnar" src="https://avatars.githubusercontent.com/u/29282228?v=4&s=117" width="117">](https://github.com/andrii-bodnar) | [<img alt="superandrew213" src="https://avatars.githubusercontent.com/u/13059204?v=4&s=117" width="117">](https://github.com/superandrew213) | [<img alt="radarhere" src="https://avatars.githubusercontent.com/u/3112309?v=4&s=117" width="117">](https://github.com/radarhere) |
| :----------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: |
| [tyndria](https://github.com/tyndria) | [anthony0030](https://github.com/anthony0030) | [andychongyz](https://github.com/andychongyz) | [andrii-bodnar](https://github.com/andrii-bodnar) | [superandrew213](https://github.com/superandrew213) | [radarhere](https://github.com/radarhere) |
[<img alt="kaspermeinema" src="https://avatars.githubusercontent.com/u/73821331?v=4&s=117" width="117">](https://github.com/kaspermeinema) |[<img alt="tykarol" src="https://avatars.githubusercontent.com/u/9386320?v=4&s=117" width="117">](https://github.com/tykarol) |[<img alt="jvelten" src="https://avatars.githubusercontent.com/u/48118068?v=4&s=117" width="117">](https://github.com/jvelten) |[<img alt="mellow-fellow" src="https://avatars.githubusercontent.com/u/19280122?v=4&s=117" width="117">](https://github.com/mellow-fellow) |[<img alt="jmontoyaa" src="https://avatars.githubusercontent.com/u/158935?v=4&s=117" width="117">](https://github.com/jmontoyaa) |[<img alt="jcalonso" src="https://avatars.githubusercontent.com/u/664474?v=4&s=117" width="117">](https://github.com/jcalonso) |
:---: |:---: |:---: |:---: |:---: |:---: |
[kaspermeinema](https://github.com/kaspermeinema) |[tykarol](https://github.com/tykarol) |[jvelten](https://github.com/jvelten) |[mellow-fellow](https://github.com/mellow-fellow) |[jmontoyaa](https://github.com/jmontoyaa) |[jcalonso](https://github.com/jcalonso) |
| [<img alt="kaspermeinema" src="https://avatars.githubusercontent.com/u/73821331?v=4&s=117" width="117">](https://github.com/kaspermeinema) | [<img alt="tykarol" src="https://avatars.githubusercontent.com/u/9386320?v=4&s=117" width="117">](https://github.com/tykarol) | [<img alt="jvelten" src="https://avatars.githubusercontent.com/u/48118068?v=4&s=117" width="117">](https://github.com/jvelten) | [<img alt="mellow-fellow" src="https://avatars.githubusercontent.com/u/19280122?v=4&s=117" width="117">](https://github.com/mellow-fellow) | [<img alt="jmontoyaa" src="https://avatars.githubusercontent.com/u/158935?v=4&s=117" width="117">](https://github.com/jmontoyaa) | [<img alt="jcalonso" src="https://avatars.githubusercontent.com/u/664474?v=4&s=117" width="117">](https://github.com/jcalonso) |
| :----------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: |
| [kaspermeinema](https://github.com/kaspermeinema) | [tykarol](https://github.com/tykarol) | [jvelten](https://github.com/jvelten) | [mellow-fellow](https://github.com/mellow-fellow) | [jmontoyaa](https://github.com/jmontoyaa) | [jcalonso](https://github.com/jcalonso) |
[<img alt="jbelej" src="https://avatars.githubusercontent.com/u/2229202?v=4&s=117" width="117">](https://github.com/jbelej) |[<img alt="jszobody" src="https://avatars.githubusercontent.com/u/203749?v=4&s=117" width="117">](https://github.com/jszobody) |[<img alt="jorgeepc" src="https://avatars.githubusercontent.com/u/3879892?v=4&s=117" width="117">](https://github.com/jorgeepc) |[<img alt="jondewoo" src="https://avatars.githubusercontent.com/u/1108358?v=4&s=117" width="117">](https://github.com/jondewoo) |[<img alt="jonathanarbely" src="https://avatars.githubusercontent.com/u/18177203?v=4&s=117" width="117">](https://github.com/jonathanarbely) |[<img alt="jsanchez034" src="https://avatars.githubusercontent.com/u/761087?v=4&s=117" width="117">](https://github.com/jsanchez034) |
:---: |:---: |:---: |:---: |:---: |:---: |
[jbelej](https://github.com/jbelej) |[jszobody](https://github.com/jszobody) |[jorgeepc](https://github.com/jorgeepc) |[jondewoo](https://github.com/jondewoo) |[jonathanarbely](https://github.com/jonathanarbely) |[jsanchez034](https://github.com/jsanchez034) |
| [<img alt="jbelej" src="https://avatars.githubusercontent.com/u/2229202?v=4&s=117" width="117">](https://github.com/jbelej) | [<img alt="jszobody" src="https://avatars.githubusercontent.com/u/203749?v=4&s=117" width="117">](https://github.com/jszobody) | [<img alt="jorgeepc" src="https://avatars.githubusercontent.com/u/3879892?v=4&s=117" width="117">](https://github.com/jorgeepc) | [<img alt="jondewoo" src="https://avatars.githubusercontent.com/u/1108358?v=4&s=117" width="117">](https://github.com/jondewoo) | [<img alt="jonathanarbely" src="https://avatars.githubusercontent.com/u/18177203?v=4&s=117" width="117">](https://github.com/jonathanarbely) | [<img alt="jsanchez034" src="https://avatars.githubusercontent.com/u/761087?v=4&s=117" width="117">](https://github.com/jsanchez034) |
| :-------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: |
| [jbelej](https://github.com/jbelej) | [jszobody](https://github.com/jszobody) | [jorgeepc](https://github.com/jorgeepc) | [jondewoo](https://github.com/jondewoo) | [jonathanarbely](https://github.com/jonathanarbely) | [jsanchez034](https://github.com/jsanchez034) |
[<img alt="Jokcy" src="https://avatars.githubusercontent.com/u/2088642?v=4&s=117" width="117">](https://github.com/Jokcy) |[<img alt="chromacoma" src="https://avatars.githubusercontent.com/u/1535623?v=4&s=117" width="117">](https://github.com/chromacoma) |[<img alt="profsmallpine" src="https://avatars.githubusercontent.com/u/7328006?v=4&s=117" width="117">](https://github.com/profsmallpine) |[<img alt="theJoeBiz" src="https://avatars.githubusercontent.com/u/189589?v=4&s=117" width="117">](https://github.com/theJoeBiz) |[<img alt="huydod" src="https://avatars.githubusercontent.com/u/37580530?v=4&s=117" width="117">](https://github.com/huydod) |[<img alt="lucax88x" src="https://avatars.githubusercontent.com/u/6294464?v=4&s=117" width="117">](https://github.com/lucax88x) |
:---: |:---: |:---: |:---: |:---: |:---: |
[Jokcy](https://github.com/Jokcy) |[chromacoma](https://github.com/chromacoma) |[profsmallpine](https://github.com/profsmallpine) |[theJoeBiz](https://github.com/theJoeBiz) |[huydod](https://github.com/huydod) |[lucax88x](https://github.com/lucax88x) |
| [<img alt="Jokcy" src="https://avatars.githubusercontent.com/u/2088642?v=4&s=117" width="117">](https://github.com/Jokcy) | [<img alt="chromacoma" src="https://avatars.githubusercontent.com/u/1535623?v=4&s=117" width="117">](https://github.com/chromacoma) | [<img alt="profsmallpine" src="https://avatars.githubusercontent.com/u/7328006?v=4&s=117" width="117">](https://github.com/profsmallpine) | [<img alt="theJoeBiz" src="https://avatars.githubusercontent.com/u/189589?v=4&s=117" width="117">](https://github.com/theJoeBiz) | [<img alt="huydod" src="https://avatars.githubusercontent.com/u/37580530?v=4&s=117" width="117">](https://github.com/huydod) | [<img alt="lucax88x" src="https://avatars.githubusercontent.com/u/6294464?v=4&s=117" width="117">](https://github.com/lucax88x) |
| :-----------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: |
| [Jokcy](https://github.com/Jokcy) | [chromacoma](https://github.com/chromacoma) | [profsmallpine](https://github.com/profsmallpine) | [theJoeBiz](https://github.com/theJoeBiz) | [huydod](https://github.com/huydod) | [lucax88x](https://github.com/lucax88x) |
[<img alt="lucaperret" src="https://avatars.githubusercontent.com/u/1887122?v=4&s=117" width="117">](https://github.com/lucaperret) |[<img alt="ombr" src="https://avatars.githubusercontent.com/u/857339?v=4&s=117" width="117">](https://github.com/ombr) |[<img alt="louim" src="https://avatars.githubusercontent.com/u/923718?v=4&s=117" width="117">](https://github.com/louim) |[<img alt="dolphinigle" src="https://avatars.githubusercontent.com/u/7020472?v=4&s=117" width="117">](https://github.com/dolphinigle) |[<img alt="leomelzer" src="https://avatars.githubusercontent.com/u/23313?v=4&s=117" width="117">](https://github.com/leomelzer) |[<img alt="leods92" src="https://avatars.githubusercontent.com/u/879395?v=4&s=117" width="117">](https://github.com/leods92) |
:---: |:---: |:---: |:---: |:---: |:---: |
[lucaperret](https://github.com/lucaperret) |[ombr](https://github.com/ombr) |[louim](https://github.com/louim) |[dolphinigle](https://github.com/dolphinigle) |[leomelzer](https://github.com/leomelzer) |[leods92](https://github.com/leods92) |
| [<img alt="lucaperret" src="https://avatars.githubusercontent.com/u/1887122?v=4&s=117" width="117">](https://github.com/lucaperret) | [<img alt="ombr" src="https://avatars.githubusercontent.com/u/857339?v=4&s=117" width="117">](https://github.com/ombr) | [<img alt="louim" src="https://avatars.githubusercontent.com/u/923718?v=4&s=117" width="117">](https://github.com/louim) | [<img alt="dolphinigle" src="https://avatars.githubusercontent.com/u/7020472?v=4&s=117" width="117">](https://github.com/dolphinigle) | [<img alt="leomelzer" src="https://avatars.githubusercontent.com/u/23313?v=4&s=117" width="117">](https://github.com/leomelzer) | [<img alt="leods92" src="https://avatars.githubusercontent.com/u/879395?v=4&s=117" width="117">](https://github.com/leods92) |
| :---------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: |
| [lucaperret](https://github.com/lucaperret) | [ombr](https://github.com/ombr) | [louim](https://github.com/louim) | [dolphinigle](https://github.com/dolphinigle) | [leomelzer](https://github.com/leomelzer) | [leods92](https://github.com/leods92) |
[<img alt="galli-leo" src="https://avatars.githubusercontent.com/u/5339762?v=4&s=117" width="117">](https://github.com/galli-leo) |[<img alt="dviry" src="https://avatars.githubusercontent.com/u/1230260?v=4&s=117" width="117">](https://github.com/dviry) |[<img alt="larowlan" src="https://avatars.githubusercontent.com/u/555254?v=4&s=117" width="117">](https://github.com/larowlan) |[<img alt="leaanthony" src="https://avatars.githubusercontent.com/u/1943904?v=4&s=117" width="117">](https://github.com/leaanthony) |[<img alt="hoangbits" src="https://avatars.githubusercontent.com/u/7990827?v=4&s=117" width="117">](https://github.com/hoangbits) |[<img alt="labohkip81" src="https://avatars.githubusercontent.com/u/36964869?v=4&s=117" width="117">](https://github.com/labohkip81) |
:---: |:---: |:---: |:---: |:---: |:---: |
[galli-leo](https://github.com/galli-leo) |[dviry](https://github.com/dviry) |[larowlan](https://github.com/larowlan) |[leaanthony](https://github.com/leaanthony) |[hoangbits](https://github.com/hoangbits) |[labohkip81](https://github.com/labohkip81) |
| [<img alt="galli-leo" src="https://avatars.githubusercontent.com/u/5339762?v=4&s=117" width="117">](https://github.com/galli-leo) | [<img alt="dviry" src="https://avatars.githubusercontent.com/u/1230260?v=4&s=117" width="117">](https://github.com/dviry) | [<img alt="larowlan" src="https://avatars.githubusercontent.com/u/555254?v=4&s=117" width="117">](https://github.com/larowlan) | [<img alt="leaanthony" src="https://avatars.githubusercontent.com/u/1943904?v=4&s=117" width="117">](https://github.com/leaanthony) | [<img alt="hoangbits" src="https://avatars.githubusercontent.com/u/7990827?v=4&s=117" width="117">](https://github.com/hoangbits) | [<img alt="labohkip81" src="https://avatars.githubusercontent.com/u/36964869?v=4&s=117" width="117">](https://github.com/labohkip81) |
| :-------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: |
| [galli-leo](https://github.com/galli-leo) | [dviry](https://github.com/dviry) | [larowlan](https://github.com/larowlan) | [leaanthony](https://github.com/leaanthony) | [hoangbits](https://github.com/hoangbits) | [labohkip81](https://github.com/labohkip81) |
[<img alt="kyleparisi" src="https://avatars.githubusercontent.com/u/1286753?v=4&s=117" width="117">](https://github.com/kyleparisi) |[<img alt="elkebab" src="https://avatars.githubusercontent.com/u/6313468?v=4&s=117" width="117">](https://github.com/elkebab) |[<img alt="kidonng" src="https://avatars.githubusercontent.com/u/44045911?v=4&s=117" width="117">](https://github.com/kidonng) |[<img alt="kevin-west-10x" src="https://avatars.githubusercontent.com/u/65194914?v=4&s=117" width="117">](https://github.com/kevin-west-10x) |[<img alt="kergekacsa" src="https://avatars.githubusercontent.com/u/16637320?v=4&s=117" width="117">](https://github.com/kergekacsa) |[<img alt="HussainAlkhalifah" src="https://avatars.githubusercontent.com/u/43642162?v=4&s=117" width="117">](https://github.com/HussainAlkhalifah) |
:---: |:---: |:---: |:---: |:---: |:---: |
[kyleparisi](https://github.com/kyleparisi) |[elkebab](https://github.com/elkebab) |[kidonng](https://github.com/kidonng) |[kevin-west-10x](https://github.com/kevin-west-10x) |[kergekacsa](https://github.com/kergekacsa) |[HussainAlkhalifah](https://github.com/HussainAlkhalifah) |
| [<img alt="kyleparisi" src="https://avatars.githubusercontent.com/u/1286753?v=4&s=117" width="117">](https://github.com/kyleparisi) | [<img alt="elkebab" src="https://avatars.githubusercontent.com/u/6313468?v=4&s=117" width="117">](https://github.com/elkebab) | [<img alt="kidonng" src="https://avatars.githubusercontent.com/u/44045911?v=4&s=117" width="117">](https://github.com/kidonng) | [<img alt="kevin-west-10x" src="https://avatars.githubusercontent.com/u/65194914?v=4&s=117" width="117">](https://github.com/kevin-west-10x) | [<img alt="kergekacsa" src="https://avatars.githubusercontent.com/u/16637320?v=4&s=117" width="117">](https://github.com/kergekacsa) | [<img alt="HussainAlkhalifah" src="https://avatars.githubusercontent.com/u/43642162?v=4&s=117" width="117">](https://github.com/HussainAlkhalifah) |
| :---------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------: |
| [kyleparisi](https://github.com/kyleparisi) | [elkebab](https://github.com/elkebab) | [kidonng](https://github.com/kidonng) | [kevin-west-10x](https://github.com/kevin-west-10x) | [kergekacsa](https://github.com/kergekacsa) | [HussainAlkhalifah](https://github.com/HussainAlkhalifah) |
[<img alt="HughbertD" src="https://avatars.githubusercontent.com/u/1580021?v=4&s=117" width="117">](https://github.com/HughbertD) |[<img alt="hiromi2424" src="https://avatars.githubusercontent.com/u/191297?v=4&s=117" width="117">](https://github.com/hiromi2424) |[<img alt="giacomocerquone" src="https://avatars.githubusercontent.com/u/9303791?v=4&s=117" width="117">](https://github.com/giacomocerquone) |[<img alt="roenschg" src="https://avatars.githubusercontent.com/u/9590236?v=4&s=117" width="117">](https://github.com/roenschg) |[<img alt="gjungb" src="https://avatars.githubusercontent.com/u/3391068?v=4&s=117" width="117">](https://github.com/gjungb) |[<img alt="geoffappleford" src="https://avatars.githubusercontent.com/u/731678?v=4&s=117" width="117">](https://github.com/geoffappleford) |
:---: |:---: |:---: |:---: |:---: |:---: |
[HughbertD](https://github.com/HughbertD) |[hiromi2424](https://github.com/hiromi2424) |[giacomocerquone](https://github.com/giacomocerquone) |[roenschg](https://github.com/roenschg) |[gjungb](https://github.com/gjungb) |[geoffappleford](https://github.com/geoffappleford) |
| [<img alt="HughbertD" src="https://avatars.githubusercontent.com/u/1580021?v=4&s=117" width="117">](https://github.com/HughbertD) | [<img alt="hiromi2424" src="https://avatars.githubusercontent.com/u/191297?v=4&s=117" width="117">](https://github.com/hiromi2424) | [<img alt="giacomocerquone" src="https://avatars.githubusercontent.com/u/9303791?v=4&s=117" width="117">](https://github.com/giacomocerquone) | [<img alt="roenschg" src="https://avatars.githubusercontent.com/u/9590236?v=4&s=117" width="117">](https://github.com/roenschg) | [<img alt="gjungb" src="https://avatars.githubusercontent.com/u/3391068?v=4&s=117" width="117">](https://github.com/gjungb) | [<img alt="geoffappleford" src="https://avatars.githubusercontent.com/u/731678?v=4&s=117" width="117">](https://github.com/geoffappleford) |
| :-------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: |
| [HughbertD](https://github.com/HughbertD) | [hiromi2424](https://github.com/hiromi2424) | [giacomocerquone](https://github.com/giacomocerquone) | [roenschg](https://github.com/roenschg) | [gjungb](https://github.com/gjungb) | [geoffappleford](https://github.com/geoffappleford) |
[<img alt="gabiganam" src="https://avatars.githubusercontent.com/u/28859646?v=4&s=117" width="117">](https://github.com/gabiganam) |[<img alt="fuadscodes" src="https://avatars.githubusercontent.com/u/60370584?v=4&s=117" width="117">](https://github.com/fuadscodes) |[<img alt="dtrucs" src="https://avatars.githubusercontent.com/u/1926041?v=4&s=117" width="117">](https://github.com/dtrucs) |[<img alt="ferdiusa" src="https://avatars.githubusercontent.com/u/1997982?v=4&s=117" width="117">](https://github.com/ferdiusa) |[<img alt="fgallinari" src="https://avatars.githubusercontent.com/u/6473638?v=4&s=117" width="117">](https://github.com/fgallinari) |[<img alt="Gkleinereva" src="https://avatars.githubusercontent.com/u/23621633?v=4&s=117" width="117">](https://github.com/Gkleinereva) |
:---: |:---: |:---: |:---: |:---: |:---: |
[gabiganam](https://github.com/gabiganam) |[fuadscodes](https://github.com/fuadscodes) |[dtrucs](https://github.com/dtrucs) |[ferdiusa](https://github.com/ferdiusa) |[fgallinari](https://github.com/fgallinari) |[Gkleinereva](https://github.com/Gkleinereva) |
| [<img alt="gabiganam" src="https://avatars.githubusercontent.com/u/28859646?v=4&s=117" width="117">](https://github.com/gabiganam) | [<img alt="fuadscodes" src="https://avatars.githubusercontent.com/u/60370584?v=4&s=117" width="117">](https://github.com/fuadscodes) | [<img alt="dtrucs" src="https://avatars.githubusercontent.com/u/1926041?v=4&s=117" width="117">](https://github.com/dtrucs) | [<img alt="ferdiusa" src="https://avatars.githubusercontent.com/u/1997982?v=4&s=117" width="117">](https://github.com/ferdiusa) | [<img alt="fgallinari" src="https://avatars.githubusercontent.com/u/6473638?v=4&s=117" width="117">](https://github.com/fgallinari) | [<img alt="Gkleinereva" src="https://avatars.githubusercontent.com/u/23621633?v=4&s=117" width="117">](https://github.com/Gkleinereva) |
| :--------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: |
| [gabiganam](https://github.com/gabiganam) | [fuadscodes](https://github.com/fuadscodes) | [dtrucs](https://github.com/dtrucs) | [ferdiusa](https://github.com/ferdiusa) | [fgallinari](https://github.com/fgallinari) | [Gkleinereva](https://github.com/Gkleinereva) |
[<img alt="epexa" src="https://avatars.githubusercontent.com/u/2198826?v=4&s=117" width="117">](https://github.com/epexa) |[<img alt="EnricoSottile" src="https://avatars.githubusercontent.com/u/10349653?v=4&s=117" width="117">](https://github.com/EnricoSottile) |[<img alt="elliotdickison" src="https://avatars.githubusercontent.com/u/2523678?v=4&s=117" width="117">](https://github.com/elliotdickison) |[<img alt="eliOcs" src="https://avatars.githubusercontent.com/u/1283954?v=4&s=117" width="117">](https://github.com/eliOcs) |[<img alt="Jmales" src="https://avatars.githubusercontent.com/u/22914881?v=4&s=117" width="117">](https://github.com/Jmales) |[<img alt="jessica-coursera" src="https://avatars.githubusercontent.com/u/35155465?v=4&s=117" width="117">](https://github.com/jessica-coursera) |
:---: |:---: |:---: |:---: |:---: |:---: |
[epexa](https://github.com/epexa) |[EnricoSottile](https://github.com/EnricoSottile) |[elliotdickison](https://github.com/elliotdickison) |[eliOcs](https://github.com/eliOcs) |[Jmales](https://github.com/Jmales) |[jessica-coursera](https://github.com/jessica-coursera) |
| [<img alt="epexa" src="https://avatars.githubusercontent.com/u/2198826?v=4&s=117" width="117">](https://github.com/epexa) | [<img alt="EnricoSottile" src="https://avatars.githubusercontent.com/u/10349653?v=4&s=117" width="117">](https://github.com/EnricoSottile) | [<img alt="elliotdickison" src="https://avatars.githubusercontent.com/u/2523678?v=4&s=117" width="117">](https://github.com/elliotdickison) | [<img alt="eliOcs" src="https://avatars.githubusercontent.com/u/1283954?v=4&s=117" width="117">](https://github.com/eliOcs) | [<img alt="Jmales" src="https://avatars.githubusercontent.com/u/22914881?v=4&s=117" width="117">](https://github.com/Jmales) | [<img alt="jessica-coursera" src="https://avatars.githubusercontent.com/u/35155465?v=4&s=117" width="117">](https://github.com/jessica-coursera) |
| :-----------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------: |
| [epexa](https://github.com/epexa) | [EnricoSottile](https://github.com/EnricoSottile) | [elliotdickison](https://github.com/elliotdickison) | [eliOcs](https://github.com/eliOcs) | [Jmales](https://github.com/Jmales) | [jessica-coursera](https://github.com/jessica-coursera) |
[<img alt="vith" src="https://avatars.githubusercontent.com/u/3265539?v=4&s=117" width="117">](https://github.com/vith) |[<img alt="janwilts" src="https://avatars.githubusercontent.com/u/16721581?v=4&s=117" width="117">](https://github.com/janwilts) |[<img alt="janklimo" src="https://avatars.githubusercontent.com/u/7811733?v=4&s=117" width="117">](https://github.com/janklimo) |[<img alt="jamestiotio" src="https://avatars.githubusercontent.com/u/18364745?v=4&s=117" width="117">](https://github.com/jamestiotio) |[<img alt="jcjmcclean" src="https://avatars.githubusercontent.com/u/1822574?v=4&s=117" width="117">](https://github.com/jcjmcclean) |[<img alt="Jbithell" src="https://avatars.githubusercontent.com/u/8408967?v=4&s=117" width="117">](https://github.com/Jbithell) |
:---: |:---: |:---: |:---: |:---: |:---: |
[vith](https://github.com/vith) |[janwilts](https://github.com/janwilts) |[janklimo](https://github.com/janklimo) |[jamestiotio](https://github.com/jamestiotio) |[jcjmcclean](https://github.com/jcjmcclean) |[Jbithell](https://github.com/Jbithell) |
| [<img alt="vith" src="https://avatars.githubusercontent.com/u/3265539?v=4&s=117" width="117">](https://github.com/vith) | [<img alt="janwilts" src="https://avatars.githubusercontent.com/u/16721581?v=4&s=117" width="117">](https://github.com/janwilts) | [<img alt="janklimo" src="https://avatars.githubusercontent.com/u/7811733?v=4&s=117" width="117">](https://github.com/janklimo) | [<img alt="jamestiotio" src="https://avatars.githubusercontent.com/u/18364745?v=4&s=117" width="117">](https://github.com/jamestiotio) | [<img alt="jcjmcclean" src="https://avatars.githubusercontent.com/u/1822574?v=4&s=117" width="117">](https://github.com/jcjmcclean) | [<img alt="Jbithell" src="https://avatars.githubusercontent.com/u/8408967?v=4&s=117" width="117">](https://github.com/Jbithell) |
| :---------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: |
| [vith](https://github.com/vith) | [janwilts](https://github.com/janwilts) | [janklimo](https://github.com/janklimo) | [jamestiotio](https://github.com/jamestiotio) | [jcjmcclean](https://github.com/jcjmcclean) | [Jbithell](https://github.com/Jbithell) |
[<img alt="JakubHaladej" src="https://avatars.githubusercontent.com/u/77832677?v=4&s=117" width="117">](https://github.com/JakubHaladej) |[<img alt="jakemcallister" src="https://avatars.githubusercontent.com/u/1185699?v=4&s=117" width="117">](https://github.com/jakemcallister) |[<img alt="gaejabong" src="https://avatars.githubusercontent.com/u/978944?v=4&s=117" width="117">](https://github.com/gaejabong) |[<img alt="JacobMGEvans" src="https://avatars.githubusercontent.com/u/27247160?v=4&s=117" width="117">](https://github.com/JacobMGEvans) |[<img alt="mazoruss" src="https://avatars.githubusercontent.com/u/17625190?v=4&s=117" width="117">](https://github.com/mazoruss) |[<img alt="GreenJimmy" src="https://avatars.githubusercontent.com/u/39386?v=4&s=117" width="117">](https://github.com/GreenJimmy) |
:---: |:---: |:---: |:---: |:---: |:---: |
[JakubHaladej](https://github.com/JakubHaladej) |[jakemcallister](https://github.com/jakemcallister) |[gaejabong](https://github.com/gaejabong) |[JacobMGEvans](https://github.com/JacobMGEvans) |[mazoruss](https://github.com/mazoruss) |[GreenJimmy](https://github.com/GreenJimmy) |
| [<img alt="JakubHaladej" src="https://avatars.githubusercontent.com/u/77832677?v=4&s=117" width="117">](https://github.com/JakubHaladej) | [<img alt="jakemcallister" src="https://avatars.githubusercontent.com/u/1185699?v=4&s=117" width="117">](https://github.com/jakemcallister) | [<img alt="gaejabong" src="https://avatars.githubusercontent.com/u/978944?v=4&s=117" width="117">](https://github.com/gaejabong) | [<img alt="JacobMGEvans" src="https://avatars.githubusercontent.com/u/27247160?v=4&s=117" width="117">](https://github.com/JacobMGEvans) | [<img alt="mazoruss" src="https://avatars.githubusercontent.com/u/17625190?v=4&s=117" width="117">](https://github.com/mazoruss) | [<img alt="GreenJimmy" src="https://avatars.githubusercontent.com/u/39386?v=4&s=117" width="117">](https://github.com/GreenJimmy) |
| :--------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: |
| [JakubHaladej](https://github.com/JakubHaladej) | [jakemcallister](https://github.com/jakemcallister) | [gaejabong](https://github.com/gaejabong) | [JacobMGEvans](https://github.com/JacobMGEvans) | [mazoruss](https://github.com/mazoruss) | [GreenJimmy](https://github.com/GreenJimmy) |
[<img alt="intenzive" src="https://avatars.githubusercontent.com/u/11055931?v=4&s=117" width="117">](https://github.com/intenzive) |[<img alt="NaxYo" src="https://avatars.githubusercontent.com/u/1963876?v=4&s=117" width="117">](https://github.com/NaxYo) |[<img alt="ishendyweb" src="https://avatars.githubusercontent.com/u/10582418?v=4&s=117" width="117">](https://github.com/ishendyweb) |[<img alt="IanVS" src="https://avatars.githubusercontent.com/u/4616705?v=4&s=117" width="117">](https://github.com/IanVS) |
:---: |:---: |:---: |:---: |
[intenzive](https://github.com/intenzive) |[NaxYo](https://github.com/NaxYo) |[ishendyweb](https://github.com/ishendyweb) |[IanVS](https://github.com/IanVS) |
| [<img alt="intenzive" src="https://avatars.githubusercontent.com/u/11055931?v=4&s=117" width="117">](https://github.com/intenzive) | [<img alt="NaxYo" src="https://avatars.githubusercontent.com/u/1963876?v=4&s=117" width="117">](https://github.com/NaxYo) | [<img alt="ishendyweb" src="https://avatars.githubusercontent.com/u/10582418?v=4&s=117" width="117">](https://github.com/ishendyweb) | [<img alt="IanVS" src="https://avatars.githubusercontent.com/u/4616705?v=4&s=117" width="117">](https://github.com/IanVS) |
| :--------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------: |
| [intenzive](https://github.com/intenzive) | [NaxYo](https://github.com/NaxYo) | [ishendyweb](https://github.com/ishendyweb) | [IanVS](https://github.com/IanVS) |
<!--/contributors-->
## Software
We use Browserstack for manual testing <a href="https://www.browserstack.com" target="_blank"> <img align="left" width="117" alt="BrowserStack logo" src="https://i.ibb.co/HDRDHmx/Browserstack-logo-2x.png"> </a>
We use Browserstack for manual testing
<a href="https://www.browserstack.com" target="_blank">
<img align="left" width="117" alt="BrowserStack logo" src="https://i.ibb.co/HDRDHmx/Browserstack-logo-2x.png">
</a>
## License

View file

@ -2,6 +2,10 @@
## Reporting a Vulnerability
General security issues and concerns are we welcome in the public Github issue tracker: https://github.com/transloadit/uppy/issues.
General security issues and concerns are we welcome in the public Github issue
tracker: https://github.com/transloadit/uppy/issues.
In case of a high risk of the shared vulnerability being exploited, please report it to support@transloadit.com instead, and visit https://transloadit.com/security/ to read about Transloadits security policy, and how we generally handle these cases.
In case of a high risk of the shared vulnerability being exploited, please
report it to support@transloadit.com instead, and visit
https://transloadit.com/security/ to read about Transloadits security policy,
and how we generally handle these cases.

View file

@ -247,11 +247,11 @@ Redis so that any instance can serve the clients requests. Note that sticky
sessions are **not** needed with this setup. Here are the requirements for this
setup:
* The instances need to be connected to the same Redis server.
* You need to set `COMPANION_SECRET` to the same value on both servers.
* if you use the `companionKeysParams` feature (Transloadit), you also need
- The instances need to be connected to the same Redis server.
- You need to set `COMPANION_SECRET` to the same value on both servers.
- if you use the `companionKeysParams` feature (Transloadit), you also need
`COMPANION_PREAUTH_SECRET` to be the same on each instance.
* All other configuration needs to be the same, except if youre running many
- All other configuration needs to be the same, except if youre running many
instances on the same machine, then `COMPANION_PORT` should be different for
each instance.
@ -479,9 +479,9 @@ The name of the bucket to store uploaded files in.
It can be function that returns the name of the bucket as a `string` and takes
the following arguments:
* [`http.IncomingMessage`][], the HTTP request (will be `null` for remote
- [`http.IncomingMessage`][], the HTTP request (will be `null` for remote
uploads)
* metadata provided by the user for the file (will be `undefined` for local
- metadata provided by the user for the file (will be `undefined` for local
uploads)
##### `s3.region` `COMPANION_AWS_REGION`
@ -499,9 +499,9 @@ You can supply any
[S3 option supported by the AWS SDK](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#constructor-property)
in the `providerOptions.s3.awsClientOptions` object, _except for_ the below:
* `accessKeyId`. Instead, use the `providerOptions.s3.key` property. This is to
- `accessKeyId`. Instead, use the `providerOptions.s3.key` property. This is to
make configuration names consistent between different Companion features.
* `secretAccessKey`. Instead, use the `providerOptions.s3.secret` property. This
- `secretAccessKey`. Instead, use the `providerOptions.s3.secret` property. This
is to make configuration names consistent between different Companion
features.
@ -517,12 +517,12 @@ Get the key name for a file. The key is the file path to which the file will be
uploaded in your bucket. This option should be a function receiving three
arguments:
* `req` [`http.IncomingMessage`][], the HTTP request, for _regular_ S3 uploads
- `req` [`http.IncomingMessage`][], the HTTP request, for _regular_ S3 uploads
using the `@uppy/aws-s3` plugin. This parameter is _not_ available for
multipart uploads using the `@uppy/aws-s3` or `@uppy/aws-s3-multipart`
plugins. This parameter is `null` for remote uploads.
* `filename`, the original name of the uploaded file;
* `metadata`, user-provided metadata for the file.
- `filename`, the original name of the uploaded file;
- `metadata`, user-provided metadata for the file.
This function should return a string `key`. The `req` parameter can be used to
upload to a user-specific folder in your bucket, for example:
@ -638,7 +638,7 @@ Allowed CORS Origins (default `true`). Passed as the `origin` option in
#### `COMPANION_CLIENT_ORIGINS_REGEX`
Like COMPANION\_CLIENT\_ORIGINS, but allows a single regex instead.
Like COMPANION_CLIENT_ORIGINS, but allows a single regex instead.
`COMPANION_CLIENT_ORIGINS` will be ignored if this is used. This is a
standalone-only option.
@ -662,14 +662,14 @@ Set this to `false` to disable the
The object returned by `companion.app()` also has a property `companionEmitter`
which is an `EventEmitter` that emits the following events:
* `upload-start` - When an upload starts, this event is emitted with an object
- `upload-start` - When an upload starts, this event is emitted with an object
containing the property `token`, which is a unique ID for the upload.
* **token** - The event name is the token from `upload-start`. The event has an
- **token** - The event name is the token from `upload-start`. The event has an
object with the following properties:
* `action` - One of the following strings:
* `success` - When the upload succeeds.
* `error` - When the upload fails with an error.
* `payload` - the error or success payload.
- `action` - One of the following strings:
- `success` - When the upload succeeds.
- `error` - When the upload fails with an error.
- `payload` - the error or success payload.
Example code for using the `EventEmitter` to handle a finished file upload:
@ -711,28 +711,28 @@ throughout this section.
The following steps describe the actions that take place when a user
Authenticates and Uploads from Dropbox through Companion:
* The visitor to a website with Uppy clicks `Connect to Dropbox`.
* Uppy sends a request to Companion, which in turn sends an OAuth request to
- The visitor to a website with Uppy clicks `Connect to Dropbox`.
- Uppy sends a request to Companion, which in turn sends an OAuth request to
Dropbox (Requires that OAuth credentials from Dropbox have been added to
Companion).
* Dropbox asks the visitor to log in, and whether the Website should be allowed
- Dropbox asks the visitor to log in, and whether the Website should be allowed
to access your files
* If the visitor agrees, Companion will receive a token from Dropbox, with which
- If the visitor agrees, Companion will receive a token from Dropbox, with which
we can temporarily download files.
* Companion encrypts the token with a secret key and sends the encrypted token
- Companion encrypts the token with a secret key and sends the encrypted token
to Uppy (client)
* Every time the visitor clicks on a folder in Uppy, it asks Companion for the
- Every time the visitor clicks on a folder in Uppy, it asks Companion for the
new list of files, with this question, the token (still encrypted by
Companion) is sent along.
* Companion decrypts the token, requests the list of files from Dropbox and
- Companion decrypts the token, requests the list of files from Dropbox and
sends it to Uppy.
* When a file is selected for upload, Companion receives the token again
- When a file is selected for upload, Companion receives the token again
according to this procedure, decrypts it again, and thereby downloads the file
from Dropbox.
* As the bytes arrive, Companion uploads the bytes to the final destination
- As the bytes arrive, Companion uploads the bytes to the final destination
(depending on the configuration: Apache, a Tus server, S3 bucket, etc).
* Companion reports progress to Uppy, as if it were a local upload.
* Completed!
- Companion reports progress to Uppy, as if it were a local upload.
- Completed!
### How to use provider redirect URIs?
@ -805,9 +805,9 @@ with an `Error`):
directory). See [example returned list data structure](#list-data). `token` -
authorization token (retrieved from oauth process) to send along with your
request
* `directory` - the id/name of the directory from which data is to be
- `directory` - the id/name of the directory from which data is to be
retrieved. This may be ignored if it doesnt apply to your provider
* `query` - expressjs query params object received by the server (in case
- `query` - expressjs query params object received by the server (in case
some data you need in there).
2. `async download ({ token, id, query })` - Downloads a particular file from
the provider. Returns an object with a single property `{ stream }` - a
@ -815,27 +815,27 @@ with an `Error`):
which will be read from and uploaded to the destination. To prevent memory
leaks, make sure you release your stream if you reject this method with an
error.
* `token` - authorization token (retrieved from oauth process) to send along
- `token` - authorization token (retrieved from oauth process) to send along
with your request.
* `id` - ID of the file being downloaded.
* `query` - expressjs query params object received by the server (in case
- `id` - ID of the file being downloaded.
- `query` - expressjs query params object received by the server (in case
some data you need in there).
3. `async size ({ token, id, query })` - Returns the byte size of the file that
needs to be downloaded as a `Number`. If the size of the object is not known,
`null` may be returned.
* `token` - authorization token (retrieved from oauth process) to send along
- `token` - authorization token (retrieved from oauth process) to send along
with your request.
* `id` - ID of the file being downloaded.
* `query` - expressjs query params object received by the server (in case
- `id` - ID of the file being downloaded.
- `query` - expressjs query params object received by the server (in case
some data you need in there).
The class must also have:
* A unique `static authProvider` string property - a lowercased value which
- A unique `static authProvider` string property - a lowercased value which
indicates name of the [`grant`](https://github.com/simov/grant) OAuth2
provider to use (e.g `google` for Google). If your provider doesnt use
OAuth2, you can omit this property.
* A `static` property `static version = 2`, which is the current version of the
- A `static` property `static version = 2`, which is the current version of the
Companion Provider API.
See also
@ -912,24 +912,15 @@ This would get the Companion instance running on `http://localhost:3020`. It
uses [nodemon](https://github.com/remy/nodemon) so it will automatically restart
when files are changed.
[`http.incomingmessage`]: https://nodejs.org/api/http.html#class-httpincomingmessage
[`http.incomingmessage`]:
https://nodejs.org/api/http.html#class-httpincomingmessage
[box]: /docs/box
[dropbox]: /docs/dropbox
[facebook]: /docs/facebook
[googledrive]: /docs/google-drive
[instagram]: /docs/instagram
[onedrive]: /docs/onedrive
[unsplash]: /docs/unsplash
[url]: /docs/url
[zoom]: /docs/zoom
[transloadit]: https://transloadit.com

View file

@ -8,12 +8,12 @@ You can find already a few useful Uppy plugins out there, but there might come a
time when you will want to build your own. Plugins can hook into the upload
process or render a custom UI, typically to:
* Render some custom UI element, such as [StatusBar](/docs/status-bar) or
- Render some custom UI element, such as [StatusBar](/docs/status-bar) or
[Dashboard](/docs/dashboard).
* Do the actual uploading, such as [XHRUpload](/docs/xhr-upload) or
- Do the actual uploading, such as [XHRUpload](/docs/xhr-upload) or
[Tus](/docs/tus).
* Do work before the upload, like compressing an image or calling external API.
* Interact with a third-party service to process uploads correctly, such as
- Do work before the upload, like compressing an image or calling external API.
- Interact with a third-party service to process uploads correctly, such as
[Transloadit](/docs/transloadit) or [AwsS3](/docs/aws-s3).
See a [full example of a plugin](#example-of-a-custom-plugin) below.
@ -220,9 +220,9 @@ encrypting a large file. In those situations, determinate progress is suitable.
Here are the relevant events:
* [`preprocess-progress`](/docs/uppy#preprocess-progress)
* [`upload-progress`](/docs/uppy#upload-progress)
* [`postprocess-progress`](/docs/uppy#postprocess-progress)
- [`preprocess-progress`](/docs/uppy#preprocess-progress)
- [`upload-progress`](/docs/uppy#upload-progress)
- [`postprocess-progress`](/docs/uppy#postprocess-progress)
## JSX

View file

@ -73,21 +73,12 @@ using the powers of Transloadit services.
uploads using the HTTP `PUT` method.
[s3-robot]: https://transloadit.com/services/file-exporting/s3-store/
[transloadit-services]: https://transloadit.com/services/
[transloadit-concepts]: https://transloadit.com/docs/getting-started/concepts/
[`@uppy/transloadit`]: /docs/transloadit
[`@uppy/tus`]: /docs/tus
[`@uppy/aws-s3-multipart`]: /docs/aws-s3-multipart
[`@uppy/aws-s3`]: /docs/aws-s3-multipart
[`@uppy/xhr-upload`]: /docs/xhr-upload
[tus]: https://tus.io/
[tus-implementations]: https://tus.io/implementations.html

View file

@ -7,12 +7,12 @@ same way as the other components in the application.
Uppy comes with two state management solutions (stores):
* `@uppy/store-default`, a basic object-based store.
* `@uppy/store-redux`, a store that uses a key in a Redux store.
- `@uppy/store-default`, a basic object-based store.
- `@uppy/store-redux`, a store that uses a key in a Redux store.
You can also use a third-party store:
* [uppy-store-ngrx](https://github.com/rimlin/uppy-store-ngrx/), keeping Uppy
- [uppy-store-ngrx](https://github.com/rimlin/uppy-store-ngrx/), keeping Uppy
state in a key in an [Ngrx](https://github.com/ngrx/platform) store for use
with Angular.
@ -92,9 +92,9 @@ work well with this!
An Uppy store is an object with three methods.
* `getState()` - Return the current state object.
* `setState(patch)` - Merge the object `patch` into the current state.
* `subscribe(listener)` - Call `listener` whenever the state changes. `listener`
- `getState()` - Return the current state object.
- `setState(patch)` - Merge the object `patch` into the current state.
- `subscribe(listener)` - Call `listener` whenever the state changes. `listener`
is a function that should receive three parameters:
`(prevState, nextState, patch)`

View file

@ -10,9 +10,9 @@ the same features, but with a more ergonomic and minimal API.
But, it didnt come with its own set of new problems:
* It tries to do the exact same, but it looks like a different product.
* Its confusing for users whether they want to use Robodog or Uppy directly.
* Robodog is more ergonomic because its limited. When you hit such a limit, you
- It tries to do the exact same, but it looks like a different product.
- Its confusing for users whether they want to use Robodog or Uppy directly.
- Robodog is more ergonomic because its limited. When you hit such a limit, you
need to refactor everything to Uppy with plugins.
This has now led us to deprecating Robodog and embrace Uppy for its strong
@ -238,8 +238,8 @@ To migrate: use exposed options only.
### Known issues
* [`ERESOLVE could not resolve` on npm install](https://github.com/transloadit/uppy/issues/4057).
* [@uppy/svelte reports a broken dependency with the Vite bundler](https://github.com/transloadit/uppy/issues/4069).
- [`ERESOLVE could not resolve` on npm install](https://github.com/transloadit/uppy/issues/4057).
- [@uppy/svelte reports a broken dependency with the Vite bundler](https://github.com/transloadit/uppy/issues/4069).
## Migrate from Companion 3.x to 4.x
@ -319,11 +319,11 @@ bundle size is **25% smaller**! If you want your app to still support older
browsers (such as IE11), you may need to add the following polyfills to your
bundle:
* [abortcontroller-polyfill](https://github.com/mo/abortcontroller-polyfill)
* [core-js](https://github.com/zloirock/core-js)
* [md-gum-polyfill](https://github.com/mozdevs/mediaDevices-getUserMedia-polyfill)
* [resize-observer-polyfill](https://github.com/que-etc/resize-observer-polyfill)
* [whatwg-fetch](https://github.com/github/fetch)
- [abortcontroller-polyfill](https://github.com/mo/abortcontroller-polyfill)
- [core-js](https://github.com/zloirock/core-js)
- [md-gum-polyfill](https://github.com/mozdevs/mediaDevices-getUserMedia-polyfill)
- [resize-observer-polyfill](https://github.com/que-etc/resize-observer-polyfill)
- [whatwg-fetch](https://github.com/github/fetch)
If youre using a bundler, you need import these before Uppy:
@ -589,7 +589,8 @@ obsolete too.
### Thats it!
Uppy 1.0 will continue to receive bug fixes for three more months (until <time datetime="2021-12-01">1 December 2021</time>), security fixes for one more
Uppy 1.0 will continue to receive bug fixes for three more months (until
<time datetime="2021-12-01">1 December 2021</time>), security fixes for one more
year (until <time datetime="2022-09-01">1 September 2022</time>), but no more
new features after today. Exceptions are unlikely, but _can_ be made to
accommodate those with commercial support contracts, for example.
@ -641,11 +642,7 @@ to:
<!-- definitions -->
[core]: /docs/uppy/
[xhr]: /docs/xhr-upload/
[dashboard]: /docs/dashboard/
[aws-s3-multipart]: /docs/aws-s3-multipart/
[tus]: /docs/tus/

View file

@ -1,8 +1,8 @@
# Uppy + AWS S3 Example
This example uses @uppy/companion with a custom AWS S3 configuration.
Files are uploaded to a randomly named directory inside the `whatever/`
directory in a bucket.
This example uses @uppy/companion with a custom AWS S3 configuration. Files are
uploaded to a randomly named directory inside the `whatever/` directory in a
bucket.
## Run it

View file

@ -4,7 +4,8 @@ This example uses a server-side PHP endpoint to sign uploads to S3.
## Running It
To run this example, make sure you've correctly installed the **repository root**:
To run this example, make sure you've correctly installed the **repository
root**:
```bash
yarn || corepack yarn install
@ -13,14 +14,18 @@ yarn build || corepack yarn build
That will also install the npm dependencies for this example.
This example also uses the AWS PHP SDK.
To install it, [get composer](https://getcomposer.org) and run `composer update` in this folder.
This example also uses the AWS PHP SDK. To install it,
[get composer](https://getcomposer.org) and run `composer update` in this
folder.
```bash
corepack yarn workspace @uppy-example/aws-php exec "composer update"
```
Configure AWS S3 credentials using [environment variables](https://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/credentials.html#environment-credentials) or a [credentials file in `~/.aws/credentials`](https://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/credentials.html#credential-profiles).
Configure AWS S3 credentials using
[environment variables](https://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/credentials.html#environment-credentials)
or a
[credentials file in `~/.aws/credentials`](https://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/credentials.html#credential-profiles).
Configure a bucket name and region in the `s3-sign.php` file.
Then, again in the **repository root**, start this example by doing:
@ -31,7 +36,9 @@ corepack yarn workspace @uppy-example/aws-php start
The demo should now be available at http://localhost:8080.
You can use a different S3-compatible service like GCS by configuring that service in `~/.aws/config` and `~/.aws/credentials`, and then providing appropriate environment variables:
You can use a different S3-compatible service like GCS by configuring that
service in `~/.aws/config` and `~/.aws/credentials`, and then providing
appropriate environment variables:
```bash
AWS_PROFILE="gcs" \

View file

@ -1,7 +1,7 @@
# Uppy + Companion + Custom Provider Example
This example uses @uppy/companion with a dummy custom provider.
This serves as an illustration on how integrating custom providers would work
This example uses @uppy/companion with a dummy custom provider. This serves as
an illustration on how integrating custom providers would work
## Run it
@ -9,14 +9,15 @@ This serves as an illustration on how integrating custom providers would work
First, you want to set up your environment variable. You can copy the content of
`.env.example` and save it in a file named `.env`. You can modify in there all
the information needed for the app to work that should not be committed
(Google keys, Unsplash keys, etc.).
the information needed for the app to work that should not be committed (Google
keys, Unsplash keys, etc.).
```sh
[ -f .env ] || cp .env.example .env
```
To run the example, from the root directory of this repo, run the following commands:
To run the example, from the root directory of this repo, run the following
commands:
```sh
corepack yarn install

View file

@ -1,13 +1,16 @@
# Uploading to DigitalOcean Spaces
This example uses Uppy to upload files to a [DigitalOcean Space](https://digitaloceanspaces.com/).
DigitalOcean Spaces has an identical API to S3, so we can use the
[AwsS3](https://uppy.io/docs/aws-s3-multipart) plugin. We use @uppy/companion with a
[custom `endpoint` configuration](./server.cjs#L39) that points to DigitalOcean.
This example uses Uppy to upload files to a
[DigitalOcean Space](https://digitaloceanspaces.com/). DigitalOcean Spaces has
an identical API to S3, so we can use the
[AwsS3](https://uppy.io/docs/aws-s3-multipart) plugin. We use @uppy/companion
with a [custom `endpoint` configuration](./server.cjs#L39) that points to
DigitalOcean.
## Running it
To run this example, make sure you've correctly installed the **repository root**:
To run this example, make sure you've correctly installed the **repository
root**:
```bash
corepack yarn install
@ -17,10 +20,10 @@ corepack yarn build
That will also install the dependencies for this example.
First, set up the `COMPANION_AWS_KEY`, `COMPANION_AWS_SECRET`,
`COMPANION_AWS_REGION` (use a DigitalOcean region name for `COMPANION_AWS_REGION`,
e.g. `nyc3`), and `COMPANION_AWS_BUCKET` environment variables for
`@uppy/companion` in a `.env` file. You may find useful to first copy the
`.env.example` file:
`COMPANION_AWS_REGION` (use a DigitalOcean region name for
`COMPANION_AWS_REGION`, e.g. `nyc3`), and `COMPANION_AWS_BUCKET` environment
variables for `@uppy/companion` in a `.env` file. You may find useful to first
copy the `.env.example` file:
```sh
[ -f .env ] || cp .env.example .env

View file

@ -1,11 +1,13 @@
# Multiple Instances
This example uses Uppy with the `@uppy/golden-retriever` plugin.
It has two instances on the same page, side-by-side, but with different `id`s so their stored files don't interfere with each other.
This example uses Uppy with the `@uppy/golden-retriever` plugin. It has two
instances on the same page, side-by-side, but with different `id`s so their
stored files don't interfere with each other.
## Run it
To run this example, make sure you've correctly installed the **repository root**:
To run this example, make sure you've correctly installed the **repository
root**:
```bash
corepack yarn install

View file

@ -1,10 +1,12 @@
# Uppy + Node Example
This example uses Node server and `@uppy/xhr-upload` to upload files to the local file system.
This example uses Node server and `@uppy/xhr-upload` to upload files to the
local file system.
## Run it
To run this example, make sure you've correctly installed the **repository root**:
To run this example, make sure you've correctly installed the **repository
root**:
```sh
corepack yarn install

View file

@ -1,10 +1,12 @@
# Uppy + PHP Example
This example uses PHP server and `@uppy/xhr-upload` to upload files to the local file system.
This example uses PHP server and `@uppy/xhr-upload` to upload files to the local
file system.
## Run it
To run this example, make sure you've correctly installed the **repository root**:
To run this example, make sure you've correctly installed the **repository
root**:
```sh
corepack yarn install

View file

@ -1,10 +1,12 @@
# Uppy + Python Example
This example uses a Python Flask server and `@uppy/xhr-upload` to upload files to the local file system.
This example uses a Python Flask server and `@uppy/xhr-upload` to upload files
to the local file system.
## Run it
To run this example, make sure you've correctly installed the **repository root**:
To run this example, make sure you've correctly installed the **repository
root**:
```sh
corepack yarn install
@ -13,7 +15,8 @@ corepack yarn build
That will also install the npm dependencies for this example.
Additionally, this example uses python dependencies. Move into this directory, and install them using pip:
Additionally, this example uses python dependencies. Move into this directory,
and install them using pip:
```sh
corepack yarn workspace @uppy-example/python-xhr installPythonDeps

View file

@ -11,7 +11,7 @@ corepack yarn build
corepack yarn workspace @uppy-example/react dev
```
If you'd like to use a different package manager than Yarn (e.g. npm) to work
If you'd like to use a different package manager than Yarn (e.g. npm) to work
with this example, you can extract it from the workspace like this:
```sh

View file

@ -2,11 +2,14 @@
⚠️ In Beta
`@uppy/react-native` is a basic Uppy component for React Native with Expo. It is in Beta, and is not full-featured. You can select local images or videos, take a picture with a camera or add any file from a remote url with Uppy Companion.
`@uppy/react-native` is a basic Uppy component for React Native with Expo. It is
in Beta, and is not full-featured. You can select local images or videos, take a
picture with a camera or add any file from a remote url with Uppy Companion.
## Run it
To run this example, make sure you've correctly installed the **repository root**:
To run this example, make sure you've correctly installed the **repository
root**:
```bash
yarn install
@ -22,4 +25,5 @@ cd examples/react-native-expo
yarn start
```
Then you'll see a menu within your terminal where you can chose where to open the app (Android, iOS, device etc.)
Then you'll see a menu within your terminal where you can chose where to open
the app (Android, iOS, device etc.)

View file

@ -1,14 +1,18 @@
# Redux
This example uses Uppy with a Redux store.
The same Redux store is also used for other parts of the application, namely the counter example.
Each action is logged to the console using [redux-logger](https://github.com/theaqua/redux-logger).
This example uses Uppy with a Redux store. The same Redux store is also used for
other parts of the application, namely the counter example. Each action is
logged to the console using
[redux-logger](https://github.com/theaqua/redux-logger).
This example supports the [Redux Devtools extension](https://github.com/zalmoxisus/redux-devtools-extension), including time travel.
This example supports the
[Redux Devtools extension](https://github.com/zalmoxisus/redux-devtools-extension),
including time travel.
## Run it
To run this example, make sure you've correctly installed the **repository root**:
To run this example, make sure you've correctly installed the **repository
root**:
```sh
corepack yarn install

View file

@ -2,7 +2,8 @@
## Run it
To run this example, make sure you've correctly installed the **repository root**:
To run this example, make sure you've correctly installed the **repository
root**:
```sh
corepack yarn install

View file

@ -4,7 +4,8 @@ This example uses Uppy to handle images in a markdown editor.
## Run it
To run this example, make sure you've correctly installed the **repository root**:
To run this example, make sure you've correctly installed the **repository
root**:
```sh
corepack yarn install
@ -17,4 +18,4 @@ Then, again in the **repository root**, start this example by doing:
```sh
corepack yarn workspace @uppy-example/transloadit-markdown-bin start
```
```

View file

@ -5,7 +5,8 @@ This example shows how to make advantage of Uppy API to upload files to
## Run it
To run this example, make sure you've correctly installed the **repository root**:
To run this example, make sure you've correctly installed the **repository
root**:
```sh
corepack yarn install

View file

@ -1,10 +1,12 @@
# @uppy/companion example
This is a simple, lean example that combines the usage of @uppy/companion and uppy client.
This is a simple, lean example that combines the usage of @uppy/companion and
uppy client.
## Test it
To run this example, make sure you've correctly installed the **repository root**:
To run this example, make sure you've correctly installed the **repository
root**:
```bash
corepack yarn install

View file

@ -3,7 +3,8 @@
Youre browsing the documentation for Vue v2.x and earlier. Check out
[Vue 3 example](../vue3/) for new projects.
To run the example, from the root directory of this repo, run the following commands:
To run the example, from the root directory of this repo, run the following
commands:
```sh
corepack yarn install

View file

@ -1,6 +1,7 @@
# Vue 3 example
To run the example, from the root directory of this repo, run the following commands:
To run the example, from the root directory of this repo, run the following
commands:
```sh
cp .env.example .env

View file

@ -1,12 +1,19 @@
# XHR Bundle Upload
This example uses Uppy with XHRUpload plugin in `bundle` mode. Bundle mode uploads all files to the endpoint in a single request, instead of firing off a new request for each file. This makes uploading a bit slower, but it may be easier to handle on the server side, depending on your setup.
This example uses Uppy with XHRUpload plugin in `bundle` mode. Bundle mode
uploads all files to the endpoint in a single request, instead of firing off a
new request for each file. This makes uploading a bit slower, but it may be
easier to handle on the server side, depending on your setup.
[`server.cjs`](./server.cjs) contains an example express.js server that receives a multipart form-data upload and responds with some information about the files that were received (name, size) as JSON. It uses [multer](https://npmjs.com/package/multer) to parse the upload stream.
[`server.cjs`](./server.cjs) contains an example express.js server that receives
a multipart form-data upload and responds with some information about the files
that were received (name, size) as JSON. It uses
[multer](https://npmjs.com/package/multer) to parse the upload stream.
## Run it
To run this example, make sure you've correctly installed the **repository root**:
To run this example, make sure you've correctly installed the **repository
root**:
```sh
corepack yarn install

View file

@ -2,11 +2,16 @@
<img src="https://uppy.io/img/logo.svg" width="120" alt="Uppy logo: a smiling puppy above a pink upwards arrow" align="right">
<a href="https://www.npmjs.com/package/@uppy/audio"><img src="https://img.shields.io/npm/v/@uppy/webcam.svg?style=flat-square"></a> <img src="https://github.com/transloadit/uppy/workflows/Tests/badge.svg" alt="CI status for Uppy tests"> <img src="https://github.com/transloadit/uppy/workflows/Companion/badge.svg" alt="CI status for Companion tests"> <img src="https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg" alt="CI status for browser tests">
<a href="https://www.npmjs.com/package/@uppy/audio"><img src="https://img.shields.io/npm/v/@uppy/webcam.svg?style=flat-square"></a>
<img src="https://github.com/transloadit/uppy/workflows/Tests/badge.svg" alt="CI status for Uppy tests">
<img src="https://github.com/transloadit/uppy/workflows/Companion/badge.svg" alt="CI status for Companion tests">
<img src="https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg" alt="CI status for browser tests">
The Audio plugin for Uppy lets you record audio using a built-in or external microphone, or any other audio device, on desktop and mobile.
The Audio plugin for Uppy lets you record audio using a built-in or external
microphone, or any other audio device, on desktop and mobile.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -24,11 +29,15 @@ uppy.use(Audio)
$ npm install @uppy/audio
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/webcam).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/webcam).
## License

View file

@ -7,9 +7,13 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
The AwsS3Multipart plugin can be used to upload files directly to an S3 bucket using S3s Multipart upload strategy. With this strategy, files are chopped up in parts of 5MB+ each, so they can be uploaded concurrently. Its also reliable: if a single part fails to upload, only that 5MB has to be retried.
The AwsS3Multipart plugin can be used to upload files directly to an S3 bucket
using S3s Multipart upload strategy. With this strategy, files are chopped up
in parts of 5MB+ each, so they can be uploaded concurrently. Its also reliable:
if a single part fails to upload, only that 5MB has to be retried.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -30,11 +34,15 @@ uppy.use(AwsS3Multipart, {
$ npm install @uppy/aws-s3-multipart
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/aws-s3-multipart).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/aws-s3-multipart).
## License

View file

@ -7,9 +7,11 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
The AwsS3 plugin can be used to upload files directly to an S3 bucket. Uploads can be signed using Companion or a custom signing function.
The AwsS3 plugin can be used to upload files directly to an S3 bucket. Uploads
can be signed using Companion or a custom signing function.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -31,11 +33,15 @@ uppy.use(AwsS3, {
$ npm install @uppy/aws-s3
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/aws-s3).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/aws-s3).
## License

View file

@ -9,9 +9,13 @@
The Box plugin for Uppy lets users import files from their Box account.
A Companion instance is required for the Box plugin to work. Companion handles authentication with Box, downloads files from Box and uploads them to the destination. This saves the user bandwidth, especially helpful if they are on a mobile connection.
A Companion instance is required for the Box plugin to work. Companion handles
authentication with Box, downloads files from Box and uploads them to the
destination. This saves the user bandwidth, especially helpful if they are on a
mobile connection.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -31,11 +35,15 @@ uppy.use(Box, {
$ npm install @uppy/box
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/box).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/box).
## License

View file

@ -7,9 +7,11 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
Client library for communication with Companion. Intended for use in Uppy plugins.
Client library for communication with Companion. Intended for use in Uppy
plugins.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -19,7 +21,9 @@ import { Provider, RequestClient, Socket } from '@uppy/companion-client'
const uppy = new Uppy()
const client = new RequestClient(uppy, { companionUrl: 'https://uppy.mywebsite.com/' })
const client = new RequestClient(uppy, {
companionUrl: 'https://uppy.mywebsite.com/',
})
client.get('/drive/list').then(() => {})
const provider = new Provider(uppy, {
@ -34,7 +38,8 @@ socket.on('progress', () => {})
## Installation
> Unless you are writing a custom provider plugin, you do not need to install this.
> Unless you are writing a custom provider plugin, you do not need to install
> this.
```bash
$ npm install @uppy/companion-client

View file

@ -1,13 +1,15 @@
Companion is the server side component for Uppy. Its built with Express.js.
The purpose of Companion is to interface with third party APIs and handle remote file uploading from them.
Companion is the server side component for Uppy. Its built with Express.js. The
purpose of Companion is to interface with third party APIs and handle remote
file uploading from them.
# How it works
## oAuth with Grant, Sessions
Companion uses an oAuth middleware library called `Grant` to simplify oAuth authentication.
Inside of `config/grant.js`, you configure the oAuth providers you wish to use, providing things like client key,
client secret, scopes, and the callback URL you wish to use. For example:
Companion uses an oAuth middleware library called `Grant` to simplify oAuth
authentication. Inside of `config/grant.js`, you configure the oAuth providers
you wish to use, providing things like client key, client secret, scopes, and
the callback URL you wish to use. For example:
```js
const config = {
@ -23,13 +25,20 @@ const config = {
}
```
Once this `google` config is added to `config/grant.js`, Grant automatically creates a route `/connect/google` that
redirects to Googles oAuth page. So on the client side, you need to link the user to `https://your-server/connect/google`.
Once this `google` config is added to `config/grant.js`, Grant automatically
creates a route `/connect/google` that redirects to Googles oAuth page. So on
the client side, you need to link the user to
`https://your-server/connect/google`.
After the user completes the oAuth flow, they should always be redirected to `https://your-server/:provider/redirect`. This endpoint will in turn redirect to `https://your-server/:provider/callback`.
The `/:provider/callback` routes are handled by the `callback` controller at `server/controllers/callback.js`.
This controller receives the oAuth token, generates a json web token with it, and sends the generated json web token to the client by adding it to the cookies. This way companion doesnt have to save users oAuth tokens (which is good from the security perspective).
This json web token would be sent to companion in later requests and the oAuth token can be read from it.
After the user completes the oAuth flow, they should always be redirected to
`https://your-server/:provider/redirect`. This endpoint will in turn redirect to
`https://your-server/:provider/callback`. The `/:provider/callback` routes are
handled by the `callback` controller at `server/controllers/callback.js`. This
controller receives the oAuth token, generates a json web token with it, and
sends the generated json web token to the client by adding it to the cookies.
This way companion doesnt have to save users oAuth tokens (which is good from
the security perspective). This json web token would be sent to companion in
later requests and the oAuth token can be read from it.
## Routing And Controllers
@ -42,37 +51,61 @@ router.post('/:provider/:action', dispatcher)
router.post('/:provider/:action/:id', dispatcher)
```
Each route is handled by the `dispatcher` controller in `server/controllers/dispatcher.js`, which calls the correct controller based on `:action`.
Each route is handled by the `dispatcher` controller in
`server/controllers/dispatcher.js`, which calls the correct controller based on
`:action`.
Heres the list of provided controllers:
| controller | description |
| ---------- | ----------- |
| `authorized` | checks if the current user is authorized |
| `callback` | handles redirect from oAuth. Stores oAuth token in user session and redirects user |
| `get` | downloads files from third party APIs, writes them to disk, and uploads them to the target server |
| `list` | fetches a list of files, usually from a specified directory |
| `logout` | removes all token info from the user session |
| controller | description |
| ------------ | ------------------------------------------------------------------------------------------------- |
| `authorized` | checks if the current user is authorized |
| `callback` | handles redirect from oAuth. Stores oAuth token in user session and redirects user |
| `get` | downloads files from third party APIs, writes them to disk, and uploads them to the target server |
| `list` | fetches a list of files, usually from a specified directory |
| `logout` | removes all token info from the user session |
These controllers are generalized to work for any provider. The provider specific implementation code for each provider can be found under `server/providers`.
These controllers are generalized to work for any provider. The provider
specific implementation code for each provider can be found under
`server/providers`.
## Adding new providers
To add a new provider to Companion, you need to do two things: add the provider config to `config/grant.js`, and then create a new file in `server/providers` that describes how to interface with the providers API.
To add a new provider to Companion, you need to do two things: add the provider
config to `config/grant.js`, and then create a new file in `server/providers`
that describes how to interface with the providers API.
We are using a library called [got](https://github.com/sindresorhus/got) to make it easier to interface with third party APIs.
We are using a library called [got](https://github.com/sindresorhus/got) to make
it easier to interface with third party APIs.
Since each API works differently, we need to describe how to `download` and `list` files from the provider in a file within `server/providers`. The name of the file should be the same as what endpoint it will use. For example, `server/providers/foobar.js` if the client requests a list of files from `https://our-server/foobar/list`.
Since each API works differently, we need to describe how to `download` and
`list` files from the provider in a file within `server/providers`. The name of
the file should be the same as what endpoint it will use. For example,
`server/providers/foobar.js` if the client requests a list of files from
`https://our-server/foobar/list`.
**Note:** As of right now, you only need to implement `YourProvider.prototype.list` and `YourProvider.prototype.download` for each provider, I believe. `stats` seems to be used by Dropbox to get a list of files, so thats required there, but `upload` is optional unless you all decide to allow uploading to third parties. I got that code from an example.
**Note:** As of right now, you only need to implement
`YourProvider.prototype.list` and `YourProvider.prototype.download` for each
provider, I believe. `stats` seems to be used by Dropbox to get a list of files,
so thats required there, but `upload` is optional unless you all decide to
allow uploading to third parties. I got that code from an example.
## WebSockets
Companion uses WebSockets to transfer `progress` events to the client during file transfers. Its only set up to transfer progress during Tus uploads to the target server.
Companion uses WebSockets to transfer `progress` events to the client during
file transfers. Its only set up to transfer progress during Tus uploads to the
target server.
When a request is made to `/:provider/get` to start a transfer, a token is generated and sent back to the client in response. The client then connects to `wss://your-server/whatever-their-token-is`. Any events that are emitted using the token as the name (as in `emitter.emit('whatever-their-token-is', progressData)`) are sent back to the client.
When a request is made to `/:provider/get` to start a transfer, a token is
generated and sent back to the client in response. The client then connects to
`wss://your-server/whatever-their-token-is`. Any events that are emitted using
the token as the name (as in
`emitter.emit('whatever-their-token-is', progressData)`) are sent back to the
client.
WebSockets arent particularly secure, but we feel this is safe because the token is only usable during the corresponding file transfer, and no sensitive information is being sent, only a file id and the progress.
WebSockets arent particularly secure, but we feel this is safe because the
token is only usable during the corresponding file transfer, and no sensitive
information is being sent, only a file id and the progress.
# Design Goals
@ -80,12 +113,22 @@ These are the goals I had in mind while designing and building Companion.
## Standalone Server / Pluggable Module
Companion works as a standalone server. It should also work as a module that can be incorporated into an existing server, so people dont have to manage another server to use Uppy.
Companion works as a standalone server. It should also work as a module that can
be incorporated into an existing server, so people dont have to manage another
server to use Uppy.
One issue here is that `Grant` has different versions for Koa, Express, and Hapi. Were using `grant-express` right now, and also use all express modules. This becomes a problem if someone is using Koa, or Hapi, or something else. I dont think we can make Companion completely framework agnostic, so best case scenario would be to follow Grant and make versions for Koa, Hapi, and Express.
One issue here is that `Grant` has different versions for Koa, Express, and
Hapi. Were using `grant-express` right now, and also use all express modules.
This becomes a problem if someone is using Koa, or Hapi, or something else. I
dont think we can make Companion completely framework agnostic, so best case
scenario would be to follow Grant and make versions for Koa, Hapi, and Express.
All this may be more trouble than its worth if no one needs it, so Id get some community feedback beforehand.
All this may be more trouble than its worth if no one needs it, so Id get some
community feedback beforehand.
## Allow users to add new providers
Suppose a developer wants to use Uppy with a third party API provider that we dont support. There needs to be some way for them to be able to add their own custom providers, hopefully without having to edit `companion`s source (adding files to `server/providers`).
Suppose a developer wants to use Uppy with a third party API provider that we
dont support. There needs to be some way for them to be able to add their own
custom providers, hopefully without having to edit `companion`s source (adding
files to `server/providers`).

View file

@ -1,12 +1,14 @@
### Run companion on kubernetes
You can use our docker container to run companion on kubernetes with the following configuration.
You can use our docker container to run companion on kubernetes with the
following configuration.
```bash
kubectl create ns uppy
```
We will need a Redis container that we can get through [helm](https://github.com/kubernetes/helm):
We will need a Redis container that we can get through
[helm](https://github.com/kubernetes/helm):
```bash
helm install --name redis \
@ -20,30 +22,30 @@ We will need a Redis container that we can get through [helm](https://github.com
```yaml
apiVersion: v1
data:
COMPANION_CLIENT_ORIGINS: "localhost:3452,uppy.io"
COMPANION_DATADIR: "PATH/TO/DOWNLOAD/DIRECTORY"
COMPANION_DOMAIN: "YOUR SERVER DOMAIN"
COMPANION_DOMAINS: "sub1.domain.com,sub2.domain.com,sub3.domain.com"
COMPANION_PROTOCOL: "YOUR SERVER PROTOCOL"
COMPANION_CLIENT_ORIGINS: 'localhost:3452,uppy.io'
COMPANION_DATADIR: 'PATH/TO/DOWNLOAD/DIRECTORY'
COMPANION_DOMAIN: 'YOUR SERVER DOMAIN'
COMPANION_DOMAINS: 'sub1.domain.com,sub2.domain.com,sub3.domain.com'
COMPANION_PROTOCOL: 'YOUR SERVER PROTOCOL'
COMPANION_STREAMING_UPLOAD: true
COMPANION_REDIS_URL: redis://:superSecretPassword@uppy-redis.uppy.svc.cluster.local:6379
COMPANION_SECRET: "shh!Issa Secret!"
COMPANION_PREAUTH_SECRET: "another secret"
COMPANION_DROPBOX_KEY: "YOUR DROPBOX KEY"
COMPANION_DROPBOX_SECRET: "YOUR DROPBOX SECRET"
COMPANION_BOX_KEY: "YOUR BOX KEY"
COMPANION_BOX_SECRET: "YOUR BOX SECRET"
COMPANION_GOOGLE_KEY: "YOUR GOOGLE KEY"
COMPANION_GOOGLE_SECRET: "YOUR GOOGLE SECRET"
COMPANION_INSTAGRAM_KEY: "YOUR INSTAGRAM KEY"
COMPANION_INSTAGRAM_SECRET: "YOUR INSTAGRAM SECRET"
COMPANION_AWS_KEY: "YOUR AWS KEY"
COMPANION_AWS_SECRET: "YOUR AWS SECRET"
COMPANION_AWS_BUCKET: "YOUR AWS S3 BUCKET"
COMPANION_AWS_REGION: "AWS REGION"
COMPANION_AWS_PREFIX: "AWS PREFIX"
COMPANION_OAUTH_DOMAIN: "sub.domain.com"
COMPANION_UPLOAD_URLS: "http://tusd.tusdemo.net/files/,https://tusd.tusdemo.net/files/"
COMPANION_SECRET: 'shh!Issa Secret!'
COMPANION_PREAUTH_SECRET: 'another secret'
COMPANION_DROPBOX_KEY: 'YOUR DROPBOX KEY'
COMPANION_DROPBOX_SECRET: 'YOUR DROPBOX SECRET'
COMPANION_BOX_KEY: 'YOUR BOX KEY'
COMPANION_BOX_SECRET: 'YOUR BOX SECRET'
COMPANION_GOOGLE_KEY: 'YOUR GOOGLE KEY'
COMPANION_GOOGLE_SECRET: 'YOUR GOOGLE SECRET'
COMPANION_INSTAGRAM_KEY: 'YOUR INSTAGRAM KEY'
COMPANION_INSTAGRAM_SECRET: 'YOUR INSTAGRAM SECRET'
COMPANION_AWS_KEY: 'YOUR AWS KEY'
COMPANION_AWS_SECRET: 'YOUR AWS SECRET'
COMPANION_AWS_BUCKET: 'YOUR AWS S3 BUCKET'
COMPANION_AWS_REGION: 'AWS REGION'
COMPANION_AWS_PREFIX: 'AWS PREFIX'
COMPANION_OAUTH_DOMAIN: 'sub.domain.com'
COMPANION_UPLOAD_URLS: 'http://tusd.tusdemo.net/files/,https://tusd.tusdemo.net/files/'
kind: Secret
metadata:
name: companion-env
@ -73,25 +75,25 @@ spec:
app: companion
spec:
containers:
- image: docker.io/transloadit/companion:latest
imagePullPolicy: ifNotPresent
name: companion
resources:
limits:
memory: 150Mi
requests:
memory: 100Mi
envFrom:
- secretRef:
name: companion-env
ports:
- containerPort: 3020
volumeMounts:
- name: companion-data
mountPath: /mnt/companion-data
- image: docker.io/transloadit/companion:latest
imagePullPolicy: ifNotPresent
name: companion
resources:
limits:
memory: 150Mi
requests:
memory: 100Mi
envFrom:
- secretRef:
name: companion-env
ports:
- containerPort: 3020
volumeMounts:
- name: companion-data
mountPath: /mnt/companion-data
volumes:
- name: companion-data
emptyDir: {}
- name: companion-data
emptyDir: {}
```
```bash
@ -108,9 +110,9 @@ metadata:
namespace: uppy
spec:
ports:
- port: 80
targetPort: 3020
protocol: TCP
- port: 80
targetPort: 3020
protocol: TCP
selector:
app: companion
```

View file

@ -4,10 +4,14 @@
[![Build Status](https://travis-ci.org/transloadit/uppy.svg?branch=main)](https://travis-ci.org/transloadit/uppy)
Companion is a server integration for [Uppy](https://github.com/transloadit/uppy) file uploader.
Companion is a server integration for
[Uppy](https://github.com/transloadit/uppy) file uploader.
It handles the server-to-server communication between your server and file storage providers such as Google Drive, Dropbox,
Instagram, etc. **Companion is not a target to upload files to**. For this, use a <https://tus.io> server (if you want resumable) or your existing Apache/Nginx server (if you dont). [See here for full documentation](https://uppy.io/docs/companion/)
It handles the server-to-server communication between your server and file
storage providers such as Google Drive, Dropbox, Instagram, etc. **Companion is
not a target to upload files to**. For this, use a <https://tus.io> server (if
you want resumable) or your existing Apache/Nginx server (if you dont).
[See here for full documentation](https://uppy.io/docs/companion/)
## Install
@ -15,11 +19,16 @@ Instagram, etc. **Companion is not a target to upload files to**. For this, use
npm install @uppy/companion
```
If you dont have a Node.js project with a `package.json` you might want to install/run Companion globally like so: `[sudo] npm install -g @uppy/companion@1.x` (best check the actual latest version, and use that, so (re)installs are reproducible, and upgrades intentional).
If you dont have a Node.js project with a `package.json` you might want to
install/run Companion globally like so:
`[sudo] npm install -g @uppy/companion@1.x` (best check the actual latest
version, and use that, so (re)installs are reproducible, and upgrades
intentional).
## Usage
companion may either be used as pluggable express app, which you plug to your existing server, or it may also be run as a standalone server:
companion may either be used as pluggable express app, which you plug to your
existing server, or it may also be run as a standalone server:
### Plug to an existing server
@ -52,7 +61,8 @@ const { app: companionApp } = companion.app(options)
app.use(companionApp)
```
To enable companion socket for realtime feed to the client while upload is going on, you call the `socket` method like so.
To enable companion socket for realtime feed to the client while upload is going
on, you call the `socket` method like so.
```javascript
// ...
@ -63,14 +73,16 @@ companion.socket(server)
### Run as standalone server
Please make sure that the required env variables are set before runnning/using companion as a standalone server. [See](https://uppy.io/docs/companion/#Configure-Standalone).
Please make sure that the required env variables are set before runnning/using
companion as a standalone server.
[See](https://uppy.io/docs/companion/#Configure-Standalone).
```bash
$ companion
```
If you cloned the repo from GitHub and want to run it as a standalone server, you may also run the following command from within its
directory
If you cloned the repo from GitHub and want to run it as a standalone server,
you may also run the following command from within its directory
```bash
npm start
@ -107,6 +119,7 @@ heroku create
git push heroku master
```
Make sure you set the required [environment variables](https://uppy.io/docs/companion/#Configure-Standalone).
Make sure you set the required
[environment variables](https://uppy.io/docs/companion/#Configure-Standalone).
See [full documentation](https://uppy.io/docs/companion/)

View file

@ -2,11 +2,17 @@
<img src="https://uppy.io/img/logo.svg" width="120" alt="Uppy logo: a smiling puppy above a pink upwards arrow" align="right">
<a href="https://www.npmjs.com/package/@uppy/compressor"><img src="https://img.shields.io/npm/v/@uppy/compressor.svg?style=flat-square"></a> <img src="https://github.com/transloadit/uppy/workflows/Tests/badge.svg" alt="CI status for Uppy tests"> <img src="https://github.com/transloadit/uppy/workflows/Companion/badge.svg" alt="CI status for Companion tests"> <img src="https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg" alt="CI status for browser tests">
<a href="https://www.npmjs.com/package/@uppy/compressor"><img src="https://img.shields.io/npm/v/@uppy/compressor.svg?style=flat-square"></a>
<img src="https://github.com/transloadit/uppy/workflows/Tests/badge.svg" alt="CI status for Uppy tests">
<img src="https://github.com/transloadit/uppy/workflows/Companion/badge.svg" alt="CI status for Companion tests">
<img src="https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg" alt="CI status for browser tests">
The Compressor plugin for Uppy optimizes images (JPEG, PNG, WEBP), saving on average up to 60% in size (roughly 18 MB for 10 images). It uses [Compressor.js](https://github.com/fengyuanchen/compressorjs).
The Compressor plugin for Uppy optimizes images (JPEG, PNG, WEBP), saving on
average up to 60% in size (roughly 18 MB for 10 images). It uses
[Compressor.js](https://github.com/fengyuanchen/compressorjs).
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -24,13 +30,19 @@ uppy.use(Compressor)
npm install @uppy/compressor
```
We recommend installing from yarn or npm, and then using a module bundler such as [Parcel](https://parceljs.org/), [Vite](https://vitejs.dev/) or [Webpack](https://webpack.js.org/).
We recommend installing from yarn or npm, and then using a module bundler such
as [Parcel](https://parceljs.org/), [Vite](https://vitejs.dev/) or
[Webpack](https://webpack.js.org/).
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/compressor).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/compressor).
## License

View file

@ -7,15 +7,20 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
Uppy is a sleek, modular JavaScript file uploader that integrates seamlessly with any application. Its fast, provides a comprehensible API and lets you worry about more important problems than building a file uploader.
Uppy is a sleek, modular JavaScript file uploader that integrates seamlessly
with any application. Its fast, provides a comprehensible API and lets you
worry about more important problems than building a file uploader.
* **Fetch** files from local disk, remote urls, Google Drive, Dropbox, Instagram, or snap and record selfies with a camera;
* **Preview** and edit metadata with a nice interface;
* **Upload** to the final destination, optionally process/encode
- **Fetch** files from local disk, remote urls, Google Drive, Dropbox,
Instagram, or snap and record selfies with a camera;
- **Preview** and edit metadata with a nice interface;
- **Upload** to the final destination, optionally process/encode
**[Read the docs](https://uppy.io/docs)** | **[Try Uppy](https://uppy.io/examples/dashboard/)**
**[Read the docs](https://uppy.io/docs)** |
**[Try Uppy](https://uppy.io/examples/dashboard/)**
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -32,11 +37,15 @@ uppy.use(SomePlugin)
$ npm install @uppy/core
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/uppy).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/uppy).
## License

View file

@ -9,16 +9,20 @@
Dashboard is a universal UI plugin for Uppy:
* Drag and Drop, paste, select from local disk / my device
* UI for Webcam and remote sources: Google Drive, Dropbox, Instagram (all optional, added via plugins)
* File previews and info
* Metadata editor
* Progress: total and for individual files
* Ability to pause/resume or cancel (depending on uploader plugin) individual or all files
- Drag and Drop, paste, select from local disk / my device
- UI for Webcam and remote sources: Google Drive, Dropbox, Instagram (all
optional, added via plugins)
- File previews and info
- Metadata editor
- Progress: total and for individual files
- Ability to pause/resume or cancel (depending on uploader plugin) individual or
all files
**[Read the docs](https://uppy.io/docs/dashboard/)** | **[Try it](https://uppy.io/examples/dashboard/)**
**[Read the docs](https://uppy.io/docs/dashboard/)** |
**[Try it](https://uppy.io/examples/dashboard/)**
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -39,11 +43,15 @@ uppy.use(Dashboard, {
$ npm install @uppy/dashboard
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/dashboard).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/dashboard).
## License

View file

@ -9,9 +9,11 @@
Droppable zone UI for Uppy. Drag and drop files into it to upload.
**[Read the docs](https://uppy.io/docs/dragdrop)** | **[Try it](https://uppy.io/examples/dragdrop/)**
**[Read the docs](https://uppy.io/docs/dragdrop)** |
**[Try it](https://uppy.io/examples/dragdrop/)**
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -31,11 +33,15 @@ uppy.use(DragDrop, {
$ npm install @uppy/drag-drop
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/dragdrop).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/dragdrop).
## License

View file

@ -9,9 +9,13 @@
The Dropbox plugin for Uppy lets users import files from their Dropbox account.
A Companion instance is required for the Dropbox plugin to work. Companion handles authentication with Dropbox, downloads files from Dropbox and uploads them to the destination. This saves the user bandwidth, especially helpful if they are on a mobile connection.
A Companion instance is required for the Dropbox plugin to work. Companion
handles authentication with Dropbox, downloads files from Dropbox and uploads
them to the destination. This saves the user bandwidth, especially helpful if
they are on a mobile connection.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -31,11 +35,15 @@ uppy.use(Dropbox, {
$ npm install @uppy/dropbox
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/dropbox).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/dropbox).
## License

View file

@ -7,11 +7,16 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
The Facebook plugin for Uppy lets users import files from their Facebook account.
The Facebook plugin for Uppy lets users import files from their Facebook
account.
A Companion instance is required for the Facebook plugin to work. Companion handles authentication with Facebook, downloads files from Facebook and uploads them to the destination. This saves the user bandwidth, especially helpful if they are on a mobile connection.
A Companion instance is required for the Facebook plugin to work. Companion
handles authentication with Facebook, downloads files from Facebook and uploads
them to the destination. This saves the user bandwidth, especially helpful if
they are on a mobile connection.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -31,11 +36,15 @@ uppy.use(Facebook, {
$ npm install @uppy/facebook
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/facebook).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/facebook).
## License

View file

@ -7,11 +7,14 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
FileInput is the most barebones UI for selecting files—it shows a single button that, when clicked, opens up the browsers file selector.
FileInput is the most barebones UI for selecting files—it shows a single button
that, when clicked, opens up the browsers file selector.
**[Read the docs](https://uppy.io/docs/fileinput)** | **[Try it](https://uppy.io/examples/xhrupload/)**
**[Read the docs](https://uppy.io/docs/fileinput)** |
**[Try it](https://uppy.io/examples/xhrupload/)**
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -31,11 +34,15 @@ uppy.use(FileInput, {
$ npm install @uppy/file-input
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/fileinput).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/fileinput).
## License

View file

@ -7,9 +7,13 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
The Form plugin collects metadata from any specified `<form>` element, right before Uppy begins uploading/processing files. It optionally appends results back to the form. The appended result is a stringified version of a result returned from `uppy.upload()`.
The Form plugin collects metadata from any specified `<form>` element, right
before Uppy begins uploading/processing files. It optionally appends results
back to the form. The appended result is a stringified version of a result
returned from `uppy.upload()`.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -33,11 +37,15 @@ uppy.use(Form, {
$ npm install @uppy/form
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/form).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/form).
## License

View file

@ -7,9 +7,14 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
The GoldenRetriever plugin saves selected files in your browser cache (Local Storage for metadata, then Service Worker for all blobs + IndexedDB for small blobs), so that if the browser crashes, Uppy can restore everything and continue uploading like nothing happened. Read more about it [on the blog](https://uppy.io/blog/2017/07/golden-retriever/).
The GoldenRetriever plugin saves selected files in your browser cache (Local
Storage for metadata, then Service Worker for all blobs + IndexedDB for small
blobs), so that if the browser crashes, Uppy can restore everything and continue
uploading like nothing happened. Read more about it
[on the blog](https://uppy.io/blog/2017/07/golden-retriever/).
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -29,11 +34,15 @@ uppy.use(GoldenRetriever, {
$ npm install @uppy/golden-retriever
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/golden-retriever).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/golden-retriever).
## License

View file

@ -7,11 +7,16 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
The Google Drive plugin for Uppy lets users import files from their Google Drive account.
The Google Drive plugin for Uppy lets users import files from their Google Drive
account.
A Companion instance is required for the GoogleDrive plugin to work. Companion handles authentication with Google, downloads files from the Drive and uploads them to the destination. This saves the user bandwidth, especially helpful if they are on a mobile connection.
A Companion instance is required for the GoogleDrive plugin to work. Companion
handles authentication with Google, downloads files from the Drive and uploads
them to the destination. This saves the user bandwidth, especially helpful if
they are on a mobile connection.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -31,11 +36,15 @@ uppy.use(GoogleDrive, {
$ npm install @uppy/google-drive
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/google-drive).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/google-drive).
## License

View file

@ -7,13 +7,16 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
Image Editor is an image cropping and editing plugin for Uppy. Designed to be used with the Dashboard UI (can in theory work without it).
Image Editor is an image cropping and editing plugin for Uppy. Designed to be
used with the Dashboard UI (can in theory work without it).
⚠ In beta.
**[Read the docs](https://uppy.io/docs/image-editor)** | **[Try it](https://uppy.io/examples/dashboard/)**
**[Read the docs](https://uppy.io/docs/image-editor)** |
**[Try it](https://uppy.io/examples/dashboard/)**
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -36,11 +39,15 @@ uppy.use(ImageEditor, {
$ npm install @uppy/image-editor
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/image-editor).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/image-editor).
## License

View file

@ -7,9 +7,11 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
The Informer is a pop-up bar for showing notifications. When other plugins have some exciting news (or error) to share, they can show a notification here.
The Informer is a pop-up bar for showing notifications. When other plugins have
some exciting news (or error) to share, they can show a notification here.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -29,11 +31,15 @@ uppy.use(Informer, {
$ npm install @uppy/informer
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/informer).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/informer).
## License

View file

@ -9,9 +9,13 @@
The Instagram plugin lets users import photos from their Instagram account.
A [Companion](https://uppy.io/docs/companion) instance is required for the Instagram plugin to work. Companion handles authentication with Instagram, downloads the pictures and videos, and uploads them to the destination. This saves the user bandwidth, especially helpful if they are on a mobile connection.
A [Companion](https://uppy.io/docs/companion) instance is required for the
Instagram plugin to work. Companion handles authentication with Instagram,
downloads the pictures and videos, and uploads them to the destination. This
saves the user bandwidth, especially helpful if they are on a mobile connection.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -20,8 +24,7 @@ import Uppy from '@uppy/core'
import Instagram from '@uppy/instagram'
const uppy = new Uppy()
uppy.use(Instagram, {
})
uppy.use(Instagram, {})
```
## Installation
@ -30,11 +33,15 @@ uppy.use(Instagram, {
$ npm install @uppy/instagram
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/instagram).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/instagram).
## License

View file

@ -7,7 +7,10 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
This package includes all the locale packs that you can use to make Uppy speak your language! If your language is missing, please consider [contributing](https://github.com/transloadit/uppy/tree/main/packages/%40uppy/locales/src), starting with `en_US`, which is always up-to-date automatically.
This package includes all the locale packs that you can use to make Uppy speak
your language! If your language is missing, please consider
[contributing](https://github.com/transloadit/uppy/tree/main/packages/%40uppy/locales/src),
starting with `en_US`, which is always up-to-date automatically.
## Installation

View file

@ -7,11 +7,16 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
The OneDrive plugin for Uppy lets users import files from their OneDrive account.
The OneDrive plugin for Uppy lets users import files from their OneDrive
account.
A Companion instance is required for the OneDrive plugin to work. Companion handles authentication with Microsoft OneDrive, downloads files from OneDrive and uploads them to the destination. This saves the user bandwidth, especially helpful if they are on a mobile connection.
A Companion instance is required for the OneDrive plugin to work. Companion
handles authentication with Microsoft OneDrive, downloads files from OneDrive
and uploads them to the destination. This saves the user bandwidth, especially
helpful if they are on a mobile connection.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -31,11 +36,15 @@ uppy.use(OneDrive, {
$ npm install @uppy/onedrive
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/facebook).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/facebook).
## License

View file

@ -7,9 +7,12 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
ProgressBar is a minimalist plugin that shows the current upload progress in a thin bar element. Like the ones used by YouTube and GitHub when navigating between pages.
ProgressBar is a minimalist plugin that shows the current upload progress in a
thin bar element. Like the ones used by YouTube and GitHub when navigating
between pages.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -29,11 +32,15 @@ uppy.use(ProgressBar, {
$ npm install @uppy/progress-bar
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/progressbar).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/progressbar).
## License

View file

@ -9,7 +9,8 @@
View library for Uppy remote provider plugins.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -18,19 +19,19 @@ import Plugin from '@uppy/core/lib/plugin'
import { ProviderViews } from '@uppy/provider-views'
class GoogleDrive extends UIPlugin {
install () {
install() {
this.view = new ProviderViews(this)
// snip
}
onFirstRender () {
onFirstRender() {
return Promise.all([
this.provider.fetchPreAuthToken(),
this.view.getFolder('root'),
])
}
render (state) {
render(state) {
return this.view.render(state)
}
}
@ -38,7 +39,8 @@ class GoogleDrive extends UIPlugin {
## Installation
> Unless you are creating a custom provider plugin, you do not need to install this.
> Unless you are creating a custom provider plugin, you do not need to install
> this.
```bash
$ npm install @uppy/provider-views

View file

@ -9,7 +9,11 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
Basic Uppy component for React Native with Expo. Its in Beta, and is not full-featured. You can select local images or videos, take pictures with a camera or add any files from [remote urls](https://uppy.io/docs/url), with the help of our server-side component, [Uppy Companion](https://uppy.io/docs/companion).
Basic Uppy component for React Native with Expo. Its in Beta, and is not
full-featured. You can select local images or videos, take pictures with a
camera or add any files from [remote urls](https://uppy.io/docs/url), with the
help of our server-side component,
[Uppy Companion](https://uppy.io/docs/companion).
## Installation
@ -19,7 +23,8 @@ $ npm install @uppy/react-native
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/react/native/).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/react/native/).
## License

View file

@ -9,7 +9,8 @@
React component wrappers around Uppys officially maintained UI plugins.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -25,7 +26,7 @@ const uppy = new Uppy()
class Example extends React.Component {
state = { open: false }
render () {
render() {
return (
<DashboardModal
uppy={uppy}
@ -44,11 +45,15 @@ class Example extends React.Component {
$ npm install @uppy/react
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/react).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/react).
## License

View file

@ -7,9 +7,11 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
ReduxDevTools plugin that syncs with redux-devtools browser or JS extensions, and allows for basic time travel:
ReduxDevTools plugin that syncs with redux-devtools browser or JS extensions,
and allows for basic time travel:
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -27,11 +29,15 @@ uppy.use(ReduxDevTools)
$ npm install @uppy/redux-dev-tools
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/redux-dev-tools).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/redux-dev-tools).
## License

View file

@ -2,7 +2,10 @@
<img src="https://uppy.io/img/logo.svg" width="120" alt="Uppy logo: a smiling puppy above a pink upwards arrow" align="right">
<a href="https://www.npmjs.com/package/@uppy/remote-sources"><img src="https://img.shields.io/npm/v/@uppy/compressor.svg?style=flat-square"></a> <img src="https://github.com/transloadit/uppy/workflows/Tests/badge.svg" alt="CI status for Uppy tests"> <img src="https://github.com/transloadit/uppy/workflows/Companion/badge.svg" alt="CI status for Companion tests"> <img src="https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg" alt="CI status for browser tests">
<a href="https://www.npmjs.com/package/@uppy/remote-sources"><img src="https://img.shields.io/npm/v/@uppy/compressor.svg?style=flat-square"></a>
<img src="https://github.com/transloadit/uppy/workflows/Tests/badge.svg" alt="CI status for Uppy tests">
<img src="https://github.com/transloadit/uppy/workflows/Companion/badge.svg" alt="CI status for Companion tests">
<img src="https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg" alt="CI status for browser tests">
## Example
@ -24,11 +27,15 @@ npm install @uppy/remote-sources
yarn add @uppy/remote-sources
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy.RemoteSources` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy.RemoteSources` will attach itself
to the global `window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/remote-sources).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/remote-sources).
## License

View file

@ -7,9 +7,11 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
The screen capture plugin for Uppy lets you take photos and record videos with a built-in camera on desktop and mobile devices.
The screen capture plugin for Uppy lets you take photos and record videos with a
built-in camera on desktop and mobile devices.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -27,11 +29,15 @@ uppy.use(ScreenCapture)
$ npm install @uppy/screen-capture
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/screen-capture).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/screen-capture).
## License

View file

@ -7,10 +7,16 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
The status-bar shows upload progress and speed, ETAs, pre- and post-processing information, and allows users to control (pause/resume/cancel) the upload.
Best used together with a basic file source plugin, such as [@uppy/file-input](https://uppy.io/docs/file-input) or [@uppy/drag-drop](https://uppy.io/docs/drag-drop), or a custom implementation. Its also included in the [@uppy/dashboard](https://uppy.io/docs/dashboard) plugin.
The status-bar shows upload progress and speed, ETAs, pre- and post-processing
information, and allows users to control (pause/resume/cancel) the upload. Best
used together with a basic file source plugin, such as
[@uppy/file-input](https://uppy.io/docs/file-input) or
[@uppy/drag-drop](https://uppy.io/docs/drag-drop), or a custom implementation.
Its also included in the [@uppy/dashboard](https://uppy.io/docs/dashboard)
plugin.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -33,11 +39,15 @@ uppy.use(StatusBar, {
$ npm install @uppy/status-bar
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/status-bar).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/status-bar).
## License

View file

@ -7,9 +7,11 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
A basic object-based store for Uppy. This one is used by default, you do not need to add it manually.
A basic object-based store for Uppy. This one is used by default, you do not
need to add it manually.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -28,11 +30,15 @@ const uppy = new Uppy({
$ npm install @uppy/store-default
```
Alternatively, you can also use this package in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this package in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/stores#DefaultStore).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/stores#DefaultStore).
## License

View file

@ -7,12 +7,13 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
The `ReduxStore` stores Uppy state on a key in an existing Redux store.
The `ReduxStore` dispatches `uppy/STATE_UPDATE` actions to update state.
When the state in Redux changes, it notifies Uppy.
This way, you get most of the benefits of Redux, including support for the Redux Devtools and time traveling!
The `ReduxStore` stores Uppy state on a key in an existing Redux store. The
`ReduxStore` dispatches `uppy/STATE_UPDATE` actions to update state. When the
state in Redux changes, it notifies Uppy. This way, you get most of the benefits
of Redux, including support for the Redux Devtools and time traveling!
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -21,8 +22,11 @@ import Uppy from '@uppy/core'
import * as ReduxStore from '@uppy/store-redux'
import * as Redux from 'redux'
function createStore (reducers = {}) {
const reducer = Redux.combineReducers({ ...reducers, uppy: ReduxStore.reducer })
function createStore(reducers = {}) {
const reducer = Redux.combineReducers({
...reducers,
uppy: ReduxStore.reducer,
})
return Redux.createStore(reducer)
}
@ -36,11 +40,15 @@ const uppy = new Uppy({ store })
$ npm install @uppy/store-redux
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/stores#ReduxStore).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/stores#ReduxStore).
## License

View file

@ -9,7 +9,8 @@
Svelte component wrappers around Uppys officially maintained UI plugins.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Installation
@ -25,7 +26,9 @@ yarn add @uppy/svelte
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/svelte). At the moment, theres no documentation yet, so this link wont work. Stay tuned for more info
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/svelte). At the moment, theres no
documentation yet, so this link wont work. Stay tuned for more info
## License

View file

@ -9,7 +9,8 @@
Uppy plugin that generates small previews of images to show on your upload UI.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -29,7 +30,10 @@ uppy.use(ThumbnailGenerator, {
$ npm install @uppy/thumbnail-generator
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
<!-- Undocumented currently
## Documentation

View file

@ -7,11 +7,14 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
The Transloadit plugin can be used to upload files to Transloadit for all kinds of processing, such as transcoding video, resizing images, zipping/unzipping, [and more](https://transloadit.com/services/).
The Transloadit plugin can be used to upload files to Transloadit for all kinds
of processing, such as transcoding video, resizing images, zipping/unzipping,
[and more](https://transloadit.com/services/).
[Try it live →](https://uppy.io/examples/transloadit/)
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -31,11 +34,15 @@ uppy.use(Transloadit, {
$ npm install @uppy/transloadit
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/transloadit).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/transloadit).
## License

View file

@ -7,9 +7,11 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
The Tus plugin brings [tus.io][] resumable file uploading to Uppy by wrapping the [tus-js-client][].
The Tus plugin brings [tus.io][] resumable file uploading to Uppy by wrapping
the [tus-js-client][].
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -31,16 +33,19 @@ uppy.use(Tus, {
$ npm install @uppy/tus
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/tus).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/tus).
## License
[The MIT License](./LICENSE).
[tus.io]: https://tus.io
[tus-js-client]: https://github.com/tus/tus-js-client

View file

@ -7,11 +7,16 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
The Unsplash plugin lets users import files from Unsplash, the free stock photography resource.
The Unsplash plugin lets users import files from Unsplash, the free stock
photography resource.
A Companion instance is required for the Unsplash plugin to work. Companion will download the files and upload them to their destination. This saves bandwidth for the user (especially on mobile connections) and helps avoid CORS restrictions.
A Companion instance is required for the Unsplash plugin to work. Companion will
download the files and upload them to their destination. This saves bandwidth
for the user (especially on mobile connections) and helps avoid CORS
restrictions.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -31,11 +36,15 @@ uppy.use(Unsplash, {
$ npm install @uppy/unsplash --save
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/unsplash).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/unsplash).
## License

View file

@ -7,11 +7,16 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
The Url plugin lets users import files from the Internet. Paste any URL and itll be added!
The Url plugin lets users import files from the Internet. Paste any URL and
itll be added!
A Companion instance is required for the Url plugin to work. Companion will download the files and upload them to their destination. This saves bandwidth for the user (especially on mobile connections) and helps avoid CORS restrictions.
A Companion instance is required for the Url plugin to work. Companion will
download the files and upload them to their destination. This saves bandwidth
for the user (especially on mobile connections) and helps avoid CORS
restrictions.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -31,11 +36,15 @@ uppy.use(Url, {
$ npm install @uppy/url
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/url).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/url).
## License

View file

@ -7,13 +7,16 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
Shared utility functions for Uppy Core and the “official” plugins maintained by the Uppy team.
Shared utility functions for Uppy Core and the “official” plugins maintained by
the Uppy team.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Installation
> Unless you are creating a custom plugin, you should not need to install this manually.
> Unless you are creating a custom plugin, you should not need to install this
> manually.
```bash
$ npm install @uppy/utils

View file

@ -1,11 +1,13 @@
Influenced by:
* <https://github.com/leonadler/drag-and-drop-across-browsers>
* <https://github.com/silverwind/uppie/blob/HEAD/uppie.js>
* <https://stackoverflow.com/a/50030399/3192470>
- <https://github.com/leonadler/drag-and-drop-across-browsers>
- <https://github.com/silverwind/uppie/blob/HEAD/uppie.js>
- <https://stackoverflow.com/a/50030399/3192470>
### Why do we not use `getFilesAndDirectories()` api?
Its a proposed spec that seems to be barely implemented anywhere.
Supposed to work in Firefox and Edge, but it doesnt work in Firefox, and both Firefox and Edge support `.webkitGetAsEntry()` api anyway.
This page shows how this spec is supposed to function: <https://wicg.github.io/directory-upload/>, but it only works because of the polyfill.js that uses `.webkitGetAsEntry()` internally.
Its a proposed spec that seems to be barely implemented anywhere. Supposed to
work in Firefox and Edge, but it doesnt work in Firefox, and both Firefox and
Edge support `.webkitGetAsEntry()` api anyway. This page shows how this spec is
supposed to function: <https://wicg.github.io/directory-upload/>, but it only
works because of the polyfill.js that uses `.webkitGetAsEntry()` internally.

View file

@ -9,18 +9,20 @@
Vue component wrappers around Uppys officially maintained UI plugins.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
```vue
<template>
<dashboard-modal
:uppy="uppy"
:open="open"
:props="{
onRequestCloseModal: handleClose
}"/>
<dashboard-modal
:uppy="uppy"
:open="open"
:props="{
onRequestCloseModal: handleClose,
}"
/>
</template>
<script>
@ -29,19 +31,21 @@ import { DashboardModal } from '@uppy/vue'
export default {
components: {
DashboardModal
DashboardModal,
},
computed: {
uppy: () => new Uppy()
uppy: () => new Uppy(),
},
data () {
data() {
return {
open: false
open: false,
}
},
methods: {
handleClose() { this.open = false }
}
handleClose() {
this.open = false
},
},
}
</script>
```
@ -52,11 +56,15 @@ export default {
$ npm install @uppy/vue
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/vue).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/vue).
## License

View file

@ -7,9 +7,11 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
The Webcam plugin for Uppy lets you take photos and record videos with a built-in camera on desktop and mobile devices.
The Webcam plugin for Uppy lets you take photos and record videos with a
built-in camera on desktop and mobile devices.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -31,11 +33,15 @@ uppy.use(Webcam, {
$ npm install @uppy/webcam
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/webcam).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/webcam).
## License

View file

@ -7,9 +7,12 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
The XHRUpload plugin handles classic XHR uploads with Uppy. If you have an exiting Apache/Nginx/Node or whatever backend, this is probably the Uppy uploader plugin you are looking for.
The XHRUpload plugin handles classic XHR uploads with Uppy. If you have an
exiting Apache/Nginx/Node or whatever backend, this is probably the Uppy
uploader plugin you are looking for.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -29,11 +32,15 @@ uppy.use(XHRUpload, {
$ npm install @uppy/xhr-upload
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/xhr-upload).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/xhr-upload).
## License

View file

@ -7,11 +7,16 @@
![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
The Zoom plugin for Uppy lets users import recordings and related files from their Zoom account.
The Zoom plugin for Uppy lets users import recordings and related files from
their Zoom account.
A Companion instance and zoom account with cloud recordings is required for the Zoom plugin to work. Companion handles authentication with Zoom, downloads files from Zoom and uploads them to the destination. This saves the user bandwidth, especially helpful if they are on a mobile connection.
A Companion instance and zoom account with cloud recordings is required for the
Zoom plugin to work. Companion handles authentication with Zoom, downloads files
from Zoom and uploads them to the destination. This saves the user bandwidth,
especially helpful if they are on a mobile connection.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
Uppy is being developed by the folks at [Transloadit](https://transloadit.com),
a versatile file encoding service.
## Example
@ -31,11 +36,15 @@ uppy.use(Zoom, {
$ npm install @uppy/zoom
```
Alternatively, you can also use this plugin in a pre-built bundle from Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
Alternatively, you can also use this plugin in a pre-built bundle from
Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global
`window.Uppy` object. See the
[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
## Documentation
Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/zoom).
Documentation for this plugin can be found on the
[Uppy website](https://uppy.io/docs/zoom).
## License

View file

@ -4,8 +4,10 @@
Released: 2022-09-25
- uppy: add a decoy `Core` export to warn users about the renaming (Antoine du Hamel / #4085)
- uppy: remove all remaining occurrences of `Uppy.Core` (Antoine du Hamel / #4082)
- uppy: add a decoy `Core` export to warn users about the renaming (Antoine du
Hamel / #4085)
- uppy: remove all remaining occurrences of `Uppy.Core` (Antoine du Hamel /
#4082)
## 3.0.0

View file

@ -1,3 +1,4 @@
# Private packages
Node.js packages for internal use by Uppy, like build tooling. These are not published to npm.
Node.js packages for internal use by Uppy, like build tooling. These are not
published to npm.

View file

@ -1,18 +1,21 @@
# remark-lint-uppy
remark-lint preset derived from [`remark-preset-lint-recommended`][remark-preset-lint-recommended].
remark-lint preset derived from
[`remark-preset-lint-recommended`][remark-preset-lint-recommended].
Differences:
* The `list-item-bullet-indent` rule is disabled.
* The `list-item-indent` rule is disabled.
- The `list-item-bullet-indent` rule is disabled.
- The `list-item-indent` rule is disabled.
The reason for the differences is that these “wrong” patterns are ubiquitous in our markdown files and we dont want to do these huge changes after adding the linter.
The reason for the differences is that these “wrong” patterns are ubiquitous in
our markdown files and we dont want to do these huge changes after adding the
linter.
## License
[MIT][].
[remark-preset-lint-recommended]: https://github.com/remarkjs/remark-lint/blob/master/packages/remark-preset-lint-recommended
[remark-preset-lint-recommended]:
https://github.com/remarkjs/remark-lint/blob/master/packages/remark-preset-lint-recommended
[MIT]: ./LICENSE