Uppy is an open source project by Transloadit

The Uppy Blog

Uppy 1.0: Your best friend in file uploading

Thursday Apr 25, 2019

Today, after three years of development, we are launching version 1.0 of Uppy, our file uploader for web browsers.

A little history

Three years ago, Transloadit was ready to replace their jQuery-based file uploading & processing plugin for browsers with something more modern. They posted a job ad in search for people to build it:

In general, we’re looking for polished, well tested, carefully crafted products that are delightful to work with and use. So for this job it’s not only important that you know JavaScript, but also how to make things look stunning and work well for end users.

At your disposal are time, focus, and the core team ready to provide feedback, guidance, and anything else you need.

Shortly after, I saw a retweet of this vacancy come across my time line and I decided to apply. That, in a nutshell, is how I got involved with Uppy in the earliest stages of the project.

Initially, the idea was to build a proprietary uploader that would work exclusively with Transloadit’s commercial service, but we quickly turned around on it. We felt our version of a file uploader could have a real impact if we made it more widely available. So, just like Transloadit had done before with Tus, we decided to make Uppy an open source solution — free for anyone to use and hack on. Transloadit support became an optional plugin.

Three years, 16.000 stargazers, getting featured on Smashing Magazine, JavaScript Daily, Product Hunt, and SurviveJS, and a thriving community later — and we could not be happier to finally launch Uppy 1.0!

Continue reading ...

30 Days to Liftoff: Day 30

Wednesday Apr 24, 2019

And then there were none! Zero days left in our thirty-day blog post challenge. I can’t believe this is already the final day of our push to get Uppy to 1.0. There’s still a bunch of things that we’d like to finish before shipping, so let’s dive right in.




Continue reading ...

30 Days to Liftoff: Day 29

Tuesday Apr 23, 2019

With Easter behind us, only two days remain before the Uppy 1.0 release!. We hope you’re anticipating the launch as much as we are looking forward to being out from under the pressure of geting everything done in time!

In terms of progress and completed features, things are looking good. We don’t have the entire team present today due to personal holidays and other commitments, but there’s no slowing down as we approach our deadline! This afternoon, we’re having our final Uppy 1.0 call where we’ll make final decisions on what we will — and won’t — get done before Thursday.




Continue reading ...

30 Days to Liftoff: Day 28

Monday Apr 22, 2019

Happy second day of Easter! Just three days left before we launch Uppy 1.0 on the 25th! :scream: It’s gonna be a few busy days for us, so we want to spend today getting rested up and ready to go.

Here’s an 80’s-style montage of GIFs to give you an idea of what we’re doing to get all pumped up and ready for the final sprint!

Continue reading ...

30 Days to Liftoff: Day 27

Sunday Apr 21, 2019

Happy Easter everyone! :egg::rabbit: It’s like a regular Sunday, but with a cherry on top! Spring is also in the air, so we wish you all some nice weather to enjoy with friends and family. Since we are also spending today egg hunting rather than bug chasing, we’ll keep it short. So, once more, from us — and this lovely Roomba-riding pup:



Continue reading ...

30 Days to Liftoff: Day 26

Saturday Apr 20, 2019

‘Twas the night before Easter, when all through the house. Not a creature was stirring, not even a… pup?



Continue reading ...

30 Days to Liftoff: Day 25

Friday Apr 19, 2019

Why have a Good Friday when you can have a Great Friday instead!? Today is the beginning of an extra-long weekend, which most of the Uppy crew will spend by staying away from computers and catching up on some naptime:



Continue reading ...

30 Days to Liftoff: Day 24

Thursday Apr 18, 2019

Only six days remain in our ‘30 Days to Liftoff’ blog post challenge toward releasing Uppy 1.0 on April 25. Technically, it’s even less than that, seeing as Easter is coming up and we won’t be doing much work during the holidays. So, with just three working days left, we are starting to feel the heat. :fire:

Luckily, we’re also very close to reaching all of our release goals. Let’s take a look at where we are now!




Continue reading ...

30 Days to Liftoff: Day 23

Wednesday Apr 17, 2019

Hello and welcome to Day 23 of our ‘30 Days to Liftoff’ blog post challenge. The launch date for Uppy 1.0 is still set for April the 25th and a lot of work is ongoing to make it happen. Let’s take a look at the updates for today!




