ソースを参照

Add retext to markdown linter (#3024)

* remark-lint-uppy: use `retext` to improve doc syntax and grammar

* WIP: start fixing fixing linter errors

* Remove `retext-passive` as I don't see what's wrong with passive voice

* Remove URL plugin, add emphasis/strong marker plugin

* Fix remark settings to avoid conflicts

* WIP: more auto-fixes

* remark-simplify: allow `option`

* zoom.md

* url.md

* vue.md

* tus.md

* webcam.md

* xhrupload.md

* writing-plugins

* thumbnail-generator

* svelte

* react-dragdrop

* stores

* do not over simplify

* statusbar

* robodog

* robodog-upload

* robodog-picker

* robodog-form

* robodog-dashboard

* redux

* privacy

* uppy.md

* transloadit.md

* react-native

* react-initializing

* react-fileinput

* providers

* progressbar

* plugins

* plugin-common-options

* onedrive

* locales

* instagram

* informer

* index

* google-drive

* golden-retriever

* form

* fileinput

* facebook

* dropbox

* drop-target

* dragdrop

* remark-lint-no-unneeded-full-reference-link

* Try to setup unified-message-control

* Upgrade deps

* Fix collapsed link references with inline code

* Revert "remark-lint-no-unneeded-full-reference-link"

This reverts commit ca375f463b771bc81d0868f4d84f5979823cfc0a.

* remark-lint-uppy: add missing `"main"` field

* Update package-lock.json

* add disable comments

* fixup! xhrupload.md

* writing-plugins

* unsplash

* tus

* stores

* migration-guide

* dashboard

* community-projects

* box

* integration_help

* blog posts

* companion

* aws-s3

* aws-s3-multipart

* remark-lint-uppy README

* website/inject

* BUNDLE-README

* READMEs

* architecture

* move Remark settings to the plugin

* add `listItemIndent` setting

* list indent fix

* fix ignored files

* revert changelog changes

* fixup! architecture

* Revert changes in ignored files

* Remove unnecessary HTML tags from READMEs
Antoine du Hamel 3 年 前
コミット
55e0ffd04a
100 ファイル変更1430 行追加875 行削除
  1. 1 0
      .eslintignore
  2. 6 0
      .remarkignore
  3. 9 9
      BUNDLE-README.md
  4. 77 80
      README.md
  5. 3 0
      examples/aws-companion/readme.md
  6. 6 0
      examples/aws-presigned-url/readme.md
  7. 3 0
      examples/custom-provider/readme.md
  8. 3 0
      examples/digitalocean-spaces/readme.md
  9. 3 0
      examples/multiple-instances/readme.md
  10. 3 0
      examples/node-xhr/readme.md
  11. 3 0
      examples/php-xhr/readme.md
  12. 4 0
      examples/python-xhr/readme.md
  13. 3 0
      examples/react-native-expo/readme.md
  14. 3 0
      examples/redux/readme.md
  15. 3 0
      examples/transloadit/readme.md
  16. 3 0
      examples/uppy-with-companion/README.md
  17. 9 12
      examples/vue/README.md
  18. 3 0
      examples/xhr-bundle/readme.md
  19. 525 225
      package-lock.json
  20. 3 3
      package.json
  21. 3 4
      packages/@uppy/angular/README.md
  22. 6 4
      packages/@uppy/aws-s3-multipart/README.md
  23. 5 3
      packages/@uppy/aws-s3/README.md
  24. 5 3
      packages/@uppy/box/README.md
  25. 4 2
      packages/@uppy/companion-client/README.md
  26. 35 26
      packages/@uppy/companion/ARCHITECTURE.md
  27. 0 1
      packages/@uppy/companion/KUBERNETES.md
  28. 6 5
      packages/@uppy/companion/README.md
  29. 9 7
      packages/@uppy/core/README.md
  30. 11 9
      packages/@uppy/dashboard/README.md
  31. 5 3
      packages/@uppy/drag-drop/README.md
  32. 5 3
      packages/@uppy/dropbox/README.md
  33. 5 4
      packages/@uppy/facebook/README.md
  34. 5 3
      packages/@uppy/file-input/README.md
  35. 6 4
      packages/@uppy/form/README.md
  36. 5 3
      packages/@uppy/golden-retriever/README.md
  37. 5 4
      packages/@uppy/google-drive/README.md
  38. 5 3
      packages/@uppy/image-editor/README.md
  39. 5 3
      packages/@uppy/informer/README.md
  40. 5 3
      packages/@uppy/instagram/README.md
  41. 5 3
      packages/@uppy/locales/README.md
  42. 5 3
      packages/@uppy/onedrive/README.md
  43. 6 4
      packages/@uppy/progress-bar/README.md
  44. 4 2
      packages/@uppy/provider-views/README.md
  45. 5 3
      packages/@uppy/react-native/README.md
  46. 7 4
      packages/@uppy/react/README.md
  47. 6 4
      packages/@uppy/redux-dev-tools/README.md
  48. 5 3
      packages/@uppy/robodog/README.md
  49. 5 3
      packages/@uppy/screen-capture/README.md
  50. 6 4
      packages/@uppy/status-bar/README.md
  51. 6 4
      packages/@uppy/store-default/README.md
  52. 5 3
      packages/@uppy/store-redux/README.md
  53. 5 3
      packages/@uppy/svelte/README.md
  54. 5 3
      packages/@uppy/thumbnail-generator/README.md
  55. 5 3
      packages/@uppy/transloadit/README.md
  56. 6 3
      packages/@uppy/tus/README.md
  57. 5 3
      packages/@uppy/unsplash/README.md
  58. 5 3
      packages/@uppy/url/README.md
  59. 5 3
      packages/@uppy/utils/README.md
  60. 7 6
      packages/@uppy/utils/src/getDroppedFiles/README.md
  61. 6 5
      packages/@uppy/vue/README.md
  62. 5 3
      packages/@uppy/webcam/README.md
  63. 5 3
      packages/@uppy/xhr-upload/README.md
  64. 5 3
      packages/@uppy/zoom/README.md
  65. 1 0
      private/README.md
  66. 7 3
      private/remark-lint-uppy/README.md
  67. 33 22
      private/remark-lint-uppy/index.js
  68. 11 0
      private/remark-lint-uppy/message-control.js
  69. 29 15
      private/remark-lint-uppy/package.json
  70. 44 0
      private/remark-lint-uppy/retext-preset.js
  71. 1 1
      website/inject.js
  72. 31 31
      website/src/_template/contributing.md
  73. 4 4
      website/src/_template/integration_help.md
  74. 5 5
      website/src/docs/angular.md
  75. 34 32
      website/src/docs/aws-s3-multipart.md
  76. 46 43
      website/src/docs/aws-s3.md
  77. 12 10
      website/src/docs/box.md
  78. 8 8
      website/src/docs/community-projects.md
  79. 74 64
      website/src/docs/companion.md
  80. 30 30
      website/src/docs/dashboard.md
  81. 6 4
      website/src/docs/dragdrop.md
  82. 4 2
      website/src/docs/drop-target.md
  83. 12 10
      website/src/docs/dropbox.md
  84. 2 2
      website/src/docs/facebook.md
  85. 3 3
      website/src/docs/fileinput.md
  86. 9 9
      website/src/docs/form.md
  87. 3 3
      website/src/docs/golden-retriever.md
  88. 10 9
      website/src/docs/google-drive.md
  89. 19 20
      website/src/docs/index.md
  90. 2 2
      website/src/docs/informer.md
  91. 3 3
      website/src/docs/instagram.md
  92. 6 6
      website/src/docs/locales.md
  93. 22 13
      website/src/docs/migration-guides.md
  94. 2 2
      website/src/docs/onedrive.md
  95. 4 2
      website/src/docs/plugin-common-options.md
  96. 1 1
      website/src/docs/plugins.md
  97. 4 4
      website/src/docs/progressbar.md
  98. 4 3
      website/src/docs/providers.md
  99. 5 2
      website/src/docs/react-dashboard-modal.md
  100. 2 0
      website/src/docs/react-dashboard.md

+ 1 - 0
.eslintignore

@@ -20,3 +20,4 @@ website/src/_posts/2021-03-*.md
 website/src/_posts/2021-04-*.md
 website/src/_posts/2021-05-*.md
 website/src/_posts/2021-06-*.md
+private/remark-lint-uppy/index.js

+ 6 - 0
.remarkignore

@@ -0,0 +1,6 @@
+website/src/_posts/201*
+website/src/_posts/2020-*
+website/src/_posts/2021-0*
+examples/
+CHANGELOG.md
+BACKLOG.md

+ 9 - 9
BUNDLE-README.md

@@ -1,17 +1,17 @@
 # Uppy
 
 Hi, thanks for trying out the bundled version of the Uppy File Uploader. You can use
-this from a CDN (e.g. `<script src="https://releases.transloadit.com/uppy/v2.2.0/uppy.min.js"></script>`) or bundle it with your webapp. 
+this from a CDN (`<script src="https://releases.transloadit.com/uppy/v2.2.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 just the
+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 e.g. `./js/uppy`
+You can extract the contents of this zip to a directory, such as `./js/uppy`.
 
-Now you can create an HTML file, e.g.: `./upload.html` with the following contents:
+Now you can create an HTML file, for example `./upload.html`, with the following contents:
 
 ```html
 <html>
@@ -62,10 +62,10 @@ Now open `upload.html` in your browser, and the Uppy Dashboard will appear.
 
 ## Next steps
 
-In the example you just 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, just as if a `<input type="file">` had been used.
+In the example you built, Uppy uploads to a demo server where files will be deleted
+shortly after uploading. Youll want to target your own tusd server, S3 bucket, or Nginx/Apache server. For the latter, use the Xhr plugin: <https://uppy.io/docs/xhr-upload/> which uploads using regular multipart form posts, that youll existing Ruby or PHP backend will be able to make sense of, as if a `<input type="file">` had been used.
 
-The Dashboard currently 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/>.
 
@@ -73,4 +73,4 @@ Note that for some Plugins, you will need to run a server side component called:
 
 ## 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? Were welcoming all your questions and feedback over at <https://community.transloadit.com/c/uppy/5>.

+ 77 - 80
README.md

@@ -9,11 +9,11 @@
 | Tests | <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"> |
 | Deploys | <img src="https://github.com/transloadit/uppy/workflows/CDN/badge.svg" alt="CI status for CDN deployment"> | <img src="https://github.com/transloadit/uppy/workflows/Companion%20Deploy/badge.svg" alt="CI status for Companion deployment"> | <img src="https://github.com/transloadit/uppy/workflows/Deploy%20uppy.io/badge.svg" alt="CI status for website deployment"> |
 
-Uppy is a sleek, modular JavaScript file uploader that integrates seamlessly with any application. It’s fast, easy to use 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">
 
@@ -50,30 +50,30 @@ const uppy = new Uppy({ autoProceed: false })
 
 ## Features
 
-- Lightweight, modular plugin-based architecture, easy 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 (just 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 multiple 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
 
-``` bash
+```bash
 $ npm install @uppy/core @uppy/dashboard @uppy/tus
 ```
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.org/).
 
-Add CSS [uppy.min.css](https://releases.transloadit.com/uppy/v2.2.0/uppy.min.css), either to your HTML page's `<head>` or include in JS, if your bundler of choice supports it — transforms and plugins are available for Browserify and Webpack.
+Add CSS [uppy.min.css](https://releases.transloadit.com/uppy/v2.2.0/uppy.min.css), either to your HTML pages `<head>` or include in JS, if your bundler of choice supports it — transforms and plugins are available for Browserify and Webpack.
 
-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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object.
 
-> ⚠️ The bundle currently 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 just 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>` -->
@@ -93,11 +93,11 @@ Alternatively, you can also use a pre-built bundle from Transloadit's CDN: Edgly
 
 ## 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
 
@@ -105,49 +105,49 @@ Alternatively, you can also use a pre-built bundle from Transloadit's CDN: Edgly
 
 ### 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 and simple 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.
 
 ### 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
 
-- [`Robodog`](https://uppy.io/docs/robodog/) — user friendly abstraction to do file processing with Transloadit
-- [`Transloadit`](https://uppy.io/docs/transloadit/) — support for [Transloadit](http://transloadit.com)’s robust file uploading and encoding backend
+* [`Robodog`](https://uppy.io/docs/robodog/) — user friendly abstraction to do file processing with Transloadit
+* [`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
 
@@ -161,15 +161,15 @@ We still provide a bundle which should work on IE11, but we are not running test
 
 ### 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 import them before Uppy:
+If youre using a bundler, you need import them before Uppy:
 
 ```js
 import 'core-js'
@@ -186,7 +186,7 @@ export { default } from '@uppy/core'
 export * from '@uppy/core'
 ```
 
-If you're using Uppy from CDN, those polyfills are already included in the legacy
+If youre using Uppy from CDN, those polyfills are already included in the legacy
 bundle, so no need to include anything additionally:
 
 ```html
@@ -195,27 +195,27 @@ bundle, so no need to include anything additionally:
 
 ## FAQ
 
-### Why not just use `<input type="file">`?
+### 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:
 
-- 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 (and e.g. cropping is planned).
-- 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 just 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 (such as cropping of images).
+* 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 of 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).
 
-Our thinking is that if just 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 React?
 
@@ -223,11 +223,11 @@ Yep, we have Uppy React components, please see [Uppy React docs](https://uppy.io
 
 ### Does Uppy support S3 uploads?
 
-Yes, there is an S3 plugin, please check out the [docs](https://uppy.io/docs/aws-s3/) for more.
+Yes, please check out the [docs](https://uppy.io/docs/aws-s3/) for more information.
 
-### Do I need to install a special service/server for Uppy? Can I use it with Rails/Node/Go/PHP?
+### 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 just 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) 👌🏼
 
@@ -235,8 +235,8 @@ And you’ll need [`@uppy/companion`](https://uppy.io/docs/companion) if you’d
 
 ## 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
 
@@ -247,6 +247,7 @@ Use Uppy in your project? [Let us know](https://github.com/transloadit/uppy/issu
 ## 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="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) |[<img alt="AJvanLoon" src="https://avatars.githubusercontent.com/u/15716628?v=4&s=117" width="117">](https://github.com/AJvanLoon) |
 :---: |:---: |:---: |:---: |:---: |:---: |
 [arturi](https://github.com/arturi) |[goto-bus-stop](https://github.com/goto-bus-stop) |[kvz](https://github.com/kvz) |[ifedapoolarewaju](https://github.com/ifedapoolarewaju) |[hedgerh](https://github.com/hedgerh) |[AJvanLoon](https://github.com/AJvanLoon) |
@@ -257,7 +258,7 @@ Use Uppy in your project? [Let us know](https://github.com/transloadit/uppy/issu
 
 [<img alt="samuelayo" src="https://avatars.githubusercontent.com/u/14964486?v=4&s=117" width="117">](https://github.com/samuelayo) |[<img alt="richardwillars" src="https://avatars.githubusercontent.com/u/291004?v=4&s=117" width="117">](https://github.com/richardwillars) |[<img alt="mifi" src="https://avatars.githubusercontent.com/u/402547?v=4&s=117" width="117">](https://github.com/mifi) |[<img alt="ajkachnic" src="https://avatars.githubusercontent.com/u/44317699?v=4&s=117" width="117">](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="zcallan" src="https://avatars.githubusercontent.com/u/13760738?v=4&s=117" width="117">](https://github.com/zcallan) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[samuelayo](https://github.com/samuelayo) |[richardwillars](https://github.com/richardwillars) |[mifi](https://github.com/mifi) |[ajkachnic](https://github.com/ajkachnic) |[dependabot[bot]](https://github.com/apps/dependabot) |[zcallan](https://github.com/zcallan) |
+[samuelayo](https://github.com/samuelayo) |[richardwillars](https://github.com/richardwillars) |[mifi](https://github.com/mifi) |[ajkachnic](https://github.com/ajkachnic) |[dependabot\[bot\]](https://github.com/apps/dependabot) |[zcallan](https://github.com/zcallan) |
 
 [<img alt="tim-kos" src="https://avatars.githubusercontent.com/u/15005?v=4&s=117" width="117">](https://github.com/tim-kos) |[<img alt="janko" src="https://avatars.githubusercontent.com/u/795488?v=4&s=117" width="117">](https://github.com/janko) |[<img alt="wilkoklak" src="https://avatars.githubusercontent.com/u/17553085?v=4&s=117" width="117">](https://github.com/wilkoklak) |[<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) |
 :---: |:---: |:---: |:---: |:---: |:---: |
@@ -443,15 +444,11 @@ Use Uppy in your project? [Let us know](https://github.com/transloadit/uppy/issu
 :---: |:---: |:---: |:---: |
 [vedran555](https://github.com/vedran555) |[yoann-hellopret](https://github.com/yoann-hellopret) |[olitomas](https://github.com/olitomas) |[JimmyLv](https://github.com/JimmyLv) |
 
-
 <!--/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
 

+ 3 - 0
examples/aws-companion/readme.md

@@ -6,15 +6,18 @@ Files are uploaded to a randomly named directory inside the `whatever/` director
 ## Run it
 
 To run this example, make sure you've correctly installed the **repository root**:
+
 ```bash
 npm install
 npm run build
 ```
+
 That will also install the dependencies for this example.
 
 Then, set up the `COMPANION_AWS_KEY`, `COMPANION_AWS_SECRET`, `COMPANION_AWS_REGION`, and `COMPANION_AWS_BUCKET` environment variables for @uppy/companion.
 
 Then, again in the **repository root**, start this example by doing:
+
 ```bash
 npm run example aws-companion
 ```

+ 6 - 0
examples/aws-presigned-url/readme.md

@@ -5,10 +5,12 @@ 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**:
+
 ```bash
 npm install
 npm run build
 ```
+
 That will also install the npm dependencies for this example.
 
 This example also uses the AWS PHP SDK.
@@ -23,17 +25,21 @@ Configure AWS S3 credentials using [environment variables](https://docs.aws.amaz
 Configure a bucket name and region in the `s3-sign.php` file.
 
 Then, again in the **repository root**, start this example by doing:
+
 ```bash
 npm run example aws-presigned-url
 ```
+
 The demo should now be available at http://localhost:8080.
 
 Optionally, provide a port in the `PORT` environment variable:
+
 ```bash
 PORT=8080 npm run example aws-presigned-url
 ```
 
 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" \
 COMPANION_AWS_ENDPOINT="https://storage.googleapis.com" \

+ 3 - 0
examples/custom-provider/readme.md

@@ -6,13 +6,16 @@ This serves as an illustration on how integrating custom providers would work
 ## Run it
 
 To run this example, make sure you've correctly installed the **repository root**:
+
 ```bash
 npm install
 npm run build
 ```
+
 That will also install the dependencies for this example.
 
 Then, again in the **repository root**, start this example by doing:
+
 ```bash
 npm run example custom-provider
 ```

+ 3 - 0
examples/digitalocean-spaces/readme.md

@@ -5,13 +5,16 @@ This example uses Uppy to upload files to a DigitolOcean Space. DigitalOcean Spa
 ## Running it
 
 To run this example, make sure you've correctly installed the **repository root**:
+
 ```bash
 npm install
 npm run build
 ```
+
 That will also install the dependencies for this example.
 
 Then, again in the **repository root**, configure some environment variables, and run:
+
 ```bash
 COMPANION_AWS_REGION=ams3 \
 COMPANION_AWS_KEY=your_access_key_id \

+ 3 - 0
examples/multiple-instances/readme.md

@@ -6,13 +6,16 @@ It has two instances on the same page, side-by-side, but with different `id`s so
 ## Run it
 
 To run this example, make sure you've correctly installed the **repository root**:
+
 ```bash
 npm install
 npm run build
 ```
+
 That will also install the dependencies for this example.
 
 Then, again in the **repository root**, start this example by doing:
+
 ```bash
 npm run example multiple-instances
 ```

+ 3 - 0
examples/node-xhr/readme.md

@@ -5,13 +5,16 @@ This example uses Node server and `@uppy/xhr-upload` to upload files to the loca
 ## Run it
 
 To run this example, make sure you've correctly installed the **repository root**:
+
 ```bash
 npm install
 npm run build
 ```
+
 That will also install the dependencies for this example.
 
 Then, again in the **repository root**, start this example by doing:
+
 ```bash
 npm run example node-xhr
 ```

+ 3 - 0
examples/php-xhr/readme.md

@@ -5,13 +5,16 @@ This example uses PHP server and `@uppy/xhr-upload` to upload files to the local
 ## Run it
 
 To run this example, make sure you've correctly installed the **repository root**:
+
 ```bash
 npm install
 npm run build
 ```
+
 That will also install the dependencies for this example.
 
 Then, again in the **repository root**, start this example by doing:
+
 ```bash
 npm run example php-xhr
 ```

+ 4 - 0
examples/python-xhr/readme.md

@@ -5,19 +5,23 @@ This example uses a Python Flask server and `@uppy/xhr-upload` to upload files t
 ## Run it
 
 To run this example, make sure you've correctly installed the **repository root**:
+
 ```bash
 npm install
 npm run 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:
+
 ```bash
 cd ./examples/python-xhr
 pip install -r requirements.txt
 ```
 
 Then, again in the **repository root**, start this example by doing:
+
 ```bash
 npm run example python-xhr
 ```

+ 3 - 0
examples/react-native-expo/readme.md

@@ -7,13 +7,16 @@
 ## Run it
 
 To run this example, make sure you've correctly installed the **repository root**:
+
 ```bash
 npm install
 npm run build
 ```
+
 That will also install the dependencies for this example.
 
 Then, again in the **repository root**, start this example by doing:
+
 ```bash
 npm run example react-native-expo
 ```

+ 3 - 0
examples/redux/readme.md

@@ -9,13 +9,16 @@ This example supports the [Redux Devtools extension](https://github.com/zalmoxis
 ## Run it
 
 To run this example, make sure you've correctly installed the **repository root**:
+
 ```bash
 npm install
 npm run build
 ```
+
 That will also install the dependencies for this example.
 
 Then, again in the **repository root**, start this example by doing:
+
 ```bash
 npm run example redux
 ```

+ 3 - 0
examples/transloadit/readme.md

@@ -5,13 +5,16 @@ This example shows all the different Robodog APIs in action on a single page.
 ## Run it
 
 To run this example, make sure you've correctly installed the **repository root**:
+
 ```bash
 npm install
 npm run build
 ```
+
 That will also install the dependencies for this example.
 
 Then, again in the **repository root**, start this example by doing:
+
 ```bash
 npm run example transloadit
 ```

+ 3 - 0
examples/uppy-with-companion/README.md

@@ -5,12 +5,15 @@ This is a simple, lean example that combines the usage of @uppy/companion and up
 ## Test it
 
 To run this example, make sure you've correctly installed the **repository root**:
+
 ```bash
 npm install
 ```
+
 That will also install the dependencies for this example.
 
 Then, again in the **repository root**, start this example by doing:
+
 ```bash
 npm run example uppy-with-companion
 ```

+ 9 - 12
examples/vue/README.md

@@ -1,24 +1,21 @@
 # uppy-vue
 
 ## Project setup
-```
-npm install
-```
+
+    npm install
 
 ### Compiles and hot-reloads for development
-```
-npm run serve
-```
+
+    npm run serve
 
 ### Compiles and minifies for production
-```
-npm run build
-```
+
+    npm run build
 
 ### Lints and fixes files
-```
-npm run lint
-```
+
+    npm run lint
 
 ### Customize configuration
+
 See [Configuration Reference](https://cli.vuejs.org/config/).

+ 3 - 0
examples/xhr-bundle/readme.md

@@ -7,13 +7,16 @@ This example uses Uppy with XHRUpload plugin in `bundle` mode. Bundle mode uploa
 ## Run it
 
 To run this example, make sure you've correctly installed the **repository root**:
+
 ```bash
 npm install
 npm run build
 ```
+
 That will also install the dependencies for this example.
 
 Then, again in the **repository root**, start this example by doing:
+
 ```bash
 npm run example xhr-bundle
 ```

ファイルの差分が大きいため隠しています
+ 525 - 225
package-lock.json


+ 3 - 3
package.json

@@ -6,7 +6,7 @@
   "lint-staged": {
     "*.js": "eslint",
     "*.md": [
-      "remark -f -q -i .gitignore",
+      "remark --silently-ignore -i .remarkignore -foq",
       "eslint --fix"
     ],
     "*.ts": "eslint --fix"
@@ -104,7 +104,7 @@
     "postcss-logical": "^4.0.2",
     "postcss-safe-important": "^1.2.0",
     "pre-commit": "^1.2.2",
-    "remark-cli": "^9.0.0",
+    "remark-cli": "^10.0.0",
     "remark-lint-uppy": "file:private/remark-lint-uppy",
     "replacestream": "^4.0.3",
     "resolve": "^1.17.0",
@@ -144,7 +144,7 @@
     "dev": "npm-run-all --parallel dev:watch-sandbox watch:js:lib watch:css dev:browsersync",
     "example": "node bin/run-example",
     "lint:fix": "npm run lint -- --fix",
-    "lint:markdown": "remark -f -q . -i .gitignore",
+    "lint:markdown": "remark -f -q . -i .remarkignore",
     "lint:staged": "lint-staged",
     "lint:css": "stylelint ./packages/**/*.scss",
     "lint:css:fix": "stylelint ./packages/**/*.scss --fix",

+ 3 - 4
packages/@uppy/angular/README.md

@@ -2,10 +2,9 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/angular"><img src="https://img.shields.io/npm/v/@uppy/angular.svg?style=flat-square"></a>
-<a href="https://travis-ci.org/transloadit/uppy"><img src="https://img.shields.io/travis/transloadit/uppy/master.svg?style=flat-square" alt="Build Status"></a>
+<a href="https://www.npmjs.com/package/@uppy/angular"><img src="https://img.shields.io/npm/v/@uppy/angular.svg?style=flat-square"></a> <a href="https://travis-ci.org/transloadit/uppy"><img src="https://img.shields.io/travis/transloadit/uppy/master.svg?style=flat-square" alt="Build Status"></a>
 
-Angular component wrappers around Uppy's officially maintained UI plugins.
+Angular component wrappers around Uppys officially maintained UI plugins.
 
 Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
 
@@ -23,7 +22,7 @@ $ npm install @uppy/angular --save
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 6 - 4
packages/@uppy/aws-s3-multipart/README.md

@@ -2,10 +2,12 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/aws-s3-multipart"><img src="https://img.shields.io/npm/v/@uppy/aws-s3-multipart.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/aws-s3-multipart.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/aws-s3-multipart)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
-The AwsS3Multipart plugin can be used to upload files directly to an S3 bucket using 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 very 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.
 
@@ -30,7 +32,7 @@ $ npm install @uppy/aws-s3-multipart
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 5 - 3
packages/@uppy/aws-s3/README.md

@@ -2,8 +2,10 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/aws-s3"><img src="https://img.shields.io/npm/v/@uppy/aws-s3.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/aws-s3.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/aws-s3)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 The AwsS3 plugin can be used to upload files directly to an S3 bucket. Uploads can be signed using Companion or a custom signing function.
 
@@ -31,7 +33,7 @@ $ npm install @uppy/aws-s3
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 5 - 3
packages/@uppy/box/README.md

@@ -2,8 +2,10 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/box"><img src="https://img.shields.io/npm/v/@uppy/box.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/box.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/box)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 The Box plugin for Uppy lets users import files from their Box account.
 
@@ -31,7 +33,7 @@ $ npm install @uppy/box
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 4 - 2
packages/@uppy/companion-client/README.md

@@ -2,8 +2,10 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/companion-client"><img src="https://img.shields.io/npm/v/@uppy/companion-client.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/companion-client.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/companion-client)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 Client library for communication with Companion. Intended for use in Uppy plugins.
 

+ 35 - 26
packages/@uppy/companion/ARCHITECTURE.md

@@ -1,37 +1,41 @@
-Companion is the server side component for Uppy.  It is currently built with the Express.js.
+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:
+client secret, scopes, and the callback URL you wish to use. For example:
 
-```
+```js
+const config = {
   google: {
     key: process.env.COMPANION_GOOGLE_KEY,
     secret: process.env.COMPANION_GOOGLE_SECRET,
     scope: [
       'https://www.googleapis.com/auth/drive',
-      'https://www.googleapis.com/auth/drive.file'
+      'https://www.googleapis.com/auth/drive.file',
     ],
-    callback: '/google/callback'
-  }
+    callback: '/google/callback',
+  },
+}
 ```
 
 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 just need to link the user to `https://your-server/connect/google`.
+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/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 subsequent requests and the oAuth token can be read from it.
+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
-There are four generic routes:
 
-```
+Here’s the list of generic routes:
+
+```js
 router.get('/:provider/:action', dispatcher)
 router.get('/:provider/:action/:id', dispatcher)
 router.post('/:provider/:action', dispatcher)
@@ -40,45 +44,50 @@ 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`.
 
-There are 5 controllers:
+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. |
+| `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.
 
-We are using a library called [purest](https://github.com/simov/purest) to make it easier to interface with third party APIs.  Instead of dealing with each and every single provider's client library/SDK, we use Purest, a "generic REST API client library" that gives us a consistent, "generic" API to interface with any provider.  This makes life a lot easier.
+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 [purest](https://github.com/simov/purest) to make it easier to interface with third party APIs. Instead of dealing with each single provider’s client library/SDK, we use Purest, a “generic REST API client library” that gives us a consistent, “generic” API to interface with any provider. This makes life a lot easier.
 
-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 thats required there, but `upload` is optional unless you all decide to allow uploading to third parties. I got that code from an example.
 
-This whole approach was inspired by an example from `purest 2.x`.  Keep in mind that we're using `3.x`, so the API is different, but here is the example for reference: <https://github.com/simov/purest/tree/2.x/examples/storage>
+This whole approach was inspired by an example from `purest 2.x`. Keep in mind that we’re using `3.x`, so the API is different, but here is the example for reference: <https://github.com/simov/purest/tree/2.x/examples/storage>
 
 ## WebSockets
-Companion uses WebSockets to transfer `progress` events to the client during file transfers.  It's currently 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 (i.e. `emitter.emit('whatever-their-token-is', progressData)`) are sent back to the client.
+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.
 
-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.
+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.
 
 # Design Goals
+
 These are the goals I had in mind while designing and building Companion.
 
 ## Standalone Server / Pluggable Module
-Companion currently works as a standalone server.  It should also work as a module that can easily be incorporated into an already existing server, so people don't have to manage another server just 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.
+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.
 
-All of this may be more trouble than it's worth if no one needs it, so I'd get some community feedback beforehand.
+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.
 
 ## 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`).

+ 0 - 1
packages/@uppy/companion/KUBERNETES.md

@@ -15,7 +15,6 @@ We will need a Redis container that we can get through [helm](https://github.com
     stable/redis
 ```
 
-
 #### `companion-env.yml`
 
 ```yaml

+ 6 - 5
packages/@uppy/companion/README.md

@@ -7,7 +7,7 @@
 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/)
+Instagram, etc. **Companion is not a target to upload files to**. For this, use a <https://tus.io> server (if you want resumable) or your existing Apache/Nginx server (if you dont). [See here for full documentation](https://uppy.io/docs/companion/)
 
 ## Install
 
@@ -15,13 +15,13 @@ 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 dont have a Node.js project with a `package.json` you might want to install/run Companion globally like so: `[sudo] npm install -g @uppy/companion@1.x` (best check the actual latest version, and use that, so (re)installs are reproducible, and upgrades intentional).
 
 ## Usage
 
-companion may either be used as pluggable express app, which you plug to your already existing server, or it may simply 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 already existing server
+### Plug to an existing server
 
 ```javascript
 import express from 'express'
@@ -61,7 +61,8 @@ companion.socket(server, options)
 ```
 
 ### Run as standalone server
-Please ensure 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

+ 9 - 7
packages/@uppy/core/README.md

@@ -2,14 +2,16 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/core"><img src="https://img.shields.io/npm/v/@uppy/core.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/core.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/core)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
-Uppy is a sleek, modular JavaScript file uploader that integrates seamlessly with any application. It’s fast, easy to use 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/)**
 
@@ -32,7 +34,7 @@ $ npm install @uppy/core
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 11 - 9
packages/@uppy/dashboard/README.md

@@ -2,17 +2,19 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/dashboard"><img src="https://img.shields.io/npm/v/@uppy/dashboard.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/dashboard.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/dashboard)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 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/)**
 
@@ -39,7 +41,7 @@ $ npm install @uppy/dashboard
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 5 - 3
packages/@uppy/drag-drop/README.md

@@ -2,8 +2,10 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/drag-drop"><img src="https://img.shields.io/npm/v/@uppy/drag-drop.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/drag-drop.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/drag-drop)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 Droppable zone UI for Uppy. Drag and drop files into it to upload.
 
@@ -31,7 +33,7 @@ $ npm install @uppy/drag-drop
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 5 - 3
packages/@uppy/dropbox/README.md

@@ -2,8 +2,10 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/dropbox"><img src="https://img.shields.io/npm/v/@uppy/dropbox.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/dropbox.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/dropbox)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 The Dropbox plugin for Uppy lets users import files from their Dropbox account.
 
@@ -31,7 +33,7 @@ $ npm install @uppy/dropbox
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 5 - 4
packages/@uppy/facebook/README.md

@@ -2,14 +2,15 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/facebook"><img src="https://img.shields.io/npm/v/@uppy/facebook.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/facebook.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/facebook)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 The Facebook plugin for Uppy lets users import files from their Facebook account.
 
 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.
 
 ## Example
@@ -32,7 +33,7 @@ $ npm install @uppy/facebook
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 5 - 3
packages/@uppy/file-input/README.md

@@ -2,8 +2,10 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/file-input"><img src="https://img.shields.io/npm/v/@uppy/file-input.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/file-input.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/file-input)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 FileInput is the most barebones UI for selecting files—it shows a single button that, when clicked, opens up the browser’s file selector.
 
@@ -31,7 +33,7 @@ $ npm install @uppy/file-input
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 6 - 4
packages/@uppy/form/README.md

@@ -2,10 +2,12 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/form"><img src="https://img.shields.io/npm/v/@uppy/form.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/form.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/form)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
-The Form plugin collects metadata from any specified `<form>` element, right before Uppy begins uploading/processing files. It optionally appends results back to the form. Currently 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.
 
@@ -33,7 +35,7 @@ $ npm install @uppy/form
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 5 - 3
packages/@uppy/golden-retriever/README.md

@@ -2,8 +2,10 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/golden-retriever"><img src="https://img.shields.io/npm/v/@uppy/golden-retriever.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/golden-retriever.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/golden-retriever)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 The GoldenRetriever plugin saves selected files in your browser cache (Local Storage for metadata, then Service Worker for all blobs + IndexedDB for small blobs), so that if the browser crashes, Uppy can restore everything and continue uploading like nothing happened. Read more about it [on the blog](https://uppy.io/blog/2017/07/golden-retriever/).
 
@@ -29,7 +31,7 @@ $ npm install @uppy/golden-retriever
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 5 - 4
packages/@uppy/google-drive/README.md

@@ -2,14 +2,15 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/google-drive"><img src="https://img.shields.io/npm/v/@uppy/google-drive.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/google-drive.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/google-drive)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 The Google Drive plugin for Uppy lets users import files from their Google Drive account.
 
 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.
 
 ## Example
@@ -32,7 +33,7 @@ $ npm install @uppy/google-drive
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 5 - 3
packages/@uppy/image-editor/README.md

@@ -2,8 +2,10 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/image-editor"><img src="https://img.shields.io/npm/v/@uppy/image-editor.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/image-editor.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/image-editor)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 Image Editor is an image cropping and editing plugin for Uppy. Designed to be used with the Dashboard UI (can in theory work without it).
 
@@ -36,7 +38,7 @@ $ npm install @uppy/image-editor
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 5 - 3
packages/@uppy/informer/README.md

@@ -2,8 +2,10 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/informer"><img src="https://img.shields.io/npm/v/@uppy/informer.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/informer.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/informer)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 The Informer is a pop-up bar for showing notifications. When other plugins have some exciting news (or error) to share, they can show a notification here.
 
@@ -29,7 +31,7 @@ $ npm install @uppy/informer
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 5 - 3
packages/@uppy/instagram/README.md

@@ -2,8 +2,10 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/instagram"><img src="https://img.shields.io/npm/v/@uppy/instagram.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/instagram.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/instagram)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 The Instagram plugin lets users import photos from their Instagram account.
 
@@ -30,7 +32,7 @@ $ npm install @uppy/instagram
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 5 - 3
packages/@uppy/locales/README.md

@@ -2,10 +2,12 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/locales"><img src="https://img.shields.io/npm/v/@uppy/locales.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/locales.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/locales)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
-This packages contains all of 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/master/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/master/packages/%40uppy/locales/src), starting with `en_US`, which is always up-to-date automatically.
 
 ## Installation
 

+ 5 - 3
packages/@uppy/onedrive/README.md

@@ -2,8 +2,10 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/facebook"><img src="https://img.shields.io/npm/v/@uppy/facebook.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/facebook.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/facebook)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 The OneDrive plugin for Uppy lets users import files from their OneDrive account.
 
@@ -31,7 +33,7 @@ $ npm install @uppy/facebook
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 6 - 4
packages/@uppy/progress-bar/README.md

@@ -2,10 +2,12 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/progress-bar"><img src="https://img.shields.io/npm/v/@uppy/progress-bar.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/progress-bar.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/progress-bar)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
-ProgressBar is a minimalist plugin that shows the current upload progress in a thin bar element. Similar to 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.
 
@@ -29,7 +31,7 @@ $ npm install @uppy/progress-bar
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 4 - 2
packages/@uppy/provider-views/README.md

@@ -2,8 +2,10 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/provider-views"><img src="https://img.shields.io/npm/v/@uppy/provider-views.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/provider-views.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/provider-views)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 View library for Uppy remote provider plugins.
 

+ 5 - 3
packages/@uppy/react-native/README.md

@@ -4,10 +4,12 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/react-native"><img src="https://img.shields.io/npm/v/@uppy/react-native.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/react-native.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/react-native)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
-Basic Uppy component for React Native with Expo. It is in Beta, and is not full-featured. You can select local images or videos, take pictures with a camera or add any files from [remote urls](https://uppy.io/docs/url), with the help of our server-side component, [Uppy Companion](https://uppy.io/docs/companion).
+Basic Uppy component for React Native with Expo. Its in Beta, and is not full-featured. You can select local images or videos, take pictures with a camera or add any files from [remote urls](https://uppy.io/docs/url), with the help of our server-side component, [Uppy Companion](https://uppy.io/docs/companion).
 
 ## Installation
 

+ 7 - 4
packages/@uppy/react/README.md

@@ -2,16 +2,19 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/react"><img src="https://img.shields.io/npm/v/@uppy/react.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/react.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/react)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
-React component wrappers around Uppy's officially maintained UI plugins.
+React component wrappers around Uppys officially maintained UI plugins.
 
 Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
 
 ## Example
 
 <!-- eslint-disable react/state-in-constructor -->
+
 ```js
 import React from 'react'
 import Uppy from '@uppy/core'
@@ -43,7 +46,7 @@ $ npm install @uppy/react
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 6 - 4
packages/@uppy/redux-dev-tools/README.md

@@ -2,10 +2,12 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/redux-dev-tools"><img src="https://img.shields.io/npm/v/@uppy/redux-dev-tools.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/redux-dev-tools.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/redux-dev-tools)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
-ReduxDevTools plugin that simply 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.
 
@@ -27,7 +29,7 @@ $ npm install @uppy/redux-dev-tools
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 5 - 3
packages/@uppy/robodog/README.md

@@ -2,8 +2,10 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/robodog"><img src="https://img.shields.io/npm/v/@uppy/robodog.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/robodog.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/robodog)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 Robodog is an Uppy-based library that pulls your files through Transloadit for all kinds of processing, such as transcoding video, resizing images, zipping/unzipping, [and more](https://transloadit.com/services/).
 
@@ -15,7 +17,7 @@ $ npm install @uppy/robodog
 
 We recommend installing from npm and then using a module bundler such as [Webpack](http://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.org/).
 
-Alternatively, you can also use this package in a pre-built bundle from Transloadit's CDN: Edgly.
+Alternatively, you can also use this package in a pre-built bundle from Transloadits CDN: Edgly.
 
 ```html
 <link rel="stylesheet" href="https://releases.transloadit.com/uppy/v2.2.0/robodog.min.css">

+ 5 - 3
packages/@uppy/screen-capture/README.md

@@ -2,8 +2,10 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/screen-capture"><img src="https://img.shields.io/npm/v/@uppy/screen-capture.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/screen-capture.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/screen-capture)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 The Webcam plugin for Uppy lets you take photos and record videos with a built-in camera on desktop and mobile devices.
 
@@ -27,7 +29,7 @@ $ npm install @uppy/screen-capture
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 6 - 4
packages/@uppy/status-bar/README.md

@@ -2,11 +2,13 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/status-bar"><img src="https://img.shields.io/npm/v/@uppy/status-bar.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/status-bar.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/status-bar)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 The status-bar shows upload progress and speed, ETAs, pre- and post-processing information, and allows users to control (pause/resume/cancel) the upload.
-Best used together with a simple 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 is also included in the [@uppy/dashboard](https://uppy.io/docs/dashboard) plugin.
+Best used together with a basic file source plugin, such as [@uppy/file-input](https://uppy.io/docs/file-input) or [@uppy/drag-drop](https://uppy.io/docs/drag-drop), or a custom implementation. Its also included in the [@uppy/dashboard](https://uppy.io/docs/dashboard) plugin.
 
 Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
 
@@ -33,7 +35,7 @@ $ npm install @uppy/status-bar
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 6 - 4
packages/@uppy/store-default/README.md

@@ -2,10 +2,12 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/store-default"><img src="https://img.shields.io/npm/v/@uppy/store-default.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/store-default.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/store-default)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
-A simple 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.
 
@@ -28,7 +30,7 @@ $ npm install @uppy/store-default
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.org/).
 
-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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 5 - 3
packages/@uppy/store-redux/README.md

@@ -2,8 +2,10 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/store-redux"><img src="https://img.shields.io/npm/v/@uppy/store-redux.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/store-redux.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/store-redux)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 The `ReduxStore` stores Uppy state on a key in an existing Redux store.
 The `ReduxStore` dispatches `uppy/STATE_UPDATE` actions to update state.
@@ -36,7 +38,7 @@ $ npm install @uppy/store-redux
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 5 - 3
packages/@uppy/svelte/README.md

@@ -2,8 +2,10 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/svelte"><img src="https://img.shields.io/npm/v/@uppy/svelte.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/svelte.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/svelte)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 Svelte component wrappers around Uppy’s officially maintained UI plugins.
 
@@ -23,7 +25,7 @@ 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 is 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
 

+ 5 - 3
packages/@uppy/thumbnail-generator/README.md

@@ -2,8 +2,10 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/thumbnail-generator"><img src="https://img.shields.io/npm/v/@uppy/thumbnail-generator.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/thumbnail-generator.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/thumbnail-generator)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 Uppy plugin that generates small previews of images to show on your upload UI.
 
@@ -29,7 +31,7 @@ $ npm install @uppy/thumbnail-generator
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 <!-- Undocumented currently
 ## Documentation

+ 5 - 3
packages/@uppy/transloadit/README.md

@@ -2,8 +2,10 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/transloadit"><img src="https://img.shields.io/npm/v/@uppy/transloadit.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/transloadit.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/transloadit)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 The Transloadit plugin can be used to upload files to Transloadit for all kinds of processing, such as transcoding video, resizing images, zipping/unzipping, [and more](https://transloadit.com/services/).
 
@@ -31,7 +33,7 @@ $ npm install @uppy/transloadit
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 6 - 3
packages/@uppy/tus/README.md

@@ -2,8 +2,10 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/tus"><img src="https://img.shields.io/npm/v/@uppy/tus.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/tus.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/tus)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 The Tus plugin brings [tus.io][] resumable file uploading to Uppy by wrapping the [tus-js-client][].
 
@@ -31,7 +33,7 @@ $ npm install @uppy/tus
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 
@@ -42,4 +44,5 @@ Documentation for this plugin can be found on the [Uppy website](https://uppy.io
 [The MIT License](./LICENSE).
 
 [tus.io]: https://tus.io
+
 [tus-js-client]: https://github.com/tus/tus-js-client

+ 5 - 3
packages/@uppy/unsplash/README.md

@@ -2,8 +2,10 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/unsplash"><img src="https://img.shields.io/npm/v/@uppy/unsplash.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/unsplash.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/unsplash)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 The Unsplash plugin lets users import files from Unsplash, the free stock photography resource.
 
@@ -31,7 +33,7 @@ $ npm install @uppy/unsplash --save
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 5 - 3
packages/@uppy/url/README.md

@@ -2,8 +2,10 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/url"><img src="https://img.shields.io/npm/v/@uppy/url.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/url.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/url)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 The Url plugin lets users import files from the Internet. Paste any URL and it’ll be added!
 
@@ -31,7 +33,7 @@ $ npm install @uppy/url
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 5 - 3
packages/@uppy/utils/README.md

@@ -2,10 +2,12 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/utils"><img src="https://img.shields.io/npm/v/@uppy/utils.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/utils.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/utils)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
-Shared utility functions for Uppy Core and the "official" plugins maintained by the Uppy team.
+Shared utility functions for Uppy Core and the “official” plugins maintained by the Uppy team.
 
 Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
 

+ 7 - 6
packages/@uppy/utils/src/getDroppedFiles/README.md

@@ -1,10 +1,11 @@
 Influenced by:
-  - <https://github.com/leonadler/drag-and-drop-across-browsers>
-  - <https://github.com/silverwind/uppie/blob/master/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 e.g. shows how this spec is supposed to function: <https://wicg.github.io/directory-upload/>, but it only works because of the polyfill.js that uses `.webkitGetAsEntry()` internally.
+Its a proposed spec that seems to be barely implemented anywhere.
+Supposed to work in Firefox and Edge, but it doesnt work in Firefox, and both Firefox and Edge support `.webkitGetAsEntry()` api anyway.
+This page shows how this spec is supposed to function: <https://wicg.github.io/directory-upload/>, but it only works because of the polyfill.js that uses `.webkitGetAsEntry()` internally.

+ 6 - 5
packages/@uppy/vue/README.md

@@ -2,10 +2,12 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/vue"><img src="https://img.shields.io/npm/v/@uppy/vue.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/vue.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/vue)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
-Vue component wrappers around Uppy's officially maintained UI plugins.
+Vue component wrappers around Uppys officially maintained UI plugins.
 
 Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service.
 
@@ -52,7 +54,7 @@ $ npm install @uppy/vue
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 
@@ -61,4 +63,3 @@ Documentation for this plugin can be found on the [Uppy website](https://uppy.io
 ## License
 
 [The MIT License](./LICENSE).
-

+ 5 - 3
packages/@uppy/webcam/README.md

@@ -2,8 +2,10 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/webcam"><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">
+[![npm version](https://img.shields.io/npm/v/@uppy/webcam.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/webcam)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 The Webcam plugin for Uppy lets you take photos and record videos with a built-in camera on desktop and mobile devices.
 
@@ -31,7 +33,7 @@ $ npm install @uppy/webcam
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 5 - 3
packages/@uppy/xhr-upload/README.md

@@ -2,8 +2,10 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/xhr-upload"><img src="https://img.shields.io/npm/v/@uppy/xhr-upload.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/xhr-upload.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/xhr-upload)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 The XHRUpload plugin handles classic XHR uploads with Uppy. If you have an exiting Apache/Nginx/Node or whatever backend, this is probably the Uppy uploader plugin you are looking for.
 
@@ -29,7 +31,7 @@ $ npm install @uppy/xhr-upload
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 5 - 3
packages/@uppy/zoom/README.md

@@ -2,8 +2,10 @@
 
 <img src="https://uppy.io/images/logos/uppy-dog-head-arrow.svg" width="120" alt="Uppy logo: a superman puppy in a pink suit" align="right">
 
-<a href="https://www.npmjs.com/package/@uppy/zoom"><img src="https://img.shields.io/npm/v/@uppy/zoom.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">
+[![npm version](https://img.shields.io/npm/v/@uppy/zoom.svg?style=flat-square)](https://www.npmjs.com/package/@uppy/zoom)
+![CI status for Uppy tests](https://github.com/transloadit/uppy/workflows/Tests/badge.svg)
+![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg)
+![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg)
 
 The Zoom plugin for Uppy lets users import recordings and related files from their Zoom account.
 
@@ -31,7 +33,7 @@ $ npm install @uppy/zoom
 
 We recommend installing from npm and then using a module bundler such as [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.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 Transloadits CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
 
 ## Documentation
 

+ 1 - 0
private/README.md

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

+ 7 - 3
private/remark-lint-uppy/README.md

@@ -1,14 +1,18 @@
 # remark-lint-uppy
+
 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 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 `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.
 
 ## License
+
 [MIT][].
 
 [remark-preset-lint-recommended]: https://github.com/remarkjs/remark-lint/blob/master/packages/remark-preset-lint-recommended
+
 [MIT]: ./LICENSE

+ 33 - 22
private/remark-lint-uppy/index.js

@@ -1,23 +1,34 @@
-'use strict'
+const importDefault = (specifier) => import(specifier).then((module) => module.default)
 
-exports.plugins = [
-  require('remark-frontmatter'),
-  // Do a lint.
-  require('remark-lint'),
-  // Unix compatibility.
-  require('remark-lint-final-newline'),
-  // Differs or unsupported across vendors.
-  require('remark-lint-no-auto-link-without-protocol'),
-  require('remark-lint-no-blockquote-without-marker'),
-  require('remark-lint-no-literal-urls'),
-  [require('remark-lint-ordered-list-marker-style'), '.'],
-  // Mistakes.
-  require('remark-lint-hard-break-spaces'),
-  require('remark-lint-no-duplicate-definitions'),
-  require('remark-lint-no-heading-content-indent'),
-  require('remark-lint-no-inline-padding'),
-  require('remark-lint-no-shortcut-reference-image'),
-  require('remark-lint-no-shortcut-reference-link'),
-  require('remark-lint-no-undefined-references'),
-  require('remark-lint-no-unused-definitions'),
-]
+export default {
+  settings: {
+    emphasis: '_',
+    strong: '*',
+    listItemIndent: 'one',
+  },
+  plugins: [
+    await importDefault('remark-frontmatter'),
+    // Do a lint.
+    await importDefault('remark-lint'),
+    // Unix compatibility.
+    await importDefault('remark-lint-final-newline'),
+    // Differs or unsupported across vendors.
+    await importDefault('remark-lint-no-auto-link-without-protocol'),
+    await importDefault('remark-lint-no-blockquote-without-marker'),
+    await importDefault('remark-lint-no-literal-urls'),
+    [await importDefault('remark-lint-ordered-list-marker-style'), '.'],
+    // Mistakes.
+    await importDefault('remark-lint-hard-break-spaces'),
+    await importDefault('remark-lint-no-duplicate-definitions'),
+    await importDefault('remark-lint-no-heading-content-indent'),
+    await importDefault('remark-lint-no-inline-padding'),
+    await importDefault('remark-lint-no-shortcut-reference-image'),
+    await importDefault('remark-lint-no-shortcut-reference-link'),
+    await importDefault('remark-lint-no-undefined-references'),
+    await importDefault('remark-lint-no-unused-definitions'),
+    [await importDefault('remark-lint-emphasis-marker'), '_'],
+    await importDefault('remark-lint-strong-marker'),
+    await importDefault('./retext-preset.js'),
+    await importDefault('./message-control.js'),
+  ],
+}

+ 11 - 0
private/remark-lint-uppy/message-control.js

@@ -0,0 +1,11 @@
+import unifiedMessageControl from 'unified-message-control'
+import { commentMarker } from 'mdast-comment-marker'
+
+export default [
+  unifiedMessageControl,
+  {
+    name: 'retext-simplify',
+    marker: commentMarker,
+    test: 'html',
+  },
+]

+ 29 - 15
private/remark-lint-uppy/package.json

@@ -1,22 +1,36 @@
 {
   "name": "remark-lint-uppy",
   "version": "0.0.0",
+  "main": "index.js",
   "dependencies": {
-    "remark-frontmatter": "^3.0.0",
-    "remark-lint": "^8.0.0",
-    "remark-lint-final-newline": "^1.0.5",
-    "remark-lint-hard-break-spaces": "^2.0.1",
-    "remark-lint-no-auto-link-without-protocol": "^2.0.1",
-    "remark-lint-no-blockquote-without-marker": "^4.0.0",
-    "remark-lint-no-duplicate-definitions": "^2.0.1",
-    "remark-lint-no-heading-content-indent": "^3.0.0",
-    "remark-lint-no-inline-padding": "^3.0.0",
-    "remark-lint-no-literal-urls": "^2.0.1",
-    "remark-lint-no-shortcut-reference-image": "^2.0.1",
-    "remark-lint-no-shortcut-reference-link": "^2.0.1",
-    "remark-lint-no-undefined-references": "^3.0.0",
-    "remark-lint-no-unused-definitions": "^2.0.1",
-    "remark-lint-ordered-list-marker-style": "^2.0.1"
+    "mdast-comment-marker": "^2.1.0",
+    "remark-frontmatter": "^4.0.0",
+    "remark-lint": "^9.0.0",
+    "remark-lint-emphasis-marker": "^3.0.0",
+    "remark-lint-final-newline": "^2.0.0",
+    "remark-lint-hard-break-spaces": "^3.0.0",
+    "remark-lint-no-auto-link-without-protocol": "^3.1.0",
+    "remark-lint-no-blockquote-without-marker": "^5.0.0",
+    "remark-lint-no-duplicate-definitions": "^3.0.0",
+    "remark-lint-no-heading-content-indent": "^4.0.0",
+    "remark-lint-no-inline-padding": "^4.0.0",
+    "remark-lint-no-literal-urls": "^3.0.0",
+    "remark-lint-no-shortcut-reference-image": "^3.1.0",
+    "remark-lint-no-shortcut-reference-link": "^3.1.0",
+    "remark-lint-no-undefined-references": "^4.0.0",
+    "remark-lint-no-unused-definitions": "^3.1.0",
+    "remark-lint-ordered-list-marker-style": "^3.1.0",
+    "remark-lint-strong-marker": "^3.1.0",
+    "remark-retext": "^5.0.0",
+    "retext-english": "^4.0.0",
+    "retext-equality": "^6.2.0",
+    "retext-profanities": "^7.1.0",
+    "retext-quotes": "^5.0.0",
+    "retext-simplify": "^7.0.0",
+    "retext-syntax-mentions": "^3.1.0",
+    "unified": "^10.0.0",
+    "unified-message-control": "^4.0.0"
   },
+  "type": "module",
   "private": true
 }

+ 44 - 0
private/remark-lint-uppy/retext-preset.js

@@ -0,0 +1,44 @@
+import remarkRetext from 'remark-retext'
+import { unified } from 'unified'
+import retextEnglish from 'retext-english'
+import retextEquality from 'retext-equality'
+import retextProfanities from 'retext-profanities'
+import retextQuotes from 'retext-quotes'
+import retextSimplify from 'retext-simplify'
+import retextSyntaxMentions from 'retext-syntax-mentions'
+
+export default [
+  remarkRetext,
+  unified()
+    .use(retextEnglish)
+    .use(retextEquality, { ignore: ['disabled', 'host', 'hosts', 'invalid', 'whitespace'] })
+    .use(retextProfanities, { sureness: 1 })
+    .use(retextQuotes)
+    .use(retextSimplify, {
+      ignore: [
+        'accurate',
+        'address',
+        'alternatively',
+        'component',
+        'equivalent',
+        'function',
+        'identify',
+        'implement',
+        'initial',
+        'interface',
+        'maintain',
+        'maximum',
+        'minimum',
+        'option',
+        'parameters',
+        'provide',
+        'render',
+        'request',
+        'selection',
+        'submit',
+        'type',
+        'validate',
+      ],
+    })
+    .use(retextSyntaxMentions),
+]

+ 1 - 1
website/inject.js

@@ -236,7 +236,7 @@ function injectLocaleList () {
 
   const dstpath = path.join(webRoot, 'src', '_template', 'list_of_locale_packs.md')
   const localeListDstPath = path.join(webRoot, 'src', 'examples', 'locale_list.json')
-  fs.writeFileSync(dstpath, resultingMdTable, 'utf-8')
+  fs.writeFileSync(dstpath, `${resultingMdTable}\n`, 'utf-8')
   console.info(chalk.green('✓ injected: '), chalk.grey(dstpath))
   fs.writeFileSync(localeListDstPath, JSON.stringify(localeList), 'utf-8')
   console.info(chalk.green('✓ injected: '), chalk.grey(localeListDstPath))

+ 31 - 31
website/src/_template/contributing.md

@@ -16,8 +16,8 @@ Our website’s examples section is also our playground, please read the [Local
 
 ### 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
 
@@ -144,17 +144,17 @@ If you have two-factor authentication enabled on your account, Lerna will ask fo
 
 Other things to keep in mind during release:
 
-*   When doing a major release >= 1.0, of the `@uppy/core` package, the `peerDependency` of the plugin packages needs to be updated first. Eg when updating from 1.y.z to 2.0.0, the peerDependency of each should be `"@uppy/core": "^2.0.0"` before doing `npm run release`.
-*   When adding a new package, add the following key to its package.json:
-    ```json
-    "publishConfig": { "access": "public" }
-    ```
-    Else, npm will try and fail to publish a _private_ package, because the `@uppy` scope on npm does not support that.
+* When doing a major release >= 1.0, of the `@uppy/core` package, the `peerDependency` of the plugin packages needs to be updated first. Eg when updating from 1.y.z to 2.0.0, the peerDependency of each should be `"@uppy/core": "^2.0.0"` before doing `npm run release`.
+* When adding a new package, add the following key to its package.json:
+  ```json
+  "publishConfig": { "access": "public" }
+  ```
+  Else, npm will try and fail to publish a _private_ package, because the `@uppy` scope on npm does not support that.
 
 After a release, the demos on transloadit.com should also be updated. After updating, 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.
+* 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:
 
@@ -168,9 +168,9 @@ Even though bundled in this repo, the website is regarded as a separate project.
 
 ### Local previews
 
-1.  `npm install`
-2.  `npm start`
-3.  Go to http://localhost:4000. Your changes in `/website` and `/packages/@uppy` will be watched, your browser will refresh as files change.
+1. `npm install`
+2. `npm start`
+3. Go to http://localhost:4000. Your changes in `/website` and `/packages/@uppy` will be watched, your browser will refresh as files change.
 
 Then, to work on, for instance, the XHRUpload example, you would edit the following files:
 
@@ -250,9 +250,9 @@ Style to the mobile breakpoint with your selectors, then use `min-width` media q
 
 ### 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 */
@@ -290,20 +290,20 @@ h1 {
 
 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.
 
 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
 
@@ -343,12 +343,12 @@ This section won’t be too in-depth, because TypeScript depends on your framewo
 
 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:
 

+ 4 - 4
website/src/_template/integration_help.md

@@ -1,9 +1,9 @@
 <!-- WARNING! This file was injected. Please edit in ".github/ISSUE_TEMPLATE/integration_help.md" instead and run "inject.js" -->
 
-Transloadit is providing Uppy free of charge. If you want, you can self-host all of its components and never pay us a dime. There are docs and tests, and your Bug Reports and Feature Requests are always welcome on GitHub. 
+Transloadit is providing Uppy free of charge. If you want, you can self-host all its components and never pay us a dime. You can access docs and tests, and your Bug Reports and Feature Requests are always welcome on GitHub.
 
-There is also a different category of support that we like to call Integration Help: assistance to make things work for your environment, that have already been reported as working for the larger community.
+We offer also a different category of support that we like to call Integration Help: help to make things work for your environment, that have already been reported as working for the larger community.
 
-As much as we at Transloadit would like to provide detailed Integration Help to every non-paying user, Uppy has reached a point where this is no longer sustainable for our small crew. If we end up investing our time in a million different apps that use Uppy, as long as there is no money flowing back, we won't be able to ramp up our team to meet the demand. This would spread the team ever thinner and eventually grind development to a halt.
+As much as we at Transloadit would like to provide detailed Integration Help to every non-paying user, Uppy has reached a point where this is no longer sustainable for our small crew. If we end up investing our time in a million different apps that use Uppy, as long as no money is flowing back, we won’t be able to ramp up our team to meet the demand. This would spread the team ever thinner and eventually grind development to a halt.
 
-That is not where we want to be. So, in order to offer enthusiasts, businesses, and enterprises assistance in a sustainable way, we're providing community-based Integration Help for free at <https://community.transloadit.com/c/uppy>. If you are unable to solve your problem with help of the Uppy community, we offer paid Integration Help via <https://uppy.io/support>.
+That is not where we want to be. So, to offer enthusiasts, businesses, and enterprises help in a sustainable way, we’re providing community-based Integration Help for free at <https://community.transloadit.com/c/uppy>. If you are unable to solve your problem with help of the Uppy community, we offer paid Integration Help via <https://uppy.io/support>.

+ 5 - 5
website/src/docs/angular.md

@@ -77,10 +77,10 @@ export class AppComponent {
 
 The following plugins are available as Angular component wrappers:
 
-- `<uppy-dashboard />` - renders a `@uppy/dashboard`
-- `<uppy-drag-drop />` - renders a `@uppy/drag-drop` area
-- `<uppy-progress-bar />` - renders a `@uppy/progress-bar`
-- `<uppy-status-bar />` - renders a `@uppy/status-bar`
+* `<uppy-dashboard />` - renders a `@uppy/dashboard`
+* `<uppy-drag-drop />` - renders a `@uppy/drag-drop` area
+* `<uppy-progress-bar />` - renders a `@uppy/progress-bar`
+* `<uppy-status-bar />` - renders a `@uppy/status-bar`
 
 Each component takes a `props` prop that will be passed to the UI Plugin.
 
@@ -160,7 +160,7 @@ The `<uppy-dashboard-modal />` cannot be passed to a `target:` option of a remot
 
 #### CSS
 
-The `UppyAngularDragDropModule` component includes some simple styles, like shown in the [example](/examples/dragdrop). You can also choose not to use it and provide your own styles instead:
+The `UppyAngularDragDropModule` component includes some basic styles, like shown in the [example](/examples/dragdrop). You can also choose not to use it and provide your own styles instead:
 
 ```typescript
 @Component({

+ 34 - 32
website/src/docs/aws-s3-multipart.md

@@ -8,7 +8,7 @@ category: "Destinations"
 tagline: "uploader for AWS S3 using its resumable Multipart protocol"
 ---
 
-The `@uppy/aws-s3-multipart` 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 is also very reliable: if a single part fails to upload, only that 5MB chunk has to be retried.
+The `@uppy/aws-s3-multipart` plugin can be used to upload files directly to an S3 bucket using S3s Multipart upload strategy. With this strategy, files are chopped up in parts of 5MB+ each, so they can be uploaded concurrently. It’s also quite reliable: if a single part fails to upload, only that 5MB chunk has to be retried.
 
 ```js
 import AwsS3Multipart from '@uppy/aws-s3-multipart'
@@ -29,7 +29,7 @@ Install from NPM:
 npm install @uppy/aws-s3-multipart
 ```
 
-In the [CDN package](/docs/#With-a-script-tag), it is available on the `Uppy` global object:
+In the [CDN package](/docs/#With-a-script-tag), the plugin class is available on the `Uppy` global object:
 
 ```js
 const { AwsS3Multipart } = Uppy
@@ -67,7 +67,7 @@ This will be used by the default implementations of the upload-related functions
 
 ### `companionCookiesRule: 'same-origin'`
 
-This option correlates to the [RequestCredentials value](https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials), which tells the plugin whether or not to send cookies to [Companion](/docs/companion).
+This option correlates to the [RequestCredentials value](https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials), which tells the plugin whether to send cookies to [Companion](/docs/companion).
 
 ### `getChunkSize(file)`
 
@@ -75,48 +75,49 @@ A function that returns the minimum chunk size to use when uploading the given f
 
 The S3 Multipart plugin uploads files in chunks. Chunks are sent in batches to have presigned URLs generated via ([`prepareUploadParts()`](#prepareUploadParts-file-partData)). To reduce the amount of requests for large files, you can choose a larger chunk size, at the cost of having to re-upload more data if one chunk fails to upload.
 
-S3 requires a minimum chunk size of 5MB, and supports at most 10,000 chunks per multipart upload. If `getChunkSize()` returns a size that's too small, Uppy will increase it to S3's minimum requirements.
+S3 requires a minimum chunk size of 5MB, and supports at most 10,000 chunks per multipart upload. If `getChunkSize()` returns a size that’s too small, Uppy will increase it to S3’s minimum requirements.
 
 ### `createMultipartUpload(file)`
 
-A function that calls the S3 Multipart API to create a new upload. `file` is the file object from Uppy's state. The most relevant keys are `file.name` and `file.type`.
+A function that calls the S3 Multipart API to create a new upload. `file` is the file object from Uppys state. The most relevant keys are `file.name` and `file.type`.
 
 Return a Promise for an object with keys:
 
- - `uploadId` - The UploadID returned by S3.
- - `key` - The object key for the file. This needs to be returned to allow it to be different from the `file.name`.
+* `uploadId` - The UploadID returned by S3.
+* `key` - The object key for the file. This needs to be returned to allow it to be different from the `file.name`.
 
-The default implementation calls out to Companion's S3 signing endpoints.
+The default implementation calls out to Companions S3 signing endpoints.
 
 ### `listParts(file, { uploadId, key })`
 
-A function that calls the S3 Multipart API to list the parts of a file that have already been uploaded. Receives the `file` object from Uppy's state, and an object with keys:
+A function that calls the S3 Multipart API to list the parts of a file that have already been uploaded. Receives the `file` object from Uppys state, and an object with keys:
 
- - `uploadId` - The UploadID of this Multipart upload.
- - `key` - The object key of this Multipart upload.
+* `uploadId` - The UploadID of this Multipart upload.
+* `key` - The object key of this Multipart upload.
 
 Return a Promise for an array of S3 Part objects, as returned by the S3 Multipart API. Each object has keys:
 
- - `PartNumber` - The index in the file of the uploaded part.
- - `Size` - The size of the part in bytes.
- - `ETag` - The ETag of the part, used to identify it when completing the multipart upload and combining all parts into a single file.
+* `PartNumber` - The index in the file of the uploaded part.
+* `Size` - The size of the part in bytes.
+* `ETag` - The ETag of the part, used to identify it when completing the multipart upload and combining all parts into a single file.
 
-The default implementation calls out to Companion's S3 signing endpoints.
+The default implementation calls out to Companions S3 signing endpoints.
 
 ### `prepareUploadParts(file, partData)`
 
-A function that generates a batch of signed URLs for the specified part numbers. Receives the `file` object from Uppy's state. The `partData` argument is an object with keys:
+A function that generates a batch of signed URLs for the specified part numbers. Receives the `file` object from Uppys state. The `partData` argument is an object with keys:
 
- - `uploadId` - The UploadID of this Multipart upload.
- - `key` - The object key in the S3 bucket.
- - `partNumbers` - An array of indecies of this part in the file (`PartNumber` in S3 terminology). Note that part numbers are _not_ zero-based.
+* `uploadId` - The UploadID of this Multipart upload.
+* `key` - The object key in the S3 bucket.
+* `partNumbers` - An array of indecies of this part in the file (`PartNumber` in S3 terminology). Note that part numbers are _not_ zero-based.
 
 `prepareUploadParts` should return a `Promise` with an `Object` with keys:
 
- - `presignedUrls` - A JavaScript object with the part numbers as keys and the presigned URL for each part as the value.
- - `headers` - **(Optional)** Custom headers that should be sent to the S3 presigned URL.
+* `presignedUrls` - A JavaScript object with the part numbers as keys and the presigned URL for each part as the value.
+* `headers` - **(Optional)** Custom headers that should be sent to the S3 presigned URL.
 
 An example of what the return value should look like:
+
 ```json
 {
   "presignedUrls": {
@@ -131,6 +132,7 @@ An example of what the return value should look like:
 If an error occured, reject the `Promise` with an `Object` with the following keys:
 
 <!-- eslint-disable -->
+
 ```json
 { "source": { "status": 500 } }
 ```
@@ -139,32 +141,32 @@ If an error occured, reject the `Promise` with an `Object` with the following ke
 
 ### `abortMultipartUpload(file, { uploadId, key })`
 
-A function that calls the S3 Multipart API to abort a Multipart upload, and delete all parts that have been uploaded so far. Receives the `file` object from Uppy's state, and an object with keys:
+A function that calls the S3 Multipart API to abort a Multipart upload, and removes all parts that have been uploaded so far. Receives the `file` object from Uppy’s state, and an object with keys:
 
- - `uploadId` - The UploadID of this Multipart upload.
- - `key` - The object key of this Multipart upload.
+* `uploadId` - The UploadID of this Multipart upload.
+* `key` - The object key of this Multipart upload.
 
 This is typically called when the user cancels an upload. Cancellation cannot fail in Uppy, so the result of this function is ignored.
 
-The default implementation calls out to Companion's S3 signing endpoints.
+The default implementation calls out to Companions S3 signing endpoints.
 
 ### `completeMultipartUpload(file, { uploadId, key, parts })`
 
-A function that calls the S3 Multipart API to complete a Multipart upload, combining all parts into a single object in the S3 bucket. Receives the `file` object from Uppy's state, and an object with keys:
+A function that calls the S3 Multipart API to complete a Multipart upload, combining all parts into a single object in the S3 bucket. Receives the `file` object from Uppys state, and an object with keys:
 
- - `uploadId` - The UploadID of this Multipart upload.
- - `key` - The object key of this Multipart upload.
- - `parts` - S3-style list of parts, an array of objects with `ETag` and `PartNumber` properties. This can be passed straight to S3's Multipart API.
+* `uploadId` - The UploadID of this Multipart upload.
+* `key` - The object key of this Multipart upload.
+* `parts` - S3-style list of parts, an array of objects with `ETag` and `PartNumber` properties. This can be passed straight to S3s Multipart API.
 
 Return a Promise for an object with properties:
 
- - `location` - **(Optional)** A publically accessible URL to the object in the S3 bucket.
+* `location` - **(Optional)** A publically accessible URL to the object in the S3 bucket.
 
-The default implementation calls out to Companion's S3 signing endpoints.
+The default implementation calls out to Companions S3 signing endpoints.
 
 ## S3 Bucket Configuration
 
-S3 buckets do not allow public uploads by default.  In order to allow Uppy to upload to a bucket directly, its CORS permissions need to be configured. This process is described in the [AwsS3 documentation](/docs/aws-s3/#S3-Bucket-configuration).
+S3 buckets do not allow public uploads by default. To allow Uppy to upload to a bucket directly, its CORS permissions need to be configured. This process is described in the [AwsS3 documentation](/docs/aws-s3/#S3-Bucket-configuration).
 
 While the Uppy AWS S3 plugin uses `POST` requests when uploading files to an S3 bucket, the AWS S3 Multipart plugin uses `PUT` requests when uploading file parts. Additionally, the `ETag` header must also be exposed (in the response):
 

+ 46 - 43
website/src/docs/aws-s3.md

@@ -22,9 +22,9 @@ uppy.use(AwsS3, {
 })
 ```
 
-There are broadly two ways of uploading to S3 in a browser. A server can generate a presigned URL for a [PUT upload](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html), or a server can generate form data for a [POST upload](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html). Companion uses a POST upload. See [POST Uploads](#POST-uploads) for some caveats if you would like to use POST uploads without Companion. See [Generating a presigned upload URL server-side](#example-presigned-url) for an example of a PUT upload.
+Uploading to S3 from a browser can be done in broadly two ways. A server can generate a presigned URL for a [PUT upload](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html), or a server can generate form data for a [POST upload](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html). Companion uses a POST upload. See [POST Uploads](#POST-uploads) for some caveats if you would like to use POST uploads without Companion. See [Generating a presigned upload URL server-side](#example-presigned-url) for an example of a PUT upload.
 
-There is also a separate plugin for S3 Multipart uploads. Multipart in this sense refers to Amazon's proprietary chunked, resumable upload mechanism for large files. See the [`@uppy/aws-s3-multipart`](/docs/aws-s3-multipart) documentation.
+You can also use a separate plugin for S3 Multipart uploads. Multipart in this sense refers to Amazon’s proprietary chunked, resumable upload mechanism for large files. See the [`@uppy/aws-s3-multipart`](/docs/aws-s3-multipart) documentation.
 
 ## Installation
 
@@ -36,7 +36,7 @@ Install from NPM:
 npm install @uppy/aws-s3
 ```
 
-In the [CDN package](/docs/#With-a-script-tag), it is available on the `Uppy` global object:
+In the [CDN package](/docs/#With-a-script-tag), the plugin class is available on the `Uppy` global object:
 
 ```js
 const { AwsS3 } = Uppy
@@ -68,10 +68,10 @@ Custom headers that should be sent along to [Companion][companion docs] on every
 
 ### `metaFields: []`
 
-Pass an array of field names to specify the metadata fields that should be stored in S3 as Object Metadata. This takes values from each file's `file.meta` property.
+Pass an array of field names to specify the metadata fields that should be stored in S3 as Object Metadata. This takes values from each files `file.meta` property.
 
-- Set this to `['name']` to only send the name field.
-- Set this to an empty array `[]` (the default) to not send any fields.
+* Set this to `['name']` to only send the name field.
+* Set this to an empty array `[]` (the default) to not send any fields.
 
 ### `getUploadParameters(file)`
 
@@ -91,7 +91,7 @@ The `fields` field is an object with form fields to send along with the upload r
 For presigned PUT uploads, this should be left empty.
 
 The `headers` field is an object with request headers to send along with the upload request.
-When using a presigned PUT upload, it's a good idea to provide `headers['content-type']`. That will ensure that the request uses the same content-type that was used to generate the signature. Without it, the browser may decide on a different content-type instead, causing S3 to reject the upload.
+When using a presigned PUT upload, it’s a good idea to provide `headers['content-type']`. That will make sure that the request uses the same content-type that was used to generate the signature. Without it, the browser may decide on a different content-type instead, causing S3 to reject the upload.
 
 ### `timeout: 30 * 1000`
 
@@ -111,7 +111,7 @@ Set to `0` to disable limiting.
 
 Customize response handling once an upload is completed. This passes the function through to @uppy/xhr-upload, see its [documentation](https://uppy.io/docs/xhr-upload/#getResponseData-responseText-response) for API details.
 
-This option is useful when uploading to an S3-like service that doesn't reply with an XML document, but with something else such as JSON.
+This option is useful when uploading to an S3-like service that doesnt reply with an XML document, but with something else such as JSON.
 
 ### `locale: {}`
 
@@ -131,13 +131,13 @@ const locales = {
 ## S3 Bucket configuration
 
 S3 buckets do not allow public uploads by default.
-In order to allow Uppy to upload directly to a bucket, at least its CORS permissions need to be configured, and you potentially need to change some of the *Public access settings* that provide an extra layer of public access protection even if the correct CORS permissions are in place.
+To allow Uppy to upload directly to a bucket, at least its CORS permissions need to be configured, and you potentially need to change some of the _Public access settings_ that provide an extra layer of public access protection even if the correct CORS permissions are in place.
 
 CORS permissions can be found in the [S3 Management Console](https://console.aws.amazon.com/s3/home).
-Click the bucket that will receive the uploads, then go into the "Permissions" tab and select the "CORS configuration" button.
-A JSON document will be shown that contains the CORS configuration. (AWS used to use XML but now only allow JSON). More information about the [S3 CORS format here](https://docs.amazonaws.cn/en_us/AmazonS3/latest/userguide/ManageCorsUsing.html).
+Click the bucket that will receive the uploads, then go into the `Permissions` tab and select the `CORS configuration` button.
+A JSON document will be shown that defines the CORS configuration. (AWS used to use XML but now only allow JSON). More information about the [S3 CORS format here](https://docs.amazonaws.cn/en\_us/AmazonS3/latest/userguide/ManageCorsUsing.html).
 
-It is good practice to use two CORS rules: one for viewing the uploaded files, and one for uploading files.
+A good practice is to use two CORS rules: one for viewing the uploaded files, and one for uploading files.
 
 Depending on which settings were enabled during bucket creation, AWS S3 may have defined a CORS rule that allows public reading already.
 This rule looks like:
@@ -155,7 +155,7 @@ If uploaded files should be publically viewable, but a rule like this is not pre
 A different rule is necessary to allow uploading.
 This rule should come _before_ the existing rule, because S3 only uses the first rule that matches the origin of the request.
 
-At minimum, the domain from which the uploads will happen must be whitelisted, and the definitions from the previous rule must be added:
+At minimum, the domain from which the uploads will happen must be allow-listed, and the definitions from the earlier rule must be added:
 
 ```json
 {
@@ -187,7 +187,7 @@ When using a presigned upload URL, the following permissions must be granted:
 }
 ```
 
-The final configuration should look something like this (note that it contains two rules in an array `[]`):
+The final configuration should look something like this (note that it defines two rules in an array `[]`):
 
 ```json
 [
@@ -210,9 +210,9 @@ The final configuration should look something like this (note that it contains t
 ]
 ```
 
-Even with these CORS rules in place, you browser might still encounter HTTP status 403 responses with `AccessDenied` in the response body when it tries to `POST` to your bucket. In this case, within the "Permissions" tab of the [S3 Management Console](https://console.aws.amazon.com/s3/home), choose "Public access settings".
+Even with these CORS rules in place, you browser might still receive HTTP status 403 responses with `AccessDenied` in the response body when it tries to `POST` to your bucket. In this case, within the `Permissions` tab of the [S3 Management Console](https://console.aws.amazon.com/s3/home), choose `Public access settings`.
 
-It will list general *Public access settings for this bucket*, which can override the rules imposed by your CORS settings. Click on *edit* to manage these settings. Under *Manage public access control lists (ACLs) for this bucket*, make sure that *Block new public ACLs and uploading public objects (Recommended)* is unchecked, and *Save* these settings.
+It will list general _Public access settings for this bucket_, which can override the rules imposed by your CORS settings. Click on _edit_ to manage these settings. Under _Manage public access control lists (ACLs) for this bucket_, make sure that _Block new public ACLs and uploading public objects (Recommended)_ is unchecked, and _Save_ these settings.
 
 If you are using an IAM policy to allow access to the S3 bucket, the policy must have at least the `s3:PutObject` and `s3:PutObjectAcl` permissions scoped to the bucket in question.
 
@@ -220,23 +220,23 @@ In-depth documentation about CORS rules is available on the [AWS documentation s
 
 ## POST uploads
 
-Companion uses POST uploads by default, but you can also use them with your own endpoints. There are a few things to be aware of when doing so:
+Companion uses POST uploads by default, but you can also use them with your own endpoints. A few things to be aware of when doing so:
 
- - The `@uppy/aws-s3` plugin attempts to read the `<Location>` XML tag from POST upload responses. S3 does not respond with an XML document by default. When generating the form data for POST uploads, you must set the `success_action_status` field to `201`.
-   ```js
-   // `s3` is an instance of the AWS JavaScript SDK's S3 client
-   s3.createPresignedPost({
-     // ...
-     Fields: {
-       // ...
-       success_action_status: '201',
-     },
-   })
-   ```
+* The `@uppy/aws-s3` plugin attempts to read the `<Location>` XML tag from POST upload responses. S3 does not respond with an XML document by default. When generating the form data for POST uploads, you must set the `success_action_status` field to `201`.
+  ```js
+  // `s3` is an instance of the AWS JavaScript SDK's S3 client
+  s3.createPresignedPost({
+    // ...
+    Fields: {
+      // ...
+      success_action_status: '201',
+    },
+  })
+  ```
 
 ## S3 alternatives
 
-Many other object storage providers have an identical API to S3, so you can use the `@uppy/aws-s3` plugin with them as well. To use them with Companion, you can set the `COMPANION_AWS_ENDPOINT` variable to the endpoint of your preferred service.
+Many other object storage providers have a same API to S3, so you can use the `@uppy/aws-s3` plugin with them as well. To use them with Companion, you can set the `COMPANION_AWS_ENDPOINT` variable to the endpoint of your preferred service.
 
 ### DigitalOcean Spaces
 
@@ -264,9 +264,9 @@ export COMPANION_AWS_SECRET="YOUR-GCS-SECRET" # The Secret
 
 You do not need to configure the region with GCS.
 
-You also need to configure CORS differently. Unlike Amazon, Google does not offer a UI for CORS configurations. Instead, an HTTP API must be used. If you haven't done this already, see [Configuring CORS on a Bucket](https://cloud.google.com/storage/docs/configuring-cors#Configuring-CORS-on-a-Bucket) in the GCS documentation, or follow the steps below to do it using Google's API playground.
+You also need to configure CORS differently. Unlike Amazon, Google does not offer a UI for CORS configurations. Instead, an HTTP API must be used. If you havent done this already, see [Configuring CORS on a Bucket](https://cloud.google.com/storage/docs/configuring-cors#Configuring-CORS-on-a-Bucket) in the GCS documentation, or follow the steps below to do it using Googles API playground.
 
-GCS has multiple CORS formats, both XML and JSON. Unfortunately, their formats are different from Amazon's, so we can't simply use the one from the [S3 Bucket configuration](#S3-Bucket-configuration) section. Google appears to favour the JSON format, so we will use that.
+GCS has several CORS formats, both XML and JSON. Unfortunately, their formats are different from Amazon’s, so we can’t use the one from the [S3 Bucket configuration](#S3-Bucket-configuration) section. Google appears to favour the JSON format, so we will use that.
 
 #### JSON CORS configuration
 
@@ -289,7 +289,7 @@ The JSON format consists of an array of CORS configuration objects. An example u
 }
 ```
 
-Most AWS configurations should be fairly simple to port to this format. When using presigned `PUT` uploads, replace the `"POST"` method by `"PUT"` in the first entry.
+When using presigned `PUT` uploads, replace the `"POST"` method by `"PUT"` in the first entry.
 
 If you have the [gsutil](https://cloud.google.com/storage/docs/gsutil) command-line tool, you can apply this configuration using the [gsutil cors](https://cloud.google.com/storage/docs/configuring-cors#configure-cors-bucket) command.
 
@@ -299,20 +299,23 @@ gsutil cors set THAT-FILE.json gs://BUCKET-NAME
 
 Otherwise, you can manually apply it through the OAuth playground:
 
- 1. Get a temporary API token from the [Google OAuth2.0 playground](https://developers.google.com/oauthplayground/)
-   1. Select the "Cloud Storage JSON API v1" » "devstorage.full_control" scope
-   1. Press "Authorize APIs" and allow access
- 1. Click "Step 3 - Configure request to API"
- 1. Configure it as follows:
-   - HTTP Method: PATCH
-   - Request URI: `https://www.googleapis.com/storage/v1/b/YOUR_BUCKET_NAME`
-   - Content-Type: application/json (should be the default)
-   - Press "Enter request body" and input your CORS configuration
- 1. Then, finally, press "Send the request".
+1. Get a temporary API token from the [Google OAuth2.0 playground](https://developers.google.com/oauthplayground/)
+2. Select the `Cloud Storage JSON API v1` » `devstorage.full_control` scope
+3. Press `Authorize APIs` and allow access
+4. Click `Step 3 - Configure request to API`
+5. Configure it as follows:
+
+* HTTP Method: PATCH
+* Request URI: `https://www.googleapis.com/storage/v1/b/YOUR_BUCKET_NAME`
+* Content-Type: application/json (should be the default)
+* Press `Enter request body` and input your CORS configuration
+
+1. Then, finally, press `Send the request`.
 
 ## Examples
 
 <a id="example-presigned-url"></a>
+
 ### Generating a presigned upload URL server-side
 
 The `getUploadParameters` function can return a Promise, so upload parameters can be prepared server-side.
@@ -357,7 +360,7 @@ See the [aws-presigned-url example in the uppy repository](https://github.com/tr
 
 ### Retrieving presign parameters of the uploaded file
 
-Once the file is uploaded, it is possible to retrieve the parameters that were
+Once the file is uploaded, its possible to retrieve the parameters that were
 generated in `getUploadParameters(file)` via the `file.meta` field:
 
 ```js

+ 12 - 10
website/src/docs/box.md

@@ -33,7 +33,7 @@ Install from NPM:
 npm install @uppy/box
 ```
 
-In the [CDN package](/docs/#With-a-script-tag), it is available on the `Uppy` global object:
+In the [CDN package](/docs/#With-a-script-tag), the plugin class is available on the `Uppy` global object:
 
 ```js
 const { Box } = Uppy
@@ -42,12 +42,14 @@ const { Box } = Uppy
 ## Setting Up
 
 To use the Box provider, you need to configure the Box keys that Companion should use. With the standalone Companion server, specify environment variables:
+
 ```shell
 export COMPANION_BOX_KEY="Box API key"
 export COMPANION_BOX_SECRET="Box API secret"
 ```
 
 When using the Companion Node.js API, configure these options:
+
 ```js
 companion.app({
   providerOptions: {
@@ -62,15 +64,15 @@ companion.app({
 You can create a Box App on the [Box Developers site](https://app.box.com/developers/console).
 
 Things to note:
-- Choose "Custom App" and select the "Standard OAuth 2.0 (User Authentication)" app type.
-- Oddly you must enable full write access, or you will get [403 when downloading files](https://support.box.com/hc/en-us/community/posts/360049195613-403-error-while-file-download-API-Call)
 
-You'll be redirected to the app page. This page lists the client ID (app key) and client secret (app secret), which you should use to configure Companion as shown above.
+* Choose `Custom App` and select the `Standard OAuth 2.0 (User Authentication)` app type.
+* Oddly you must enable full write access, or you will get [403 when downloading files](https://support.box.com/hc/en-us/community/posts/360049195613-403-error-while-file-download-API-Call)
 
-The app page has a "Redirect URIs" field. Here, add:
-```
-https://$YOUR_COMPANION_HOST_NAME/box/redirect
-```
+You’ll be redirected to the app page. This page lists the client ID (app key) and client secret (app secret), which you should use to configure Companion as shown above.
+
+The app page has a `"Redirect URIs"` field. Here, add:
+
+    https://$YOUR_COMPANION_HOST_NAME/box/redirect
 
 You can only use the integration with your own account initially—make sure to apply for production status on the app page before you publish your app, or your users will not be able to sign in!
 
@@ -117,11 +119,11 @@ The valid and authorised URL(s) from which OAuth responses should be accepted.
 
 This value can be a `String`, a `Regex` pattern, or an `Array` of both.
 
-This is useful when you have your [Companion](/docs/companion) running on multiple hosts. Otherwise, the default value should do just fine.
+This is useful when you have your [Companion](/docs/companion) running on several hosts. Otherwise, the default value should do fine.
 
 ### `companionCookiesRule: 'same-origin'`
 
-This option correlates to the [RequestCredentials value](https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials), which tells the plugin whether or not to send cookies to [Companion](/docs/companion).
+This option correlates to the [RequestCredentials value](https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials), which tells the plugin whether to send cookies to [Companion](/docs/companion).
 
 ### `locale: {}`
 

+ 8 - 8
website/src/docs/community-projects.md

@@ -7,13 +7,13 @@ permalink: docs/community-projects/
 category: "Docs"
 ---
 
-Uppy has a large community of enthusiasts building plugins, integrations with js frameworks, etc! Here's a non-exhaustive list as we just started indexing these.
+Uppy has a large community of enthusiasts building plugins, integrations with js frameworks, etc! Here’s a non-exhaustive list:
 
-- [vue-uppy](https://github.com/toast38coza/vue-uppy) — A Vue wrapper for Uppy.io
-- [uppy-angular-library](https://github.com/adritasharma/uppy-angular-library) — Angular 8/9 component wrapper
-- [ng-uppy](https://github.com/sunil-shrestha/ng-uppy) — Sample angular (5.x) app for uppy.io with resumable uploads
-- [uppy-aws-amplify](https://github.com/joelvh/uppy-aws-amplify) — Upload to AWS Amplify Storage (S3) with Uppy
-- [uppy-image-compressor](https://github.com/arturi/uppy-plugin-image-compressor/blob/master/src/index.js) — Uppy’s own [Artur Paikin](https://github.com/arturi) received a [question](https://github.com/transloadit/uppy/issues/1582#issuecomment-495787004) about creating plugins and wanted to showcase how you could for example, do image optimization before uploading with Uppy even starts. This could save bandwidth and time, at the tradeoff of not having the original version on the server. We thought the result might be useful to others too so this project is currently under consideration of becoming an official Plugin, depending on your feedback.
-- [nova-s3-multipart-upload](https://github.com/ahmedkandel/nova-s3-multipart-upload) — Uppy tool for [Laravel Nova](https://nova.laravel.com)
+* [vue-uppy](https://github.com/toast38coza/vue-uppy) — A Vue wrapper for Uppy.io
+* [uppy-angular-library](https://github.com/adritasharma/uppy-angular-library) — Angular 8/9 component wrapper
+* [ng-uppy](https://github.com/sunil-shrestha/ng-uppy) — Sample angular (5.x) app for uppy.io with resumable uploads
+* [uppy-aws-amplify](https://github.com/joelvh/uppy-aws-amplify) — Upload to AWS Amplify Storage (S3) with Uppy
+* [uppy-image-compressor](https://github.com/arturi/uppy-plugin-image-compressor/blob/master/src/index.js) — Uppy’s own [Artur Paikin](https://github.com/arturi) received a [question](https://github.com/transloadit/uppy/issues/1582#issuecomment-495787004) about creating plugins and wanted to showcase how you could for example, do image optimization before uploading with Uppy even starts. This could save bandwidth and time, at the tradeoff of not having the original version on the server. We thought the result might be useful to others too so this project is under consideration of becoming an official Plugin, depending on your feedback.
+* [nova-s3-multipart-upload](https://github.com/ahmedkandel/nova-s3-multipart-upload) — Uppy tool for [Laravel Nova](https://nova.laravel.com)
 
-We'd like to list more community projects, do you know one that should be on this page? Send us a PR via the link down below.
+Wed like to list more community projects, do you know one that should be on this page? Send us a PR via the link down below.

+ 74 - 64
website/src/docs/companion.md

@@ -9,24 +9,26 @@ category: "Docs"
 tagline: "Server-side proxy that enables remote sources like Instagram, Google Drive, and Dropbox"
 ---
 
-Drag and drop, webcam, basic file manipulation (adding metadata, for example) and uploading via tus-resumable uploads or XHR/Multipart are all possible using just the Uppy client module.
+Drag and drop, webcam, basic file manipulation (adding metadata, for example) and uploading via tus-resumable uploads or XHR/Multipart are all possible using only the Uppy client module.
+
+<!--retext-simplify ignore however-->
 
 However, if you add [Companion](https://github.com/transloadit/uppy/tree/master/packages/@uppy/companion) to the mix, your users will be able to select files from remote sources, such as Instagram, Google Drive and Dropbox, bypassing the client (so a 5 GB video isn’t eating into your users’ data plans), and then uploaded to the final destination. Files are removed from Companion after an upload is complete, or after a reasonable timeout. Access tokens also don’t stick around for long, for security reasons.
 
-Companion handles the server-to-server communication between your server and file storage providers such as Google Drive, Dropbox, Instagram, etc. Note that you can **not** upload files **to** Companion, it just handles the third party integrations.
+Companion handles the server-to-server communication between your server and file storage providers such as Google Drive, Dropbox, Instagram, etc. Note that you can **not** upload files **to** Companion, it only handles the third party integrations.
 
 ## Supported providers
 
 As of now, Companion is integrated to work with:
 
-- Google Drive (name `drive`) - [Set up instructions](/docs/google-drive/#Setting-Up)
-- Dropbox (name `dropbox`) - [Set up instructions](/docs/dropbox/#Setting-Up)
-- Box (name `box`) - [Set up instructions](/docs/box/#Setting-Up)
-- Instagram (name `instagram`)
-- Facebook (name `facebook`)
-- OneDrive (name `onedrive`)
-- Remote URLs (name `url`)
-- Amazon S3 (name `s3`)
+* Google Drive (name `drive`) - [Set up instructions](/docs/google-drive/#Setting-Up)
+* Dropbox (name `dropbox`) - [Set up instructions](/docs/dropbox/#Setting-Up)
+* Box (name `box`) - [Set up instructions](/docs/box/#Setting-Up)
+* Instagram (name `instagram`)
+* Facebook (name `facebook`)
+* OneDrive (name `onedrive`)
+* Remote URLs (name `url`)
+* Amazon S3 (name `s3`)
 
 ## Installation
 
@@ -36,19 +38,21 @@ Install from NPM:
 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@2.x`.
+If you dont have a Node.js project with a `package.json` you might want to install/run Companion globally like so: `[sudo] npm install -g @uppy/companion@2.x`.
 
 ### Prerequisite
 
 Since v2, you now need to be running `node.js >= v10.20.1` to use Companion. Please see [Migrating v1 to v2](#Migrating-v1-to-v2)
 
-Unfortunately, Windows is not a supported platform right now. It may work, and we're happy to accept improvements in this area, but we can't provide assistance.
+Unfortunately, Windows is not a supported platform right now. It may work, and we’re happy to accept improvements in this area, but we can’t provide support.
 
 ## Usage
 
-Companion may either be used as a pluggable express app, which you plug into your already existing server, or it may simply be run as a standalone server:
+<!--retext-simplify ignore already-existing-->
+
+Companion may either be used as a pluggable express app, which you plug into your already existing server, or it may also be run as a standalone server:
 
-### Plugging into an already existing server
+### Plugging into an existing server
 
 To plug Companion into an existing server, call its `.app` method, passing in an [options](#Options) object as a parameter. This returns a server instance that you can mount on a subpath in your Express or app.
 
@@ -101,7 +105,7 @@ This takes your `server` instance and [Options](#Options) as parameters.
 
 ### Running as a standalone server
 
-> Please ensure that the required environment variables are set before running/using Companion as a standalone server. See [Configure Standalone](#Configuring-a-standalone-server) for the variables required.
+> Please make sure that the required environment variables are set before running/using Companion as a standalone server. See [Configure Standalone](#Configuring-a-standalone-server) for the variables required.
 
 Set environment variables first:
 
@@ -295,7 +299,7 @@ const options = {
 
 2. **secret(recommended)** - A secret string which Companion uses to generate authorization tokens.
 
-3. **uploadUrls(recommended)** - An allowlist (array) of strings (exact URLs) or regular expressions. If specified, Companion will only accept uploads to these URLs. This is needed to make sure a Companion instance is only allowed to upload to your servers. **Omitting this leaves your system open to potential [SSRF](https://en.wikipedia.org/wiki/Server-side_request_forgery) attacks, and may throw an error in future `@uppy/companion` releases.**
+3. **uploadUrls(recommended)** - An allowlist (array) of strings (exact URLs) or regular expressions. If specified, Companion will only accept uploads to these URLs. This is needed to make sure a Companion instance is only allowed to upload to your servers. **Omitting this leaves your system open to potential [SSRF](https://en.wikipedia.org/wiki/Server-side\_request\_forgery) attacks, and may throw an error in future `@uppy/companion` releases.**
 
 4. **redisUrl(optional)** - URL to running Redis server. If this is set, the state of uploads would be stored temporarily. This helps for resumed uploads after a browser crash from the client. The stored upload would be sent back to the client on reconnection.
 
@@ -303,30 +307,30 @@ const options = {
 
 6. **redisPubSubScope(optional)** - Use a scope for the companion events at the Redis server. Setting this option will prefix all events with the name provided and a colon.
 
-7. **server(optional)** - An object with details, mainly used to carry out oauth authentication from any of the enabled providers above. Though it is optional, it is required if you would be enabling any of the supported providers. The following are the server options you may set:
+7. **server(optional)** - An object with details, mainly used to carry out oauth authentication from any of the enabled providers above. Though it’s optional, it’s required if you would be enabling any of the supported providers. The following are the server options you may set:
 
-  - `protocol` - `http | https`
-  - `host` (required) - your server host (e.g localhost:3020, mydomain.com)
-  - `path` - the server path to where the Uppy app is sitting (e.g if Companion is at `mydomain.com/companion`, then the path would be `/companion`).
-  - `oauthDomain` - if you have multiple instances of Companion with different (and perhaps dynamic) subdomains, you can set a single fixed domain (e.g `sub1.mydomain.com`) to handle your oauth authentication for you. This would then redirect back to the correct instance with the required credentials on completion. This way you only need to configure a single callback URL for OAuth providers.
-  - `validHosts` - if you are setting an `oauthDomain`, you need to set a list of valid hosts, so the oauth handler can validate the host of the Uppy instance requesting the authentication. This is basically a list of valid domains running your Companion instances. The list may also contain regex patterns. e.g `['sub2.mydomain.com', 'sub3.mydomain.com', '(\\w+).mydomain.com']`
-  - `implicitPath` - if the URL path to your Companion server is set in your NGINX server (or any other Http server) instead of your express app, then you need to set this path as `implicitPath`. So if your Companion URL is `mydomain.com/mypath/companion`. Where the path `/mypath` is defined in your NGINX server, while `/companion` is set in your express app. Then you need to set the option `implicitPath` to `/mypath`, and set the `path` option to `/companion`.
+* `protocol` - `http | https`
+* `host` (required) - your server host (e.g localhost:3020, mydomain.com)
+* `path` - the server path to where the Uppy app is sitting (e.g if Companion is at `mydomain.com/companion`, then the path would be `/companion`).
+* `oauthDomain` - if you have several instances of Companion with different (and perhaps dynamic) subdomains, you can set a single fixed domain (e.g `sub1.mydomain.com`) to handle your oauth authentication for you. This would then redirect back to the correct instance with the required credentials on completion. This way you only need to configure a single callback URL for OAuth providers.
+* `validHosts` - if you are setting an `oauthDomain`, you need to set a list of valid hosts, so the oauth handler can validate the host of the Uppy instance requesting the authentication. This is essentially a list of valid domains running your Companion instances. The list may also contain regex patterns. e.g `['sub2.mydomain.com', 'sub3.mydomain.com', '(\\w+).mydomain.com']`
+* `implicitPath` - if the URL path to your Companion server is set in your NGINX server (or any other Http server) instead of your express app, then you need to set this path as `implicitPath`. So if your Companion URL is `mydomain.com/mypath/companion`. Where the path `/mypath` is defined in your NGINX server, while `/companion` is set in your express app. Then you need to set the option `implicitPath` to `/mypath`, and set the `path` option to `/companion`.
 
-8. **sendSelfEndpoint(optional)** - This is basically the same as the `server.host + server.path` attributes. The major reason for this attribute is that, when set, it adds the value as the `i-am` header of every request response.
+8. **sendSelfEndpoint(optional)** - This is essentially the same as the `server.host + server.path` attributes. The major reason for this attribute is that, when set, it adds the value as the `i-am` header of every request response.
 
 9. **providerOptions(optional)** - An object containing credentials (`key` and `secret`) for each provider you would like to enable. Please see [the list of supported providers](#Supported-providers).
 
 10. **customProviders(optional)** - This option enables you to add custom providers along with the already supported providers. See [Adding Custom Providers](#Adding-custom-providers) for more information.
 
-11. **debug(optional)** - A boolean flag to tell Companion whether or not to log useful debug information while running.
+11. **debug(optional)** - A boolean flag to tell Companion whether to log useful debug information while running.
 
-12. **logClientVersion(optional)** - A boolean flag to tell Companion whether or not to log its version upon startup.
+12. **logClientVersion(optional)** - A boolean flag to tell Companion whether to log its version upon startup.
 
-13. **metrics(optional)** - A boolean flag to tell Companion whether or not to provide an endpoint `/metrics` with Prometheus metrics.
+13. **metrics(optional)** - A boolean flag to tell Companion whether to provide an endpoint `/metrics` with Prometheus metrics.
 
 ### Provider Redirect URIs
 
-When generating your provider API keys on their corresponding developer platforms (e.g [Google Developer Console](https://console.developers.google.com/)), you'd need to provide a `redirect URI` for the OAuth authorization process. In general the redirect URI for each provider takes the format:
+When generating your provider API keys on their corresponding developer platforms (e.g [Google Developer Console](https://console.developers.google.com/)), youd need to provide a `redirect URI` for the OAuth authorization process. In general the redirect URI for each provider takes the format:
 
 `http(s)://$YOUR_COMPANION_HOST_NAME/$PROVIDER_NAME/redirect`
 
@@ -362,17 +366,18 @@ The datacenter region where the target bucket is located. The standalone Compani
 
 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 make configuration names consistent between different Companion features.
-- `secretAccessKey`. Instead, use the `providerOptions.s3.secret` property. This is to make configuration names consistent between different Companion features.
+* `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 is to make configuration names consistent between different Companion features.
 
-Be aware that some options may cause wrong behaviour if they conflict with Companion's assumptions. If you find that a particular option does not work as expected, please [open an issue on the Uppy repository](https://github.com/transloadit/uppy/issues/new) so we can document it here.
+Be aware that some options may cause wrong behaviour if they conflict with Companions assumptions. If you find that a particular option does not work as expected, please [open an issue on the Uppy repository](https://github.com/transloadit/uppy/issues/new) so we can document it here.
 
 #### `providerOptions.s3.getKey(req, filename, metadata)`
 
 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`, 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-multipart` plugin;
-- `filename`, the original name of the uploaded file;
-- `metadata`, user-provided metadata for the file. See the [`@uppy/aws-s3`](https://uppy.io/docs/aws-s3/#metaFields) docs. Currently, the `@uppy/aws-s3-multipart` plugin unconditionally sends all metadata fields, so all of them are available here.
+
+* `req`, 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-multipart` plugin;
+* `filename`, the original name of the uploaded file;
+* `metadata`, user-provided metadata for the file. See the [`@uppy/aws-s3`](https://uppy.io/docs/aws-s3/#metaFields) docs. The `@uppy/aws-s3-multipart` plugin unconditionally sends all metadata fields, so they all are available here.
 
 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:
 
@@ -389,6 +394,7 @@ app.use(uppy.app({
 ```
 
 The default implementation returns the `filename`, so all files will be uploaded to the root of the bucket as their original file name.
+
 ```js
 app.use(uppy.app({
   providerOptions: {
@@ -401,7 +407,7 @@ app.use(uppy.app({
 
 ### Running in Kubernetes
 
-We have [a detailed guide on running Companion in Kubernetes](https://github.com/transloadit/uppy/blob/master/packages/%40uppy/companion/KUBERNETES.md) for you, that’s how we currently run our example server at <https://companion.uppy.io>.
+We have [a detailed guide on running Companion in Kubernetes](https://github.com/transloadit/uppy/blob/master/packages/%40uppy/companion/KUBERNETES.md) for you, that’s how we run our example server at <https://companion.uppy.io>.
 
 ### Adding custom providers
 
@@ -433,25 +439,30 @@ The `customProviders` option should be an object containing each custom provider
 
 To work well with Companion, the **Module** must be a class with the following methods.
 
-1. `list (options, done)` - lists JSON data of user files (e.g. list of all the files in a particular directory).
-  - `options` - is an object containing the following attributes
-    - 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 retrieved. This may be ignored if it doesn't apply to your provider
-    - query - expressjs query params object received by the server (just in case there is some data you need in there).
-  - `done (err, data)` - the callback that should be called when the request to your provider is made. As the signature indicates, the following data should be passed along to the callback `err`, and [`data`](#list-data).
+1. `list (options, done)` - lists JSON data of user files (for example list of all the files in a particular directory).
+
+* `options` - is an object containing the following attributes
+  \*   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 retrieved. This may be ignored if it doesn’t apply to your provider
+  \*   query - expressjs query params object received by the server (in case there’s some data you need in there).
+* `done (err, data)` - the callback that should be called when the request to your provider is made. As the signature indicates, the following data should be passed along to the callback `err`, and [`data`](#list-data).
+
 2. `download (options, onData)` - downloads a particular file from the provider.
-  - `options` - is an object containing the following attributes:
-    - 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 (just in case there is some data you need in there).
-  - `onData (err, chunk)` - a callback that should be called with each data chunk received as download is happening. The `err` argument is an error that should be passed if an error occurs during download. It should be `null` if there's no error. Once the download is completed and there are no more chunks to receive, `onData` should be called with `null` values like so `onData(null, null)`
+
+* `options` - is an object containing the following attributes:
+  \*   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 there’s some data you need in there).
+* `onData (err, chunk)` - a callback that should be called with each data chunk received as download is happening. The `err` argument is an error that should be passed if an error occurs during download. It should be `null` if there’s no error. Once the download is completed and no more chunks are to be received, `onData` should be called with `null` values like so `onData(null, null)`
+
 3. `size (options, done)` - returns the byte size of the file that needs to be downloaded.
-  - `options` - is an object containing the following attributes:
-    - token - authorization token (retrieved from oauth process) to send along with your request.
-    - id - ID of the file being downloaded.
-  - `done (err, size)` - the callback that should be called after the request to your provider is completed. As the signature indicates, the following data should be passed along to the callback `err`, and `size` (number).
 
-The class must also have an `authProvider` string (lowercased) field which typically indicates the name of the provider (e.g "dropbox").
+* `options` - is an object containing the following attributes:
+  \*   token - authorization token (retrieved from oauth process) to send along with your request.
+  \*   id - ID of the file being downloaded.
+* `done (err, size)` - the callback that should be called after the request to your provider is completed. As the signature indicates, the following data should be passed along to the callback `err`, and `size` (number).
+
+The class must also have an `authProvider` string (lowercased) field which typically indicates the name of the provider (e.g `"dropbox"`).
 
 #### list data
 
@@ -507,7 +518,7 @@ In v2 the `google` and `microsoft` [providerOptions](https://uppy.io/docs/compan
 
 ### OAuth Redirect URIs
 
-On your Providers' respective developer platforms, the OAuth redirect URIs that you should supply has now changed from:
+On your Providers respective developer platforms, the OAuth redirect URIs that you should supply has now changed from:
 
 `http(s)://$COMPANION_HOST_NAME/connect/$AUTH_PROVIDER/callback` in v1
 
@@ -557,21 +568,20 @@ This would get the Companion instance running on `http://localhost:3020`. It use
 
 An example server is running at <https://companion.uppy.io>, which is deployed with [Kubernetes](https://github.com/transloadit/uppy/blob/master/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.
 
 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!

+ 30 - 30
website/src/docs/dashboard.md

@@ -10,12 +10,12 @@ tagline: "full-featured sleek UI with file previews, metadata editing, upload/pa
 
 `@uppy/dashboard` is a universal UI plugin for Uppy, offering several useful features:
 
-- Drag and drop, paste, select from local disk / my device
-- UI for the Webcam plugin and remote sources, such as Google Drive, Dropbox, Instagram, Facebook and OneDrive (all optional, added via plugins)
-- Image previews
-- Metadata editor
-- Upload progress
-- Ability to pause or cancel (depending on the uploader plugin) uploads
+* Drag and drop, paste, select from local disk / my device
+* UI for the Webcam plugin and remote sources, such as Google Drive, Dropbox, Instagram, Facebook and OneDrive (all optional, added via plugins)
+* Image previews
+* Metadata editor
+* Upload progress
+* Ability to pause or cancel (depending on the uploader plugin) uploads
 
 ```js
 import Dashboard from '@uppy/dashboard'
@@ -37,7 +37,7 @@ Install from NPM:
 npm install @uppy/dashboard
 ```
 
-In the [CDN package](/docs/#With-a-script-tag), it is available on the `Uppy` global object:
+In the [CDN package](/docs/#With-a-script-tag), the plugin class is available on the `Uppy` global object:
 
 ```js
 const { Dashboard } = Uppy
@@ -106,12 +106,12 @@ uppy.use(Dashboard, {
 
 ### `id: 'Dashboard'`
 
-A unique identifier for this plugin. It defaults to `'Dashboard'`, but you can change this if you need multiple Dashboard instances.
+A unique identifier for this plugin. It defaults to `'Dashboard'`, but you can change this if you need several Dashboard instances.
 Plugins that are added by the Dashboard get unique IDs based on this ID, like `'Dashboard:StatusBar'` and `'Dashboard:Informer'`.
 
 ### `target: 'body'`
 
-Dashboard is rendered into `body`, because it is hidden by default and only opened as a modal when `trigger` is clicked.
+Dashboard is rendered into `body`, because its hidden by default and only opened as a modal when `trigger` is clicked.
 
 ### `inline: false`
 
@@ -119,11 +119,11 @@ By default, Dashboard will be rendered as a modal, which is opened by clicking o
 
 ### `trigger: null`
 
-String with a CSS selector for a button that will trigger opening the Dashboard modal. Multiple buttons or links can be used, as long as it is a class selector (`.select-file-button`, for example).
+String with a CSS selector for a button that will trigger opening the Dashboard modal. Several buttons or links can be used, as long as they are selected using a class selector (`.select-file-button`, for example).
 
 ### `plugins: []`
 
-List of plugin IDs that should be shown in the Dashboard's top bar. For example, to show the Webcam plugin:
+List of plugin IDs that should be shown in the Dashboards top bar. For example, to show the Webcam plugin:
 
 ```js
 uppy.use(Webcam)
@@ -132,7 +132,7 @@ uppy.use(Dashboard, {
 })
 ```
 
-Of course, you can also use the `target` option in the Webcam plugin to achieve this. However, that does not work with the React components. The `target` option may be changed in the future to only accept DOM elements, so it is recommended to use this `plugins` array instead.
+You could also use the `target` option in the Webcam plugin to achieve this, but that does not work with the React components. The `target` option may be changed in the future to only accept DOM elements, so its recommended to use this `plugins` array instead.
 
 ### `width: 750`
 
@@ -156,7 +156,7 @@ Turn the file icon and thumbnail in the Dashboard into a link to the uploaded fi
 
 Passed to the Status Bar plugin used in the Dashboard.
 
-By default, progress in Status Bar is shown as a simple percentage. If you would like to also display remaining upload size and time, set this to `true`.
+By default, progress in Status Bar is shown as a percentage. If you would like to also display remaining upload size and time, set this to `true`.
 
 `showProgressDetails: false`: Uploading: 45%
 `showProgressDetails: true`: Uploading: 45%・43 MB of 101 MB・8s left
@@ -204,7 +204,7 @@ Set to `null` to disable the “Done” button.
 
 ### `showSelectedFiles: true`
 
-Show the list (grid) of selected files with preview and file name. In case you are showing selected files in your own app’s UI and want the Uppy Dashboard to just be a picker, the list can be hidden with this option.
+Show the list (grid) of selected files with preview and file name. In case you are showing selected files in your own app’s UI and want the Uppy Dashboard to only be a picker, the list can be hidden with this option.
 
 See also `disableStatusBar` option, which can hide the progress and upload button.
 
@@ -230,12 +230,12 @@ Optionally, specify a string of text that explains something about the upload fo
 
 An array of UI field objects, or a function that takes a [File Object](https://uppy.io/docs/uppy/#File-Objects) and returns an array of UI field objects, that will be shown when a user clicks the “edit” button on that file. Configuring this enables the “edit” button on file cards. Each object requires:
 
-- `id`, the name of the meta field. Note: this will also be used in CSS/HTML as part of the `id` attribute, so it’s better to [avoid using characters like periods, semicolons, etc](https://stackoverflow.com/a/79022).
-- `name`, the label shown in the interface.
-- `placeholder`, the text shown when no value is set in the field. (Not needed when a custom render function is provided)
+* `id`, the name of the meta field. Note: this will also be used in CSS/HTML as part of the `id` attribute, so it’s better to [avoid using characters like periods, semicolons, etc](https://stackoverflow.com/a/79022).
+* `name`, the label shown in the interface.
+* `placeholder`, the text shown when no value is set in the field. (Not needed when a custom render function is provided)
 
 Optionally, you can specify `render: ({value, onChange, required, form}, h) => void`, a function for rendering a custom form element.
-It gets passed `({value, onChange, required, form}, h)` where `value` is the current value of the meta field, `required` is a boolean that's true if the field `id` is in the `restrictedMetaFields` restriction, `form` is the `id` of the associated `<form>` element, and `onChange: (newVal) => void` is a function saving the new value and `h` is the `createElement` function from [preact](https://preactjs.com/guide/v10/api-reference#h--createelement).
+It gets passed `({value, onChange, required, form}, h)` where `value` is the current value of the meta field, `required` is a boolean thats true if the field `id` is in the `restrictedMetaFields` restriction, `form` is the `id` of the associated `<form>` element, and `onChange: (newVal) => void` is a function saving the new value and `h` is the `createElement` function from [preact](https://preactjs.com/guide/v10/api-reference#h--createelement).
 `h` can be useful when using uppy from plain JavaScript, where you cannot write JSX.
 
 ```js
@@ -287,7 +287,7 @@ uppy.use(Dashboard, {
 
 ![](/images/uppy-dashboard-meta-fields.jpg)
 
-Note that this metadata will only be set on a file object if it is entered by the user. If the user doesn't edit a file's metadata, it will not have default values; instead everything will be `undefined`. If you want to set a certain meta field to each file regardless of user actions, set [`meta` in the Uppy constructor options](/docs/uppy/#meta).
+Note that this metadata will only be set on a file object if it’s entered by the user. If the user doesn’t edit a file’s metadata, it will not have default values; instead everything will be `undefined`. If you want to set a certain meta field to each file regardless of user actions, set [`meta` in the Uppy constructor options](/docs/uppy/#meta).
 
 ### `closeModalOnClickOutside: false`
 
@@ -299,7 +299,7 @@ Set to true to automatically close the modal when all current uploads are comple
 
 With this option, the modal is only automatically closed when uploads are complete _and successful_. If some uploads failed, the modal stays open so the user can retry failed uploads or cancel the current batch and upload an entirely different set of files instead.
 
-> Setting [`allowMultipleUploads: false`](/docs/uppy#allowMultipleUploads-true) is **strongly** recommended when using this option. With multiple upload batches, the auto-closing behavior can be very confusing for users.
+> Setting [`allowMultipleUploads: false`](/docs/uppy#allowMultipleUploads-true) is **strongly** recommended when using this option. With several upload batches, the auto-closing behavior can be quite confusing for users.
 
 ### `disablePageScrollWhenModalOpen: true`
 
@@ -311,13 +311,13 @@ Add light animations when the modal dialog is opened or closed, for a more satis
 
 ### `fileManagerSelectionType: 'files'`
 
-Configure the type of selections allowed when browsing your file system via the file manager selection window. May be either 'files', 'folders', or 'both'. Selecting entire folders for upload may not be supported on all [browsers](https://caniuse.com/#feat=input-file-directory).
+Configure the type of selections allowed when browsing your file system via the file manager selection window. May be either `'files'`, `'folders'`, or `'both'`. Selecting entire folders for upload may not be supported on all [browsers](https://caniuse.com/#feat=input-file-directory).
 
 ### `proudlyDisplayPoweredByUppy: true`
 
 Uppy is provided to the world for free by the team behind [Transloadit](https://transloadit.com). In return, we ask that you consider keeping a tiny Uppy logo at the bottom of the Dashboard, so that more people can discover and use Uppy.
 
-This is, of course, entirely optional. Just set this option to false if you do not wish to display the Uppy logo.
+Set this option to `false` if you do not wish to display the Uppy logo.
 
 ### `disableStatusBar: false`
 
@@ -325,7 +325,7 @@ Dashboard ships with the `StatusBar` plugin that shows upload progress and pause
 
 ### `disableInformer: false`
 
-Dashboard ships with the `Informer` plugin that notifies when the browser is offline, or when it is time to say cheese if `Webcam` is taking a picture. If you want, you can disable the Informer and/or provide your own custom solution.
+Dashboard ships with the `Informer` plugin that notifies when the browser is offline, or when its time to say cheese if `Webcam` is taking a picture. If you want, you can disable the Informer and/or provide your own custom solution.
 
 ### `disableThumbnailGenerator: false`
 
@@ -335,7 +335,7 @@ Dashboard ships with the `ThumbnailGenerator` plugin that adds small resized ima
 
 Localize text that is shown to the user.
 
-The Dashboard also contains the [`@uppy/status-bar`](/docs/status-bar) plugin by default, which has its own strings. Strings for the Status Bar can also be specified in the Dashboard `locale.strings` option, and will be passed down. They are not all listed below—see the [`@uppy/status-bar`](/docs/status-bar) documentation pages for the full list.
+The Dashboard also includes the [`@uppy/status-bar`](/docs/status-bar) plugin by default, which has its own strings. Strings for the Status Bar can also be specified in the Dashboard `locale.strings` option, and will be passed down. They are not all listed below—see the [`@uppy/status-bar`](/docs/status-bar) documentation pages for the full list.
 
 The default English strings are:
 
@@ -437,11 +437,11 @@ const strings = {
 
 Uppy Dashboard supports “Dark Mode”. You can try it live on [the Dashboard example page](https://uppy.io/examples/dashboard/).
 
-There are three options:
+It supports the following values:
 
-- `light` — the default
-- `dark`
-- `auto` — will respect the user’s system settings and switch automatically
+* `light` — the default
+* `dark`
+* `auto` — will respect the user’s system settings and switch automatically
 
 ![Uppy dark mode screenshot](/images/uppy-dashboard-dark-mar-2020.png)
 
@@ -515,7 +515,7 @@ Fired when the Dashboard modal is closed.
 
 **Parameters:**
 
-- `file` — The [File Object](https://uppy.io/docs/uppy/#File-Objects) representing the file that was opened for editing.
+* `file` — The [File Object](https://uppy.io/docs/uppy/#File-Objects) representing the file that was opened for editing.
 
 Fired when the user clicks “edit” icon next to a file in the Dashboard. The FileCard panel is then open with file metadata available for editing.
 
@@ -523,6 +523,6 @@ Fired when the user clicks “edit” icon next to a file in the Dashboard. The
 
 **Parameters:**
 
-- `file` — The [File Object](https://uppy.io/docs/uppy/#File-Objects) representing the file that was edited.
+* `file` — The [File Object](https://uppy.io/docs/uppy/#File-Objects) representing the file that was edited.
 
 Fired when the user finished editing the file metadata.

+ 6 - 4
website/src/docs/dragdrop.md

@@ -9,7 +9,7 @@ category: "Sources"
 tagline: "plain and simple drag-and-drop area"
 ---
 
-The `@uppy/drag-drop` plugin renders a simple drag and drop area for file selection. it can be useful when you only want the local device as a file source, don’t need file previews and a UI for metadata editing, and the [Dashboard](/docs/dashboard/) feels like overkill.
+The `@uppy/drag-drop` plugin renders a drag and drop area for file selection. it can be useful when you only want the local device as a file source, don’t need file previews and a UI for metadata editing, and the [Dashboard](/docs/dashboard/) feels like overkill.
 
 ```js
 import DragDrop from '@uppy/drag-drop'
@@ -31,7 +31,7 @@ Install from NPM:
 npm install @uppy/drag-drop
 ```
 
-In the [CDN package](/docs/#With-a-script-tag), it is available on the `Uppy` global object:
+In the [CDN package](/docs/#With-a-script-tag), the plugin class is available on the `Uppy` global object:
 
 ```js
 const { DragDrop } = Uppy
@@ -39,7 +39,7 @@ const { DragDrop } = Uppy
 
 ## CSS
 
-The `@uppy/drag-drop` plugin includes some simple styles, like shown in the [example](/examples/dragdrop). You can also choose not to use it and provide your own styles instead.
+The `@uppy/drag-drop` plugin includes some basi c styles, like shown in the [example](/examples/dragdrop). You can also choose not to use it and provide your own styles instead.
 
 ```js
 import '@uppy/core/dist/style.css'
@@ -66,7 +66,7 @@ uppy.use(DragDrop, {
 
 ### `id: 'DragDrop'`
 
-A unique identifier for this plugin. It defaults to `'DragDrop'`. Use this if you need to add multiple DragDrop instances.
+A unique identifier for this plugin. It defaults to `'DragDrop'`. Use this if you need to add several DragDrop instances.
 
 ### `target: null`
 
@@ -115,5 +115,7 @@ const strings = {
 <!-- definitions -->
 
 [ondragover]: https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/ondragover
+
 [ondragleave]: https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/ondragleave
+
 [ondrop]: https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/ondrop

+ 4 - 2
website/src/docs/drop-target.md

@@ -33,7 +33,7 @@ Install from NPM:
 npm install @uppy/drop-target
 ```
 
-In the [CDN package](/docs/#With-a-script-tag), it is available on the `Uppy` global object:
+In the [CDN package](/docs/#With-a-script-tag), the plugin class is available on the `Uppy` global object:
 
 ```js
 const DragDrop = Uppy.DropTarget
@@ -41,7 +41,7 @@ const DragDrop = Uppy.DropTarget
 
 ## CSS
 
-The `@uppy/drop-target` plugin includes some simple styles for `uppy-is-drag-over` CSS class name. You can also choose not to use it and provide your own styles instead.
+The `@uppy/drop-target` plugin includes some basic styles for `uppy-is-drag-over` CSS class name. You can also choose not to use it and provide your own styles instead.
 
 ```js
 import '@uppy/core/dist/style.css'
@@ -82,5 +82,7 @@ Callback for the [`ondragleave`][ondragleave] event handler.
 <!-- definitions -->
 
 [ondragover]: https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/ondragover
+
 [ondragleave]: https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/ondragleave
+
 [ondrop]: https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/ondrop

+ 12 - 10
website/src/docs/dropbox.md

@@ -33,7 +33,7 @@ Install from NPM:
 npm install @uppy/dropbox
 ```
 
-In the [CDN package](/docs/#With-a-script-tag), it is available on the `Uppy` global object:
+In the [CDN package](/docs/#With-a-script-tag), the plugin class is available on the `Uppy` global object:
 
 ```js
 const { Dropbox } = Uppy
@@ -42,12 +42,14 @@ const { Dropbox } = Uppy
 ## Setting Up
 
 To use the Dropbox provider, you need to configure the Dropbox keys that Companion should use. With the standalone Companion server, specify environment variables:
+
 ```shell
 export COMPANION_DROPBOX_KEY="Dropbox API key"
 export COMPANION_DROPBOX_SECRET="Dropbox API secret"
 ```
 
 When using the Companion Node.js API, configure these options:
+
 ```js
 companion.app({
   providerOptions: {
@@ -62,15 +64,15 @@ companion.app({
 You can create a Dropbox App on the [Dropbox Developers site](https://www.dropbox.com/developers/apps/create).
 
 Things to note:
-- Choose the "Dropbox API", not the business variant.
-- Typically you'll want "Full Dropbox" access, unless you are very certain that you need the other one.
 
-You'll be redirected to the app page. This page lists the app key and app secret, which you should use to configure Companion as shown above.
+* Choose the “Dropbox API”, not the business variant.
+* Typically you’ll want “Full Dropbox” access, unless you are absolutely certain that you need the other one.
 
-The app page has a "Redirect URIs" field. Here, add:
-```
-https://$YOUR_COMPANION_HOST_NAME/dropbox/redirect
-```
+You’ll be redirected to the app page. This page lists the app key and app secret, which you should use to configure Companion as shown above.
+
+The app page has a “Redirect URIs” field. Here, add:
+
+    https://$YOUR_COMPANION_HOST_NAME/dropbox/redirect
 
 You can only use the integration with your own account initially—make sure to apply for production status on the app page before you publish your app, or your users will not be able to sign in!
 
@@ -117,11 +119,11 @@ The valid and authorised URL(s) from which OAuth responses should be accepted.
 
 This value can be a `String`, a `Regex` pattern, or an `Array` of both.
 
-This is useful when you have your [Companion](/docs/companion) running on multiple hosts. Otherwise, the default value should do just fine.
+This is useful when you have your [Companion](/docs/companion) running on several hosts. Otherwise, the default value should do fine.
 
 ### `companionCookiesRule: 'same-origin'`
 
-This option correlates to the [RequestCredentials value](https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials), which tells the plugin whether or not to send cookies to [Companion](/docs/companion).
+This option correlates to the [RequestCredentials value](https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials), which tells the plugin whether to send cookies to [Companion](/docs/companion).
 
 ### `locale: {}`
 

+ 2 - 2
website/src/docs/facebook.md

@@ -78,11 +78,11 @@ The valid and authorized URL(s) from which OAuth responses should be accepted.
 
 This value can be a `String`, a `Regex` pattern, or an `Array` of both.
 
-This is useful when you have your [Companion](/docs/companion) running on multiple hosts. Otherwise, the default value should be good enough.
+This is useful when you have your [Companion](/docs/companion) running on several hosts. Otherwise, the default value should be good enough.
 
 ### `companionCookiesRule: 'same-origin'`
 
-This option correlates to the [RequestCredentials value](https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials), which tells the plugin whether or not to send cookies to [Companion](/docs/companion).
+This option correlates to the [RequestCredentials value](https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials), which tells the plugin whether to send cookies to [Companion](/docs/companion).
 
 ### `locale: {}`
 

+ 3 - 3
website/src/docs/fileinput.md

@@ -33,7 +33,7 @@ Install from NPM:
 npm install @uppy/file-input
 ```
 
-In the [CDN package](/docs/#With-a-script-tag), it is available on the `Uppy` global object:
+In the [CDN package](/docs/#With-a-script-tag), the plugin class is available on the `Uppy` global object:
 
 ```js
 const { FileInput } = Uppy
@@ -41,7 +41,7 @@ const { FileInput } = Uppy
 
 ## CSS
 
-The `@uppy/file-input` plugin includes some simple styles for use with the [`pretty`](#pretty-true) option, like shown in the [example](/examples/xhrupload). You can also choose not to use it and provide your own styles instead.
+The `@uppy/file-input` plugin includes some basic styles for use with the [`pretty`](#pretty-true) option, like shown in the [example](/examples/xhrupload). You can also choose not to use it and provide your own styles instead.
 
 ```js
 import '@uppy/core/dist/style.css'
@@ -68,7 +68,7 @@ uppy.use(FileInput, {
 
 ### `id: 'FileInput'`
 
-A unique identifier for this plugin. It defaults to `'FileInput'`. Use this if you need to add multiple FileInput instances.
+A unique identifier for this plugin. It defaults to `'FileInput'`. Use this if you need to add several `FileInput` instances.
 
 ### `target: null`
 

+ 9 - 9
website/src/docs/form.md

@@ -10,8 +10,8 @@ tagline: "collect metadata from <code>&lt;form&gt;</code> right before the Uppy
 
 The `@uppy/form` plugin has several features to integrate with HTML `<form>` elements.
 
-- It collects user-specified metadata from form fields, right before Uppy begins uploading/processing files.
-- It can append upload results back to the form as a hidden field. Currently the appended result is a stringified version of a [`result`](/docs/uppy/#uppy-upload) returned from `uppy.upload()` or `complete` event.
+* It collects user-specified metadata from form fields, right before Uppy begins uploading/processing files.
+* It can append upload results back to the form as a hidden field. The appended result is a stringified version of a [`result`](/docs/uppy/#uppy-upload) returned from `uppy.upload()` or `complete` event.
 
 ```js
 import Form from '@uppy/form'
@@ -31,7 +31,7 @@ Install from NPM:
 npm install @uppy/form
 ```
 
-In the [CDN package](/docs/#With-a-script-tag), it is available on the `Uppy` global object:
+In the [CDN package](/docs/#With-a-script-tag), the plugin class is available on the `Uppy` global object:
 
 ```js
 const { Form } = Uppy
@@ -66,19 +66,19 @@ The `name` attribute for the `<input type="hidden">` where the result will be ad
 
 ### `getMetaFromForm: true`
 
-Configures whether or not to extract metadata from the form. When set to true, the `Form` plugin will extract all fields from a `<form>` element before upload begins. Those fields will then be added to global `uppy.state.meta` and each file’s meta, and appended as (meta)data to the upload in an object with `[file input name attribute]` -> `[file input value]` key/values.
+Configures whether to extract metadata from the form. When set to true, the `Form` plugin will extract all fields from a `<form>` element before upload begins. Those fields will then be added to global `uppy.state.meta` and each file’s meta, and appended as (meta)data to the upload in an object with `[file input name attribute]` -> `[file input value]` key/values.
 
 ### `addResultToForm: true`
 
-Configures whether or not to add upload/encoding results back to the form in an `<input name="uppyResult" type="hidden">` element.
+Configures whether to add upload/encoding results back to the form in an `<input name="uppyResult" type="hidden">` element.
 
 ### `triggerUploadOnSubmit: false`
 
-Configures whether or not to start the upload when the form is submitted. When the user presses a submit button, this will prevent form submission, and instead upload files. You can then:
+Configures whether to start the upload when the form is submitted. When the user presses a submit button, this will prevent form submission, and instead upload files. You can then:
 
-- use `submitOnSuccess: true` if you need the form to _actually_ be submitted once all files have been uploaded.
-- listen for `uppy.on('complete')` to do something else if the file uploads are all you need. For example, if the form is used for file metadata only.
+* use `submitOnSuccess: true` if you need the form to _actually_ be submitted once all files have been uploaded.
+* listen for `uppy.on('complete')` to do something else if the file uploads are all you need. For example, if the form is used for file metadata only.
 
 ### `submitOnSuccess: false`
 
-Configures whether or not to submit the form after Uppy finishes uploading/encoding.
+Configures whether to submit the form after Uppy finishes uploading/encoding.

+ 3 - 3
website/src/docs/golden-retriever.md

@@ -10,7 +10,7 @@ tagline: "restore files and continue uploading after a page refresh or a browser
 
 The `@uppy/golden-retriever` plugin saves selected files in your browser cache, so that if the browser crashes, Uppy can restore everything and continue uploading as if nothing happened. You can read more about it [on our blog](https://uppy.io/blog/2017/07/golden-retriever/).
 
-The Golden Retriever uses LocalStorage to store file metadata and Uppy state, and IndexedDB for small files. It also uses a Service Worker for _all_ files because, unlike IndexedDB, a Service Worker can keep very large files. Service Worker storage is _very_ temporary though, and doesn't persist across browser crashes or restarts. It works very well, however, for accidental refreshes or closed tabs.
+The Golden Retriever uses LocalStorage to store file metadata and Uppy state, and IndexedDB for small files. It also uses a Service Worker for _all_ files because, unlike IndexedDB, a Service Worker can keep large files. Service Worker storage is _quite_ temporary though, and doesn’t persist across browser crashes or restarts. It works well, however, for accidental refreshes or closed tabs.
 
 ## Installation
 
@@ -22,7 +22,7 @@ Install from NPM:
 npm install @uppy/golden-retriever
 ```
 
-In the [CDN package](/docs/#With-a-script-tag), it is available on the `Uppy` global object:
+In the [CDN package](/docs/#With-a-script-tag), the plugin class is available on the `Uppy` global object:
 
 ```js
 const { GoldenRetriever } = Uppy
@@ -30,7 +30,7 @@ const { GoldenRetriever } = Uppy
 
 ## Usage
 
-1\. Bundle your own service worker `sw.js` file with Uppy GoldenRetriever’s service worker. If you are using Browserify, just bundle it separately. For Webpack, there is a plugin [serviceworker-webpack-plugin](https://github.com/oliviertassinari/serviceworker-webpack-plugin).
+1\. Bundle your own service worker `sw.js` file with Uppy GoldenRetriever’s service worker. If you are using Browserify, bundle it separately. For Webpack, check out [serviceworker-webpack-plugin](https://github.com/oliviertassinari/serviceworker-webpack-plugin).
 
 ```js
 // sw.js

+ 10 - 9
website/src/docs/google-drive.md

@@ -33,7 +33,7 @@ Install from NPM:
 npm install @uppy/google-drive
 ```
 
-In the [CDN package](/docs/#With-a-script-tag), it is available on the `Uppy` global object:
+In the [CDN package](/docs/#With-a-script-tag), the plugin class is available on the `Uppy` global object:
 
 ```js
 const { GoogleDrive } = Uppy
@@ -42,12 +42,14 @@ const { GoogleDrive } = Uppy
 ## Setting  Up
 
 To use the Google Drive provider, you need to configure the Google Drive keys that Companion should use. With the standalone Companion server, specify environment variables:
+
 ```shell
 export COMPANION_GOOGLE_KEY="Google Drive OAuth client ID"
 export COMPANION_GOOGLE_SECRET="Google Drive OAuth client secret"
 ```
 
 When using the Companion Node.js API, configure these options:
+
 ```js
 companion.app({
   providerOptions: {
@@ -61,12 +63,11 @@ companion.app({
 
 To sign up for API keys, go to the [Google Developer Console](https://console.developers.google.com/).
 
-Create a project for your app if you don't have one yet.
-- On the project's dashboard, [enable the Google Drive API](https://developers.google.com/drive/api/v3/enable-drive-api).
-- [Set up OAuth authorization](https://developers.google.com/drive/api/v3/about-auth). Use this for an authorized redirect URI:
-   ```
-   https://$YOUR_COMPANION_HOST_NAME/drive/redirect
-   ```
+Create a project for your app if you don’t have one yet.
+
+* On the project’s dashboard, [enable the Google Drive API](https://developers.google.com/drive/api/v3/enable-drive-api).
+* [Set up OAuth authorization](https://developers.google.com/drive/api/v3/about-auth). Use this for an authorized redirect URI:
+  https://$YOUR\_COMPANION\_HOST\_NAME/drive/redirect
 
 Google will give you an OAuth client ID and client secret. Use them to configure Companion as shown above.
 
@@ -113,11 +114,11 @@ The valid and authorised URL(s) from which OAuth responses should be accepted.
 
 This value can be a `String`, a `Regex` pattern, or an `Array` of both.
 
-This is useful when you have your [Companion](/docs/companion) running on multiple hosts. Otherwise, the default value should be good enough.
+This is useful when you have your [Companion](/docs/companion) running on several hosts. Otherwise, the default value should be good enough.
 
 ### `companionCookiesRule: 'same-origin'`
 
-This option correlates to the [RequestCredentials value](https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials), which tells the plugin whether or not to send cookies to [Companion](/docs/companion).
+This option correlates to the [RequestCredentials value](https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials), which tells the plugin whether    to send cookies to [Companion](/docs/companion).
 
 ### `locale: {}`
 

+ 19 - 20
website/src/docs/index.md

@@ -7,7 +7,7 @@ order: 0
 category: "Docs"
 ---
 
-Uppy is a sleek and modular file uploader. It fetches files from local disk, Google Drive, Instagram, remote urls, cameras etc, and then uploads them to the final destination. It’s fast, easy to use and lets you worry about more important problems than building a file uploader.
+Uppy is a sleek and modular file uploader. It fetches files from local disk, Google Drive, Instagram, remote urls, cameras etc, and then uploads them to the final destination. It’s fast, has a comprehensible API and lets you worry about more important problems than building a file uploader.
 
 Uppy consists of a core module and [various plugins](/docs/plugins/) for selecting, manipulating and uploading files.
 
@@ -43,7 +43,7 @@ Here’s the simplest example html page with Uppy (it uses a CDN bundle, while w
 
 <a class="TryButton" href="/examples/dashboard/">Try it live</a>
 
-Drag and drop, webcam, basic file manipulation (adding metadata), uploading via tus-resumable uploads or XHR/Multipart is all possible using just the Uppy client module.
+Drag and drop, webcam, basic file manipulation (adding metadata), uploading via tus-resumable uploads or XHR/Multipart is all possible using the Uppy client module.
 
 Adding [Companion](/docs/companion/) to the mix enables remote sources such as Instagram, Google Drive, Dropbox, and remote URLs. Uploads from remote sources are handled server-to-server, so a 5 GB video won’t be eating into your mobile data plan. Files are removed from Companion after an upload is complete, or after a reasonable timeout. Access tokens also don’t stick around for long, for security reasons.
 
@@ -57,7 +57,7 @@ Uppy can be used with a module bundler such as [Webpack](http://webpack.js.org/)
 
 Install the `@uppy/core` package from npm:
 
-``` bash
+```bash
 $ npm install @uppy/core
 ```
 
@@ -89,9 +89,9 @@ uppy.on('complete', (result) => {
 })
 ```
 
-Many plugins include a CSS file for the necessary styles in their `dist/` folder. The plugin documentation pages will tell you which to use and when. When using multiple plugin CSS files, some code is duplicated. A CSS minifier like [clean-css](https://www.npmjs.com/package/clean-css) is recommended to remove the duplicate selectors.
+Many plugins include a CSS file for the necessary styles in their `dist/` folder. The plugin documentation pages will tell you which to use and when. When using several plugin CSS files, some code is duplicated. A CSS minifier like [clean-css](https://www.npmjs.com/package/clean-css) is recommended to remove the duplicate selectors.
 
-You can also use the combined `uppy` package, which includes all plugins that are maintained by the Uppy team. Only use it if you have tree-shaking set up in your module bundler, otherwise you may end up sending a lot of unused code to your users.
+You can also use the joint `uppy` package, which includes all plugins that are maintained by the Uppy team. Only use it if you have tree-shaking set up in your module bundler, otherwise you may end up sending a lot of unused code to your users.
 
 ```bash
 $ npm install uppy
@@ -107,28 +107,29 @@ And add the `uppy/dist/uppy.min.css` file to your page.
 
 #### SCSS
 
-If you are using SCSS in your project, you can include the Uppy SCSS source files, instead of using our prebuilt CSS. Uppy's SCSS files do assume Node.js-style resolution for `@import`s, so you may need to [configure a resolver](https://github.com/transloadit/uppy/issues/2296#issuecomment-640649513).
+If you are using SCSS in your project, you can include the Uppy SCSS source files, instead of using our prebuilt CSS. Uppys SCSS files do assume Node.js-style resolution for `@import`s, so you may need to [configure a resolver](https://github.com/transloadit/uppy/issues/2296#issuecomment-640649513).
 
 ### With a script tag
 
-You can also use a pre-built bundle from Transloadit's CDN: Edgly. `Uppy` will attach itself to the global `window.Uppy` object.
+You can also use a pre-built bundle from Transloadits CDN: Edgly. `Uppy` will attach itself to the global `window.Uppy` object.
 
-> ⚠️ The bundle consists of all plugins maintained by the Uppy team. This method is therefore not recommended for production, as your users will have to download all plugins, even if you are only using a few of them.
+> ⚠️ The bundle consists of all plugins maintained by the Uppy team. This method is thus not recommended for production, as your users will have to download all plugins, even if you are only using a few of them.
 
 1\. Add a script at the bottom of the closing `</body>` tag:
 
-``` html
+```html
 <script src="https://releases.transloadit.com/uppy/v2.2.0/uppy.min.js"></script>
 ```
 
 2\. Add CSS to `<head>`:
-``` html
+
+```html
 <link href="https://releases.transloadit.com/uppy/v2.2.0/uppy.min.css" rel="stylesheet">
 ```
 
 3\. Initialize at the bottom of the closing `</body>` tag:
 
-``` html
+```html
 <script>
   var uppy = new Uppy.Core()
   uppy.use(Uppy.DragDrop, { target: '#drag-drop-area' })
@@ -138,11 +139,11 @@ You can also use a pre-built bundle from Transloadit's CDN: Edgly. `Uppy` will a
 
 ## Documentation
 
-- [Uppy](/docs/uppy/) — full list of options, methods and events.
-- [Plugins](/docs/plugins/) — list of Uppy plugins and their options.
-- [Server](/docs/companion/) — setting up and running a Companion instance, which adds support for Instagram, Dropbox, Google Drive, direct links, and other remote sources.
-- [React](/docs/react/) — components to integrate Uppy UI plugins with React apps.
-- [Writing Plugins](/docs/writing-plugins) — how to write a plugin for Uppy (documentation in progress).
+* [Uppy](/docs/uppy/) — full list of options, methods and events.
+* [Plugins](/docs/plugins/) — list of Uppy plugins and their options.
+* [Server](/docs/companion/) — setting up and running a Companion instance, which adds support for Instagram, Dropbox, Google Drive, direct links, and other remote sources.
+* [React](/docs/react/) — components to integrate Uppy UI plugins with React apps.
+* [Writing Plugins](/docs/writing-plugins) — how to write a plugin for Uppy (documentation in progress).
 
 ## Browser Support
 
@@ -150,9 +151,7 @@ You can also use a pre-built bundle from Transloadit's CDN: Edgly. `Uppy` will a
   <img src="https://saucelabs.com/browser-matrix/transloadit-uppy.svg" alt="Sauce Test Status"/>
 </a>
 
-We currently aim to support IE11+ and recent versions of Safari, Edge, Chrome, Firefox and Opera.
-
-We still run end to end tests with IE10, but we are not actively supporting it or fixing visual / minor issues.
+We aim to support recent versions of Safari, Chrome, Firefox, and Opera.
 
 ### Polyfills
 
@@ -181,7 +180,7 @@ export { default } from '@uppy/core'
 export * from '@uppy/core'
 ```
 
-If you're using Uppy from CDN, those polyfills are already included in the bundle, no need to include anything additionally:
+If youre using Uppy from CDN, those polyfills are already included in the bundle, no need to include anything additionally:
 
 ```html
 <script src="https://releases.transloadit.com/uppy/v2.2.0/uppy.min.js"></script>

+ 2 - 2
website/src/docs/informer.md

@@ -36,7 +36,7 @@ Install from NPM:
 npm install @uppy/informer
 ```
 
-In the [CDN package](/docs/#With-a-script-tag), it is available on the `Uppy` global object:
+In the [CDN package](/docs/#With-a-script-tag), the plugin class is available on the `Uppy` global object:
 
 ```js
 const { Informer } = Uppy
@@ -61,7 +61,7 @@ The `@uppy/informer` plugin has the following configurable options:
 
 ### `id: 'Informer'`
 
-A unique identifier for this plugin. It defaults to `'Informer'`. Use this if you need multiple Informer instances.
+A unique identifier for this plugin. It defaults to `'Informer'`. Use this if you need several `Informer` instances.
 
 ### `target: null`
 

+ 3 - 3
website/src/docs/instagram.md

@@ -35,7 +35,7 @@ Install from NPM:
 npm install @uppy/instagram
 ```
 
-In the [CDN package](/docs/#With-a-script-tag), it is available on the `Uppy` global object:
+In the [CDN package](/docs/#With-a-script-tag), the plugin class is available on the `Uppy` global object:
 
 ```js
 const { Instagram } = Uppy
@@ -84,11 +84,11 @@ The valid and authorised URL(s) from which OAuth responses should be accepted.
 
 This value can be a `String`, a `Regex` pattern, or an `Array` of both.
 
-This is useful when you have your [Companion](/docs/companion) running on multiple hosts. Otherwise, the default value should be good enough.
+This is useful when you have your [Companion](/docs/companion) running on several hosts. Otherwise, the default value should be good enough.
 
 ### `companionCookiesRule: 'same-origin'`
 
-This option correlates to the [RequestCredentials value](https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials), which tells the plugin whether or not to send cookies to [Companion](/docs/companion).
+This option correlates to the [RequestCredentials value](https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials), which tells the plugin whether to send cookies to [Companion](/docs/companion).
 
 ### `locale: {}`
 

+ 6 - 6
website/src/docs/locales.md

@@ -7,7 +7,7 @@ category: "Docs"
 body_class: "page-docs-locales"
 ---
 
-Uppy speaks multiple languages, English being the default. You can use a locale pack to translate Uppy into your language of choice.
+Uppy speaks many languages, English being the default. You can use a locale pack to translate Uppy into your language of choice.
 
 [List of our locale packs](#List-of-locale-packs)
 
@@ -80,8 +80,8 @@ uppy.use(DragDrop, {
 If you speak a language we don’t yet support, you can contribute! Here’s how you do it:
 
 1. Go to the [uppy/locales](https://github.com/transloadit/uppy/tree/master/packages/%40uppy/locales/src) directory in the Uppy GitHub repo.
-1. Go to `en_US.js` and copy its contents, as English is the most up-to-date locale.
-1. Press “Create new file”, name it according to the [`language_COUNTRY` format](http://www.i18nguy.com/unicode/language-identifiers.html), make sure to use underscore `_` as a divider. Examples: `en_US`, `en_GB`, `ru_RU`, `ar_AE`. Variants should be trailing, e.g.: `sr_RS_Latin` for Serbian Latin vs Cyrillic.
-1. If your language has different pluralization rules than English, update the `pluralize` implementation. If you are unsure how to do this, please ask us for help in a [GitHub issue](https://github.com/transloadit/uppy/issues/new).
-1. Paste what you’ve copied from `en_US.js` and use it as a starting point to translate strings into your language.
-1. When you are ready, save the file — this should create a PR that we’ll then review 🎉 Thanks!
+2. Go to `en_US.js` and copy its contents, as English is the most up-to-date locale.
+3. Press “Create new file”, name it according to the [`language_COUNTRY` format](http://www.i18nguy.com/unicode/language-identifiers.html), make sure to use underscore `_` as a divider. Examples: `en_US`, `en_GB`, `ru_RU`, `ar_AE`. Variants should be trailing, for example `sr_RS_Latin` for Serbian Latin vs Cyrillic.
+4. If your language has different pluralization rules than English, update the `pluralize` implementation. If you are unsure how to do this, please ask us for help in a [GitHub issue](https://github.com/transloadit/uppy/issues/new).
+5. Paste what you’ve copied from `en_US.js` and use it as a starting point to translate strings into your language.
+6. When you are ready, save the file — this should create a PR that we’ll then review 🎉 Thanks!

+ 22 - 13
website/src/docs/migration-guides.md

@@ -14,13 +14,13 @@ These cover all the major Uppy versions and how to migrate to them.
 
 With 2.0, following in the footsteps of Microsoft, we are dropping support for IE11. As a result, we are able to remove all built-in polyfills, and the new 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:
+If youre using a bundler, you need import these before Uppy:
 
 ```js
 import 'core-js'
@@ -37,7 +37,7 @@ export { default } from '@uppy/core'
 export * from '@uppy/core'
 ```
 
-If you're using Uppy from a CDN, we now provide two bundles: one for up-to-date browsers that do not include polyfills and use modern syntax, and one for legacy browsers. When migrating, be mindful about the types of browsers you want to support:
+If youre using Uppy from a CDN, we now provide two bundles: one for up-to-date browsers that do not include polyfills and use modern syntax, and one for legacy browsers. When migrating, be mindful about the types of browsers you want to support:
 
 ```html
 <!-- Modern browsers (recommended) -->
@@ -52,7 +52,7 @@ Please note that while you may be able to get 2.0 to work in IE11 this way, we d
 
 ### Use `BasePlugin` or `UIPlugin` instead of `Plugin`
 
-[`@uppy/core`][core] provided a `Plugin` class for creating plugins. This was used for any official plugin, but also for users who want to create their own custom plugin. However, `Plugin` always came bundled with Preact, even if the plugin itself didn't add any UI elements.
+[`@uppy/core`][core] used to provide a `Plugin` class for creating plugins. This was used for any official plugin, but also for users who want to create their own custom plugin. But, `Plugin` always came bundled with Preact, even if the plugin itself didn’t add any UI elements.
 
 `Plugin` has been replaced with `BasePlugin` and `UIPlugin`. `BasePlugin` is the minimum you need to create a plugin and `UIPlugin` adds Preact for rendering user interfaces.
 
@@ -62,7 +62,7 @@ You can import them from [`@uppy/core`][core]:
 import { BasePlugin, UIPlugin } from '@uppy/core'
 ```
 
-**Note:** some bundlers will include `UIPlugin` (and therefore Preact) if you import from `@uppy/core`. To make sure this does not happen, you can import `Uppy` and `BasePlugin` directly: 
+**Note:** some bundlers will include `UIPlugin` (and thus Preact) if you import from `@uppy/core`. To make sure this does not happen, you can import `Uppy` and `BasePlugin` directly:
 
 ```js
 import Uppy from '@uppy/core/lib/Uppy.js'
@@ -115,7 +115,9 @@ const otherUppy = Uppy() // incorrect, will throw.
 
 ### Rename `allowMultipleUploads` to `allowMultipleUploadBatches`
 
-[`allowMultipleUploadBatches`](https://uppy.io/docs/uppy/#allowMultipleUploadBatches-true) means allowing multiple calls to [`.upload()`](https://uppy.io/docs/uppy/#uppy-upload), in other words, a user can add more files after already having uploaded some.
+[`allowMultipleUploadBatches`](https://uppy.io/docs/uppy/#allowMultipleUploadBatches-true) means allowing several calls to [`.upload()`](https://uppy.io/docs/uppy/#uppy-upload), in other words, a user can add more files after already having uploaded some.
+
+<!--retext-simplify ignore multiple-->
 
 We have renamed this to be more intention revealing that this is about uploads, and not whether a user can choose multiple files for one upload.
 
@@ -127,7 +129,7 @@ const uppy = new Uppy({
 
 ### New default limits for [`@uppy/xhr-upload`][xhr] and [`@uppy/tus`][tus]
 
-The default limit has been changed from `0` to `5`. Setting this to `0` means there is no limit on concurrent uploads.
+The default limit has been changed from `0` to `5`. Setting this to `0` means no limit on concurrent uploads.
 
 You can change the limit on the Tus and XHR plugin options.
 
@@ -175,6 +177,7 @@ uppy.use(Tus, {
 Uppy types are now individual exports and should be imported separately.
 
 <!-- eslint-disable @typescript-eslint/no-unused-vars -->
+
 ```ts
 import type { PluginOptions, UIPlugin, PluginTarget } from '@uppy/core'
 ```
@@ -184,6 +187,7 @@ import type { PluginOptions, UIPlugin, PluginTarget } from '@uppy/core'
 [`@uppy/core`][core] provides an [`.on`](/docs/uppy/#uppy-on-39-event-39-action) method to listen to [events](/docs/uppy/#Events). The types for these events were loose and allowed for invalid events to be passed, such as `uppy.on('upload-errrOOOoooOOOOOrrrr')`.
 
 <!-- eslint-disable @typescript-eslint/no-unused-vars -->
+
 ```ts
 // Before:
 
@@ -214,6 +218,7 @@ uppy.on<'complete', Meta>('complete', (result) => {
 Plugins that add their own events can merge with existing ones in `@uppy/core` with `declare module '@uppy/core' { ... }`. This is a TypeScript pattern called [module augmentation](https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation). For instance, when using [`@uppy/dashboard`][dashboard]:
 
 <!-- eslint-disable @typescript-eslint/no-unused-vars -->
+
 ```ts
 uppy.on('dashboard:file-edit-state', (file) => {
   const fileName = file.name
@@ -236,16 +241,20 @@ Tus will now by default try to resume uploads if the upload has been started in
 
 This also means tus will store some data in localStorage for each upload, which will automatically be removed on success. Making `removeFingerprintOnSuccess` obsolete too.
 
-### That's it!
+### Thats it!
 
 Uppy 1.0 will continue to receive bug fixes for three more months (until <time datetime="2021-12-01">1 December 2021</time>), security fixes for one more 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.
 
-We hope you'll waste no time in taking Uppy 2.0 out for a walk. When you do, please let us know what you thought of it on [Reddit](https://www.reddit.com/r/javascript/comments/penbr7/uppy_file_uploader_20_smaller_and_faster_modular/), [HN](https://news.ycombinator.com/item?id=28359287), ProductHunt, or [Twitter](https://twitter.com/uppy_io/status/1432399270846603264). We're howling at the moon to hear from you!
+We hope youll waste no time in taking Uppy 2.0 out for a walk. When you do, please let us know what you thought of it on [Reddit](https://www.reddit.com/r/javascript/comments/penbr7/uppy\_file\_uploader\_20\_smaller\_and\_faster\_modular/), [HN](https://news.ycombinator.com/item?id=28359287), ProductHunt, or [Twitter](https://twitter.com/uppy\_io/status/1432399270846603264). We’re howling at the moon to hear from you!
 
 <!-- definitions -->
 
 [core]: /docs/uppy/
+
 [xhr]: /docs/xhr-upload/
+
 [dashboard]: /docs/dashboard/
+
 [aws-s3-multipart]: /docs/aws-s3-multipart/
+
 [tus]: /docs/tus/

+ 2 - 2
website/src/docs/onedrive.md

@@ -78,11 +78,11 @@ The valid and authorised URL(s) from which OAuth responses should be accepted.
 
 This value can be a `String`, a `Regex` pattern, or an `Array` of both.
 
-This is useful when you have your [Companion](/docs/companion) running on multiple hosts. Otherwise, the default value should be good enough.
+This is useful when you have your [Companion](/docs/companion) running on many hosts. Otherwise, the default value should be good enough.
 
 ### `companionCookiesRule: 'same-origin'`
 
-This option correlates to the [RequestCredentials value](https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials), which tells the plugin whether or not to send cookies to [Companion](/docs/companion).
+This option correlates to the [RequestCredentials value](https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials), which tells the plugin whether to send cookies to [Companion](/docs/companion).
 
 ### `locale: {}`
 

+ 4 - 2
website/src/docs/plugin-common-options.md

@@ -10,7 +10,7 @@ Each plugin can have any number of options (please see specific plugins for deta
 
 ### `id`
 
-A unique string identifying the plugin. By default, the plugin's name is used, so usually it does not need to be configured manually. Use this if you need to add multiple plugins of the same type.
+A unique string identifying the plugin. By default, the plugin’s name is used, so usually it does not need to be configured manually. Use this if you need to add several plugins of the same type.
 
 ### `target`
 
@@ -70,10 +70,12 @@ uppy.getPlugin('Dashboard').setOptions({
 })
 ```
 
-> ⚠️ This should work for most options, except for `limit` and some others related to an upload. This is because some objects/instances are created immediately upon initialization, and not updated later.
+> ⚠️ This should work for most options, except for `limit` and some others related to an upload. This is because some objects/instances are created at once upon initialization, and not updated later.
 
 <!-- Keep this heading, it is here to avoid breaking existing URLs -->
+
 <!-- Previously the content that is now at /docs/providers was here -->
+
 ## Provider Plugins
 
 See the [Provider Plugins](/docs/providers) documentation page for information on provider plugins.

+ 1 - 1
website/src/docs/plugins.md

@@ -9,6 +9,6 @@ order: 3
 category: "Docs"
 ---
 
-Everything in Uppy is a Plugin. This lets us offer a wealth of features, but avoid bloating your JS bundle sizes if you don't need all of them.
+Everything in Uppy is a Plugin. This lets us offer a wealth of features, but avoid bloating your JS bundle sizes if you don’t need them all.
 
 See [list of packages and sizes](#package-list) below to install what you need.

+ 4 - 4
website/src/docs/progressbar.md

@@ -9,7 +9,7 @@ category: "UI Elements"
 tagline: "add a small YouTube-style progress bar at the top of the page"
 ---
 
-`@uppy/progress-bar` is a minimalist plugin that shows the current upload progress in a thin bar element, similar to the ones used by YouTube and GitHub when navigating between pages.
+`@uppy/progress-bar` 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.
 
 ```js
 import ProgressBar from '@uppy/progress-bar'
@@ -33,7 +33,7 @@ Install from NPM:
 npm install @uppy/progress-bar
 ```
 
-In the [CDN package](/docs/#With-a-script-tag), it is available on the `Uppy` global object:
+In the [CDN package](/docs/#With-a-script-tag), the plugin class is available on the `Uppy` global object:
 
 ```js
 const { ProgressBar } = Uppy
@@ -66,7 +66,7 @@ uppy.use(ProgressBar, {
 
 ### `id: 'ProgressBar'`
 
-A unique identifier for this Progress Bar. It defaults to `'ProgressBar'`. Use this if you need to add multiple ProgressBar instances.
+A unique identifier for this Progress Bar. It defaults to `'ProgressBar'`. Use this if you need to add many `ProgressBar` instances.
 
 ### `target: null`
 
@@ -74,7 +74,7 @@ DOM element, CSS selector, or plugin to mount the progress bar into.
 
 ### `fixed: false`
 
-When set to true, show the progress bar at the top of the page with `position: fixed`. When set to false, show the progress bar inline wherever it is mounted.
+When set to true, show the progress bar at the top of the page with `position: fixed`. When set to false, show the progress bar inline wherever its mounted.
 
 ```js
 uppy.use(ProgressBar, {

+ 4 - 3
website/src/docs/providers.md

@@ -6,15 +6,16 @@ order: 10
 category: "Sources"
 ---
 
-The Provider plugins help you connect to your accounts with remote file providers such as [Dropbox](https://dropbox.com), [Google Drive](https://drive.google.com), [Instagram](https://instagram.com) and remote URLs (importing a file by pasting a direct link to it). Because this requires server-to-server communication, they work tightly with [Companion](https://github.com/transloadit/uppy/tree/master/packages/%40uppy/companion) to manage the server-to-server authorization for your account. Almost all of the communication (file download/upload) is done on the server-to-server end, so this saves you the stress and bills of data consumption on the client.
+The Provider plugins help you connect to your accounts with remote file providers such as [Dropbox](https://dropbox.com), [Google Drive](https://drive.google.com), [Instagram](https://instagram.com) and remote URLs (importing a file by pasting a direct link to it). Because this requires server-to-server communication, they work tightly with [Companion](https://github.com/transloadit/uppy/tree/master/packages/%40uppy/companion) to manage the server-to-server authorization for your account. Almost all the communication (file download/upload) is done on the server-to-server end, so this saves you the stress and bills of data consumption on the client.
 
 As of now, the supported providers are [**Dropbox**](/docs/dropbox), [**Google Drive**](/docs/google-drive), [**OneDrive**](/docs/onedrive/), [**Box**](/docs/box/), [**Instagram**](/docs/instagram), [**Facebook**](/docs/facebook/), [**Zoom**](/docs/zoom/) and [**URL**](/docs/url).
 
-Usage of the Provider plugins is not that different from any other *acquirer* plugin, except that it takes an extra option `companionUrl`, which specifies the URL to the Companion that you are running. This allows Uppy to know what server to connect to when datacenter operations are required by the provider plugin.
+Usage of the Provider plugins is not that different from any other _acquirer_ plugin, except that it takes an extra option `companionUrl`, which specifies the URL to the Companion that you are running. This allows Uppy to know what server to connect to when datacenter operations are required by the provider plugin.
 
-Here's a quick example:
+Heres a quick example:
 
 <!-- eslint-disable import/first, import/newline-after-import -->
+
 ```js
 import Uppy from '@uppy/core'
 import Dashboard from '@uppy/dashboard'

+ 5 - 2
website/src/docs/react-dashboard-modal.md

@@ -40,13 +40,15 @@ Import general Core styles from `@uppy/core/dist/style.css` first, then add the
 Styles for Provider plugins, like Google Drive and Instagram, are also bundled with Dashboard styles. Styles for other plugins, such as `@uppy/url` and `@uppy/webcam`, are not included. If you are using those, please see their docs and make sure to include styles for them as well.
 
 <!-- Make sure the old name of this section still works -->
+
 <a id="Options"></a>
+
 ## Props
 
 The `<DashboardModal />` component supports most [`@uppy/dashboard`][] options as props. It adds two more:
 
- - `open` - Boolean true or false, setting this to `true` opens the modal and setting it to `false` closes it.
- - `onRequestClose` - Callback called when the user attempts to close the modal, either by clicking the close button or by clicking outside the modal (if the `closeModalOnClickOutside` prop is set).
+* `open` - Boolean true or false, setting this to `true` opens the modal and setting it to `false` closes it.
+* `onRequestClose` - Callback called when the user attempts to close the modal, either by clicking the close button or by clicking outside the modal (if the `closeModalOnClickOutside` prop is set).
 
 An Uppy instance must be provided in the `uppy={}` prop: see [Initializing Uppy](/docs/react/initializing) for details.
 
@@ -119,4 +121,5 @@ class MusicUploadButton extends React.Component {
 ```
 
 [`@uppy/dashboard`]: /docs/dashboard/
+
 [`@uppy/webcam`]: /docs/webcam/

+ 2 - 0
website/src/docs/react-dashboard.md

@@ -46,6 +46,7 @@ The `<Dashboard />` component supports all [`@uppy/dashboard`][] options as prop
 > The `<Dashboard />` cannot be passed to a `target:` option of a remote provider or plugins such as [`@uppy/webcam`][]. To use other plugins like [`@uppy/webcam`][] (Image Editor, Google Drive, etc) with the `<Dashboard />` component, first add them to the Uppy instance, and then specify their `id` in the [`plugins`](/docs/dashboard/#plugins) prop:
 
 <!-- eslint-disable react/jsx-props-no-spreading -->
+
 ```js
 import React from 'react'
 import { Dashboard } from '@uppy/react'
@@ -72,4 +73,5 @@ function Uploader () {
 ```
 
 [`@uppy/dashboard`]: /docs/dashboard/
+
 [`@uppy/webcam`]: /docs/webcam/

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません