Regressive Web Apps

There were plenty of talks about building for the web at this year’s Google I/O event. That makes a nice change from previous years when the web barely got a look in and you’d be forgiven for thinking that Google I/O was an event for Android app developers.

This year’s event showed just how big Google is, and how it doesn’t have one party line when it comes to the web and native. At the same time as there were talks on Service Workers and performance for the web, there was also an unveiling of Android Instant Apps—a full-frontal assault on the web. If you thought it was annoying when websites door-slammed you with intrusive prompts to install their app, just wait until they don’t need to ask you anymore.

Peter has looked a bit closer at Android Instant Apps and I think he’s as puzzled as I am. Either they are sandboxed to have similar permission models to the web (in which case, why not just use the web?) or they allow more access to native APIs in which case they’re a security nightmare waiting to happen. I’m guessing it’s probably the former.

Meanwhile, a different part of Google is fighting the web’s corner. The buzzword du jour is Progressive Web Apps, originally defined by Alex as:

  • Responsive
  • Connectivity independent
  • App-like-interactions
  • Fresh
  • Safe
  • Discoverable
  • Re-engageable
  • Installable
  • Linkable

A lot of those points are shared by good native apps, but the first and last points in that list are key features of the web: being responsive and linkable.

Alas many of the current examples of so-called Progressive Web Apps are anything but. Flipkart and The Washington Post have made Progressive Web Apps that are getting lots of good press from Google, but are mobile-only.

Looking at most of the examples of Progressive Web Apps, there’s an even more worrying trend than the return to m-dot subdomains. It looks like most of them are concentrating so hard on the “app” part that they’re forgetting about the “web” bit. That means they’re assuming that modern JavaScript is available everywhere.

Alex pointed to shop.polymer-project.org as an example of a Progressive Web App that is responsive as well as being performant and resilient to network failures. It also requires JavaScript (specifically the Polymer polyfill for web components) to render some text and images in a browser. If you’re using the “wrong” browser—like, say, Opera Mini—you get nothing. That’s not progressive. That’s the opposite of progressive. The end result may feel very “app-like” if you’re using an approved browser, but throwing the users of other web browsers under the bus is the very antithesis of what makes the web great. What does it profit a website to gain app-like features if it loses its soul?

I’m getting very concerned that the success criterion for Progressive Web Apps is changing from “best practices on the web” to “feels like native.” That certainly seems to be how many of the current crop of Progressive Web Apps are approaching the architecture of their sites. I think that’s why the app-shell model is the one that so many people are settling on.

Personally, I’m not a fan of the app-shell model. I feel that it prioritises exactly the wrong stuff—the interface is rendered quickly while the content has to wait. It feels weirdly like a hangover from Appcache. I also notice it being used as a get-out-of-jail-free card, much like the ol’ “Single Page App” descriptor; “Ah, I can’t do progressive enhancement because I’m building an app shell/SPA, you see.”

But whatever. That’s just, like, my opinion, man. Other people can build their app-shelled SPAs and meanwhile I’m free to build websites that work everywhere, and still get to use all the great technologies that power Progressive Web Apps. That’s one of the reasons why I’ve been quite excited about them—all the technologies and methodologies they promote match perfectly with my progressive enhancement approach: responsive design, Service Workers, good performance, and all that good stuff.

I hope we’ll see more examples of Progressive Web Apps that don’t require JavaScript to render content, and don’t throw away responsiveness in favour of a return to device-specific silos. But I’m not holding my breath. People seem to be so caught up in the attempt to get native-like functionality that they’re willing to give up the very things that make the web great.

For example, I’ve seen people use a meta viewport declaration to disable pinch-zooming on their sites. As justification they point to the fact that you can’t pinch-zoom in most native apps, therefore this web-based app should also prohibit that action. The inability to pinch-zoom in native apps is a bug. By also removing that functionality from web products, people are reproducing unnecessary bugs. It feels like a cargo-cult approach to building for the web: slavishly copy whatever native is doing …because everyone knows that native apps are superior to websites, right?

Here’s another example of the cargo-cult imitation of native. In your manifest JSON file, you can declare a display property. You can set it to browser, standalone, or fullscreen. If you set it to standalone or fullscreen then, when the site is launched from the home screen, it won’t display the address bar. If you set the display property to browser, the address bar will be visible on launch. Now, personally I like to expose those kind of seams:

