Jamstack is dead, long live Jamstack!

Issue #211.August 7, 2023.2 Minute read.

Betting on HTML, living in a VanJS down by the river, and forging an unholy alliance.

Welcome to #211.

Eyeballs logo

The Main Thing

Jennifer Lawrence crying on Hot Ones asking, what do you mean?

MFW when someone tells me they're a Jamstack developer.

A jammy tale

For the last 7 years, technologists, philosophers, and dev rels with too much time on their hands have debated one simple question: “Wtf is Jamstack?”

But these days, it might be more appropriate to ask, “What was Jamstack?” Because Netlify just killed the Jamstack Community Discord server (after already killing off Jamstack Conf) due to low activity — and even longtime Jamstack defenders like Brian Rinaldi have declared that the term seems to be dead.

But to write a proper eulogy for Jamstack, we still need to figure what it actually means. And to do that, we need to go back to where it all started.

Smashing Conf 2016: Matt Biilmann (Netlify co-founder & CEO) introduced the world to “The JAM Stack” for the very first time. JAM stood for “JavaScript, APIs, and Markup” — which was pretty revolutionary, since no one had ever used those to build a website before 2016. (That’s a joke.)

But even from the beginning, JAMstack never really referred to a specific “stack”, like LAMP or MERN. It was more of an architecture that involved creating interactive static sites with assets that are generated at build time and hosted on CDNs like Netlify.

So why did Matt call it the “The JAM Stack” and not something more precise/less confusing, like “build-time rendering” or even “static sites with JavaScripty things”?

Because those don’t have the sizzle 🍳. And the sizzle is what sells.

Static sites had been around for a long time back in 2016, but for many developers, they still conjured up images of boring, brochure-like websites that lacked the rich interactivity of the modern web.

So in those early days, “the JAM Stack” seemed to have two main goals: 1) rebrand and expand the concept of static sites as something modern, powerful, and jamtastic exciting, and 2) convince developers to host those static sites on Netlify. And it worked.

That’s why Miriam Schwab once said in a Jamstack roundtable that, “The name Jamstack is devoid of meaning, but it did serve a purpose” — which was to start a movement and build a community around the idea of building modern static sites. Or as Will Ferrell once said, “No one knows what Jamstack means, but it’s provocative.”

Ok, so Jamstack = static sites, right? Wrong.

It meant that for a while, until a few years later when we started to bump up against the limits of what purely static sites were capable of, and more dynamic forms of rendering started to become fashionable again with SSR, ISR, etc.

Netlify wanted developers to host their more dynamic web apps on its CDN too (because money) — so what did they do?

They rebranded “the JAMstack” to Jamstack, stopped referencing the original acronym altogether, and expanded the term’s definition to include most dynamically generated websites and pretty much all other forms of modern web development.

This might’ve been a smart business move for Netlify, but it signaled the beginning of the end for Jamstack — because when everything’s jammy, nothing is.

For the past couple years, Jamstack enthusiasm has waned, and we’ve seen a rash of articles, videos, and podcasts all trying to answer “What is Jamstack?” in their own way.

For the pro-Jammy crowd, the answers became “it’s a feeling, a community, a set of web dev principles.” And for the anti-Jammy crowd, the answer was, “it’s a marketing term that has always meant sites you can host on Netlify.”

And they both might be right.

After spending way too much time going down the rabbit hole of Jamstack history this past weekend, here’s my TLDR answer to that age-old question:

Even though the term was non-prescriptive and imprecise (and thus mostly unhelpful) from the start, Jamstack did help kickstart a movement around modern static sites in the late 2010s. But it was also clearly a marketing term that Netlify overextended to the point where it eventually lost all its original meaning — however nebulous that was to begin with.

Bottom Line: I never thought I’d write one of my longest Bytes stories ever about the life and death of Jamstack, but here we are. RIP ole’ sport.


Nylas logo

Our Friends
(With Benefits)

Mr Incredible looking depressed at his computer

MFW I've spent the last 3 weeks building email integrations.

Email, Calendar, and Contacts ➡ in your app. Build for free with Nylas.️

Over 250,000 developers use simple APIs from Nylas to seamlessly integrate emails, calendars, and contacts in their apps.

Why? Because those features can instantly make your app more powerful, but building them from scratch is painful af.

Nylas makes it easy to sync data and automate tasks based on your users’ inboxes, calendar, and contacts. And you can use their free-forever tier to quickly:

  • Build in-app calendar views & scheduling tools
  • Embed email clients for your users
  • Enable instant, in-app event booking
  • Power automated (one-off or mass) email outreach that lands in inboxes, not spam

Check out the Nylas + AI virtual workshop this week. You’ll get hands-on with combining gen AI tools like ChatGPT and Huggingface with email data and capabilities.

Spot the Bug logo

Spot the Bug

Sponsored by Snyk

Are your JavaScript projects affected by code vulnerabilities? Check out Snyk’s Top 10 JavaScript Code Vulnerabilities Cheat Sheet to find out which vulnerabilities you should look out for.

function getRandomChoice (array) {
  return array[Math.floor((Math.random() * array.length) + 1)]

getRandomChoice(["jersey mikes", "firehouse", "subway"])

Cool Bits logo

Cool Bits

  1. Alice Alexandra Moore wrote an in-depth article called Understanding React Server Components on the Vercel blog.

  2. VanJS just released v1.0 of its Reactive UI framework that “feels like building React apps in a scripting language, without JSX.” It also feels a lot like living in a van down by the river.

  3. CarbonQA provides high-quality QA services for dev teams, so you’ll never have to do it yourself again. They work in your tools, talk with your team on Slack, and let your devs be devs. [sponsored]

  4. Sunil Pai gave a talk called Everything’s better with friends at the Future Frontend conference. I’m a little offended that he wasn’t wearing the Bytes hat we sent him on stage, but I guess we can still be friends.

  5. Nico Burniske wrote about his experience building Leptos Query — a Tanstack Query equivalent for Leptos, which is a new full-stack framework for building web apps in Rust.

  6. Dave Rupert wrote an article called If Web Components are so great, why am I not using them? It reminds me of an article I’ve been writing called, “If kale is so healthy, why do I still think it’s icky?”

  7. Marco Salazar and Pete Hunt wrote about how they Sped up the dbt docs by 20x with React Server Components. It’s a helpful look into both the power of RSC and the pain you can experience when implementing them.

  8. TurnKey just launched Dev’s Got (Extra)Talent! — the first global talent competition for developers to showcase their skills beyond coding. The winner will be crowned “World’s Most Extra Talented Developer” and receive a tasty grand prize of $5,000. Register here before August 31st, and good luck trying to beat my talent of playing a perfect Wonderwall cover on the recorder. [sponsored]

  9. Catskull wrote an article called I’m betting on HTML. What kind of odds do you think they got for that on Fanduel?

  10. PythonMonkey is a new SpiderMonkey JavaScript engine embedded into the Python VM, which allows JavaScript libraries to be used seamlessly in Python code and vice versa. I just hope the scriptGods don’t curse us all for this abomination.

Spot the Bug logo

Spot the Bug: Solution

Sponsored by Snyk

By adding 1 to the result of Math.random() * array.length, it will always be greater than 1 which means the first element in the array (jersey mikes) will never be chosen.

You’ll either want to put subway first so it never gets chosen (cause it’s gross) or remove the + 1

function getRandomChoice (array) {
  return array[Math.floor((Math.random() * array.length))]

getRandomChoice(["jersey mikes", "firehouse", "subway"])