Mux is the video API for the JAMstack
Tags: javascript, gatsby, serverless
Published: 2020-04-08 16:28:01

# What is the JAMstack?

The JAMstack is a term popularized in the last year, largely by the React community and companies like [Netlify](https://www.netlify.com/) and [Zeit](https://zeit.co/). Specifically, JAMstack stands for "Javascript", "APIs" and "Markup". These terms don't exactly describe what the JAMstack is in a clear way, but the name itself has a nice ring to it so it seems to have stuck.

Here is a breakdown of all the pieces for a "JAMstack" application and what some of the popular options are. For a more exhaustive list you might check out [awesome-jamstack on Github](https://github.com/automata/awesome-jamstack).

## Static content frameworks

This covers the "Javascript" and "Markup" part of the stack.

* [Next.js](https://nextjs.org/): Open source, write everything with React and the framework gives you automatic code splitting and a server-side rendered web application.
* [Gatsby](https://www.gatsbyjs.com/): Also open source and you write everything with React components. The Gatsby framework handles code splitting and lazy loading resources. Gatsby also has a concept of “sources” where you can write GraphQL queries to pull in data from 3rd party sources via a plugin.
* [11ty](https://www.11ty.dev/): A static site generator that works with all kinds of templates: markdown, liquid templates, nunjucks, handlebars, mustache, ejs, haml, pug and Javascript template literals

## Deploy

These are platforms that can host your statically built application. With common JAMstack frameworks you end up with static files that can be hosted by a static file server and delivered over a CDN.

* [Zeit](https://zeit.co/)
* [Netlify](https://www.netlify.com/)
* [Firebase hosting](https://firebase.google.com/docs/hosting)
* [Surge.sh](https://surge.sh/)
* [Render](https://render.com/)
* [AWS S3](https://aws.amazon.com/s3/)

## Cloud Functions (“Serverless”)

All of these services, in one way or another, allow you to write code in javascript that handles an API request and returns a response. This, along with other 3rd party APIs is the "API" part of the stack. The serverless part is that you don’t have to worry about the details on how or where that code gets run. These platforms will handle the server configuration and the deployment of your API endpoints as “cloud functions” or “lambdas”. In your client side application, you can make requests to these functions the same way you would make requests to API endpoints that you would have deployed to your own traditional server.

* [AWS Lambda](https://aws.amazon.com/lambda/)
* [Firebase Cloud Functions](https://firebase.google.com/docs/functions/)
* [Cloudflare Workers](https://workers.cloudflare.com/)
* [Zeit API Routes](https://nextjs.org/docs/api-routes/introduction)
* [Netlify Functions](https://docs.netlify.com/functions/overview/)

## Headless CMS

A “headless” CMS is a CMS that gives you and your team an interface to log in, edit content, add new content, upload assets and the “publish” data that makes it into your website or application.

There are many headless CMSes. We are a little biased, so these are the one ones that work with Mux and these are the ones that we have used. Look around for what works for you. And if you have one that you want to use with Mux, let us know and we can build an integration.

* [Sanity](https://www.sanity.io/)
* [Contentful](https://www.contentful.com/)
* [Dato](https://www.datocms.com/)
* [Cosmic JS](https://www.cosmicjs.com/)

## Authentication (advanced)

If you’re building a static marketing site you probably will not need to deal with authentication. However, for a more advanced application you will need to have users login, reset passwords and do all the pieces of authentication.

* [Auth0](https://auth0.com/)
* [Firebase auth](https://firebase.google.com/docs/auth)
* [Netlify Identity](https://docs.netlify.com/visitor-access/identity/)


## Database (advanced)

If you are authenticating users and dealing with logged in sessions, you probably need a database. These are commonly used for JAMstack applications.

* [Firebase](https://firebase.google.com/)
* [FaunaDB](https://fauna.com/)

# How did we get here?

Before these tools gained popularity the answer to “What stack should I use for my marketing site?” might have been “use Rails” and that is a clear answer. But now if someone says “use the JAMstack” well, that is a complicated answer. It’s a little misleading to call the “JAMstack” a specific stack, because as you can see from above, even if you decided to use the JAMstack, you still have a lot of choices to make.

Before the JAMstack was popularized, we have had a long history of static site generators. You may remember [Jekyl](https://jekyllrb.com/) or [Middleman](https://middlemanapp.com/) from the Ruby community. These tools allowed you to write Markdown, Liquid or Ruby’s ERB templates and generate a static site that you could host somewhere like s3 to host your blog. These tools are _*great*_ and they are still widely used.

These static site generators were great for developers that wanted to make something like a blog or a simple marketing website. Someone non-technical might reach for a tool like Wordpress or Squarespace, whereas a hacker would turn to a static site generator.

For more advanced applications that went beyond statically rendered HTML, we had to switch gears away from static site generators and into a web framework like Rails.

Then advanced frontend frameworks for building interactive single page applications became popular: Angular, Ember and React. Suddenly, frontend developers had all these tools and got comfortable writing React code for their applications. But for static marketing sites we couldn’t write React or Angular code because we still needed static HTML for SEO purposes and fast initial load times. Developers were stuck in a world where we wrote what we were comfortable with for our application frontend but then for our marketing site had to switch back to some ad-hoc cobbled together jQuery functions.

The biggest feature that made the JAMstack popular is that you get the best of both worlds: server-side rendered HTML *plus* interactive React components that you can do whatever you want with. This is the big innovation and the first “oh wow” moment I had using both Next.js and Gatsby. You write normal React like you’re used to, run the build process and then all of a sudden you end up with static HTML returned by the server and all your interactive React code works as you would expect.

# Video for the JAMstack

Mux is the video API for the JAMstack. The philosophy behind Mux and how we approach video fits in neatly with the JAMstack philosophy. Mux will act as your video infrastructure by handling the storage, hosting and delivery of your video without getting in the way or being opinionated about the presentation.

In fact, Mux does not even give you a video player. You have to bring your own player to the party. The entire “frontend” of the video experience is up to you, Mux is focused on handling the backend or the “serverless” part of your video stack. Think of Mux as the headless video platform. You control every bit of the user experience while Mux does the heavy lifting behind the scenes.

# JAMstack at Mux

In addition to providing APIs that you can use for your JAMstack website, Mux also uses the JAMstack ourselves to power our marketing site (mux.com) and the Mux blog.

A couple of months ago we finished the process of moving the Mux Blog to the JAMstack. Before this project, the Mux blog was hosted and deployed separately from mux.com. The blog was powered by an old version of Ghost, using the default Casper theme. Our marketing site is a Gatsby site that uses gatsby-source-filesystem to create some pages from markdown and gatsby-source-airtable to pull in some data from Airtable.

The main issue with our existing blog that we wanted to address was that since we were using a Ghost theme, not only was the design of the blog completely different from the design of the rest of our marketing website, but it was an entirely different application with a different structure, hosting and deploy process.

As a result, visitors that landed on a blog post didn’t have an easy way to get back to the main marketing site and since the look and feel didn’t exactly line up, the experience was too disconnected. We decided that we wanted to move everything to a headless CMS so that we could make the blog part of our existing Gatsby marketing site for consistency.

# Migrating to a headless CMS

There are pre-built Mux integrations for [Sanity](https://www.sanity.io/), [Contentful](https://www.contentful.com/), and [Cosmic](https://www.cosmicjs.com/). All of these options allow you to bring your own  Mux account. Alternatively, [Dato](https://www.datocms.com/) is a headless CMS that offers native video built into the product that is [powered by Mux](https://www.datocms.com/blog/why-we-chose-mux-for-datocms).

We ended up choosing Sanity as our headless CMS. We loved that Sanity felt like an open-ended developer product that could grow with our needs past just the blog today. Calling Sanity a headless CMS sells it short from what it really is: it’s more akin to a structured, real-time database. The CMS part is all open source and in your control for how you want things to look and work. The way to think about it is that Sanity provides a real-time database along with some low-level primitives to define your data model, then from there, you build your own CMS.

![Mux Sanity CMS editor](https://dev-to-uploads.s3.amazonaws.com/i/h2vy1p9mo4kzbvwyjn4f.png)

As a part of this project of moving the blog to a new CMS, we wanted to set ourselves up with a headless CMS that could be used beyond just the blog and could also create a variety of pages on mux.com and allow us to move existing content like the [video glossary](https://mux.com/video-glossary/).

For a more technical in-depth read about how we did this, check out this Sanity Guide we wrote [How to migrate your HTML blog-content from Ghost](https://www.sanity.io/guides/how-to-migrate-your-html-blog-content-from-ghost) and the blog post [Moving the Mux blog to the JAMstack](https://www.sanity.io/blog/moving-the-mux-blog-to-the-jamstack).