The idea of “seamlessness” as a desirable trait in what we design is one that bothers me. Technology has seams. By hiding those seams, we may think we are helping the end user, but we are also making a conscience choice to deceive them (or at least restrict what they can do).

Other people disagree. They think it makes more sense to hide the URL. They have a genuine concern that users will be confused by launching a website from the home screen in a browser (presumably because the user’s particular form of amnesia caused them to forget how that icon ended up on their home screen in the first place).

Fair enough. We’ll agree to differ. They can set their display property how they want, and I can set my display property how I want. It’s a big web after all. There’s no one right or wrong way to do this. That’s why there are multiple options for the values.

Or, at least, that was the situation until recently…

Remember when I wrote about how Chrome on Android will show an “add to home screen” prompt if your Progressive Web App fulfils a few criteria?

  • It is served over HTTPS,
  • it has a manifest JSON file,
  • it has a Service Worker, and
  • the user visits it a few times.

Well, those goalposts have moved. There is now a new criterion:

  • Your manifest file must not contain a display value of browser.

Chrome developers have decided that displaying URLs is not “best practice”. It was filed as a bug.

A bug.

Displaying URLs.

A bug.

I’m somewhat flabbergasted by this. The killer feature of the web—URLs—are being treated as something undesirable because they aren’t part of native apps. That’s not a failure of the web; that’s a failure of native apps.

Now, don’t get me wrong. I’m not saying that everyone should be setting their display property to browser. That would be far too prescriptive. I’m saying that it should be a choice. It should depend on the website. It should depend on the expectations of the users of that particular website. To declare that all users of all websites will be confused by seeing a URL is so presumptuous and arrogant that it beggars belief.

I wouldn’t even have noticed this change of policy if it weren’t for the newly-released Lighthouse tool for testing Progressive Web Apps. The Session gets a good score but under “Best Practices” there was a red mark against the site for having display: browser. Turns out that’s the official party line from Chrome.

Just to clarify: you can have a site that has literally no HTML or turns away entire classes of devices, yet officially follows “best practices” and gets rewarded with an “add to home screen” prompt. But if you have a blazingly fast responsive site that works offline, you get nothing simply because you don’t want to hide URLs from your users:

I want people to be able to copy URLs. I want people to be able to hack URLs. I’m not ashamed of my URLs …I’m downright proud.

Stuart argues that this is a paternal decision:

The app manifest declares properties of the app, but the display property isn’t about the app; it’s about how the app’s developer wants it to be shown. Do they want to proudly declare that this app is on the web and of the web? Then they’ll add the URL bar. Do they want to conceal that this is actually a web app in order to look more like “native” apps? Then they’ll hide the URL bar.

I think there’s something to that, but digging deeper, developers and designers don’t make decisions like that in isolation. They’re generally thinking about what’s best for users. So, yes, absolutely, different apps will have different display properties, but that shouldn’t be down to the belief system of the developer; it should be down to the needs of the users …the specific needs of the specific users of that specific app. For the Chrome team to come down on one side or the other and arbitrarily declare that one decision is “correct” for every single Progressive Web App that is ever going to be built …that’s a political decision. It kinda feels like an abuse of power to me. Withholding the “add to home screen” prompt like that has a whiff of blackmail about it.

The other factors that contribute to the “add to home screen” prompt are pretty uncontroversial:

  • Sites should be served over a secure connection: that’s pretty hard to argue with.
  • Sites should be resilient to network outages: I don’t think anyone is going to say that’s a bad idea.
  • Sites should provide some metadata in manifest file: okay, sure, it’s certainly not harmful.
  • Sites should obscure their URL …whoa! That feels like a very, very different requirement, one that imposes one particular opinion onto everyone who wants to participate.

This isn’t the first time that Chrome developers have made a move against the address bar. It’s starting to grind me down.

Up until now I’ve been a big fan of Progressive Web Apps. I understood them to be combining the best of the web (responsiveness, linkability) with the best of native (installable, connectivity independent). Now I see that balance shifting towards the native end of the scale at the expense of the web’s best features. I’d love to see that balance restored with a little less emphasis on the “Apps” and a little more emphasis on the “Web.” Now that would be progressive.

Have you published a response to this? :

Responses

Webrocker

[…] Looking at most of the examples of Progressive Web Apps, there’s an even more worrying trend than the return to m-dot subdomains. It looks like most of them are concentrating so hard on the “app” part that they’re forgetting about the “web” bit. That means they’re assuming that modern JavaScript is available everywhere.adactio.com

I’m again with Jeremy Keith here. I’m team web. Links and Urls (and being responsive) are the web’s superpower. Don’t cripple that by trying to emulate ‘native’.

(and I want to add a second like for the usage of the word ‘flabbergasted’)

# Posted by Webrocker on Wednesday, May 25th, 2016 at 6:48am

potch

Progressive Web Apps is a Google brand and only they get to decide what it means and how it’s rewarded. adactio.com/journal/10708

# Posted by potch on Wednesday, May 25th, 2016 at 7:03pm

Webrocker

Ha! It! Really! Works!

I have to admit I was a bit sceptical of the outcome after I tweaked and added things and bits of my website at the Indiewebcamp in Nuremberg, setting up a service worker and offline caching things, adding a manifest file … while in theory I understand what all of this was supposed to do, I felt a bit dumb for not completly grasping how to control the stuff.

So as so often when learning new tricks on the web, it started with copy/pasting a working solution and trying to adapt this to my ideas.

But the one (visible) ‘ahaa!’ outcome — getting the Chrome browser to display the ‘add to home screen’ prompt — it hasn’t happened yet. Even during my tests at the Open Device Lab Frankfurt, nothing happened. There is this thing; the Chrome browser kind of decides*) if you as a visitor have interacted and shown enough interest in the web site before it’ll show this prompt. Apparently my one-time visits during the tests were not enough.

Until now.

So yes, technically I now have my web site as a “progressive web app”: In case you have visited some of my contents while being online, you then can browse and read the stuff while being offline. Other than that, I haven’t dug deeper, so there’s currently no storage of user input or interaction for use when being online again — but all this is possible, though maybe not really useful for my website. I highly recomment Jake Archibald’s talk on this year’s Google I/O event, if you are interested in this PWA stuff. (*)But also take good note of Jeremy Keith’s article.)

For the moment I am excited that I got this to work, just for the sake of getting it to work. :-)

# Posted by Webrocker on Thursday, May 26th, 2016 at 9:19am

Cheng

即使是 Google 也在开放的 Web 和封闭 App 的天平上偏向着封闭。或许我们所熟知的开放 Web 真的只是昙花一现?// Regressive Web Apps adactio.com/journal/10708

# Posted by Cheng on Tuesday, June 7th, 2016 at 3:44am

77 Shares

# Shared by Scott Jehl on Wednesday, May 25th, 2016 at 12:05am

# Shared by MAW on Wednesday, May 25th, 2016 at 12:08am

# Shared by Drew McChesney on Wednesday, May 25th, 2016 at 12:23am

# Shared by Benedict Steele on Wednesday, May 25th, 2016 at 12:29am

# Shared by Eskside Design on Wednesday, May 25th, 2016 at 1:12am

# Shared by Rob Cherny on Wednesday, May 25th, 2016 at 1:12am

# Shared by Drew Bolles on Wednesday, May 25th, 2016 at 1:42am

# Shared by Peter Rushforth on Wednesday, May 25th, 2016 at 1:48am

# Shared by Akshay Ranganath on Wednesday, May 25th, 2016 at 1:51am

# Shared by Chris Wright on Wednesday, May 25th, 2016 at 3:02am

# Shared by pixel9 on Wednesday, May 25th, 2016 at 5:06am

# Shared by maybemonad on Wednesday, May 25th, 2016 at 7:02am

# Shared by Andy Howell on Wednesday, May 25th, 2016 at 7:16am

# Shared by Sergi Meseguer on Wednesday, May 25th, 2016 at 8:02am

# Shared by Francesco Di Gravina on Wednesday, May 25th, 2016 at 8:20am

# Shared by bibo on Wednesday, May 25th, 2016 at 8:27am

# Shared by Razvan Caliman on Wednesday, May 25th, 2016 at 8:33am

# Shared by Rhys Evans on Wednesday, May 25th, 2016 at 8:36am

# Shared by Orde Saunders on Wednesday, May 25th, 2016 at 8:50am

# Shared by Thomas Digby on Wednesday, May 25th, 2016 at 9:24am

# Shared by David O'Brien on Wednesday, May 25th, 2016 at 9:24am

# Shared by Lennie on Wednesday, May 25th, 2016 at 9:51am

# Shared by Saulius Kerusauskas on Wednesday, May 25th, 2016 at 10:02am

# Shared by Pier Paolo Ramon on Wednesday, May 25th, 2016 at 10:20am

