diff --git a/404.html b/404.html index d33236dcf..163795cf3 100644 --- a/404.html +++ b/404.html @@ -12,7 +12,7 @@ - + diff --git a/assets/js/b2f554cd.5913eb2e.js b/assets/js/b2f554cd.5913eb2e.js deleted file mode 100644 index d7b5d98ce..000000000 --- a/assets/js/b2f554cd.5913eb2e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkuppy_io=self.webpackChunkuppy_io||[]).push([[1477],{30010:e=>{e.exports=JSON.parse('{"blogPosts":[{"id":"2023/07/3.13-3.21","metadata":{"permalink":"/blog/2023/07/3.13-3.21","editUrl":"https://github.com/transloadit/uppy.io/tree/main/blog/2023-12-3.13-3.21.md","source":"@site/blog/2023-12-3.13-3.21.md","title":"\ud83c\udf84 Uppy 3.13 to 3.21: Typescript Saga: the beginning, Image Editor improvements, Dashboard auto-install","description":"It\u2019s this time of the year again! Make yourself cozy","date":"2023-12-23T00:00:00.000Z","formattedDate":"December 23, 2023","tags":[],"readingTime":4.62,"hasTruncateMarker":true,"authors":[{"email":"antoine@transloadit.com","name":"Antoine du Hamel","id":"aduh95","tagline":"Developer","imageURL":"https://github.com/aduh95.png","key":"aduh95"},{"email":"merlijn@transloadit.com","name":"Merlijn Vos","id":"merlijn","tagline":"Developer","imageURL":"https://github.com/murderlon.png","key":"murderlon"},{"email":"artur@transloadit.com","name":"Artur Paikin","id":"artur","tagline":"Developer","imageURL":"https://github.com/arturi.png","key":"arturi"},{"email":"mikael@transloadit.com","name":"Mikael Finstad","id":"mikael","tagline":"Developer","imageURL":"https://github.com/mifi.png","key":"mifi"}],"frontMatter":{"title":"\ud83c\udf84 Uppy 3.13 to 3.21: Typescript Saga: the beginning, Image Editor improvements, Dashboard auto-install","date":"2023-12-23T00:00:00.000Z","authors":["aduh95","murderlon","arturi","mifi"],"image":"https://uppy.io/img/blog/3.13-3.21/dog-coding-laptop-mars-christmas-tree.jpg","slug":"2023/07/3.13-3.21","published":true,"toc_max_heading_level":2},"unlisted":false,"nextItem":{"title":"Scaling Images on Rotation","permalink":"/blog/2023-10-25-image-editor"}},"content":"\\"Screenshot\\n\\nIt\u2019s this time of the year again! Make yourself cozy\\n[by the fire](https://www.youtube.com/watch?v=ouqtX6WWL1U), and let us help you\\nunwrap the gifts Uppy has prepared for you.\\n\\nWe proud of all the improvements and amazing new features and bug fixes we were\\nable to introduce this year. The highlights being: conditional S3 multipart and\\nsigning S3 uploads on the client, speedy handling of 10-50k file uploads,\\nrefresh tokens (useful when the token expires mid-upload for a large amount of\\nfiles / slow connections), server-sent events and new `assemblyOptions` for the\\nTransloadit plugin, Dashboard Single File mode (`singleFileFullScreen`),\\nimproved ETA in the Status Bar, a bunch of new languages, including Hindi,\\nMexican Spanish and Catalan.\\n\\nThis one, however, is a recent Uppy updates post, covering releases from\\n[`3.13.0` to `3.21.0`](https://github.com/transloadit/uppy/compare/uppy%403.13.0...uppy%403.21.0):\\nannouncing the switch to Typescript, Dashboard can now auto-install plugins,\\nsupport for Catalan language, a heap of bug fixes for Tus, Companion, AWS S3,\\nand more.\\n\\n\x3c!--truncate--\x3e\\n\\n## Typescript\\n\\nWe are excited to announce that we are working hard to refactor Uppy Core and\\nall plugins source files to TypeScript. We have a build setup in place that\\ntemporarily supports both `.ts` and `.js` files in our monorepo. And a helper\\nutility that takes a package name and does the initial renaming and Typescript\\nconfig. Then we go through the list of plugins one by one. We begun with\\n`@uppy/utils` and `@uppy/core`, since most other packages depend on those. Now\\nwe are moving to the rest, one by one.\\n\\nThis work so far is only affecting Uppy internals. In published packages we are\\nusing the manually crafted `d.ts` files, as before. We are planning to flip the\\nswitch and introduce some breaking changes in the next Uppy major, due to be\\nreleased in the first quater of 2024.\\n\\n## Core\\n\\n- Allow duplicate files with `onBeforeFileAdded`.\\n- Fixed`onBeforeFileAdded` with Golden Retriever.\\n- Simplify types with class generic and type more events.\\n\\n## Image Editor\\n\\nWe have a whole separate blog post about the recent rotation improvements in the\\nImage Editor, so please read that, if you are interested. Other changes include:\\n\\n- Fixed labels on all buttons, centered the rotation slider label.\\n- Limited cropbox movements.\\n- Fixed to respect `cropperOptions.initialAspectRatio`.\\n- Change the checkered background color, make it semi-transparent.\\n- Fixed granular rotation: `[-45, 45]` instead of `[-45, 44]`.\\n- Removed 1px black lines.\\n- Made `file-editor:cancel` event fire when the Image Editor\u2019s \u201ccancel\u201d button\\n is pressed.\\n\\n\\n\\n\\"Editor\\n\\n## Dashboard\\n\\nDashboard can now automatically discover and install compatible plugins without\\n`target` option. This lets you use a much more condense syntax:\\n\\n```js\\nconst uppy = new Uppy()\\n\\t.use(ImageEditor)\\n\\t.use(Dashboard)\\n\\t.use(Webcam)\\n\\t.use(GoogleDrive);\\n```\\n\\n:::tip \\n\\nThe old way via `.use(ImageEditor, { target: Dashboard })` and\\n`.use(Dashboard, { plugins: [\'Webcam\', \'GoogleDrive\'] })` still works, but we\\nencourage you to use the new syntax.\\n\\n:::\\n\\nBug fixes:\\n\\n- Remove `.uppy-Dashboard-isFixed` CSS class when `uppy.close()` is invoked.\\n- When `showAddFilesPanel: true`, `aria-hidden` should be the opposite.\\n- Don\u2019t cancel all files and Assemblies when clicking \u201cdone\u201d.\\n- Update Dashboard\u2019s blue color to meet WCAG contrast requirements.\\n\\n## AWS S3\\n\\n- Fixed `TypeError`, fixed `uploadURL` when using `PUT`.\\n- Pass `signal` as separate arg for backward compat; pass the `uploadURL` back\\n to the caller.\\n- Refresh file before calling user-defined functions.\\n- Made sure we retry signature request.\\n- Use uppercase HTTP method names.\\n- Call `#setCompanionHeaders` in `setOptions`.\\n\\n## Companion\\n\\nOne of the most notable changes in Companion is on the client side, we\u2019ve made\\nauthentication optional, allowing for more provider types, with publicly\\naccessable links, for example.\\n\\nIn Companion Client we were able to drop the now unnecessary preflight requests,\\nimproving upload speeds and latency yet again.\\n\\nOther notable changes and fixes:\\n\\n- Allow dynamic S3 bucket.\\n- Companion+client stability fixes, error handling and retries.\\n- Catch \u201cinvalid initialization vector\u201d instead of crashing.\\n- Added Onedrive refresh tokens.\\n- Fixed `authProvider` property inconsistency.\\n- Fixed accelerated endpoints for presigned POST.\\n- Fixed double tus uploads.\\n- Fixed onedrive pagination.\\n- Fixed Redis key default TTL.\\n- Fixed Uploader.js metadata normalisation.\\n- Make CSRF protection helpers available to providers.\\n- Refactor `getProtectedHttpAgent` to make TS happy.\\n- Unify redis initialization.\\n- Use deferred length for tus streams.\\n- Fixed a refresh token race condition.\\n- Fixed edge case for pagination on root.\\n- Fixed instagram/facebook auth error regression; uploadRemoteFile undefined;\\n ProviderView error on empty plugin.icon.\\n- Added getBucket metadata argument.\\n- Added missing credentialsURL for box.\\n- Added test endpoint for dynamic oauth creds.\\n- Added Companion OAuth Key type.\\n- Aliased \u201cremoveListener\u201d as \u201coff\u201d in Redis emitter.\\n- Use user-defined `onSuccess`, `onError`, and `onProgress` callbacks in\\n `@uppy/tus`.\\n- Invoke headers function for remote uploads.\\n- Send certain Onedrive errors to the user.\\n- Upgraded Node.js docker version.\\n\\n## Frameworks Integraions\\n\\n- Angular: upgraded to Angular 16.x.\\n- Svelte: Fixed TS build command.\\n- Vue: added export for FileInput.\\n\\n## Locales\\n\\n- Added Catalan locale `ca_ES`.\\n- Added missing translations to `de_DE`.\\n- Update Farsi.\\n\\n## Transloadit\\n\\n- Emit assembly progress events.\\n- Removed Socket.io \u2014 it\u2019s server-sent events with fallback to polling now.\\n\\n## Misc\\n\\n- Added Prettier, migrated to Vitest for Uppy core and Uppy plugins.\\n- Update `file.meta.name` after compression, becase format/extension might have\\n changed.\\n- use latest Node.js version for tests.\\n- Migrate to AWS-SDK V3 syntax.\\n- Move remote file upload logic into companion-client.\\n\\nHappy holidays and see you in 2024!"},{"id":"2023-10-25-image-editor","metadata":{"permalink":"/blog/2023-10-25-image-editor","editUrl":"https://github.com/transloadit/uppy.io/tree/main/blog/2023-10-25-image-editor.md","source":"@site/blog/2023-10-25-image-editor.md","title":"Scaling Images on Rotation","description":"We recently released an \u201cimage scaling on rotation\u201d feature for Uppy\u2019s","date":"2023-12-08T00:00:00.000Z","formattedDate":"December 8, 2023","tags":[],"readingTime":5.805,"hasTruncateMarker":true,"authors":[{"email":"lakesare@gmail.com","name":"Evgenia Karunus","id":"evgenia","tagline":"Developer","imageURL":"https://github.com/lakesare.png","key":"evgenia"},{"email":"tim@transloadit.com","name":"Tim Koschuetzki","id":"tim","tagline":"Transloadit co-founder","imageURL":"https://github.com/tim-kos.png","key":"tim"}],"frontMatter":{"title":"Scaling Images on Rotation","date":"2023-12-08T00:00:00.000Z","authors":["evgenia","tim"],"image":"/img/blog/3.4-3.13/single-file-mode.jpg","slug":"2023-10-25-image-editor","published":true,"toc_max_heading_level":3},"unlisted":false,"prevItem":{"title":"\ud83c\udf84 Uppy 3.13 to 3.21: Typescript Saga: the beginning, Image Editor improvements, Dashboard auto-install","permalink":"/blog/2023/07/3.13-3.21"},"nextItem":{"title":"Uppy 3.3 to 3.13: conditional S3 multipart, signing on the client, speedy handling of 10k files and much much more","permalink":"/blog/2023/07/3.3-3.13"}},"content":"\x3c!--retext-simplify disable prior-to all-of employ very represents appropriate--\x3e\\n\\nWe recently released an \u201cimage scaling on rotation\u201d feature for Uppy\u2019s\\n[Image Editor](https://uppy.io/docs/image-editor/), an often-requested feature\\nthat we\u2019re super proud to be able to announce.\\n\\nIn this blog post, we\u2019ll be taking a peek behind the curtain, as we take a\\ndetailed look into the development of this feature, and our thought-process\\napproaching it.\\n\\nBefore we start though, take a look below at a comparison between how Uppy\u2019s\\nImage Editor used to handle image rotations, and how it handles them now.\\n\\n\\n \\n \\n \\n \\n\\n \\n \\n \\n \\n \\n\\n \\n \\n \\n\\n \\n \\n \\n
\\n Rotation\\n
Without scalingWith scaling
\\n \\n \\n \\n
\\n\\nWithout further ado, let\u2019s dive into some of the finer technical details, so you\\ncan follow along and implement this feature into your own image editor.\\n\\n\x3c!--truncate--\x3e\\n\\nThe above UI is present in many image editors - for example, the default image\\neditors on iOS and Android both employ it. Often users expect this behaviour\\ntoo, leading to some confusion when their images are left with ugly corners\\nafter a rotation.\\n\\nWe implemented this in Uppy\u2019s Image Editor last week, and the solution turned\\nout to be non-trivial. Since this is a pretty ubiquitous task to solve for all\\nimage editors, we decided to release our solution to the world and write out a\\npost about it, instead of keeping it hidden away as part of internal notes.\\n\\n## 3 Steps\\n\\nThere are **3 steps** to our scaling implementation:\\n\\n1. Ask your designer what scaling on rotation should look like\\n1. Find the `.scale()` function\\n1. Calculating the geometry\\n\\n### 1. Trust your designer\\n\\nWhen I first approached this task, my gut-instinct was to go for the \u201crotated\\nrectangle inscribed within another rectangle\u201d solution so that the largest-area\\ninscription possible is achieved. This route turned out to be an unpleasant user\\nexperience, so take this as an important lesson in trusting your designer, and\\nconsulting them first on what the user might want.\\n\\nAlternatively, you can choose to trust our designer\u2019s advice by:\\n\\n- always rotating the image around the center of the image (intersection of the\\n diagonals)\\n- just enlarging the image to remove any empty corners\\n\\n### 2. Find the `.scale()` function\\n\\nTo enlarge the image in a way that covers empty corners, we first need a scaling\\nfunction. Uppy uses [cropperjs v1.x](https://github.com/fengyuanchen/cropperjs)\\nas an image editing library, which exposes the `cropper.scale(scalingFactor)`\\nfunction. Most image editing libraries are likely to have a similar function,\\nbut of course feel free to code one yourself if you feel up to the challenge.\\n\\nImportantly, the scaling function should\\n[uniformly enlarge]()\\nthe image _around its center_, where the `scalingFactor` is determined by\\n`desiredHeight/oldHeight`.\\n\\n### 3. Calculate the geometry\\n\\nNow, we want to draw our before-rotation & after-rotation shapes on the same\\npicture, and apply some trigonometry. If you need to brush up on the mathematics\\nbehind this, we recommend watching the following Khan Academy lessons on\\n[how angles work](https://www.khanacademy.org/test-prep/praxis-math/praxis-math-lessons/gtp--praxis-math--lessons--geometry/a/gtp--praxis-math--article--angles--lesson)\\nand\\n[how sines and cosines work](https://www.khanacademy.org/math/geometry/hs-geo-trig/hs-geo-trig-ratios-intro/a/finding-trig-ratios-in-right-triangles),\\nas these cover everything you\u2019ll need to follow along.\\n\\nIn the images below, we see what happens on rotation by default. To remove the\\nempty corners, the user would have to drag around the edges of the cropbox. What\\nwe can do instead is scale the image (in the directions shown by the green arrows) so that these\\ncorners disappear.\\n\\n\\n \\n \\n \\n\\n \\n \\n \\n\\n \\n \\n \\n
What happens on rotation
\\n \\n \\n \\n
\\n\\nSo, to cover up these checkered corners, we will need to scale the image. If we\\ncover up the larger corner, the smaller corner will get covered up\\nautomatically, so our code takes the form of\\n`scale(Math.max(scalingFactor1, scalingFactor2))`. These two scaling factors are\\ncalculated very similarly, so we\u2019ll only focus on calculating only one of them\\nin this tutorial (although the full solution is given in the conclusion).\\n\\nIn the images below, the green\\nrectangle represents the desired dimensions of our image after it\u2019s\\nscaled. Our scaling function (and hopefully yours) is defined in such a way that\\nif we have the image of height `h`, and we want to scale it up to height `H`, we\\nneed to execute `.scale(H/h)`. Since we already know `h`, as it\u2019s the height of\\nour image, we only need to find `H` to complete our scaling function.\\n\\n\\n \\n \\n \\n\\n \\n \\n \\n\\n \\n \\n \\n
We want to find H
\\n \\n \\n \\n
\\n\\nFor the rest of the tutorial, the following steps are then automatic - as we\\nknow all the angles in the image, we know the image\u2019s width and height, and we\\nknow to find `H`.\\n\\n

The easiest way to go about it, is to first annotate the image with all the\\nrelevant angles. We\u2019ll be using blue for the rotation angle\\n \u03b1, and pink \\nfor 90 - \u03b1:

\\n\\n\\n \\n \\n \\n\\n \\n \\n \\n \\n \\n
Color all angles
\\n \\n
\\n\\nWe can then find `H`, by adding the two outer sides of these triangles.\\n\\n\\n \\n \\n \\n\\n \\n \\n \\n\\n \\n \\n \\n
Add two triangle sides: H = sin(\u03b1 - 90) * h + sin(\u03b1) * w
\\n \\n \\n \\n
\\n\\nSo, now we have our desired `H`! We know one of our scaling factors is `H/h`.\\nNow, we just need to find our other scaling factor, which is `W/w`. This follows\\na similar process, and you can find the calculations as part of the full\\nsolution below.\\n\\n```javascript\\nscalingFactor\\n= max(scalingFactor1, scalingFactor2)\\n= max(H/h, W/w)\\n= max(\\n (sin(\u03b1 - 90) * h + sin(\u03b1) * w) / h,\\n (sin(\u03b1) * h + sin(\u03b1 - 90) * w) / w\\n)\\n```\\n\\n## Conclusion\\n\\nIn Uppy, our code ended up looking like this:\\n\\n```javascript\\nfunction getScalingFactor(w, h, rotationAngle) {\\n\\tconst \u03b1 = Math.abs(toRadians(rotationAngle));\\n\\n\\tconst scalingFactor = Math.max(\\n\\t\\t(Math.sin(\u03b1) * w + Math.cos(\u03b1) * h) / h,\\n\\t\\t(Math.sin(\u03b1) * h + Math.cos(\u03b1) * w) / w,\\n\\t);\\n\\n\\treturn scalingFactor;\\n}\\nconst image = cropper.getImageData();\\nconst scaleFactor = getScalingFactor(image.width, image.height, rotationAngle);\\ncropper.scale(scaleFactor);\\n```\\n\\nYou can see the full version\\n[on GitHub](https://github.com/transloadit/uppy/blob/12e08ada02b9080bd5e1d19526bdf8a2010e62a1/packages/%40uppy/image-editor/src/utils/getScaleFactorThatRemovesDarkCorners.js).\\n\\n
\\n Bonus content: our founder\u2019s (Tim Koschuetzki) initial scribbled notes with the solution\\n \\n
"},{"id":"2023/07/3.3-3.13","metadata":{"permalink":"/blog/2023/07/3.3-3.13","editUrl":"https://github.com/transloadit/uppy.io/tree/main/blog/2023-07-3.4-3.13.md","source":"@site/blog/2023-07-3.4-3.13.md","title":"Uppy 3.3 to 3.13: conditional S3 multipart, signing on the client, speedy handling of 10k files and much much more","description":"This is a big Uppy update post, covering releases from","date":"2023-07-26T00:00:00.000Z","formattedDate":"July 26, 2023","tags":[],"readingTime":8.82,"hasTruncateMarker":true,"authors":[{"email":"merlijn@transloadit.com","name":"Merlijn Vos","id":"merlijn","tagline":"Developer","imageURL":"https://github.com/murderlon.png","key":"murderlon"},{"email":"artur@transloadit.com","name":"Artur Paikin","id":"artur","tagline":"Developer","imageURL":"https://github.com/arturi.png","key":"arturi"},{"email":"antoine@transloadit.com","name":"Antoine du Hamel","id":"aduh95","tagline":"Developer","imageURL":"https://github.com/aduh95.png","key":"aduh95"},{"email":"mikael@transloadit.com","name":"Mikael Finstad","id":"mikael","tagline":"Developer","imageURL":"https://github.com/mifi.png","key":"mifi"}],"frontMatter":{"title":"Uppy 3.3 to 3.13: conditional S3 multipart, signing on the client, speedy handling of 10k files and much much more","date":"2023-07-26T00:00:00.000Z","authors":["murderlon","arturi","aduh95","mifi"],"image":"/img/blog/3.4-3.13/single-file-mode.jpg","slug":"2023/07/3.3-3.13","published":true,"toc_max_heading_level":2},"unlisted":false,"prevItem":{"title":"Scaling Images on Rotation","permalink":"/blog/2023-10-25-image-editor"},"nextItem":{"title":"New Uppy.io and docs","permalink":"/blog/2023-05-new-website"}},"content":"\\"Screenshot\\n\\nThis is a big Uppy update post, covering releases from\\n[`3.3.0` to `3.13.0`](https://github.com/transloadit/uppy/compare/uppy%403.4.0...uppy%403.13.0)!\\n\\nIn this issue: the long-awaited unified S3 plugin which can switch between\\nregular and multipart uploads, improved performance when adding and validating\\n10k+ files, and stability improvements and bug fixes. The Transloadit plugin is\\nnow also easier to configure and leaner in bundle size, since we removed\\n`socket.io-client` in favor of\\n[Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events).\\n\\nPlease make a cup of something tasty \u2615\ufe0f (in a non-spillable container), as this\\nwill be quite a ride.\\n\\n\x3c!--truncate--\x3e\\n\\n## AWS S3\\n\\n### Merging of the plugins\\n\\nAfter years of separating regular non-multipart uploads and multipart uploads,\\nwe are finally merging the two sibling plugins: `@uppy/aws-s3` and\\n`@uppy/aws-s3-multpart`. Here\u2019s the brief version of what you need to know, with\\ndetails to follow in the next section:\\n\\n- `@uppy/aws-s3-multipart` is deprecated. You should use `@uppy/aws-s3` and set\\n the `shouldUseMultipart: true` option to get the same \u201cmultipart always\\n enabled\u201d behavior. We plan to keep `@uppy/aws-s3-multipart` around as an alias\\n for the next major cycle and add a warning at the install when Uppy 4.0.0 will\\n be released.\\n- `@uppy/aws-s3` now hosts two plugins:\\n - the legacy one, untouched, to guarantee backward compatibility. We plan to\\n get rid of it in the next major, we recommend moving away from it and report\\n if you see something missing in the new plugin.\\n - the new merged plugin, available if you pass\\n [`shouldUseMultipart`](https://uppy.io/docs/aws-s3-multipart/#shouldusemultipartfile)\\n option.\\n\\nOur plan for this merge is to maintain the backward compatibility until the next\\nmajor, while also providing forward compatibility so you can try our new plugin\\nand give us some feedback before we remove the old code for good.\\n\\n### Conditional Multipart Explained\\n\\nMultipart and \u201cregular\u201d uploads have different use cases. The advantages of\\nmultipart uploads are:\\n\\n- **Improved throughput** \u2013 You can upload parts in parallel to improve\\n throughput.\\n- **Quick recovery from any network issues** \u2013 Smaller part size minimizes the\\n impact of restarting a failed upload due to a network error.\\n- **Pause and resume object uploads** \u2013 You can upload object parts over time.\\n After you initiate a multipart upload, there is no expiry; you must explicitly\\n complete or stop the multipart upload.\\n- **Begin an upload before you know the final object size** \u2013 You can upload an\\n object as you are creating it.\\n\\nHowever, the downside is _request overhead_, as it needs to do creation,\\nsigning, and completion requests besides the upload requests. For example, if\\nyou are uploading files that are only a couple kilobytes with a 100ms roundtrip\\nlatency, you are spending 400ms on overhead and only a few milliseconds on\\nuploading. This really adds up if you upload a lot of small files.\\n\\nSo now you can use just one plugin, the `@uppy/aws-s3`, and enable multipart\\nconditionally, even per-file:\\n\\n```js\\nuppy.use(AwsS3, {\\n\\tshouldUseMultipart(file) {\\n\\t\\t// Use multipart only for files larger than 100MiB.\\n\\t\\treturn file.size > 100 * 2 ** 20;\\n\\t},\\n});\\n```\\n\\nor\\n\\n```js\\nuppy.use(AwsS3, {\\n\\tshouldUseMultipart: true,\\n});\\n```\\n\\nPlease see the new\\n[`shouldUseMultipart: boolean | function`](https://uppy.io/docs/aws-s3-multipart/#shouldusemultipartfile)\\noption for details.\\n\\n### Signing on the client\\n\\nBy default, when you upload to S3 with Uppy, every file, or every chunk in case\\nof Multipart, needs to be signed on the server. For many small files or files\\nwith many chunks this means a few additional requests per file/chunk of the\\nupload.\\n\\nTo address this issue and speed up the uploads by roughly 20%, we are\\nintroducing a new option: `getTemporarySecurityCredentials: boolean | function`.\\nWhen `true`, both S3 and S3 Multipart uploads will be signed on the client using\\nthe\\n[AWS Security Federation Token](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html),\\ncreated once per user (until it expires) on your backend rather than a unique\\nsigned URL for every single chunk.\\n\\n:::caution\\n\\nYou should opt-in into this only if you are comfortable giving end users direct\\naccess to signing files for your bucket.\\n\\n:::\\n\\n### Stability and bug fixes\\n\\n- We\u2019ve improved the internal handling of `RateLimitedQueue` to make\\n [retries more robust](https://github.com/transloadit/uppy/pull/4424) and\\n increased\\n [priority of `abort` and `complete`](https://github.com/transloadit/uppy/pull/4542)\\n requests.\\n- While we were at it, we\u2019ve also fixed\\n [resuming in single-chunk uploads](https://github.com/transloadit/uppy/pull/4528),\\n and improved\\n [chunk size calculation](https://github.com/transloadit/uppy/pull/4508).\\n- [Golden Retriever integration with S3 Multipart](https://github.com/transloadit/uppy/pull/4526)\\n was fixed.\\n\\nAdditionally, we\u2019ve disabled pause-resume buttons in the UI for remote S3\\nMultipart uploads \u2014\xa0they are not supported on Companion, so the UI now reflects\\nthat.\\n\\n## Core\\n\\nPerformance of adding and uploading big batches of files has (yet again) been\\ngreatly improved with refactors in both Uppy Core and Provider Views (that\u2019s\\nwhat we internally call all remote UIs: Instagram, Unsplash, Dropbox).\\n\\nWe\u2019ve been able to achieve this by\\n[refactoring out totals validation for Restrictions (maxTotalFileSize, maxNumberOfFiles)](https://github.com/transloadit/uppy/pull/4402):\\ninstead of doing it for each file, we perform the check at the end, after all\\nthe files have been added/validated. This was confirmed to work with 10k+ files!\\n\ud83d\ude80\\n\\n\\"Uppy\\n\\nWe\u2019ve also fixed an issue with delayed throttled progress events, which could\\nlead to incorrect progress.\\n\\n## Transloadit\\n\\n### assemblyOptions\\n\\nWe\u2019ve introduced a new option called\\n[`assemblyOptions: object | function`](https://uppy.io/docs/transloadit/#assemblyoptions),\\nwhich replaces the `getAssemblyOptions`, `params` and `fields` (those are now\\ndeprecated and will be removed in the next major).\\n\\nHere\u2019s how you can use the new option as an object:\\n\\n```js\\nuppy.use(Transloadit, {\\n\\tassemblyOptions: {\\n\\t\\tparams: {\\n\\t\\t\\tauth: { key: \'key-from-transloadit\' },\\n\\t\\t\\ttemplate_id: \'id-from-transloadit\',\\n\\t\\t\\tsteps: {\\n\\t\\t\\t\\t// Overruling Template at runtime\\n\\t\\t\\t},\\n\\t\\t},\\n\\t\\tsignature: \'generated-signature\',\\n\\t\\tfields: {\\n\\t\\t\\t// Dynamic or static fields to send along\\n\\t\\t},\\n\\t},\\n});\\n```\\n\\nAnd here\u2019s an example with a function, to be able to set meta fields per-file,\\nfor instance:\\n\\n```js\\nuppy.use(Transloadit, {\\n\\tassemblyOptions(file) {\\n\\t\\treturn {\\n\\t\\t\\tparams: {\\n\\t\\t\\t\\tauth: { key: \'TRANSLOADIT_AUTH_KEY_HERE\' },\\n\\t\\t\\t\\ttemplate_id: \'xyz\',\\n\\t\\t\\t},\\n\\t\\t\\tfields: {\\n\\t\\t\\t\\tcaption: file.meta.caption,\\n\\t\\t\\t},\\n\\t\\t};\\n\\t},\\n});\\n```\\n\\n### Server-sent events\\n\\nHistorically Transloadit supported progress updates via Socket.io. It is a\\nrobust and stable package, but came with a \u201cprice-tag\u201d in the form of bundle\\nsize:\\n[38.3 kB Minified](https://bundlephobia.com/package/socket.io-client@4.7.1). So\\nit\u2019s been on our minds for a while to replace it with something more\\nlightweight, without breaking backwards-compatibility for the older clients (so\\nsimply removing Socket.io on the server in favor of plain WebSockets is not\\ndesireable).\\n\\nThe answer \u2014\\n[Server-sent events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events).\\nIt\u2019s a simple low-overhead one-way connection from Transloadit servers to\\n`@uppy/transloadit`. As was the case with Socket.io, we fall back to HTTP\\npolling every 2 seconds if SSE connection fails for some reason.\\n\\nSocket.io is still around in `@uppy/transloadit`, but will be removed soon, once\\nSSE proves itself in production.\\n\\n### Bug fixes\\n\\n- Reset `tus` key in the file on error, so retried files are re-uploaded.\\n- Clean up event listener to prevent cancelled assemblies.\\n- Make sure `fields` is not nullish when there are no files in Assembly.\\n\\n## Companion\\n\\n### Refresh tokens\\n\\nWe\u2019ve\\n[implemented refresh tokens](https://github.com/transloadit/uppy/pull/4448) for\\nDropbox and Google Drive to solve issued where tokens would expire in the middle\\nof a long upload and then the upload would fail.\\n\\nHere\u2019s how it\u2019s implemented in Companion:\\n\\n- We changed the logic when receiving a 401 from Companion, Uppy will now call a\\n new `/:provider/refresh-token` endpoint which will give uppy a new access\\n token.\\n- `refresh_token` is now stored inside uppy auth token along with `access_token`\\n (encrypted JWT) for providers that give a refresh token (before only\\n `access_token` was stored, now we store both as a `JSON.stringify`\u2019d\\n document).\\n\\n### Bug fixes and improvements\\n\\n- Fixed a bug with non-ASCII metadata crashed Companion. The AWS SDK doesn\u2019t\\n encode metadata by itself, so now we do it in Companion.\\n- Switched from aws-sdk v2 to @aws-sdk/\\\\* v3\\n- Upgraded Grant dependency\\n- We now send expire info for non-multipart uploads and added connection\\n keep-alive to Dropbox to improve connection stability\\n- Merged Provider and SearchProvider internal remote source classes.\\n- Increased max limits for remote file list operations and fixed part listing in\\n S3\\n\\n## Url\\n\\nWe\u2019ve upgraded the Url plugin to use `filename` from `Content-Disposition`\\nheader of the file you are importing, instead of relying on the url (but kept\\nthe latter as a fallback) (#4489). So now your files have proper names instead\\nof `noname`.\\n\\n\\"Uppy\\n\\n## Dashboard and Status Bar\\n\\nSingle File Mode has been improved to adapt to height of less than 400px \u2014 the\\nUI turns back to grid in this case. We are also not using `fit: cover` anymore\\nto avoid cropping important parts of the image:\\n\\n\\"Uppy\\n\\nWe\u2019ve also added an option to disable the Single File mode, as it can be\\nunwanted in certain use cases:\\n[`singleFileFullScreen`](https://uppy.io/docs/dashboard/#singlefilefullscreen).\\n\\nIf you wrapped Uppy Dashboard in a `
` element, it could be accidentally\\nsubmitted when a user pressed Enter to save meta fields or entering urls. Now\\nwe\u2019ve\\n[added a `form=\\"\\"` attribute, connected to an empty ``](https://github.com/transloadit/uppy/pull/4283)\\nin document root to prevent the outer form from being submitted.\\n\\nA bug has been fixed that allowed clicking on buttons and links in Dashboard\\n[disabled mode](https://uppy.io/docs/dashboard/#disabled).\\n\\nRange selection of remote files has been fixed, you can now shift+click to\\nselect multiple files again. We\u2019ve added the `VirtualList` component which is\\nalready used in Uppy \u201cselected files\u201d screen to remote file lists. So now\\nscrolling through 10k+ files is breeze \ud83c\udf2c\ufe0f\\n\\n\\"Dashboard\\n\\n### Status Bar\\n\\n- Fixed ETA when Uppy recovers its state.\\n- Remove throttled component to fix a bug where state would become shared\\n between multiple status bars on a page.\\n\\n## Locales\\n\\nWe\u2019ve added support for Hindi and Mexican Spanish. French, Spanish and Chinese\\nlocales have been improved.\\n\\n## Uploaders\\n\\n- Fixed an issue where sockets were opened right away, ignoring the\\n `RateLimitedQueue`, which led to bugs in all plugins that handle remote\\n uploads. Additionally, when file is removed (or all are canceled), we call\\n `controller.abort` on queued requests.\\n- Fixed a bug with sockets being closed, while the upload was still in progress.\\n- In XHR Upload we\u2019ve added support for arrays in metadata and an\\n `\'upload-stalled\'` event.\\n\\n## Miscellaneous\\n\\n- `@uppy/golden-retriever` has been refactored refactor to modernize the\\n codebase.\\n- We\u2019ve switched more non-critical errors to warnings.\\n- Improved fallbacks for the drag & drop API.\\n- The React Native example has been modernized and updated.\\n- `uppy.resetProgress()` in Core has been fixed.\\n\\nWe hope you\u2019ve enjoyed this update posts and all the fixes and features we\u2019ve\\nworked on! As always, please see the full changelog on GitHub:\\n[3.4.0 \u2014 3.13.0](https://github.com/transloadit/uppy/compare/uppy%403.4.0...uppy%403.13.0)."},{"id":"/2023-05-new-website","metadata":{"permalink":"/blog/2023-05-new-website","editUrl":"https://github.com/transloadit/uppy.io/tree/main/blog/2023-05-new-website.md","source":"@site/blog/2023-05-new-website.md","title":"New Uppy.io and docs","description":"We are excited to announce that our new website, documentation and blog are now","date":"2023-05-10T00:00:00.000Z","formattedDate":"May 10, 2023","tags":[],"readingTime":1.08,"hasTruncateMarker":false,"authors":[{"email":"merlijn@transloadit.com","name":"Merlijn Vos","id":"merlijn","tagline":"Developer","imageURL":"https://github.com/murderlon.png","key":"murderlon"},{"email":"artur@transloadit.com","name":"Artur Paikin","id":"artur","tagline":"Developer","imageURL":"https://github.com/arturi.png","key":"arturi"},{"email":"antoine@transloadit.com","name":"Antoine du Hamel","id":"aduh95","tagline":"Developer","imageURL":"https://github.com/aduh95.png","key":"aduh95"}],"frontMatter":{"title":"New Uppy.io and docs","date":"2023-05-10T00:00:00.000Z","authors":["murderlon","arturi","aduh95"],"image":"/img/blog/new-website/homepage.png","published":true},"unlisted":false,"prevItem":{"title":"Uppy 3.3 to 3.13: conditional S3 multipart, signing on the client, speedy handling of 10k files and much much more","permalink":"/blog/2023/07/3.3-3.13"},"nextItem":{"title":"\ud83c\udf84 Uppy 3.1-3.3: Improved AWS S3 Multipart, Single File Mode","permalink":"/blog/2022/12/3.3"}},"content":"\\"Screenshot\\n\\nWe are excited to announce that our new website, documentation and blog are now\\nlive out of beta, ready for you to enjoy on [Uppy.io](https://uppy.io)! Let us\\nknow what you think [on twitter](https://twitter.com/uppy_io).\\n\\nThe first iteration of the Uppy website was built by Artur and Kevin over 7\\nyears ago, using [Hexo](https://hexo.io/) static site generator as a base. It\\nserved us well, but over time Hexo got less maintained, our docs more messy, and\\nquite a few places were collecting dust.\\n\\nAbout a year ago Merlijn set on a task to refresh the Uppy documentation\\nexperience, rewriting most of the docs from the ground up, with everyone on the\\nteam contributing in their area of Uppy knowledge.\\n[Docusaurus](https://docusaurus.io/) \ud83e\udd95 was chosen as one of the top modern\\ntools for documentation.\\n\\n![Screenshot of the Uppy website showing a documentation page with new design](/img/blog/new-website/dashboard-docs.png)\\n\\nMost of the plugin\u2019s docs now explain when you should use it (and sometimes when\\nnot), followed by how to install, tips and details and links to CodeSandbox\\nsamples.\\n\\nAnd for desert, we now have a swift website-wide search in the top bar, powered\\nby [Algolia](https://www.algolia.com), give it a go!\\n\\n![Screenshot of the Uppy website showing the search interface](/img/blog/new-website/search.png)\\n\\nEnjoy the new [uppy.io](https://uppy.io)!"},{"id":"2022/12/3.3","metadata":{"permalink":"/blog/2022/12/3.3","editUrl":"https://github.com/transloadit/uppy.io/tree/main/blog/2022-12-3.3.md","source":"@site/blog/2022-12-3.3.md","title":"\ud83c\udf84 Uppy 3.1-3.3: Improved AWS S3 Multipart, Single File Mode","description":"\ud83c\udf85\ud83d\udc36 Ho-ho-ho, we are about to wrap up another year for Uppy! Three minor","date":"2022-12-23T00:00:00.000Z","formattedDate":"December 23, 2022","tags":[],"readingTime":2.48,"hasTruncateMarker":true,"authors":[{"email":"antoine@transloadit.com","name":"Antoine du Hamel","id":"aduh95","tagline":"Developer","imageURL":"https://github.com/aduh95.png","key":"aduh95"},{"email":"artur@transloadit.com","name":"Artur Paikin","id":"artur","tagline":"Developer","imageURL":"https://github.com/arturi.png","key":"arturi"},{"email":"mikael@transloadit.com","name":"Mikael Finstad","id":"mikael","tagline":"Developer","imageURL":"https://github.com/mifi.png","key":"mifi"},{"email":"merlijn@transloadit.com","name":"Merlijn Vos","id":"merlijn","tagline":"Developer","imageURL":"https://github.com/murderlon.png","key":"murderlon"}],"frontMatter":{"title":"\ud83c\udf84 Uppy 3.1-3.3: Improved AWS S3 Multipart, Single File Mode","date":"2022-12-23T00:00:00.000Z","authors":["aduh95","arturi","mifi","murderlon"],"image":"https://uppy.io/img/blog/3.1-3.3/dashboard-christmas.jpg","published":true,"slug":"2022/12/3.3"},"unlisted":false,"prevItem":{"title":"New Uppy.io and docs","permalink":"/blog/2023-05-new-website"},"nextItem":{"title":"Uppy 3.0: Future-proof, conveniently easy, stable as ever","permalink":"/blog/2022/09/3.0"}},"content":"![](/img/blog/3.1-3.3/dashboard-christmas.jpg)\\n\\n\ud83c\udf85\ud83d\udc36 Ho-ho-ho, we are about to wrap up another year for Uppy! Three `minor`\\nreleases ago we\u2019ve introduced Uppy 3.0. It\u2019s time to give you an update on\\nwhat\u2019s been cooking in the Uppy-Transloadit headquarters (besides cranberry\\nsauce) for the past couple of months.\\n\\nIn short: AWS S3 Multipart stability improvements, Single File Mode for the\\nDashboard, more tests and bugfixes, new locales.\\n\\n\x3c!--truncate--\x3e\\n\\n## Safer AWS S3 Multipart uploads on slow connections\\n\\n`@uppy/aws-s3-multipart` has been serving well for people who prefer a\\n_client-to_s3_ setup with Uppy. However, some uploads could occasionally fail in\\npoor network conditions. It turned out, simultaneously signing and uploading\\nmany chunks at once saturated the HTTP/1.1 connection limit, which lead to\\nsignatures expiring by the time Uppy started uploading the next chunk.\\n\\nWe\u2019ve refactored our internal queue mechanism to sign chunks right before we\\nbegin uploading them to the remote server. When the upload is paused, the queue\\nis emptied and re-populated again on resume. The default `limit` for this plugin\\nhas been set to `6` and the default S3 signature expiry has been lifted from\\n`300` to `800` seconds.\\n\\n## Single File Mode\\n\\nOften times people only want to upload a single file (most commonly an image)\\nvia Uppy. But the Dashboard UI is tailored to handling many files at once, and\\nit used to display the single image as a small, sad-looking block in the corner.\\nThis ends now! (Actually, it ended a few releases ago, figure of speech).\\n\\n\\n\\nWith only one file selected, we\u2019ll display it large and centered, and make sure\\nto re-generate the image preview so it\u2019s `600px` wide, looking nice and sleek on\\nmodern displays.\\n\\nSee [PR #4188](https://github.com/transloadit/uppy/pull/4188) for more\\nscreenshots.\\n\\n## Bug fixes and Upgrades\\n\\nWe\u2019ve upgraded Typescript to `v4.8` and Jest to `v29`, among other tools and\\npackages.\\n\\nWe are now additionally testing that Uppy packages are correctly bundled with\\nthe latest Rollup, Webpack, Parcel, Vite, and ESBuild.\\n\\nNotable bug fixes:\\n\\n- XHR Upload: Queue requests for socket token for remote files\\n- Core: Prevent crashes when a file is removed before the upload starts\\n- Golden Retriever: Fixed upload retries\\n- AWS S3 and XHR Upload: Fixed Cannot mark a queued request as done in\\n MiniXHRUpload\\n- Webcam: Set default videoConstraints\\n- Image Editor: Fix controls in small Dashboard\\n\\nSee the full list in the\\n[changelog](https://github.com/transloadit/uppy/blob/main/CHANGELOG.md).\\n\\n## Companion\\n\\nAnd of course, this festive season we are not forgetting Companion under the\\ntree:\\n\\n- Throttle progress by time\\n- Added workaround for S3 accelerated endpoints\\n- Send expire info for non-multipart uploads\\n- Send expiry time alongside S3 signed requests\\n- Added support for AbortSignal\\n- Prevent preflight race condition\\n\\n## Locales\\n\\nUzbek language pack was added, while Polish and Ukrainian language packs were\\nupdated.\\n\\n---\\n\\nThat\u2019s it for our updates! Stay tuned for more in 2023 and happy holidays (if\\nyou are celebrating)! Cheers. In the meantime, we are driving home, driving home\\nfor Christmas. Yeah.\\n\\n![](/img/blog/3.1-3.3/driving-home.gif)"},{"id":"2022/09/3.0","metadata":{"permalink":"/blog/2022/09/3.0","editUrl":"https://github.com/transloadit/uppy.io/tree/main/blog/2022-09-3.0.md","source":"@site/blog/2022-09-3.0.md","title":"Uppy 3.0: Future-proof, conveniently easy, stable as ever","description":"Screenshot of Uppy 3.0.0 UI","date":"2022-09-13T00:00:00.000Z","formattedDate":"September 13, 2022","tags":[],"readingTime":6.68,"hasTruncateMarker":true,"authors":[{"email":"antoine@transloadit.com","name":"Antoine du Hamel","id":"aduh95","tagline":"Developer","imageURL":"https://github.com/aduh95.png","key":"aduh95"},{"email":"artur@transloadit.com","name":"Artur Paikin","id":"artur","tagline":"Developer","imageURL":"https://github.com/arturi.png","key":"arturi"},{"email":"mikael@transloadit.com","name":"Mikael Finstad","id":"mikael","tagline":"Developer","imageURL":"https://github.com/mifi.png","key":"mifi"},{"email":"merlijn@transloadit.com","name":"Merlijn Vos","id":"merlijn","tagline":"Developer","imageURL":"https://github.com/murderlon.png","key":"murderlon"}],"frontMatter":{"title":"Uppy 3.0: Future-proof, conveniently easy, stable as ever","date":"2022-09-13T00:00:00.000Z","authors":["aduh95","arturi","mifi","murderlon"],"image":"https://uppy.io/img/blog/3.0/uppy-3-0.jpg","published":true,"slug":"2022/09/3.0"},"unlisted":false,"prevItem":{"title":"\ud83c\udf84 Uppy 3.1-3.3: Improved AWS S3 Multipart, Single File Mode","permalink":"/blog/2022/12/3.3"},"nextItem":{"title":"Uppy 2.4-2.7: Image Compressor, Transloadit Rate Limiting, ESM","permalink":"/blog/2022/03/2.4-2.7"}},"content":"![Screenshot of Uppy 3.0.0 UI](/img/blog/3.0/uppy-3-0.jpg)\\n\\n> For those new to Uppy, coming from Reddit, Hacker News and Product Hunt today:\\n> Uppy is a popular open source file uploader for the browser. Pick files from\\n> local disk or camera, remote sources like Instagram, Unsplash, Dropbox etc,\\n> record audio and screencasts. Crop and tweak images with the image editor\\n> plugin. Supports resumable uploads to a tus.io server, AWS S3 (and many others\\n> with similar API like DigitalOcean), multipart.\\n> [Try it](https://uppy.io/examples/dashboard)!\\n\\nUppy is turning three! When you\u2019re counting in\\n[dog years](https://www.akc.org/expert-advice/health/how-to-calculate-dog-years-to-human-years/)\\n\u2013 which we most certainly are \u2013 that\u2019s 29 already. An age like that signifies\\nproper adulthood. For Uppy, this means it\u2019s ready to stay loyal, but without the\\nsilly mistakes (read: bugs). Uppy also underwent (ESM) surgery to keep it\\nstrolling by your side in the current ecosystem, and received other behavioral\\nimprovements \ud83d\udc36\\n\\n\x3c!--truncate--\x3e\\n\\nTL;DR: ESM transition, native mobile camera, new Remote Sources plugin, sweeping\\nCompanion rewrite and streaming support, `async`/`await` everything, React 18\\nand Vue 3 support, all examples rewritten.\\n\\n## ESM surgery\\n\\n[ECMAScript Modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules)\\n(ESM) are the future and we\u2019re ready to adopt it. Benefits over CommonJS\\ninclude: improved security, better tree shaking, and a syntax that can be\\nunderstood natively by browsers, which can greatly improve the DX if the tools\\nare configured to take advantage of that.\\n\\nFollowing in the footsteps of many other packages, we now only ship Uppy core\\nand its plugins as ESM. For Uppy 2.x, we were shipping CommonJS.\\n\\nIf you are already using ESM or the CDN builds, nothing changes for you! If you\\nare using CommonJS, you may have to add extra tooling for everything to work, or\\nconsider refactoring your codebase to ESM. Please refer to the\\n[Pure ESM package gist](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c)\\nfor more information and help on how to do that.\\n\\n## Less integration code with the new remote sources preset\\n\\nWe\u2019ve introduced a new Uppy preset plugin,\\n[`@uppy/remote-sources`](/docs/remote-sources), which combines Instagram,\\nFacebook, Google Drive, Box, Unsplash, Dropbox, One Drive, Zoom and any other\\nremote cloud sources that Uppy will support in the future. The plugin only works\\nwith Dashboard and allows you to enable all the above sources in a single line.\\n\\nBefore, you had to manually include every cloud provider / remote source:\\n\\n```js\\nuppy\\n\\t.use(Instagram, {\\n\\t\\tcompanionUrl: COMPANION_URL,\\n\\t\\tcompanionAllowedHosts: COMPANION_ALLOWED_HOSTS,\\n\\t})\\n\\t.use(GoogleDrive, {\\n\\t\\tcompanionUrl: COMPANION_URL,\\n\\t\\tcompanionAllowedHosts: COMPANION_ALLOWED_HOSTS,\\n\\t})\\n\\t.use(OneDrive, {\\n\\t\\tcompanionUrl: COMPANION_URL,\\n\\t\\tcompanionAllowedHosts: COMPANION_ALLOWED_HOSTS,\\n\\t})\\n\\t.use(Instagram, {\\n\\t\\tcompanionUrl: COMPANION_URL,\\n\\t\\tcompanionAllowedHosts: COMPANION_ALLOWED_HOSTS,\\n\\t})\\n\\t.use(Facebook, {\\n\\t\\tcompanionUrl: COMPANION_URL,\\n\\t\\tcompanionAllowedHosts: COMPANION_ALLOWED_HOSTS,\\n\\t})\\n\\t.use(Unsplash, {\\n\\t\\tcompanionUrl: COMPANION_URL,\\n\\t\\tcompanionAllowedHosts: COMPANION_ALLOWED_HOSTS,\\n\\t});\\n// ...\\n```\\n\\nAfter:\\n\\n```js\\nuppy.use(RemoteSources, { companionUrl: COMPANION_URL });\\n```\\n\\nTo get started, check out the [`RemoteSources` docs](/docs/remote-sources).\\n\\n## Robodog ends its service\\n\\nUppy is flexible and extensible through plugins, but the integration code could\\nsometimes prove daunting. This is what brought [Robodog](/docs/robodog/) to\\nlife. It served as an alternative with the same features, but with a more\\nergonomic and minimal API.\\n\\nIt did, however, come with its own set of new problems:\\n\\n- Robodog tries to do the exact same thing as Uppy, but looks like an entirely\\n different product.\\n- Users are faced with a confusing choice between using Robodog or using Uppy\\n directly.\\n- Robodog is more ergonomic because it\u2019s limited. When hitting such a limit, the\\n user has to refactor everything to Uppy using plugins.\\n\\nThis has now led us to deprecating Robodog and embracing Uppy for its strong\\nsuits: modularity and flexibility. At the same time, we\u2019re also introducing\\nsomething to take away some of the repetitive integration code:\\n[`@uppy/remote-sources`](/docs/remote-sources).\\n\\nAre you using Robodog in your code base? You can check out the\\n[migration guide](https://uppy.io/docs/guides/migration-guides/#migrate-from-robodog-to-uppy-plugins)\\nto see how you can transition to Uppy plugins without losing functionality. We\\nhave committed ourselves to extending Robodog support for one year to give our\\nusers more time to migrate.\\n\\n## Native mobile camera\\n\\nAs you are probably aware, Uppy\u2019s Webcam plugin provides a nice UI for desktop\\ndevices to take pictures and record videos. Up until 3.0, the same UI was\\nutilized on mobile as well.\\n\\nSince most mobile devices have a system UI for taking pictures and recording\\nvideos \u2013 which is usually better than any custom solution we can offer \u2013 we\u2019ve\\nintroduced a new option called `mobileNativeCamera` for the Webcam plugin:\\n\\n```js\\nuppy.use(Webcam, {\\n\\tmobileNativeCamera: isMobile({ tablet: true }),\\n});\\n```\\n\\nBy default, it uses the [`is-mobile`](https://github.com/juliangruber/is-mobile)\\npackage to detect mobile devices, like smartphones and tablets, but you can\\nmanually set this option to `true` or `false` if you wish. When enabled, instead\\nof the usual Camera/Webcam Uppy UI, users will be presented with buttons that\\nopen their device\u2019s native camera interface:\\n\\n![Uppy native camera UI](/img/blog/3.0/native-camera.jpg)\\n\\n[`videoConstraints.facingMode`](/docs/webcam/#videoConstraints) is also\\nsupported by this option via the\\n[`capture`](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/capture)\\nattribute (in the browsers and devices that respect it).\\n\\n```js\\nuppy.use(Webcam, {\\n\\tvideoConstraints: {\\n\\t\\tfacingMode: \'user\',\\n\\t},\\n});\\n```\\n\\nThe same applies to [`modes`](/docs/webcam/#modes), allowing you to enable only\\nvideo or only photos.\\n\\n## Devotedly stable\\n\\nSince the Uppy 2.7.0 release, **we\u2019ve fixed over 95 bugs!** This includes fixes\\nto bugs that made uploading less stable, documentation corrections, and\\ndependency upgrades.\\n\\n## Companion turns 4.0\\n\\nEveryone\u2019s favorite Companion also received some love.\\n\\n### Streaming upload\\n\\nStreaming upload can now also be enabled in Companion when using Tus. This comes\\nwith greatly improved upload speeds and allows uploading up to hundreds of\\ngigabytes without needing a large server storage. We found that this improves\\nspeeds by about 37% for a Google Drive upload of a 1 GB file\\n([source](https://github.com/transloadit/uppy/pull/4046#issuecomment-1235697937)).\\nThis feature was also available before Companion 4.0, but it didn\u2019t work with\\nTus until now.\\n\\nWith streaming upload disabled (default), the whole file will be downloaded\\nfirst. The upload will then start when the download has completely finished.\\n\\nWhen streaming upload is enabled, Companion will start downloading the file from\\nthe provider (such as Google Drive), while at the same time starting the upload\\nto the destination (such as Tus), and sending every chunk of data consecutively.\\n\\nFor more information, see the [Companion docs](/docs/companion/).\\n\\n### Event emitter\\n\\nCompanion now has a server-side event emitter that can be used to detect when\\nuploads start, finish and fail, without having to depend on the client (so it\\nworks even when users have closed their browser).\\n\\nExample code:\\n\\n```js\\nconst { app, emitter } = companion.app(options);\\n\\nemitter.on(\'upload-start\', ({ token }) => {\\n\\tconsole.log(\'Upload started\', token);\\n\\n\\tfunction onUploadEvent({ action, payload }) {\\n\\t\\tif (action === \'success\') {\\n\\t\\t\\temitter.off(token, onUploadEvent); // avoid listener leak\\n\\t\\t\\tconsole.log(\'Upload finished\', token, payload.url);\\n\\t\\t} else if (action === \'error\') {\\n\\t\\t\\temitter.off(token, onUploadEvent); // avoid listener leak\\n\\t\\t\\tconsole.error(\'Upload failed\', payload);\\n\\t\\t}\\n\\t}\\n\\temitter.on(token, onUploadEvent);\\n});\\n```\\n\\n### Internal improvements\\n\\nCompanion\u2019s internal request code and Providers have been rewritten to\\n`async`/`await`, which has greatly simplified and reduced the amount of code.\\nThis will lead to less bugs and security issues, and make it easier to implement\\nnew custom Providers.\\n\\nWe have also replaced the deprecated\\n[`request`](https://github.com/request/request) library with\\n[`got`](https://github.com/sindresorhus/got). This also removed the need for\\n[`purest`](https://github.com/simov/purest).\\n\\n### And more!\\n\\n- [Compressor](/docs/compressor) is officially stable. The Compressor plugin for\\n Uppy optimizes images (JPEG, PNG), saving on average up to 60% in size. It has\\n proven itself through extensive battle testing.\\n- [AWS S3 Multipart](/docs/aws-s3-multipart) also became more stable this\\n release, as a result of us hammering out some of the last edge cases with lots\\n of files and/or huge files.\\n- React 18 is now supported in [`@uppy/react`](/docs/react), Vue 3 is supported\\n for [`@uppy/vue`](/docs/vue), and Angular 14 for\\n [`@uppy/angular`](/docs/angular).\\n- Our [examples](https://github.com/transloadit/uppy/tree/main/examples) have\\n received a fresh round of updates to keep them relevant.\\n\\n---\\n\\n![Animate picture of a visibly happy dog getting a head massage](/img/blog/3.0/dog-enjoys.gif)\\n\\nFor more details, see the full\\n[changelog](https://github.com/transloadit/uppy/blob/HEAD/CHANGELOG.md#1300) and\\nthe [migration guide](/docs/migration-guides.html).\\n\\nThat\u2019s it from us for now! As you can see, Uppy may be slowly turning into an\\nold dog, but we\u2019re still committed to keep teaching it new tricks. We hope\\nyou\u2019ll enjoy this latest major release, and all the features and improvements it\\nincludes. We can\u2019t wait to hear your thoughts about it on\\n[Twitter](https://twitter.com/uppy_io)!"},{"id":"2022/03/2.4-2.7","metadata":{"permalink":"/blog/2022/03/2.4-2.7","editUrl":"https://github.com/transloadit/uppy.io/tree/main/blog/2022-03-2.4-2.7.md","source":"@site/blog/2022-03-2.4-2.7.md","title":"Uppy 2.4-2.7: Image Compressor, Transloadit Rate Limiting, ESM","description":"We\u2019re always looking for opportunities to teach Uppy cool new tricks, and the","date":"2022-03-11T00:00:00.000Z","formattedDate":"March 11, 2022","tags":[],"readingTime":3.32,"hasTruncateMarker":true,"authors":[{"email":"antoine@transloadit.com","name":"Antoine du Hamel","id":"aduh95","tagline":"Developer","imageURL":"https://github.com/aduh95.png","key":"aduh95"},{"email":"artur@transloadit.com","name":"Artur Paikin","id":"artur","tagline":"Developer","imageURL":"https://github.com/arturi.png","key":"arturi"},{"email":"mikael@transloadit.com","name":"Mikael Finstad","id":"mikael","tagline":"Developer","imageURL":"https://github.com/mifi.png","key":"mifi"},{"email":"merlijn@transloadit.com","name":"Merlijn Vos","id":"merlijn","tagline":"Developer","imageURL":"https://github.com/murderlon.png","key":"murderlon"}],"frontMatter":{"title":"Uppy 2.4-2.7: Image Compressor, Transloadit Rate Limiting, ESM","date":"2022-03-11T00:00:00.000Z","authors":["aduh95","arturi","mifi","murderlon"],"image":"https://uppy.io/img/blog/2.4-2.7/compressor.jpg","published":true,"slug":"2022/03/2.4-2.7"},"unlisted":false,"prevItem":{"title":"Uppy 3.0: Future-proof, conveniently easy, stable as ever","permalink":"/blog/2022/09/3.0"},"nextItem":{"title":"\ud83c\udf84 Uppy 2.1-2.3: Audio plugin, fast and efficient streaming for Companion, production-ready Unsplash, and more","permalink":"/blog/2021/12/2.1-2.3"}},"content":"We\u2019re always looking for opportunities to teach Uppy cool new tricks, and the\\npast few months have been no exception. Since our\\n[most recent post](https://uppy.io/blog/2021/12/2.1-2.3/) in December, Uppy has\\ncontinued to receive a steady stream of updates. This post covers all the\\nimprovements made in Uppy versions 2.4 through 2.7. Changes and additions\\ninclude: image compression, improved Transloadit rate limiting and a lighter\\nDashboard plugin. We\u2019ve also moved our end-to-end tests to Cypress, and are\\nslowly converting plugins to ES modules (ESM).\\n\\n\\"Uppy\\n\\n\x3c!--truncate--\x3e\\n\\n## Compressor\\n\\nSome of the most commonly uploaded files on the internet are images \u2014 photos,\\nstock images, screenshots, and documents scans. Uppy now includes a new plugin\\ncalled `@uppy/compressor` that optimizes images (JPEG, PNG), saving on average\\nup to 60% in size (roughly 18 MB for 10 images). It uses\\n[Compressor.js](https://github.com/fengyuanchen/compressorjs) under the hood.\\n\\n[Read the docs](https://uppy.io/docs/compressor/) and\\n[try Compressor in action](https://uppy.io/examples/dashboard/).\\n\\n```js\\nimport Uppy from \'@uppy/core\';\\nimport Compressor from \'@uppy/compressor\';\\n\\nconst uppy = new Uppy();\\nuppy.use(Compressor);\\n```\\n\\n`@uppy/compressor` is also the first plugin that we are releasing as ESM,\\nbackwards compatible as CJS, to test out how this works. Please report any\\nissues.\\n\\n## Hosted Companion custom credentials\\n\\nIt cannot be overstated that our\\n[Transloadit-hosted](https://transloadit.com/docs/sdks/uppy/)\\n[Companion Plugin](https://uppy.io/docs/companion/) is the easiest secure way to\\nallow your users pick files from cloud sources like Google Drive, Instagram,\\nBox, etc. via Uppy. Up until now, however, that meant your users had to\\nauthenticate their cloud account with Transloadit, preventing you from showing\\nyour own logo instead. That has now been fixed! Head to `Transloadit Console` /\\n`Credentials`, scroll down to `Third-party Credentials`, click on\\n`Add new Credentials`, select `Companion OAuth`, and voil\xe0!\\n\\n\\"Transloadit\\n\\nTry it out with the\\n[free Transloadit Community Plan \u2014 5GB / month and access to Companion](https://transloadit.com/pricing/).\\n\\n## Transloadit rate limiting\\n\\nWe\u2019ve added rate limiting to Transloadit\\n[assembly creation and status polling](https://github.com/transloadit/uppy/pull/3429),\\nand [tus retries](https://github.com/transloadit/uppy/pull/3394):\\n\\n> When the remote server responds with HTTP 429, all requests are paused for a\\n> while in the hope that it can resolve the rate limiting. Failed requests are\\n> now also queued up after the retry delay. Before, they were scheduled for\\n> retry without being queued up, which would sometimes end up overflowing the\\n> limit option.\\n\\nAs a result of this change, uploading many files at once has become even more\\nrobust.\\n\\n## Move to ESM\\n\\nThe JavaScript ecosystem is moving towards ESM, and we want to follow suit. We\\nare slowly starting to adopt ESM in Uppy packages. To do so, we integrated a\\nplugin into our build system that transpiles ESM source code to CommonJS syntax,\\nwhich is distributed with the npm package. Nothing will change on your end,\\nthough \u2013 we know that not everyone is using tooling that support ESM, so we\u2019re\\nholding on to CommonJS for the time being. Our plan is to refactor all official\\nUppy plugins to ESM before Uppy 3.0 is released, and drop CommonJS in favor of\\nESM in the npm packages at that point.\\n\\nFor details, see [PR 3468](https://github.com/transloadit/uppy/pull/3468).\\n\\n## End to end: move to Cypress\\n\\nUppy has had end to end from the start, but the developer experience was less\\nthan ideal with custom Webdriver.io + Selenium. The transition to\\n[Cypress](https://github.com/transloadit/uppy/pull/3444) allows us to write\\ntests with ease and comfort, backed by great documentation.\\n\\n## Lighter Bundle\\n\\nWe continue to look for ways to reduce Uppy\u2019s bundle size and modernize our\\nbuild toolchain. This time, we\u2019ve replaced the\\n[Exifr.js](https://github.com/exif-js/exif-js) legacy bundle with the modern one\\nwithout IE polyfills. Our Browserify bundler has been replaced with a modern and\\nmore efficient ESBuild.\\n\\n## Companion improvements\\n\\n- Improved private IP check (#3403)\\n- Implement periodic ping functionality (#3246)\\n- Fix broken thumbnails for Box and Dropbox (#3460)\\n- Fix unpslash author meta, sanitize metadata to strings and improve Companion\\n tests (#3478)\\n\\nThat\u2019s it for today! See the full\\n[changelog](https://github.com/transloadit/uppy/blob/master/CHANGELOG.md#1300)\\nfor more details."},{"id":"2021/12/2.1-2.3","metadata":{"permalink":"/blog/2021/12/2.1-2.3","editUrl":"https://github.com/transloadit/uppy.io/tree/main/blog/2021-12-2.1-2.3.md","source":"@site/blog/2021-12-2.1-2.3.md","title":"\ud83c\udf84 Uppy 2.1-2.3: Audio plugin, fast and efficient streaming for Companion, production-ready Unsplash, and more","description":"Last Christmas, we gave you Uppy 1.24, but","date":"2021-12-15T00:00:00.000Z","formattedDate":"December 15, 2021","tags":[],"readingTime":5.075,"hasTruncateMarker":true,"authors":[{"email":"antoine@transloadit.com","name":"Antoine du Hamel","id":"aduh95","tagline":"Developer","imageURL":"https://github.com/aduh95.png","key":"aduh95"},{"email":"artur@transloadit.com","name":"Artur Paikin","id":"artur","tagline":"Developer","imageURL":"https://github.com/arturi.png","key":"arturi"},{"email":"mikael@transloadit.com","name":"Mikael Finstad","id":"mikael","tagline":"Developer","imageURL":"https://github.com/mifi.png","key":"mifi"},{"email":"merlijn@transloadit.com","name":"Merlijn Vos","id":"merlijn","tagline":"Developer","imageURL":"https://github.com/murderlon.png","key":"murderlon"}],"frontMatter":{"title":"\ud83c\udf84 Uppy 2.1-2.3: Audio plugin, fast and efficient streaming for Companion, production-ready Unsplash, and more","date":"2021-12-15T00:00:00.000Z","authors":["aduh95","arturi","mifi","murderlon"],"image":"https://uppy.io/img/blog/2.1-2.3/audio-cover.jpg","published":true,"slug":"2021/12/2.1-2.3"},"unlisted":false,"prevItem":{"title":"Uppy 2.4-2.7: Image Compressor, Transloadit Rate Limiting, ESM","permalink":"/blog/2022/03/2.4-2.7"},"nextItem":{"title":"Uppy 2.0.0: smaller, faster, modular plugins, Preact X, stricter types, and much more","permalink":"/blog/2021/08/2.0"}},"content":"\x3c!--retext-simplify ignore very--\x3e\\n\\nLast Christmas, we gave you [Uppy 1.24](https://uppy.io/blog/2020/12/1.24/), but\\nthis very next year, we\u2019ll take it away (since it\u2019s outdated by now) and give\\nyou a brand-new Uppy 2.3 \ud83c\udf81!\\n\\nAfter the [release](https://uppy.io/blog/2021/08/2.0/) of our latest major\\nversion, 2.0.0, we\u2019ve been busy with many things. First of all is the\\nlong-awaited Audio plugin to record and upload live audio directly. We then\\nworked on adding a fast and efficient streaming interface to Companion and made\\nUnsplash production ready. Housekeeping was also part of the job: we made Status\\nBar improvements, moved from npm to Yarn 3, did some refactoring, and updated\\ndependencies.\\n\\nLast but not least, we got the issue count down from around 110 since 2.0.0 to\\naround 45 now.\\n\\n\x3c!--truncate--\x3e\\n\\n## Audio plugin\\n\\nUppy now has a new `@uppy/audio` plugin for recording audio memos, sounds,\\njingling bells, Christmas carols, and all your holiday cheer. Check it out on\\nthe [demo page](https://uppy.io/examples/dashboard/).\\n\\n\\n\\n## `@uppy/unsplash` is now production ready\\n\\nThe Unsplash plugin has received an update, providing attribution to the image\\nauthors and adding some polish to make it look better. Being fully brand\\ncompliant with Unsplash means it\u2019s now production ready. You can demo the plugin\\non the [website](https://uppy.io/examples/dashboard) or read the\\n[docs](https://uppy.io/docs/unsplash/).\\n\\n## New streaming interface for Companion\\n\\n[Companion][companion] handles the server-to-server communication between your\\nserver and file storage providers such as Google Drive, Dropbox, Instagram, and\\nthe like. This bypasses the client (so a 5 GB video isn\u2019t eating into your\\nusers\u2019 data plans) and files are directly uploaded to the final destination.\\nCompanion is made to be effortlessly integrate-able with Uppy.\\n\\nIt used to work by downloading the requested file from a remote provider on the\\nserver to then start uploading it to the destination. This did the job, but it\u2019s\\nwasn\u2019t ideal.\\n\\nWe now built streaming support into Companion, which means the download and\\nupload can happen simultaneously. This can result in **two times faster\\nuploads**, because we no longer have to wait for files to finish downloading\\nbefore starting the upload process. It\u2019s especially useful for large files and\\nremoves the need for a lot of storage space on the server, as data will be\\nbuffered in memory.\\n\\nYou can enable this by setting `streamingUpload` in the Companion\\n[options](https://uppy.io/docs/companion/#Options).\\n\\n**NOTE:** Streaming is turned off by default. Do not turn it on yet if you\u2019re\\nusing TUS for uploads, due to\\n[this tus-js-client bug](https://github.com/tus/tus-js-client/issues/275).\\n\\nInterested in using Companion? You can use Transloadit-hosted Companion on every\\n[Plan](https://transloadit.com/pricing/).\\n\\n## Status Bar error state improvements\\n\\nThe Status Bar plugin would get confused about upload errors in Uppy, and we\u2019ve\\naddressed this:\\n\\n- The error state is now shown in case of only _one_ failed file instead of\\n _all_ failed files. The plugin used to get stuck in the uploading state when a\\n single file failed.\\n- Added \u201cX of X files uploaded\u201d below \u201cUpload failed\u201d for extra context.\\n- Improved the error details button styling in the Status Bar and the file info\\n card.\\n- Status Bar state is set to complete if the user manually removes the failed\\n files.\\n\\n![status bar improvements screenshot](/img/blog/2.1-2.3/status-bar-improvements.jpg)\\n\\n## Internal housekeeping\\n\\n### Yarn v3 instead of npm\\n\\nWe\u2019ve switched the Uppy repo to Yarn 3 to improve package install performance.\\nWith our complex dependency graph and over thirty packages in a monorepo, we are\\nseeing install times reduced by more than a few minutes!\\n\\nWe are using [Corepack](https://github.com/nodejs/corepack) to make sure all\\nUppy contributors are using the same version of Yarn. If you are an Uppy\\ncontributor, please run the following commands to enable Corepack:\\n\\n```sh\\ncorepack -v || npm i -g corepack # install Corepack if not already installed\\nyarn -v || corepack enable # install Yarn through Corepack if not already installed\\nyarn || corepack yarn install # install npm dependencies using yarn\\n```\\n\\n[View the PR](https://github.com/transloadit/uppy/pull/3237)\\n\\n### Refactor locale scripts & generate types and docs\\n\\nThis is an internal change, but important nonetheless. Our locales now live in a\\nseparate `locale.js` file for every plugin instead of `this.defaultLocale` in\\nthe class. The docs and types are automatically updated when we add or remove\\nnew locale strings.\\n\\n[View the PR](https://github.com/transloadit/uppy/pull/3276).\\n\\n### Automated release scripts\\n\\nA lot of things need to happen when we\u2019re publishing a new release. A complete\\nredo of the automation script is now available for quick and secure releases.\\n\\nHere are some highlights:\\n\\n- Releaser runs `yarn release` and will get a series of\\n [prompts](https://github.com/terkelg/prompts) to set up a release.\\n- A changelog will be generated.\\n- The contributions table will be updated.\\n- GitHub Actions will create a release candidate pull request.\\n- When approved, GitHub Actions automatically merges, publishes to the npm\\n public registry, and creates CDN bundles.\\n\\n[View the PR](https://github.com/transloadit/uppy/pull/3304).\\n\\n## And more\\n\\n- google-drive: plugin has been updated for brand compliance (#3178)\\n- google-drive: sort Google Drive list by name #3069\\n- status-bar: now shows all details on mobile when `showProgressDetails` is\\n `true` (#3174)\\n- core: move `Uppy` class to its own module (#3225)\\n- angular: fix component crash by loosening `package.json` version constraints\\n (#3210)\\n- drop-target: exposed events (#3238)\\n- companion: add `maxFileSize` option in companion for safety #3159\\n- companion: new AWS S3 multipart presigned URL batching endpoint #3056\\n- companion: improve CORS default headers #3167\\n- companion: use GET instead of HEAD for `getURLMeta` for better server\\n compatibility (especially signed S3 URLs) #3048\\n- companion: deprecate missing `uploadUrls` option (will be required in the\\n future) #3182\\n- companion: close window on auth callback error and show error to user #3143\\n- companion: cut off length of file names to avoid AWS error #3048\\n- companion: safely escape ` - + diff --git a/blog/2016/08/0.8.0/index.html b/blog/2016/08/0.8.0/index.html index 0839648e1..30c301c0e 100644 --- a/blog/2016/08/0.8.0/index.html +++ b/blog/2016/08/0.8.0/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2016/08/0.9.0/index.html b/blog/2016/08/0.9.0/index.html index b0e58c96a..3e3ba7f76 100644 --- a/blog/2016/08/0.9.0/index.html +++ b/blog/2016/08/0.9.0/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2016/09/0.10/index.html b/blog/2016/09/0.10/index.html index aff57ef46..f34392881 100644 --- a/blog/2016/09/0.10/index.html +++ b/blog/2016/09/0.10/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2016/11/0.11/index.html b/blog/2016/11/0.11/index.html index 08caa272d..32ef15568 100644 --- a/blog/2016/11/0.11/index.html +++ b/blog/2016/11/0.11/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2016/12/0.12/index.html b/blog/2016/12/0.12/index.html index 20c4be867..09e400112 100644 --- a/blog/2016/12/0.12/index.html +++ b/blog/2016/12/0.12/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2017/02/0.14/index.html b/blog/2017/02/0.14/index.html index 4f9b0306e..baec8569d 100644 --- a/blog/2017/02/0.14/index.html +++ b/blog/2017/02/0.14/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2017/03/0.15/index.html b/blog/2017/03/0.15/index.html index 54ed23b5d..18b27fe5b 100644 --- a/blog/2017/03/0.15/index.html +++ b/blog/2017/03/0.15/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2017/05/0.16/index.html b/blog/2017/05/0.16/index.html index c38309d83..34d3c2862 100644 --- a/blog/2017/05/0.16/index.html +++ b/blog/2017/05/0.16/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2017/05/0.17/index.html b/blog/2017/05/0.17/index.html index f5e1fc701..5bda3b066 100644 --- a/blog/2017/05/0.17/index.html +++ b/blog/2017/05/0.17/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2017/07/golden-retriever/index.html b/blog/2017/07/golden-retriever/index.html index 29c4ea9a9..64edbe8b0 100644 --- a/blog/2017/07/golden-retriever/index.html +++ b/blog/2017/07/golden-retriever/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2017/08/0.18/index.html b/blog/2017/08/0.18/index.html index fbe3e4e23..38721f4ff 100644 --- a/blog/2017/08/0.18/index.html +++ b/blog/2017/08/0.18/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2017/09/0.19/index.html b/blog/2017/09/0.19/index.html index bac0ee19a..25721e100 100644 --- a/blog/2017/09/0.19/index.html +++ b/blog/2017/09/0.19/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2017/10/0.20/index.html b/blog/2017/10/0.20/index.html index e29d801c3..6f4ad8318 100644 --- a/blog/2017/10/0.20/index.html +++ b/blog/2017/10/0.20/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2017/10/0.21/index.html b/blog/2017/10/0.21/index.html index 6a4682221..593def7b8 100644 --- a/blog/2017/10/0.21/index.html +++ b/blog/2017/10/0.21/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2017/12/0.22/index.html b/blog/2017/12/0.22/index.html index a2c7b8fa7..fdb5edb99 100644 --- a/blog/2017/12/0.22/index.html +++ b/blog/2017/12/0.22/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2018/02/0.23/index.html b/blog/2018/02/0.23/index.html index bceae9bc6..624717092 100644 --- a/blog/2018/02/0.23/index.html +++ b/blog/2018/02/0.23/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2018/04/0.24/index.html b/blog/2018/04/0.24/index.html index 86f54a258..677168027 100644 --- a/blog/2018/04/0.24/index.html +++ b/blog/2018/04/0.24/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2018/06/0.25/index.html b/blog/2018/06/0.25/index.html index ff271259b..cb951f48f 100644 --- a/blog/2018/06/0.25/index.html +++ b/blog/2018/06/0.25/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2018/07/0.26/index.html b/blog/2018/07/0.26/index.html index 2aae99d2d..abe613948 100644 --- a/blog/2018/07/0.26/index.html +++ b/blog/2018/07/0.26/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2018/08/0.27/index.html b/blog/2018/08/0.27/index.html index b1856777c..c4e613a8e 100644 --- a/blog/2018/08/0.27/index.html +++ b/blog/2018/08/0.27/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2018/10/0.28/index.html b/blog/2018/10/0.28/index.html index 4cc0a4064..0be93cc2e 100644 --- a/blog/2018/10/0.28/index.html +++ b/blog/2018/10/0.28/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2018/12/0.29/index.html b/blog/2018/12/0.29/index.html index 743c18b4b..106eb9262 100644 --- a/blog/2018/12/0.29/index.html +++ b/blog/2018/12/0.29/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/03/0.30/index.html b/blog/2019/03/0.30/index.html index 7f2329f6b..e39bb91e1 100644 --- a/blog/2019/03/0.30/index.html +++ b/blog/2019/03/0.30/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/03/liftoff-01/index.html b/blog/2019/03/liftoff-01/index.html index 2317689b1..786238af3 100644 --- a/blog/2019/03/liftoff-01/index.html +++ b/blog/2019/03/liftoff-01/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/03/liftoff-02/index.html b/blog/2019/03/liftoff-02/index.html index c0256dd11..5c950f138 100644 --- a/blog/2019/03/liftoff-02/index.html +++ b/blog/2019/03/liftoff-02/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/03/liftoff-03/index.html b/blog/2019/03/liftoff-03/index.html index 540fa1b10..136f154a2 100644 --- a/blog/2019/03/liftoff-03/index.html +++ b/blog/2019/03/liftoff-03/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/03/liftoff-04/index.html b/blog/2019/03/liftoff-04/index.html index ce4a30240..ec19e922e 100644 --- a/blog/2019/03/liftoff-04/index.html +++ b/blog/2019/03/liftoff-04/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/03/liftoff-05/index.html b/blog/2019/03/liftoff-05/index.html index 6864183d0..dae596974 100644 --- a/blog/2019/03/liftoff-05/index.html +++ b/blog/2019/03/liftoff-05/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/03/liftoff-06/index.html b/blog/2019/03/liftoff-06/index.html index 14329e3e4..a198b1dec 100644 --- a/blog/2019/03/liftoff-06/index.html +++ b/blog/2019/03/liftoff-06/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/04/1.0/index.html b/blog/2019/04/1.0/index.html index 07ef5f68f..7cbae4464 100644 --- a/blog/2019/04/1.0/index.html +++ b/blog/2019/04/1.0/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/04/liftoff-07/index.html b/blog/2019/04/liftoff-07/index.html index 6c75eb5df..be0f6515c 100644 --- a/blog/2019/04/liftoff-07/index.html +++ b/blog/2019/04/liftoff-07/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/04/liftoff-08/index.html b/blog/2019/04/liftoff-08/index.html index ef8b97289..89ff19da6 100644 --- a/blog/2019/04/liftoff-08/index.html +++ b/blog/2019/04/liftoff-08/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/04/liftoff-09/index.html b/blog/2019/04/liftoff-09/index.html index 58358c3ff..6fecf1275 100644 --- a/blog/2019/04/liftoff-09/index.html +++ b/blog/2019/04/liftoff-09/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/04/liftoff-10/index.html b/blog/2019/04/liftoff-10/index.html index 9587eb810..3a571ff7d 100644 --- a/blog/2019/04/liftoff-10/index.html +++ b/blog/2019/04/liftoff-10/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/04/liftoff-11/index.html b/blog/2019/04/liftoff-11/index.html index d5500d2df..ed761c796 100644 --- a/blog/2019/04/liftoff-11/index.html +++ b/blog/2019/04/liftoff-11/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/04/liftoff-12/index.html b/blog/2019/04/liftoff-12/index.html index 996954168..eb2c6fb5f 100644 --- a/blog/2019/04/liftoff-12/index.html +++ b/blog/2019/04/liftoff-12/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/04/liftoff-13/index.html b/blog/2019/04/liftoff-13/index.html index 7c6ae3bac..72b5a82b8 100644 --- a/blog/2019/04/liftoff-13/index.html +++ b/blog/2019/04/liftoff-13/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/04/liftoff-14/index.html b/blog/2019/04/liftoff-14/index.html index 1262f936b..0ed9f04dc 100644 --- a/blog/2019/04/liftoff-14/index.html +++ b/blog/2019/04/liftoff-14/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/04/liftoff-15/index.html b/blog/2019/04/liftoff-15/index.html index 8899bf0af..4b1380f89 100644 --- a/blog/2019/04/liftoff-15/index.html +++ b/blog/2019/04/liftoff-15/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/04/liftoff-16/index.html b/blog/2019/04/liftoff-16/index.html index f113a1155..c29cdf179 100644 --- a/blog/2019/04/liftoff-16/index.html +++ b/blog/2019/04/liftoff-16/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/04/liftoff-17/index.html b/blog/2019/04/liftoff-17/index.html index b52dbe5de..f7b22549f 100644 --- a/blog/2019/04/liftoff-17/index.html +++ b/blog/2019/04/liftoff-17/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/04/liftoff-18/index.html b/blog/2019/04/liftoff-18/index.html index 26a3c9887..a7772bb15 100644 --- a/blog/2019/04/liftoff-18/index.html +++ b/blog/2019/04/liftoff-18/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/04/liftoff-19/index.html b/blog/2019/04/liftoff-19/index.html index 4c09c330e..ac7b6407e 100644 --- a/blog/2019/04/liftoff-19/index.html +++ b/blog/2019/04/liftoff-19/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/04/liftoff-20/index.html b/blog/2019/04/liftoff-20/index.html index 039490c0f..89534fc66 100644 --- a/blog/2019/04/liftoff-20/index.html +++ b/blog/2019/04/liftoff-20/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/04/liftoff-21/index.html b/blog/2019/04/liftoff-21/index.html index e6a26fdec..3840e7d4a 100644 --- a/blog/2019/04/liftoff-21/index.html +++ b/blog/2019/04/liftoff-21/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/04/liftoff-22/index.html b/blog/2019/04/liftoff-22/index.html index 48c027f71..f9b43a6e8 100644 --- a/blog/2019/04/liftoff-22/index.html +++ b/blog/2019/04/liftoff-22/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/04/liftoff-23/index.html b/blog/2019/04/liftoff-23/index.html index 1b4d69820..914073e3d 100644 --- a/blog/2019/04/liftoff-23/index.html +++ b/blog/2019/04/liftoff-23/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/04/liftoff-24/index.html b/blog/2019/04/liftoff-24/index.html index bd8853c8a..b0ef6ca31 100644 --- a/blog/2019/04/liftoff-24/index.html +++ b/blog/2019/04/liftoff-24/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/04/liftoff-25/index.html b/blog/2019/04/liftoff-25/index.html index ac577f639..b88e3136f 100644 --- a/blog/2019/04/liftoff-25/index.html +++ b/blog/2019/04/liftoff-25/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/04/liftoff-26/index.html b/blog/2019/04/liftoff-26/index.html index c1e2c0f56..ad1325174 100644 --- a/blog/2019/04/liftoff-26/index.html +++ b/blog/2019/04/liftoff-26/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/04/liftoff-27/index.html b/blog/2019/04/liftoff-27/index.html index 115a32ada..22697b598 100644 --- a/blog/2019/04/liftoff-27/index.html +++ b/blog/2019/04/liftoff-27/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/04/liftoff-28/index.html b/blog/2019/04/liftoff-28/index.html index 7316688b3..fadca6475 100644 --- a/blog/2019/04/liftoff-28/index.html +++ b/blog/2019/04/liftoff-28/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/04/liftoff-29/index.html b/blog/2019/04/liftoff-29/index.html index 6ffdd859f..561262a74 100644 --- a/blog/2019/04/liftoff-29/index.html +++ b/blog/2019/04/liftoff-29/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/04/liftoff-30/index.html b/blog/2019/04/liftoff-30/index.html index 8e4345a65..eca7d555f 100644 --- a/blog/2019/04/liftoff-30/index.html +++ b/blog/2019/04/liftoff-30/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/08/1.3/index.html b/blog/2019/08/1.3/index.html index 4e211933a..07ec85171 100644 --- a/blog/2019/08/1.3/index.html +++ b/blog/2019/08/1.3/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/10/1.5/index.html b/blog/2019/10/1.5/index.html index 075b64604..331996fc0 100644 --- a/blog/2019/10/1.5/index.html +++ b/blog/2019/10/1.5/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/11/1.6/index.html b/blog/2019/11/1.6/index.html index 114e853d5..612912dd8 100644 --- a/blog/2019/11/1.6/index.html +++ b/blog/2019/11/1.6/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2019/12/1.7/index.html b/blog/2019/12/1.7/index.html index bd7c1d043..4c2e8c03f 100644 --- a/blog/2019/12/1.7/index.html +++ b/blog/2019/12/1.7/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2020/03/1.9/index.html b/blog/2020/03/1.9/index.html index 718434536..787467a4a 100644 --- a/blog/2020/03/1.9/index.html +++ b/blog/2020/03/1.9/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2020/03/custom-providers/index.html b/blog/2020/03/custom-providers/index.html index 74af9f535..837eb07b9 100644 --- a/blog/2020/03/custom-providers/index.html +++ b/blog/2020/03/custom-providers/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2020/04/1.10/index.html b/blog/2020/04/1.10/index.html index b5885a223..59d40a445 100644 --- a/blog/2020/04/1.10/index.html +++ b/blog/2020/04/1.10/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2020/04/1.13/index.html b/blog/2020/04/1.13/index.html index 79ac2fd96..bc119e162 100644 --- a/blog/2020/04/1.13/index.html +++ b/blog/2020/04/1.13/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2020/07/1.18-image-editor/index.html b/blog/2020/07/1.18-image-editor/index.html index 1e8516340..f2992b742 100644 --- a/blog/2020/07/1.18-image-editor/index.html +++ b/blog/2020/07/1.18-image-editor/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2020/09/companion-2.0/index.html b/blog/2020/09/companion-2.0/index.html index ca533347f..b08b4eef8 100644 --- a/blog/2020/09/companion-2.0/index.html +++ b/blog/2020/09/companion-2.0/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2020/10/1.22/index.html b/blog/2020/10/1.22/index.html index fa2ce6def..3b19a33f2 100644 --- a/blog/2020/10/1.22/index.html +++ b/blog/2020/10/1.22/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2020/11/1.23/index.html b/blog/2020/11/1.23/index.html index 1f5057047..9cbeb4337 100644 --- a/blog/2020/11/1.23/index.html +++ b/blog/2020/11/1.23/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2020/12/1.24/index.html b/blog/2020/12/1.24/index.html index b6c87587e..af7fa571a 100644 --- a/blog/2020/12/1.24/index.html +++ b/blog/2020/12/1.24/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2021/01/1.25/index.html b/blog/2021/01/1.25/index.html index 9488f82e2..6e2103e68 100644 --- a/blog/2021/01/1.25/index.html +++ b/blog/2021/01/1.25/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2021/02/1.26/index.html b/blog/2021/02/1.26/index.html index 8ff045be3..62886c21c 100644 --- a/blog/2021/02/1.26/index.html +++ b/blog/2021/02/1.26/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2021/04/1.27/index.html b/blog/2021/04/1.27/index.html index d8c9169ee..d017416e0 100644 --- a/blog/2021/04/1.27/index.html +++ b/blog/2021/04/1.27/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2021/05/1.29/index.html b/blog/2021/05/1.29/index.html index 51c38145c..465981518 100644 --- a/blog/2021/05/1.29/index.html +++ b/blog/2021/05/1.29/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2021/07/1.30/index.html b/blog/2021/07/1.30/index.html index 2552fdd57..f6d45c8b5 100644 --- a/blog/2021/07/1.30/index.html +++ b/blog/2021/07/1.30/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2021/08/2.0/index.html b/blog/2021/08/2.0/index.html index c45579b51..336e5d525 100644 --- a/blog/2021/08/2.0/index.html +++ b/blog/2021/08/2.0/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2021/12/2.1-2.3/index.html b/blog/2021/12/2.1-2.3/index.html index 7ab10aa54..c4d2b15e2 100644 --- a/blog/2021/12/2.1-2.3/index.html +++ b/blog/2021/12/2.1-2.3/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2022/03/2.4-2.7/index.html b/blog/2022/03/2.4-2.7/index.html index 17030b239..596b43287 100644 --- a/blog/2022/03/2.4-2.7/index.html +++ b/blog/2022/03/2.4-2.7/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2022/09/3.0/index.html b/blog/2022/09/3.0/index.html index 0eb7dbba5..67a56642f 100644 --- a/blog/2022/09/3.0/index.html +++ b/blog/2022/09/3.0/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2022/12/3.3/index.html b/blog/2022/12/3.3/index.html index e8dd4b6b4..8e9a381c6 100644 --- a/blog/2022/12/3.3/index.html +++ b/blog/2022/12/3.3/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2023-05-new-website/index.html b/blog/2023-05-new-website/index.html index fb82e8fe2..31ca41ef5 100644 --- a/blog/2023-05-new-website/index.html +++ b/blog/2023-05-new-website/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2023-10-25-image-editor/index.html b/blog/2023-10-25-image-editor/index.html index c28ff1ab8..134b2726d 100644 --- a/blog/2023-10-25-image-editor/index.html +++ b/blog/2023-10-25-image-editor/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/2023/07/3.13-3.21/index.html b/blog/2023/07/3.13-3.21/index.html index 5a49db41d..0bb8130a5 100644 --- a/blog/2023/07/3.13-3.21/index.html +++ b/blog/2023/07/3.13-3.21/index.html @@ -3,7 +3,7 @@ -๐ŸŽ„ Uppy 3.13 to 3.21: Typescript Saga: the beginning, Image Editor improvements, Dashboard auto-install | Uppy +๐ŸŽ„ Uppy 3.13 to 3.21: Typescript Saga: the beginning, Image Editor improvements, Dashboard auto-install | Uppy @@ -12,11 +12,11 @@ - + -
Skip to main content

๐ŸŽ„ Uppy 3.13 to 3.21: Typescript Saga: the beginning, Image Editor improvements, Dashboard auto-install

ยท 5 min read
Screenshot of the new Uppy website homepage +

๐ŸŽ„ Uppy 3.13 to 3.21: Typescript Saga: the beginning, Image Editor improvements, Dashboard auto-install

ยท 5 min read
Drawing of a dog with a laptop and Christmas tree on Mars

Itโ€™s this time of the year again! Make yourself cozy by the fire, and let us help you unwrap the gifts Uppy has prepared for you.

diff --git a/blog/2023/07/3.3-3.13/index.html b/blog/2023/07/3.3-3.13/index.html index 466f768b8..4534522e7 100644 --- a/blog/2023/07/3.3-3.13/index.html +++ b/blog/2023/07/3.3-3.13/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/archive/index.html b/blog/archive/index.html index ee319eadb..7c002c40f 100644 --- a/blog/archive/index.html +++ b/blog/archive/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/atom.xml b/blog/atom.xml index 0c01a8a83..649df3207 100644 --- a/blog/atom.xml +++ b/blog/atom.xml @@ -13,7 +13,7 @@ 2023-12-23T00:00:00.000Z - +

Itโ€™s this time of the year again! Make yourself cozy by the fire, and let us help you unwrap the gifts Uppy has prepared for you.

diff --git a/blog/index.html b/blog/index.html index efb0472e6..97c03acd6 100644 --- a/blog/index.html +++ b/blog/index.html @@ -12,11 +12,11 @@ - + -

ยท 5 min read
Screenshot of the new Uppy website homepage +

ยท 5 min read
Drawing of a dog with a laptop and Christmas tree on Mars

Itโ€™s this time of the year again! Make yourself cozy by the fire, and let us help you unwrap the gifts Uppy has prepared for you.

diff --git a/blog/page/2/index.html b/blog/page/2/index.html index 940a336e6..c3fb34b0d 100644 --- a/blog/page/2/index.html +++ b/blog/page/2/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/page/3/index.html b/blog/page/3/index.html index 724c545bb..6eab5358b 100644 --- a/blog/page/3/index.html +++ b/blog/page/3/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/page/4/index.html b/blog/page/4/index.html index 063bea699..0383302c1 100644 --- a/blog/page/4/index.html +++ b/blog/page/4/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/page/5/index.html b/blog/page/5/index.html index 886e09f4a..61dae2503 100644 --- a/blog/page/5/index.html +++ b/blog/page/5/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/page/6/index.html b/blog/page/6/index.html index a23e281f3..f7c29d436 100644 --- a/blog/page/6/index.html +++ b/blog/page/6/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/page/7/index.html b/blog/page/7/index.html index dff341b99..305912f8c 100644 --- a/blog/page/7/index.html +++ b/blog/page/7/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/page/8/index.html b/blog/page/8/index.html index e9ef2ceab..4ddc8e95c 100644 --- a/blog/page/8/index.html +++ b/blog/page/8/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/page/9/index.html b/blog/page/9/index.html index c4d271d54..1da15deec 100644 --- a/blog/page/9/index.html +++ b/blog/page/9/index.html @@ -12,7 +12,7 @@ - + diff --git a/blog/rss.xml b/blog/rss.xml index e46ce96e0..50a121731 100644 --- a/blog/rss.xml +++ b/blog/rss.xml @@ -14,7 +14,7 @@ https://uppy.io/blog/2023/07/3.13-3.21 Sat, 23 Dec 2023 00:00:00 GMT - +

Itโ€™s this time of the year again! Make yourself cozy by the fire, and let us help you unwrap the gifts Uppy has prepared for you.

diff --git a/docs/angular/index.html b/docs/angular/index.html index 8649a3023..1e6db7285 100644 --- a/docs/angular/index.html +++ b/docs/angular/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/audio/index.html b/docs/audio/index.html index 36cc4ef24..b8c85d19d 100644 --- a/docs/audio/index.html +++ b/docs/audio/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/aws-s3-multipart/index.html b/docs/aws-s3-multipart/index.html index 0cbe5734a..8e1d551cd 100644 --- a/docs/aws-s3-multipart/index.html +++ b/docs/aws-s3-multipart/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/aws-s3/index.html b/docs/aws-s3/index.html index 7154514fe..6d8d35ce4 100644 --- a/docs/aws-s3/index.html +++ b/docs/aws-s3/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/box/index.html b/docs/box/index.html index 2bbc001d5..e7896e285 100644 --- a/docs/box/index.html +++ b/docs/box/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/companion/index.html b/docs/companion/index.html index 91eb48533..dd4170f84 100644 --- a/docs/companion/index.html +++ b/docs/companion/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/compressor/index.html b/docs/compressor/index.html index 57fe3818e..3688c94b5 100644 --- a/docs/compressor/index.html +++ b/docs/compressor/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/dashboard/index.html b/docs/dashboard/index.html index 64ca9f7d6..50a34da59 100644 --- a/docs/dashboard/index.html +++ b/docs/dashboard/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/drag-drop/index.html b/docs/drag-drop/index.html index 2d9ab9c49..85bfd9824 100644 --- a/docs/drag-drop/index.html +++ b/docs/drag-drop/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/drop-target/index.html b/docs/drop-target/index.html index 65ab4b432..349002c20 100644 --- a/docs/drop-target/index.html +++ b/docs/drop-target/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/dropbox/index.html b/docs/dropbox/index.html index fe1da1733..33df18c20 100644 --- a/docs/dropbox/index.html +++ b/docs/dropbox/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/facebook/index.html b/docs/facebook/index.html index 72a5cef73..01da53f16 100644 --- a/docs/facebook/index.html +++ b/docs/facebook/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/file-input/index.html b/docs/file-input/index.html index a3b80a638..b36ea6935 100644 --- a/docs/file-input/index.html +++ b/docs/file-input/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/form/index.html b/docs/form/index.html index 8949135e5..de5da309e 100644 --- a/docs/form/index.html +++ b/docs/form/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/golden-retriever/index.html b/docs/golden-retriever/index.html index 7fc22474f..eafaf7b6e 100644 --- a/docs/golden-retriever/index.html +++ b/docs/golden-retriever/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/google-drive/index.html b/docs/google-drive/index.html index 6f70f7f28..9a36c3f9d 100644 --- a/docs/google-drive/index.html +++ b/docs/google-drive/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/guides/browser-support/index.html b/docs/guides/browser-support/index.html index e153deb6c..2baa29591 100644 --- a/docs/guides/browser-support/index.html +++ b/docs/guides/browser-support/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/guides/building-plugins/index.html b/docs/guides/building-plugins/index.html index 87707ede9..c166be454 100644 --- a/docs/guides/building-plugins/index.html +++ b/docs/guides/building-plugins/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/guides/building-your-own-ui-with-uppy/index.html b/docs/guides/building-your-own-ui-with-uppy/index.html index 8606b1084..4b6c2f1ea 100644 --- a/docs/guides/building-your-own-ui-with-uppy/index.html +++ b/docs/guides/building-your-own-ui-with-uppy/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/guides/choosing-uploader/index.html b/docs/guides/choosing-uploader/index.html index 09c497fe2..8724aafbb 100644 --- a/docs/guides/choosing-uploader/index.html +++ b/docs/guides/choosing-uploader/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/guides/custom-stores/index.html b/docs/guides/custom-stores/index.html index bba9b6c57..b3df4eafe 100644 --- a/docs/guides/custom-stores/index.html +++ b/docs/guides/custom-stores/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/guides/migration-guides/index.html b/docs/guides/migration-guides/index.html index 9593a7249..c2264ee9f 100644 --- a/docs/guides/migration-guides/index.html +++ b/docs/guides/migration-guides/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/image-editor/index.html b/docs/image-editor/index.html index a24c2991d..4045b6cb9 100644 --- a/docs/image-editor/index.html +++ b/docs/image-editor/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/informer/index.html b/docs/informer/index.html index c8328833f..bff743612 100644 --- a/docs/informer/index.html +++ b/docs/informer/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/instagram/index.html b/docs/instagram/index.html index 32a1fbde2..0d6bf8d38 100644 --- a/docs/instagram/index.html +++ b/docs/instagram/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/locales/index.html b/docs/locales/index.html index 960b2024f..c5cc9ada7 100644 --- a/docs/locales/index.html +++ b/docs/locales/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/onedrive/index.html b/docs/onedrive/index.html index bc42cd3db..0410ec8b9 100644 --- a/docs/onedrive/index.html +++ b/docs/onedrive/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/progress-bar/index.html b/docs/progress-bar/index.html index 3d354ce0a..e5c0bc2eb 100644 --- a/docs/progress-bar/index.html +++ b/docs/progress-bar/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/quick-start/index.html b/docs/quick-start/index.html index 8a3981d54..5078cb3a8 100644 --- a/docs/quick-start/index.html +++ b/docs/quick-start/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/react/index.html b/docs/react/index.html index 763715b7a..d553848b6 100644 --- a/docs/react/index.html +++ b/docs/react/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/remote-sources/index.html b/docs/remote-sources/index.html index 1db44c4ef..db762bad8 100644 --- a/docs/remote-sources/index.html +++ b/docs/remote-sources/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/screen-capture/index.html b/docs/screen-capture/index.html index e0e0806b9..5d071d202 100644 --- a/docs/screen-capture/index.html +++ b/docs/screen-capture/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/status-bar/index.html b/docs/status-bar/index.html index 5793771d2..999eb31b5 100644 --- a/docs/status-bar/index.html +++ b/docs/status-bar/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/svelte/index.html b/docs/svelte/index.html index 28c205cbf..ddc47f44e 100644 --- a/docs/svelte/index.html +++ b/docs/svelte/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/thumbnail-generator/index.html b/docs/thumbnail-generator/index.html index 1b6e53d51..9d7122ff4 100644 --- a/docs/thumbnail-generator/index.html +++ b/docs/thumbnail-generator/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/transloadit/index.html b/docs/transloadit/index.html index 93961a9d4..8b2f22b9c 100644 --- a/docs/transloadit/index.html +++ b/docs/transloadit/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/tus/index.html b/docs/tus/index.html index 389f5db83..e1ff47eae 100644 --- a/docs/tus/index.html +++ b/docs/tus/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/unsplash/index.html b/docs/unsplash/index.html index b26899822..a6a75c8c1 100644 --- a/docs/unsplash/index.html +++ b/docs/unsplash/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/uppy/index.html b/docs/uppy/index.html index 3ed45df68..e71a936bd 100644 --- a/docs/uppy/index.html +++ b/docs/uppy/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/url/index.html b/docs/url/index.html index b1ef135ab..b66674218 100644 --- a/docs/url/index.html +++ b/docs/url/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/vue/index.html b/docs/vue/index.html index 35361b8e1..f487abf21 100644 --- a/docs/vue/index.html +++ b/docs/vue/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/webcam/index.html b/docs/webcam/index.html index 91e522ff1..fe511df52 100644 --- a/docs/webcam/index.html +++ b/docs/webcam/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/xhr-upload/index.html b/docs/xhr-upload/index.html index 106a8b3ec..78bd54ae1 100644 --- a/docs/xhr-upload/index.html +++ b/docs/xhr-upload/index.html @@ -12,7 +12,7 @@ - + diff --git a/docs/zoom/index.html b/docs/zoom/index.html index c230811a7..29e26bf09 100644 --- a/docs/zoom/index.html +++ b/docs/zoom/index.html @@ -12,7 +12,7 @@ - + diff --git a/examples/index.html b/examples/index.html index f6c45be1e..41007affd 100644 --- a/examples/index.html +++ b/examples/index.html @@ -12,7 +12,7 @@ - + diff --git a/img/blog/3.13-3.21/dog-coding-laptop-mars-christmas-tree-2.jpg b/img/blog/3.13-3.21/dog-coding-laptop-mars-christmas-tree-2.jpg new file mode 100644 index 000000000..79e647b41 Binary files /dev/null and b/img/blog/3.13-3.21/dog-coding-laptop-mars-christmas-tree-2.jpg differ diff --git a/img/blog/3.13-3.21/dog-coding-laptop-mars-christmas-tree-2.png b/img/blog/3.13-3.21/dog-coding-laptop-mars-christmas-tree-2.png new file mode 100644 index 000000000..e6bd34809 Binary files /dev/null and b/img/blog/3.13-3.21/dog-coding-laptop-mars-christmas-tree-2.png differ diff --git a/index.html b/index.html index 108ab93c2..0ae1a0b26 100644 --- a/index.html +++ b/index.html @@ -12,7 +12,7 @@ - + diff --git a/privacy-policy/index.html b/privacy-policy/index.html index bacb275e9..d76dc21bc 100644 --- a/privacy-policy/index.html +++ b/privacy-policy/index.html @@ -12,7 +12,7 @@ - + diff --git a/search/index.html b/search/index.html index 7c583a41b..8cfd030a6 100644 --- a/search/index.html +++ b/search/index.html @@ -12,7 +12,7 @@ - +