Continue reading ...

30 Days to Liftoff: Day 22

Tuesday Apr 16, 2019

We will launch Uppy 1.0 on April 25 and this is our ‘30 Days to Liftoff’ blog post challenge where we share updates on our progress each day! Let’s see what happened on Day 22.




Continue reading ...

30 Days to Liftoff: Day 21

Monday Apr 15, 2019

We’re reaching the final stretch of our ‘30 Days to Liftoff’ blog post challenge. After a refreshing weekend, the entire team is ready to give it their all over the next ten days to ensure that Uppy 1.0 reaches its April 25 release date.




Since we’re starting the week strong and prepared, let’s take a quick glance at how our Uppy dashboard is looking.

Continue reading ...

30 Days to Liftoff: Day 20

Sunday Apr 14, 2019

And on the seventh day, Uppy rested :angel: We, too, will be spending this day in quiet contemplation (and most certainly not by sleeping off yesterday’s escapades). So if there isn’t anything else you need us for, we’ll be grabbing our blankets and heading back to bed:

Continue reading ...

30 Days to Liftoff: Day 19

Saturday Apr 13, 2019

Hey DJ, turn the music Uppy! We’re taking a few well-deserved days off from chasing tasks and issues (and cats, of course) to get our feet up on the dance floor and enjoy a drink or two. We hope you are doing the same! Here’s a record-breaking Wiener to get you in the mood:

Continue reading ...

30 Days to Liftoff: Day 18

Friday Apr 12, 2019

Hi! You’re reading our ‘30 Days to Liftoff’ blog post challenge about the launch of Uppy 1.0 on April 25. Here’s what we’ve been up to since yesterday’s progress update.




Continue reading ...

30 Days to Liftoff: Day 17

Thursday Apr 11, 2019

It’s day 17 already of our ‘30 Days to Liftoff’ blog post challenge and the launch of Uppy 1.0 on April 25 is coming closer by the day. The Uppy team is dealing with the big tasks now, so the updates might seem a little scant!




Continue reading ...

30 Days to Liftoff: Day 16

Wednesday Apr 10, 2019

Two weeks left in our ‘30 Days to Liftoff’! We’re starting to home in on Uppy 1.0’s release on April 25. Being in the middle of the week gives us a great opportunity to see how hard the team is working. Let’s take a look at the new features, bug fixes and milestones that have been completed! :dog:




Reminder: you can keep up with our CHANGELOG to see everything else we intend to complete for the official Uppy 1.0 release.

Continue reading ...

30 Days to Liftoff: Day 15

Tuesday Apr 9, 2019

:musical_note: Woah, we’re halfway there! Take our paw, we’ll make it we swear! :notes: That’s fifteen down and fifteen more to go. Great to have you along for the ride as we move ever closer towards launching Uppy 1.0 on April 25.

Let’s see what is Uppy today!



Continue reading ...

30 Days to Liftoff: Day 14

Monday Apr 8, 2019

Today marks the fourteenth day in our ‘30 Days to Liftoff’ blog post challenge, working our way towards launching Uppy 1.0 on April 25. It’s the beginning of a new week and there is much to be done. The Uppy team is already firing on all cylinders and we also have some developments to share from before the weekend.

Continue reading ...

30 Days to Liftoff: Day 13

Sunday Apr 7, 2019

Shh, it’s Sunday, Uppy is sleeping in today :sleeping: We’ll be taking the day off as well, as we gear up to go full throttle again in the morning. There’s still a lot to do before the Uppy 1.0 launch on April 25. In the meantime, why don’t you join us in letting sleeping dogs lie.

Continue reading ...

30 Days to Liftoff: Day 12

Saturday Apr 6, 2019

Hey guys! How is your Saturday treating you so far? We are focusing today on meeting friends and having fun, and taking our minds off all Uppy-related things for just a few days. To give you an idea of what we’re up to tonight, check out this groovy GIF:

Continue reading ...

30 Days to Liftoff: Day 11

Friday Apr 5, 2019

And another week bites the dust! With the weekend right around the corner, we’re busy getting as much as possible done before heading off for some well-deserved rest & relaxation. Here is what we’ve been up to!


Continue reading ...

30 Days to Liftoff: Day 10

Thursday Apr 4, 2019

Today marks the tenth day in our 30 Days to Liftoff! April 25 is still in our sights as we work towards the Uppy 1.0 release. The end of the working week is almost upon us, but there’s no sign of slowing down yet.


Things are looking up(py) on our project board as the team has been working on tasks at a steady pace. A quick status update will give us a little insight into how things are going concerning all things Uppy.

Continue reading ...

30 Days to Liftoff: Day 9

Wednesday Apr 3, 2019

The entire team is starting to get into its groove as the Uppy channel in our Slack workspace is looking livelier than ever. Let’s dive straight into Day 9 of our 30 Days to Liftoff!



Everyone is moving at a comfortable pace, working on the various In Progress cards sitting neatly on our Uppy board, so here’s a quick update on the progress towards Uppy 1.0, coming April 25!

Continue reading ...

30 Days to Liftoff: Day 8

Tuesday Apr 2, 2019

Welcome to Day 8 of our ongoing thirty-day blog post challenge toward the Uppy 1.0 release on April 25! Yesterday was the 1st of April, but we had no time for fooling around! The entire team was present for our weekly call, which was again fully dedicated to discussing Uppy progress.



During the call, a lot of cards were moved from the To Do lane into the In Progress lane — and some are even already Done. We also added a few New tasks mostly related to language packs for Uppy, where we’ll be asking our own team members to update a locale of their own language. We hope other languages will be picked up by the community!

Continue reading ...

30 Days to Liftoff: Day 7

Monday Apr 1, 2019

Welcome to Day 7 of our ongoing thirty-day blog post challenge toward the Uppy 1.0 release on April 25! With the weekend behind us and all batteries fully recharged, we’re ready to start hacking away again at the forest of To Do’s that lies in front of us.

We still have some updates from the end of last week to share with you, and our team is already working hard today on fixing issues and making improvements. So let’s jump into it!

Continue reading ...

30 Days to Liftoff: Day 6

Sunday Mar 31, 2019

Shh, it’s Sunday, Uppy is sleeping in today :sleeping: We’ll be taking the day off as well, as we gear up to go full throttle again in the morning. There’s still a lot to do before the Uppy 1.0 launch on April 25! In the meantime, why don’t you join us in letting sleeping dogs lie.

Continue reading ...

30 Days to Liftoff: Day 5

Saturday Mar 30, 2019

Work hard, play hard! It’s Saturday, so it’s time for us to wind down and take some time for ourself. Seeing as we won’t have much to share over the weekend in terms of progress updates, we thought we’d try to distract you a bit. Sit back, relax, and enjoy this nice GIF, handpicked by our crew:

Continue reading ...

30 Days to Liftoff: Day 4

Friday Mar 29, 2019

Today marks the fourth day of our ongoing thirty-day blog post challenge, giving you an overview of all the progress building up to our Uppy 1.0 release on April 25!

Continue reading ...

30 Days to Liftoff: Day 3

Thursday Mar 28, 2019

Two days ago, we announced the upcoming launch of Uppy 1.0 on April 25, kicking off our thirty-day blog post challenge to keep you updated on everything that is going on. Here’s day three for you!

Continue reading ...

30 Days to Liftoff: Day 2

Wednesday Mar 27, 2019

Yesterday, marked the beginning of our thirty-day blog post challenge to keep you updated on our preparations for releasing Uppy 1.0 on April 25. So here we are again already!

Continue reading ...

30 Days to Liftoff: Day 1

Tuesday Mar 26, 2019

When we started working on Uppy back in early 2016, all we had was an idea and the shared desire to launch file uploading into a new age. We had already been laying the groundwork with the development of tus.io and felt that its robust back-end deserved a front-end just as robust, modern and user-friendly.

Continue reading ...

Uppy 0.30: Introducing Robodog

Wednesday Mar 6, 2019

In 0.30, we are introducing a new friend for Uppy — the Robodog.


Robodog: easy to assemble

Continue reading ...

Uppy 0.29: separate Core and Plugin styles, React Native in tus-js-client

Tuesday Dec 11, 2018

0.29 brings bug fixes and improvements, while we are busy working on Uppy React Native support (which first had to land in the js client for our resumable file upload protocol: tus.io) and a Preset (still debating the name) which will make it easier to leverage Transloadit’s encoding platform, and offer a smooth migration path for users not yet on Uppy. The highlights of this release are: separating Core and Plugin styles, more accurate progress reporting by factoring in sizes across files, adding a responseType option for XHR Upload, and fixing visual Webcam bugs.

Continue reading ...

Uppy 0.28: A look behind the scenes

Monday Nov 5, 2018

In 0.28, we are introducing a new “Single Upload” mode, improving on the Status Bar plugin with a spinner and different pause/resume/cancel buttons. We’ll also share some progress on bringing back unified locale packs and a Transloadit Preset 🍁

Continue reading ...

Uppy 0.27: First Swing at React Native Support

Thursday Aug 23, 2018

In 0.27, we have some more iterations on the Dashboard UI for you in store again. We are getting rid of the permanent tab bar and made tons of other improvements!

Continue reading ...

Uppy 0.26: Lerna

Thursday Jul 12, 2018

Uppy 0.26 replaces the monolithic Uppy package with a separate npm package for every plugin.

Continue reading ...

Uppy 0.25: Drag & Drop Links Urls & Images, Improved File Selecting in Providers, Interactive Components In i18n

Thursday Jun 7, 2018

Uppy 0.25 comes with a couple of new features, like drag-and-dropping URLs and images with the Url plugin, Dashboard modal animation and interactive components in i18n strings, as well as a ton of under the hood fixes and improvements.

Continue reading ...

Uppy 0.24: Refreshed Dashboard, StatusBar and Provider UI, revamped XHR Response Handling

Tuesday Apr 17, 2018

Uppy 0.24.2 brings a refreshed UI in the Dashboard and StatusBar plugins, a synchronous addFile() method, a cancel button, style protections, documentation on writing your own Uppy plugin, revamped XHR response handling and tons of bugfixes.

Continue reading ...

Uppy 0.23: Import from Url, refactored thumbnail generation, XHR bundle

Monday Feb 12, 2018

Hi all! We are back from holidays with a shiny new 0.23.0 release for you! It’s packed with a new Url plugin (imports files from urls), refactored ThumbnailGenerator, Webcam improvements and more.

Import from Url

Meet our new “Provider” plugin, Url. It’s simple, yet powerful: paste a link to any file on the web, and Uppy with Uppy Server will upload it wherever you need.

uppy.use(Url, { target: Dashboard, host: YOUR_UPPY_SERVER_URL })
Continue reading ...

Uppy 0.22: Preact, Form, Improved Dashboard, Custom Stores

Saturday Dec 23, 2017

Uppy is featured on Product Hunt! To our fellow hunters: welcome! Quick intro: Uppy is the next open source file uploader for web browsers. We’re very close to launching 1.0 and would love to get your feedback in, leave your thoughts on Product Hunt or start a discussion below.

Hi all! It’s New Year and Christmas time, and this year Santa is brining you Uppy 0.22 🎁 This release packs a lot of neat stuff, but it also breaks things in quite a few places, so please read on.

And, if you are celebrating, happy holidays from the Uppy Team! 🎄

Continue reading ...

Uppy 0.21: End to End Tests, Accessibility, Additional Security for Uppy Server

Friday Nov 24, 2017

Hi all! We’ve been busy with Halloween, but also another release, so here is Uppy 0.21! This one improves accessibility, features new end-to-end tests and improved security in Uppy Server.

Continue reading ...

Uppy 0.20: React, Retry & Time Travel

Thursday Oct 5, 2017

We are proud to present Uppy 0.20. This one focuses on React and Redux support, adding storage expirations to GoldenRetriever and upload retries. Enjoy!

Uppy React components

Uppy now ships with React components! We’ve been exploring different approaches to React components for several months, so we’re excited to finally have them in ✨ There are components for each of Uppy’s UI elements, like the Dashboard and the StatusBar.

const uppy = Uppy()
uppy.use(Tus10, { endpoint: '/upload' })

const Dashboard = require('uppy/lib/react/Dashboard')
const Uploader = () => (
  <Dashboard
    uppy={uppy}
    note="Hey! It's a React component!"
  />
)

ReactDOM.render(<Uploader />, document.querySelector('#uploader'))
Continue reading ...

Uppy 0.19: Tests, Informer details and better APIs

Thursday Sep 21, 2017

Hello! The 0.19 release is about internal fixes, optimizations and refactoring, as well as some work on PRs that we’ll hopefully tell you about soon!

Jest tests

Thanks to our contributer, @richardwillars, and following the example set by Uppy Server, we’ve switched to Jest for Uppy’s unit tests, and added a bunch of new tests as well. And even more are being added as we speak!

We’re also happy to report that more tests have been added for Uppy Server.

Dashboard APIs

We’ve exposed show/hide/isOpen APIs for the Dashboard UI plugin. Now you can open and close the modal dialog programmatically:

var modal = uppy.getPlugin('Dashboard')
modal.show()

...

button.addEventListener('click', () => {
  if (modal.isOpen()) {
    modal.hide()
  } else {
    modal.show()
  }
})

Check out the docs.

Continue reading ...

Uppy 0.18: Dogumentation and The GoldenRetriever

Friday Sep 15, 2017

Hi! Another month — a new Uppy release 🎉

Note: current latest release is actually 0.19, but this post got delayed, so we are publishing it first. 0.19 post is coming next.

New documentation

Documentation for Uppy has been re-written, and now features chapters on Uppy’s settings and API, using various plugins, and running Uppy Server. Check it out: https://uppy.io/docs/. More chapters to come!

The GoldenRetriever

The GoldenRetriever has been released as a public beta. For details, please refer to the previous post, The GoldenRetriever: Making uploads survive browser crashes, but the gist is: when enabled, this plugin will save uppy-state to localStorage on every change, and then if your browser crashes, or you accidentaly navigate away from a tab,later when you return, your uploads will resume like nothing happened. Spoiler: it uses Service Workers and IndexedDB.

Continue reading ...

The Golden Retriever: Making uploads survive browser crashes

Monday Jul 31, 2017

TL;DR: We’re on a mission to improve file uploading on the web. We released tus: the open protocol for resumable file uploads, as well as Uppy: the next open source file uploader for web browsers. Uppy uses tus, which makes it resilient to poor network conditions and crashing servers. Today we’re launching an Uppy feature that also makes it resilient to browser crashes, which we believe is an industry first. We’re sharing a quick demo video, a bit of background, how exactly we achieved this, and how you can try it yourself.

***

Don’t you just hate it when you’re about to share the perfect photos from your trip to Iceland, and halfway through, your cat jumps on the keyboard and trashes your browser? Or the battery in your laptop dies? Or you accidentally close the tab or navigate away? We hate that too!

If action games have had checkpoints since 1687 — why can’t file uploaders? Well, as it turns out, they can! We found a way to get those Iceland pics into the hands of your loved ones with near-zero levels of frustration, even after a dreaded Blue Screen of Death! (if that is still a thing ;)

Continue reading ...

Uppy 0.17: Restrictions

Tuesday Jul 11, 2017

Hi! We are back with yet another Uppy release that contains some often requested features such as file restrictions and better file type detection, alongside a brand new Instagram plugin, UI improvements and more!

Continue reading ...

Uppy 0.16: Transloadit!

Wednesday May 24, 2017

Hello there! Missed us much? :) We’re chomping at the bits, at least, to tell you about our latest release. This one has been in the works longer than usual, but then again, it’s also way cooler than usual, so let’s get right to it.

Continue reading ...

Uppy 0.15: Spring cleanup

Wednesday Mar 15, 2017

Spring is in the air and Uppy is feeling particularly full of life. In this post about Uppy 0.15, we have some exciting stories about babel-plugin-yo-yoify, progress event throttling, and new friends.

Continue reading ...

Uppy 0.14: Responsive Dashboard, Standalone & Pluggable Server, Dropbox

Monday Feb 13, 2017

Hi! Hope y’all have had great holidays! 🎄 Which reminds us, we still have a gift for you — and we even wrapped it in a package (npm). Look inside and you’ll find that Uppy 0.14!

“But wait”, you might ask, “where is the 0.13 release that we have been waiting for?”

Well, let’s just say we are superstitious like that. You won’t see us coding under any ladders either! And we were also in the middle of the holiday season, so we decided to call 0.13 “The Release That Wasn’t” and skip it.

Let’s take a look at what Uppy 0.14 has in store for you.

Continue reading ...

Uppy 0.12: Responsive. Cancel. Feedback. Refreshed ES6 server

Wednesday Dec 7, 2016

Hello! Here’s what’s new in Uppy 0.12.

Dashboard: local mode and multipart uploads support in UI

Prior to this release, we’ve optimized the Dashboard for usage with multiple “acquire plugins”, say Webcam + Google Drive. But sometimes all you need is “local disk” with drag & drop support, nice file previews and progress. And now the Dashboard UI works great with that use case out of the box. When you don’t add (.use) any acquire plugins, it looks like this:

Also (prior to this release), we’ve built the Dashboard to work well with tus resumable uploads. That’s why you can pause and resume individual uploads, as well as all at once. But if you use an endpoint that is not yet ready for the future and upload resumability (here’s how to fix that, by the way), the Dashboard UI will show regular “cancel” buttons instead of pause/resume.

Dashboard is gradually becoming more mobile friendly too, but we’ll be saving some of that stuff for the next release.

Server

Uppy server has undergone a quite a few changes, including the build setup:

  • We are using ES2015, transpiling to ES5 with Babel.
  • Added linting, lint-staged, pre-commit all that good stuff.
  • Added npm run release command that publishes releases for us.
  • Google Drive is working again on the Uppy Server side.
  • Refactoring, error handling and more minor improvements.
Continue reading ...

Uppy 0.11: StatusBar, research, https and API docs

Tuesday Nov 15, 2016

Hey everyone! It has been a while since we last shared some news about our progress and we can’t wait to let you know what’s up(py)!

In October, we have been working hard to get Uppy 0.11 ready for release. This entailed, among other things, doing a write-up of our general architecture, bringing in a friend to look at what we’ve been up to, experimenting with Redux, and updating the Dashboard UI and website example.

Here’s what we have been up to, in some more detail.

Continue reading ...

Uppy 0.10: Getting together, the future, Google Drive UI, exposed events

Wednesday Sep 28, 2016

Hi! Another month has passed and we have just released a new version of Uppy. Here’s what we’ve been up to.

Thinking about the future 🔮

We have been spending quite a lot of time thinking about Uppy’s future and the direction in which we would like to take this project. Our primary concern is making Uppy as flexible as possible as well as compatible with popular libraries, such as React and React Native. We also want to make it easy to port Uppy to any environments or ecosystems that are not officially supported.

We have done a lot of research. We created prototypes of Uppy React components and we also created a new module that we like to call “Uppy Base.” uppy-base is a thin module containing reusable functionality from some of our plugins that can be used in any ecosystem or environment, without being opinionated about the UI.

Continue reading ...

Uppy 0.9: Making Progress, then pause & resume. Remote file uploads, Informer.

Friday Aug 26, 2016

We have just released Uppy 0.9.0. This release features some changes that we think you will be very excited about. Let’s see what’s new!

Continue reading ...

Uppy version 0.8 released: The Webcam Edition and Meta Data

Wednesday Aug 17, 2016

We have just released Uppy 0.8.0 and we can’t wait to tell you more about it. Along with various under-the-hood improvements, this release also contains some very visible upgrades. You can read below for further details.

Including Meta Data

While fetching your files, Uppy is now also able to supply some custom metadata to go along with them. So far, there are three components in place for that: Core API (core:update-meta event), MetaData plugin, and a new panel in Dashboard UI called File Card, which looks like this:

metadata dashboard UI, editing file name, future size and adding description

Continue reading ...

Uppy: let’s teach an old dog some new tricks

Friday Jul 15, 2016

For the past six months, we have been working hard on uppy.io. We feel that it is high time we gave you a look behind the scenes: what are we working on, and why.

The way uploading works has not changed in a meaningful way since the days of our trusty old 56 kbit/s modems. Of course, files have gotten bigger and speeds have increased, but that is more or less all there is to say. If it were up to us – and we hope it is – that is all about to change.

We at Transloadit are on a mission to change the way the world does uploading. To accomplish this, our first step has been to develop an open protocol for resumable file uploads, called ‘tus’. Finally, that 2GB video upload from your smartphone doesn’t have to start over when your train passes through a tunnel! The protocol got Hacker News excited on several occasions and is being deployed by, among others, our friends at Vimeo. Now that a stable version 1.0 of ‘tus’ has been released, it is time to put it to the test. A protocol without real-world applications is nothing more than a meaningless document, after all.

We are therefore excited to tell you about Uppy: the file uploader that will certainly fetch more than just your newspaper.

Continue reading ...