mirror of
https://github.com/transloadit/uppy.git
synced 2026-01-23 02:25:07 +00:00
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:
parent
2a15ba5128
commit
7d6937300a
77 changed files with 1565 additions and 895 deletions
292
.github/CONTRIBUTING.md
vendored
292
.github/CONTRIBUTING.md
vendored
|
|
@ -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 you’d like to work on features that the basic development version of Uppy doesn’t 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 you’d like to work on features that the basic development version of Uppy
|
||||
doesn’t 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 doesn’t 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 doesn’t 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 doesn’t run `build` first:
|
||||
Alternatively the following command is the same as the above, except it doesn’t
|
||||
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, here’s an overview of the process to release a new Uppy version:
|
||||
Releases are managed by GitHub Actions, here’s 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 won’t 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 won’t 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 don’t have access to the transloadit.com source code ping @arturi or @goto-bus-stop and we’ll pick it up. :sparkles:
|
||||
If you don’t have access to the transloadit.com source code ping @arturi or
|
||||
@goto-bus-stop and we’ll 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 hasn’t 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 hasn’t 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 [Medium’s 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
|
||||
[Medium’s 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 you’re 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 we’ve found, the concepts are generally pretty similar.
|
||||
All these components should function as references to the normal component.
|
||||
Depending on how the framework you’re 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 we’ve found, the concepts are
|
||||
generally pretty similar.
|
||||
|
||||
If you’re 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 you’re 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 won’t 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 doesn’t have to transpiled. The version of typescript in the monorepo is `4.1`.
|
||||
This section won’t 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 doesn’t 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 Uppy’s 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 Uppy’s 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 you’re 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 Uppy’s 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 you’re 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 you’re 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 you’re 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 you’re 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 aren’t being used (ex. not having rollup locally and relying on a global install), as these dependencies won’t be present on the machine’s 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 aren’t being used (ex. not having rollup locally and relying
|
||||
on a global install), as these dependencies won’t be present on the machine’s
|
||||
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).
|
||||
|
|
|
|||
|
|
@ -4,5 +4,5 @@ node_modules/
|
|||
*.cjs
|
||||
*.mjs
|
||||
!private/js2ts/*
|
||||
*.md
|
||||
*.lock
|
||||
CHANGELOG.md
|
||||
|
|
|
|||
130
BACKLOG.md
130
BACKLOG.md
|
|
@ -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 can’t 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 upload’s 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 can’t 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
|
||||
upload’s 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)
|
||||
|
|
|
|||
120
BUNDLE-README.md
120
BUNDLE-README.md
|
|
@ -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. You’ll 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 you’ll 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. You’ll 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 you’ll 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? We’re welcoming all your questions and feedback over at <https://community.transloadit.com/c/uppy/5>.
|
||||
Stuck with anything? We’re welcoming all your questions and feedback over at
|
||||
<https://community.transloadit.com/c/uppy/5>.
|
||||
|
|
|
|||
666
README.md
666
README.md
|
|
@ -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. It’s 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. It’s 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 user’s 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 user’s 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 page’s `<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 page’s `<head>` or include in JS, if your bundler of choice
|
||||
supports it.
|
||||
|
||||
Alternatively, you can also use a pre-built bundle from Transloadit’s 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 Transloadit’s 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 Transloadit’s 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 Transloadit’s 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 it’s 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 it’s 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
|
||||
|
||||
Here’s a list of polyfills you’ll need to include to make Uppy work in older browsers, such as IE11:
|
||||
Here’s a list of polyfills you’ll 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 you’re using a bundler, you need to import them before Uppy:
|
||||
|
||||
|
|
@ -176,8 +236,8 @@ export { default } from '@uppy/core'
|
|||
export * from '@uppy/core'
|
||||
```
|
||||
|
||||
If you’re using Uppy from CDN, those polyfills are already included in the legacy
|
||||
bundle, so no need to include anything additionally:
|
||||
If you’re 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 that’s 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 that’s 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.
|
||||
* There’s 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.
|
||||
- There’s 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?
|
||||
|
||||
Transloadit’s 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), we’re 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).
|
||||
Transloadit’s 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), we’re 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! We’re able to dedicate 80% of our time to open source and haven’t 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! We’re able to dedicate 80% of
|
||||
our time to open source and haven’t 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. Here’s 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. Here’s 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 you’ll need [`@uppy/companion`](https://uppy.io/docs/companion) if you’d like your users to be able to pick files from Instagram, Google Drive, Dropbox or via direct URLs (with more services coming).
|
||||
And you’ll need [`@uppy/companion`](https://uppy.io/docs/companion) if you’d
|
||||
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
|
||||
|
||||
* Contributor’s 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)
|
||||
- Contributor’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -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 Transloadit’s 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 Transloadit’s security policy,
|
||||
and how we generally handle these cases.
|
||||
|
|
|
|||
|
|
@ -247,11 +247,11 @@ Redis so that any instance can serve the client’s 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 you’re running many
|
||||
- All other configuration needs to be the same, except if you’re 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 doesn’t 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 doesn’t 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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)`
|
||||
|
||||
|
|
|
|||
|
|
@ -10,9 +10,9 @@ the same features, but with a more ergonomic and minimal API.
|
|||
|
||||
But, it didn’t come with its own set of new problems:
|
||||
|
||||
* It tries to do the exact same, but it looks like a different product.
|
||||
* It’s confusing for users whether they want to use Robodog or Uppy directly.
|
||||
* Robodog is more ergonomic because it’s limited. When you hit such a limit, you
|
||||
- It tries to do the exact same, but it looks like a different product.
|
||||
- It’s confusing for users whether they want to use Robodog or Uppy directly.
|
||||
- Robodog is more ergonomic because it’s 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 you’re using a bundler, you need import these before Uppy:
|
||||
|
||||
|
|
@ -589,7 +589,8 @@ obsolete too.
|
|||
|
||||
### That’s 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/
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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" \
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
```
|
||||
```
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -3,7 +3,8 @@
|
|||
You’re 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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,9 +7,13 @@
|
|||

|
||||

|
||||
|
||||
The AwsS3Multipart plugin can be used to upload files directly to an S3 bucket using S3’s Multipart upload strategy. With this strategy, files are chopped up in parts of 5MB+ each, so they can be uploaded concurrently. It’s 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 S3’s Multipart upload strategy. With this strategy, files are chopped up
|
||||
in parts of 5MB+ each, so they can be uploaded concurrently. It’s 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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,9 +7,11 @@
|
|||

|
||||

|
||||
|
||||
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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,9 +7,11 @@
|
|||

|
||||

|
||||
|
||||
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
|
||||
|
|
|
|||
|
|
@ -1,13 +1,15 @@
|
|||
Companion is the server side component for Uppy. It’s 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. It’s 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 Google’s 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 Google’s 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 doesn’t 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 doesn’t 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`.
|
||||
|
||||
Here’s 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 provider’s 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 provider’s 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 that’s 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 that’s 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. It’s 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. It’s 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 aren’t 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 aren’t 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 don’t 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 don’t have to manage another
|
||||
server to use Uppy.
|
||||
|
||||
One issue here is that `Grant` has different versions for Koa, Express, and Hapi. We’re 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 don’t 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. We’re 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
|
||||
don’t 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 it’s worth if no one needs it, so I’d get some community feedback beforehand.
|
||||
All this may be more trouble than it’s worth if no one needs it, so I’d 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 don’t 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
|
||||
don’t 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`).
|
||||
|
|
|
|||
|
|
@ -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
|
||||
```
|
||||
|
|
|
|||
|
|
@ -4,10 +4,14 @@
|
|||
|
||||
[](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 don’t). [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 don’t).
|
||||
[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 don’t 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 don’t 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/)
|
||||
|
|
|
|||
|
|
@ -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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,15 +7,20 @@
|
|||

|
||||

|
||||
|
||||
Uppy is a sleek, modular JavaScript file uploader that integrates seamlessly with any application. It’s 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. It’s 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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,11 +7,16 @@
|
|||

|
||||

|
||||
|
||||
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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,11 +7,14 @@
|
|||

|
||||

|
||||
|
||||
FileInput is the most barebones UI for selecting files—it shows a single button that, when clicked, opens up the browser’s file selector.
|
||||
FileInput is the most barebones UI for selecting files—it shows a single button
|
||||
that, when clicked, opens up the browser’s 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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,9 +7,13 @@
|
|||

|
||||

|
||||
|
||||
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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,9 +7,14 @@
|
|||

|
||||

|
||||
|
||||
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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,11 +7,16 @@
|
|||

|
||||

|
||||
|
||||
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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,13 +7,16 @@
|
|||

|
||||

|
||||
|
||||
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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,9 +7,11 @@
|
|||

|
||||

|
||||
|
||||
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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,10 @@
|
|||

|
||||

|
||||
|
||||
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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,11 +7,16 @@
|
|||

|
||||

|
||||
|
||||
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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,9 +7,12 @@
|
|||

|
||||

|
||||
|
||||
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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -9,7 +9,11 @@
|
|||

|
||||

|
||||
|
||||
Basic Uppy component for React Native with Expo. It’s 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. It’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,8 @@
|
|||
|
||||
React component wrappers around Uppy’s 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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,9 +7,11 @@
|
|||

|
||||

|
||||
|
||||
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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,9 +7,11 @@
|
|||

|
||||

|
||||
|
||||
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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,10 +7,16 @@
|
|||

|
||||

|
||||
|
||||
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. It’s 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.
|
||||
It’s 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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,9 +7,11 @@
|
|||

|
||||

|
||||
|
||||
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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,12 +7,13 @@
|
|||

|
||||

|
||||
|
||||
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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,8 @@
|
|||
|
||||
Svelte component wrappers around Uppy’s 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, there’s no documentation yet, so this link won’t 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, there’s no
|
||||
documentation yet, so this link won’t work. Stay tuned for more info
|
||||
|
||||
## License
|
||||
|
||||
|
|
|
|||
|
|
@ -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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
|
|
|||
|
|
@ -7,11 +7,14 @@
|
|||

|
||||

|
||||
|
||||
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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,9 +7,11 @@
|
|||

|
||||

|
||||
|
||||
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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
|
|
|||
|
|
@ -7,11 +7,16 @@
|
|||

|
||||

|
||||
|
||||
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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,11 +7,16 @@
|
|||

|
||||

|
||||
|
||||
The Url plugin lets users import files from the Internet. Paste any URL and it’ll be added!
|
||||
The Url plugin lets users import files from the Internet. Paste any URL and
|
||||
it’ll 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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,13 +7,16 @@
|
|||

|
||||

|
||||
|
||||
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
|
||||
|
|
|
|||
|
|
@ -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?
|
||||
|
||||
It’s a proposed spec that seems to be barely implemented anywhere.
|
||||
Supposed to work in Firefox and Edge, but it doesn’t 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.
|
||||
It’s a proposed spec that seems to be barely implemented anywhere. Supposed to
|
||||
work in Firefox and Edge, but it doesn’t 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.
|
||||
|
|
|
|||
|
|
@ -9,18 +9,20 @@
|
|||
|
||||
Vue component wrappers around Uppy’s 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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,9 +7,11 @@
|
|||

|
||||

|
||||
|
||||
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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,9 +7,12 @@
|
|||

|
||||

|
||||
|
||||
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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -7,11 +7,16 @@
|
|||

|
||||

|
||||
|
||||
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 Transloadit’s 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
|
||||
Transloadit’s 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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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 don’t 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 don’t 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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue