The Case Against Progressive Enhancement's Flimsy Moral Foundation

Josh Korr, Former Product Strategy Director

Article Category: #Code

Posted on

PE is based on an unstated moral philosophy, not on practical dev ideas — and that philosophy doesn't make sense.


This post sparked a lot of response, and I've written a follow-up that's clearer than this one. My tone in this post wasn't helpful, and I was too glib/literal about calling PE a moral argument. In the follow-up, I clarify my points: 1) I'm talking about the PE discussion rather than the approach itself. 2) PE is indeed a practical approach to development, but it's often talked about in moral terms. The latter is what causes the discussion to go around in circles.

We Vigets typically stay out of in-the-weeds web development battles. But I think I have a useful insight about one particular fight, so ... <grabs parachute, adjusts steampunky goggles, wheeee!>

I’m talking about the battle over progressive enhancement.

Progressive enhancement (PE) is ostensibly a practical approach to web development that calls for making a site’s core content available in HTML, and layering on CSS and JavaScript as enhancements.

The battle is about the JavaScript part.

While JavaScript was once used primarily for discrete animations on a page — a dropdown menu, a carousel — it’s increasingly used to create highly interactive, desktop-app-like experiences on the web. Google Docs’ and Spreadsheets’ auto-saving, multi-user editing, lack of page refreshes, and offline editing? That’s JavaScript. Squarespace’s drag-and-drop tools that are advertised on seemingly every podcast? That’s JavaScript. These Dick’s Sporting Goods marketing sites? JavaScript.

However, some PE advocates argue — often vehemently — that despite this shift, JavaScript should still be used only as an enhancement, and that sites must work without JavaScript.

Other developers are increasingly frustrated with this argument: see the latest salvos from Nolan Lawson and Christian Heilmann. Lawson notes that these PE advocates seem to talk about progressive enhancement “as a moral decision as much as a technical one.” And Heilmann writes that “A lot of the [progressive enhancement] chatter that’s happening right now seems to be circular.”

They’re both right. 

In this post, I want to fully unpack those ideas and make the case that:

  1. Progressive enhancement is a philosophical, moral argument disguised as a practical approach to web development.
  2. This makes it impossible to engage with at a practical level.
  3. When exposed to scrutiny, that moral argument falls apart.
  4. Therefore, if PEers can’t find a different argument, it’s ok for everyone else to get on with their lives.

This post is not a technical assessment; I’m not a developer. But I am an expert at spotting fuzzy rhetoric and teasing out what’s really being said.

By bringing that hidden argument into the open, I hope to help break out of the circularity and ultimately make the discussion more productive.

Before we start, a quick note about nomenclature and who I'm talking about. As Nolan Lawson puts it, there are PE “moderates ... who don’t take such a hard-line stance” about JavaScript. When I refer to PEers in the rest of this post, I'm not talking about these pragmatic folks — I'm talking about the people who do take a hard-line stance about JS. Call them the PE hard-liners.

Also, opinions are of course my own.

The Real Progressive Enhancement Argument

Let’s get right to it. Here is the real progressive enhancement argument:

  • It’s a moral imperative that everything on the web should be available to everyone everywhere all the time. Failing to achieve — or at least strive for — that goal is inhumane.

Now, you won’t see that argument explicitly stated anywhere. To uncover the real argument, you have to analyze what PEers aren’t saying.

To do this, we’ll play what I call the LSAT Game, based on the LSAT’s Logical Reasoning section. In logical reasoning questions, a statement is given, and you have to identify the unstated assumption that logically connects the parts of the statement.

Let’s play the game with some pro-PE writing.


  • “When we write JavaScript, it’s critical that we recognize that we can’t be guaranteed it will run.” — Aaron Gustafson
  • “If you make your core tasks dependent on JavaScript, some of your potential users will inevitably be left out in the cold.” — Jeremy Keith

Unstated assumptions: 

  • Because there is some chance JavaScript won’t run, we must always account for that chance. 
  • Core tasks can always be achieved without JavaScript.
  • It is always bad to ignore some potential users for any reason.


  • “[With a PE approach,] Older browsers get a clunky experience with full page refreshes, but that’s still much, much better than giving them nothing at all.” — Jeremy Keith
  • “If for some reason JavaScript breaks, the site should still work and look good. If the CSS doesn’t load correctly, the HTML content should still be there with meaningful hyperlinks.” — Nick Pettit

Unstated assumptions:

  • A clunky experience is always better than no experience.
  • HTML content — i.e. text, images, unstyled forms — is the most important part of most websites.


  • “Question any approach to the web where fancy features for a few are prioritized & basic access is something you’ll ‘get to’ eventually.” — Tim Kadlec

Unstated assumptions:

  • Everything beyond HTML content is superfluous fanciness.
  • It’s morally problematic if some users cannot access features built with JavaScript.


  • “Everyone deserves access to the sum of all human knowledge.” — Nick Pettit
  • “[The web is] built with a set of principles that — much like the principles underlying the internet itself — are founded on ideas of universality and accessibility. ‘Universal access’ is a pretty good rallying cry for the web.” — Jeremy Keith
  • “The minute we start giving the middle finger to these other platforms, devices and browsers is the minute where the concept of The Web starts to erode. Because now it’s not about universal access to information, knowledge and interactivity. It’s about catering to the best of breed and leaving everyone else in the cold.” — Brad Frost

Unstated assumptions:

  • What’s on the web comprises the sum of human knowledge.
  • Progressive enhancement is fundamentally about universal access to this sum of human knowledge.
  • It is always immoral if something on the web isn’t available to everyone.

Why That Argument Causes the Circular Discussion

Assemble those unstated assumptions and you get the real PE argument: universal access to everything on the web is a moral imperative.

That’s a philosophical argument, not a practical approach to web development. 

This is why the discussion is circular: Most people are trying to have that practical discussion, but PEers answer with a moral philosophy that shuts down practical considerations.


  • “Wait, how often do people turn off JavaScript?” “Shut up. Universal access to content is a moral imperative.”
  • “I’m not trying to be mean, but I don’t think people in Sudan are going to buy my product.” “LAZY MONSTER. Universal access to content is a moral imperative.”

This must be endlessly frustrating for practical-minded devs. But there’s a silver lining to PEers going all-in on this moral argument: if that argument fails, they’ve got nothing left.

Why the Real Progressive Enhancement Argument Makes No Sense

So let’s flip the script for once. Let’s leave the practical discussion behind and see how the philosophical progressive enhancement argument stands up to scrutiny.

Spoiler alert: It doesn’t. Let me count the ways.

Fail 1: PEers Are Wrong About What’s Actually on the Web

PEers talk as though the web consists primarily of text and images that every human is entitled to have — a repository of universal birthright information. This is a wild misunderstanding of the modern world and the modern web.

The modern web is a primary way we access:

  • Business and personal software, both of which have exploded in use now that software has eaten the world and is accessed primarily via the web
  • Copyrighted news and entertainment content (text, photos, music, video, video games)
  • Advertising and marketing content

Fail 2: PEers’ Concepts of Universal Access and Moral Imperatives Therefore Make No Sense

Given what’s actually on the web, advocating for universal access means PEers would have to argue:

  • All software and copyrighted news/entertainment content accessed via the web should be free.
  • Netflix, Spotify, HBO Now, etc. should allow anyone to download original music and video files because some people don’t have JavaScript.
  • Actually, scratch that: Any content that can’t be accessed via old browsers/devices shouldn’t be on the web in the first place.
  • Everything on the web should have built-in translations into every language.
  • Honda needs to consider a universal audience for its marketing websites even though (a) its offline advertising is not universal, and (b) only certain people can access or afford the cars being advertised.
  • All of the above should also be applied to offline software, books, magazines, newspapers, TV shows, CDs, movies, advertising, etc.

Needless to say, this argument would never succeed. And it shouldn’t succeed:

  • Commercial software is a product that a company sells. Just as it would be absurd to expect companies to give away cars, Craftsman tool sets, or tax preparation services to everyone in the world, it would be absurd to expect companies to do so with software.
  • Most of the world has a system of copyrighted news/entertainment. You could argue with that system (though good luck with that), but you can’t say the system shouldn’t apply just because a copyrighted thing is accessed via the web.
  • A company has no inherent reason or moral obligation to consider people outside its products’ geographic or economic reach. Moreover, any company that offers products or services to people in other places will appropriately consider the audience’s language and available technology. Otherwise the products will fail.
  • Viget’s awesome Dick’s Sporting Goods sites are commercials. Netflix is entertainment. Adobe is a business selling software to people who want and can afford it. That stuff is not on some higher plane of universal human knowledge.

If universal access to what’s on the web doesn’t make sense, then there can’t be a moral imperative to provide that universal access. Which means:

  • PEers’ claimed (or insinuated) moral high ground is a sham.
  • The underlying justification for progressive enhancement falls apart.
  • PEers have no coherent rationale for why sites must work without JavaScript, and no coherent answer to practical retorts like “Wait, how often do people turn off JavaScript?” 