# Shared by chris van wiemeersch on Wednesday, May 25th, 2016 at 10:22am

# Shared by Rowan Manning on Wednesday, May 25th, 2016 at 10:42am

# Shared by Olivier Ligot on Wednesday, May 25th, 2016 at 11:09am

# Shared by José Luis Bolos on Wednesday, May 25th, 2016 at 11:18am

# Shared by Tom Dale on Wednesday, May 25th, 2016 at 11:28am

# Shared by John Brett on Wednesday, May 25th, 2016 at 11:29am

# Shared by Sébastien Deleuze on Wednesday, May 25th, 2016 at 11:30am

# Shared by Glynn Phillips on Wednesday, May 25th, 2016 at 11:33am

# Shared by Piet on Wednesday, May 25th, 2016 at 11:34am

# Shared by Alex Ferrando on Wednesday, May 25th, 2016 at 11:39am

# Shared by tom brandt on Wednesday, May 25th, 2016 at 11:40am

# Shared by Ad Taylor on Wednesday, May 25th, 2016 at 11:41am

# Shared by Kamalakannan on Wednesday, May 25th, 2016 at 11:44am

# Shared by Fabian Mettler on Wednesday, May 25th, 2016 at 11:45am

# Shared by Andrew Smith on Wednesday, May 25th, 2016 at 11:45am

# Shared by Mike Parsons on Wednesday, May 25th, 2016 at 11:46am

# Shared by Bryan Chaiklin on Wednesday, May 25th, 2016 at 11:48am

# Shared by Francis Onwumere on Wednesday, May 25th, 2016 at 11:50am

# Shared by Alex Kott on Wednesday, May 25th, 2016 at 11:50am

# Shared by Ire Aderinokun on Wednesday, May 25th, 2016 at 11:53am

# Shared by Studio Zero on Wednesday, May 25th, 2016 at 11:54am

# Shared by Ryan Connolly on Wednesday, May 25th, 2016 at 12:03pm

# Shared by Venkatesh on Wednesday, May 25th, 2016 at 12:04pm

# Shared by Eric Bailey on Wednesday, May 25th, 2016 at 12:23pm

# Shared by Nolan Lawson on Wednesday, May 25th, 2016 at 12:23pm

# Shared by Philippe Duval on Wednesday, May 25th, 2016 at 12:27pm

# Shared by Baldur Bjarnason on Wednesday, May 25th, 2016 at 12:31pm

# Shared by Andrey Okonetchnikov on Wednesday, May 25th, 2016 at 12:33pm

# Shared by Tobie Langel on Wednesday, May 25th, 2016 at 12:37pm

# Shared by XanderDumaine on Wednesday, May 25th, 2016 at 12:55pm

# Shared by Friedemann Altrock on Wednesday, May 25th, 2016 at 1:22pm

# Shared by Kashyap on Wednesday, May 25th, 2016 at 1:25pm

# Shared by Johann Sonntagbauer on Wednesday, May 25th, 2016 at 2:01pm

# Shared by Joni Korpi on Wednesday, May 25th, 2016 at 2:42pm

# Shared by Mathias on Wednesday, May 25th, 2016 at 2:43pm

# Shared by Olivier Audard on Wednesday, May 25th, 2016 at 3:17pm

# Shared by kateλyn perry on Wednesday, May 25th, 2016 at 3:34pm

# Shared by Ben Kelly on Wednesday, May 25th, 2016 at 4:52pm

# Shared by James Burke on Wednesday, May 25th, 2016 at 5:08pm

# Shared by Anne van Kesteren on Wednesday, May 25th, 2016 at 5:23pm

# Shared by Chris Taylor on Wednesday, May 25th, 2016 at 5:29pm

# Shared by Casper Thomsen on Wednesday, May 25th, 2016 at 5:38pm

# Shared by Mark Boyd on Wednesday, May 25th, 2016 at 6:05pm

# Shared by Jake Sandlund on Wednesday, May 25th, 2016 at 6:32pm

# Shared by Antti Koivisto on Wednesday, May 25th, 2016 at 7:34pm

# Shared by Andrey Savchenko on Wednesday, May 25th, 2016 at 9:02pm

# Shared by Jukka Niiranen on Wednesday, May 25th, 2016 at 9:25pm

# Shared by Dennis Gaebel on Thursday, May 26th, 2016 at 2:05am

# Shared by Alistair Duggin on Thursday, May 26th, 2016 at 8:57am

# Shared by kogut benoit on Thursday, May 26th, 2016 at 10:30am

# Shared by Thomas gratier on Saturday, June 11th, 2016 at 6:59pm

# Shared by Antonio Santiago on Saturday, June 11th, 2016 at 7:34pm

# Shared by Ray McBride on Monday, October 24th, 2016 at 1:10pm

94 Likes

# Liked by jalbertbowdenii on Tuesday, May 24th, 2016 at 11:58pm

# Liked by Joe Watkins on Wednesday, May 25th, 2016 at 12:31am

# Liked by Jakub Jo on Wednesday, May 25th, 2016 at 12:32am

# Liked by Alex Mahan on Wednesday, May 25th, 2016 at 12:32am

# Liked by Sean Curtis on Wednesday, May 25th, 2016 at 12:32am

# Liked by Ruadhán on Wednesday, May 25th, 2016 at 12:32am

# Liked by Devon Rathie-Wright on Wednesday, May 25th, 2016 at 12:32am

# Liked by erwin mombay on Wednesday, May 25th, 2016 at 12:33am

# Liked by DMXReady on Wednesday, May 25th, 2016 at 12:57am

# Liked by Jörg Hambuch on Wednesday, May 25th, 2016 at 12:57am

# Liked by Curtis Jurgensen on Wednesday, May 25th, 2016 at 1:31am

# Liked by Drew Bolles on Wednesday, May 25th, 2016 at 1:56am

# Liked by Alen Abdula on Wednesday, May 25th, 2016 at 1:56am

# Liked by Peter Rushforth on Wednesday, May 25th, 2016 at 1:56am

# Liked by Hugh Isaacs II on Wednesday, May 25th, 2016 at 1:57am

# Liked by Corina Rudel on Wednesday, May 25th, 2016 at 2:28am

# Liked by Jan Skovgaard on Wednesday, May 25th, 2016 at 5:40am

# Liked by Kartik Prabhu on Wednesday, May 25th, 2016 at 6:26am

# Liked by dirk döring on Wednesday, May 25th, 2016 at 6:42am

# Liked by Tinker Tom on Wednesday, May 25th, 2016 at 7:43am

# Liked by Andy Howell on Wednesday, May 25th, 2016 at 7:43am

# Liked by geertmelotte on Wednesday, May 25th, 2016 at 8:14am

# Liked by Sergi Meseguer on Wednesday, May 25th, 2016 at 8:14am

# Liked by Razvan Caliman on Wednesday, May 25th, 2016 at 8:44am

# Liked by Brunus on Wednesday, May 25th, 2016 at 9:10am

# Liked by Ricardo Gladwell on Wednesday, May 25th, 2016 at 9:10am

# Liked by adgad on Wednesday, May 25th, 2016 at 9:11am

# Liked by Vincent De Oliveira on Wednesday, May 25th, 2016 at 9:11am

# Liked by Thorvald Neumann on Wednesday, May 25th, 2016 at 9:40am

# Liked by mumoss on Wednesday, May 25th, 2016 at 9:40am

# Liked by David O'Brien on Wednesday, May 25th, 2016 at 9:40am

# Liked by Oliver Joseph Ash on Wednesday, May 25th, 2016 at 9:41am

# Liked by Douglas on Wednesday, May 25th, 2016 at 10:07am

# Liked by randstein on Wednesday, May 25th, 2016 at 10:32am

# Liked by Pier Paolo Ramon on Wednesday, May 25th, 2016 at 10:32am

# Liked by Beyoncé Owles on Wednesday, May 25th, 2016 at 11:28am

# Liked by Studio Zero on Wednesday, May 25th, 2016 at 11:58am

# Liked by Jon Moss on Wednesday, May 25th, 2016 at 11:58am

# Liked by Steven Held on Wednesday, May 25th, 2016 at 11:58am

# Liked by John Brett on Wednesday, May 25th, 2016 at 11:58am

# Liked by Adnan Topal on Wednesday, May 25th, 2016 at 11:58am

# Liked by Bryan Chaiklin on Wednesday, May 25th, 2016 at 11:59am

# Liked by jleedev on Wednesday, May 25th, 2016 at 11:59am

# Liked by Chris on Wednesday, May 25th, 2016 at 11:59am

# Liked by Glynn Phillips on Wednesday, May 25th, 2016 at 11:59am

# Liked by Gustavo Leon on Wednesday, May 25th, 2016 at 11:59am

# Liked by Andrew Smith on Wednesday, May 25th, 2016 at 12:00pm

# Liked by tbassetto on Wednesday, May 25th, 2016 at 12:34pm

# Liked by Hassan Abdel-Rahman on Wednesday, May 25th, 2016 at 12:35pm

# Liked by Baldur Bjarnason on Wednesday, May 25th, 2016 at 12:35pm

# Liked by Andrey Okonetchnikov on Wednesday, May 25th, 2016 at 1:00pm

# Liked by mar on Wednesday, May 25th, 2016 at 1:00pm

# Liked by Kristof Neirynck on Wednesday, May 25th, 2016 at 1:00pm

# Liked by kevin on Wednesday, May 25th, 2016 at 1:01pm

# Liked by Fabian Kern on Wednesday, May 25th, 2016 at 1:26pm

# Liked by Kashyap on Wednesday, May 25th, 2016 at 1:26pm

# Liked by Friedemann Altrock on Wednesday, May 25th, 2016 at 1:26pm

# Liked by Kamila Mielczarek on Wednesday, May 25th, 2016 at 1:26pm

# Liked by Tikhon Belousko on Wednesday, May 25th, 2016 at 2:50pm

# Liked by Rémi on Wednesday, May 25th, 2016 at 2:51pm

# Liked by Mizan :) on Wednesday, May 25th, 2016 at 2:51pm

# Liked by Joni Korpi on Wednesday, May 25th, 2016 at 2:52pm

# Liked by Fatih Altınok on Wednesday, May 25th, 2016 at 3:51pm

# Liked by Anton Heryanto on Wednesday, May 25th, 2016 at 3:51pm

# Liked by SA on Wednesday, May 25th, 2016 at 3:51pm

# Liked by Jason Davis on Wednesday, May 25th, 2016 at 3:51pm

# Liked by Ronalson Filho on Wednesday, May 25th, 2016 at 4:59pm

# Liked by Ben Kelly on Wednesday, May 25th, 2016 at 4:59pm

# Liked by Sam Weinig on Wednesday, May 25th, 2016 at 4:59pm

# Liked by Nicolas Eeckeloo on Wednesday, May 25th, 2016 at 5:19pm

# Liked by Josh Peek on Wednesday, May 25th, 2016 at 5:19pm

# Liked by Aske Kammer on Wednesday, May 25th, 2016 at 5:51pm

# Liked by Thomas Yung on Wednesday, May 25th, 2016 at 5:51pm

# Liked by Thomas Broyer on Wednesday, May 25th, 2016 at 5:53pm

# Liked by Fabian on Wednesday, May 25th, 2016 at 6:18pm

# Liked by Julien - revolunet on Wednesday, May 25th, 2016 at 7:49pm

# Liked by cstanhope on Wednesday, May 25th, 2016 at 7:50pm

# Liked by L. David Baron on Wednesday, May 25th, 2016 at 9:20pm

# Liked by Kyle Barrow on Wednesday, May 25th, 2016 at 9:20pm

# Liked by Gustaf on Wednesday, May 25th, 2016 at 10:55pm

# Liked by Mathieu Petitdant on Wednesday, May 25th, 2016 at 11:48pm

# Liked by Dennis Gaebel on Thursday, May 26th, 2016 at 2:22am

# Liked by Meechie Hoe on Thursday, May 26th, 2016 at 2:50am

# Liked by yong woo jeon(mixed) on Thursday, May 26th, 2016 at 2:50am

# Liked by Anil Valke on Thursday, May 26th, 2016 at 8:13am

# Liked by Alistair Duggin on Thursday, May 26th, 2016 at 9:11am

# Liked by Beau Davis on Thursday, May 26th, 2016 at 3:15pm

# Liked by Brecht Savelkoul 夏德明 on Thursday, May 26th, 2016 at 5:30pm

# Liked by Gabor Lenard on Friday, May 27th, 2016 at 9:25pm

# Liked by Marty DeGarmo on Saturday, May 28th, 2016 at 1:34am

# Liked by sisidovski on Saturday, May 28th, 2016 at 6:07am

# Liked by Simon Knox on Monday, May 30th, 2016 at 3:07pm

# Liked by Denis Elistratov on Thursday, June 2nd, 2016 at 9:23am

# Liked by Joyce White on Sunday, July 10th, 2016 at 4:30am