Fail 3: The Moral Arguments Not Taken

There are plenty of coherent philosophical/moral arguments about the internet and content access:

  1. Countries should strive for universal access to the internet — to the infrastructure and to devices that can access it — because internet access can lead to economic, social, and political progress. (i.e. right to internet access.)
  2. A government should not place limits on who can access the web, which parts of the web people can access, or what can be said on the web.
  3. Companies that control internet access should treat all data the same (i.e. net neutrality)
  4. The web should always have the potential for anyone to create hyperlinked HTML files that add to the world’s birthright knowledge.
  5. More copyright owners should let more of their content be part of the world’s birthright knowledge.

The problem for PEers is that:

  1. They do not make any of those arguments.
  2. Their central fixation — whether and how a website uses JavaScript — has zero impact on those moral causes. (For a real-time example, read this depressing report on the state of internet freedom and ask yourself: does JavaScript have anything do with this?)
  3. Web development in general has little impact on those moral causes, which are more about broader legal, political, social, and economic systems.

(PEers also often invoke the coherent moral argument of web accessibility. Accessibility is basically a non sequitur here, but it'll take a separate post or a comment on this post to articulate why. At the least, JavaScript features and client-side applications can be accessible.)

Ending the Circularity

When pragmatists get sucked into this discussion, they usually try hard to be even-handed, big-tenty, can't-we-just-get-along-y. For example, Matt Griffin wrote this achingly good-hearted article for A List Apart during a previous round of PE blowups. 

Griffin writes that PE “is epitomized by the ‘what about users with no JavaScript’ argument. This polarizing question — though not the entire issue by far — gets at the heart of the disagreement” (emphasis added). He takes hard-liner Jeremy Keith's pragmatist feints at face value, saying “[Keith] suggests that ... the answer is ‘it depends.’”

Griffin concludes:

“One thing that needs to be considered when we’re experimenting ... is who the audience is for that thing. Will everyone be able to use it? Not if it’s, say, a tool confined to a corporate intranet. Do we then need to worry about sub-3G network users? No, probably not. What about if we’re building on the open web but we’re building a product that is expressly for transferring or manipulating HD video files? Do we need to worry about slow networks then? ... Context, as usual, is everything.”

This is wonderfully pragmatic, and most devs would ask these kind of questions when determining the technical approach for a given project. But in the PE discussion, it's also woefully naive. Because to the hard-liners, context is irrelevant. Pragmatic questions are irrelevant. The JavaScript question is the entire issue — and the answer is always “We must consider JS-less scenarios because moral imperative.” 

You can see this in Jeremy Keith's response to Nolan Lawson's article. Keith writes: “Millions of people use proxy browsers like Opera Mini, which means you can’t guarantee JavaScript availability beyond the initial page load” (emphasis added). And: “I’m saying that we can build rich interactive web apps that work offline and also work when JavaScript fails or isn’t supported” (emphasis added again). 

After all this, it's still all about the JavaScript. For the hard-liners, it never actually depends.

Meantime, while Griffin bends over backward to give benefit of the doubt, Keith writes things like this:


  • “Building a client-side web thang that requires JavaScript to work is convenient. ... The trade-off is that to get that level of developer convenience, you have to sacrifice the universal reach that the web provides, and limit your audience to the browsers that can run a pre-determined level of JavaScript. ... I wish that progressive enhancement could provide the same level of developer convenience offered by Angular and Ember, but right now, it doesn’t. Instead, its benefits are focused on the end user, often at the expense of the developer. Personally, I’m willing to take that hit. I’ve always maintained that, given the choice between making something my problem, and making something the user’s problem, I’ll choose to make it my problem every time.”

Unstated assumptions:

  • The only way to care about end users is to ensure universal access to everything on the web.
  • Developers who eschew progressive enhancement are motivated by laziness and/or selfishness, and they don't think or care about end users.

That's the circularity — and the frustration — in a nutshell: Pushing an incoherent moral philosophy in the guise of a practical discussion, and kinda being a jerk about it.

So to the PE hard-liners doubling down on “It's gotta work without JavaScript”: It’s time to step down from the faux moral high ground and finally make the case at a practical level.

And to the well-meaning devs who have felt trapped or shamed in this circular discussion: You're not a bad person if you ask the hard-liners to stick to practical arguments, and tune them out until they have something coherent to say.

Related Articles