What is a Visual Headless CMS (aka Visual CMS)?
Tags: webdev, cms, javascript
Published: 2023-07-17 08:14:40

This post will be discussing a cutting-edge concept known as a Headless Visual CMS, or Headless Visual Content Management System. This is not your ordinary CMS; we are not referring to platforms like [WordPress](https://wordpress.org/), [Joomla](https://www.joomla.org/), [Drupal](https://www.drupal.org/), [Sanity.io](http://Sanity.io), [Contentful](https://www.contentful.com/), or anything like that. Instead, we're talking about a fusion of the best headless CMS features and the simplicity of site builders like [Wix](https://www.wix.com/) or [Squarespace](https://www.squarespace.com/).

Let's dive deeper into this topic.

Get a load of this:

<video muted autoplay loop playsinline controls>
      <source src="https://cdn.builder.io/o/assets%2FYJIGb4i01jvw0SRdL5Bt%2F3b7e566a31724728847836899d7eaa9f%2Fcompressed?apiKey=YJIGb4i01jvw0SRdL5Bt&amp;token=3b7e566a31724728847836899d7eaa9f&amp;alt=media&amp;optimized=true" type="video/mp4">
    </source></video>

This is probably a bit different than what you’re used to seeing in other CMSs — those blocks that are being dragged into the page are React components that come from your code base!

The integration code is simple and goes right within your existing site or app. It looks like this:

```ts
import { BuilderComponent, builder, registerComponent } from '@builder.io/react';

export async function getStaticProps({ params }) {
  // Fetch the builder content as JSON
  const page = await builder.get('page', { url: '/' + params.page.join('/') });
  return { props: { page } };
}
export default function Page({ page }) {
  // Render the content dynamically
  return <BuilderComponent model="page" content={page} />;
}

// Register your components for use in the visual editor
registerComponent(MyHero)
registerComponent(MyProductsComponent)
```

Sound interesting? Let's get into it.

## Headless CMS: all muscles, few smiles

Let's talk about what’s a headless CMS for a moment.

As devs, you might think of the term “headless” and your first association might be “headless components”, which are probably registered in your brain as components that only have an API and no UI. What I mean are projects/libraries like [Headless UI](https://headlessui.com/), [RadixUI](https://www.radix-ui.com/), [Downshift](https://www.downshift-js.com/), [TanStack Table](https://tanstack.com/table/v8), or a slew of others I might be forgetting.

A “Headless CMS”, on the other hand, is a special breed of a content management system that focuses solely on backend functionalities.

Sounds a bit spooky? Don't worry.

It just means the content is made accessible through either a [GraphQL](https://graphql.org/) or [REST API](https://www.ibm.com/topics/rest-apis) and can be displayed on pretty much any device you can think of. The magic here is that the headless CMS separates the backend (where you create and store content) from the frontend (where design and deployment happen), leaving the frontend presentation out of its scope.

 ![an image showing the pros and cons of headless CMSs.](https://cdn.builder.io/api/v1/image/assets%2FYJIGb4i01jvw0SRdL5Bt%2Fc7a6545900554effb02832f5a195e7d7?width=800)

Now, this separation might sound like an extra complication, but it's a massive perk. Why? Because it gives you a whole lot more wiggle room in how and where and how your content is displayed.

As long as a device or platform can connect to the API, it can access and consume your content.

Headless CMSs are like the Superman of content management for developers. They're tech-agnostic, performance-focused, and scale like a charm. Plus, they come with plugins and extensions for the customization that big businesses crave, along with roles and permissions for team workflow control.

But, let's face it, they aren't exactly user-friendly. They require developers to bend their components to fit into the CMS. Also, they are mostly endless glorified input forms — need an extra piece of data? Here’s a new input field, good luck mapping it and connecting it to your UI.

And if the marketing team wants something new? Well, it's back to the dev backlog. Over time, this can lead to a whole bunch of developer dependencies, limited structured data, and some pretty serious business impacts.

## Site builders: pretty faces, less grit

Then you've got site builders — the user-friendly models like Webflow, Squarespace, and Wix. They're all about visual appeal, making building a site as easy as dragging, dropping, and publishing.

 ![an image showing the pros and cons of wysiwyg editors.](https://cdn.builder.io/api/v1/image/assets%2FYJIGb4i01jvw0SRdL5Bt%2Fb33819dfc5874b5b8ee81a90cc0a3b03?width=800)

But as your site becomes more complex, [these models start to stumble](https://www.builder.io/blog/the-problem-with-a-headless-cms). Your site's speed and performance can take deteriorate, and you're chained to the platform's capabilities. Want to use the latest front-ends or back-end services? Only if the platform supports it.

 ![a meme image about how drag and drop makes money.](https://cdn.builder.io/api/v1/image/assets%2FYJIGb4i01jvw0SRdL5Bt%2F43e16734bd7445628f19a2765461d0f6?width=800)
## The best of both worlds: visual CMS

So here's a thought — why not take the best parts from both these worlds? A platform where building is as intuitive as a site builder but provides the API-based, component-driven, high-performance content management that developers love about headless CMS. Enter the Visual CMS.

It's all about visual development with elements like text, images, video, and more, wrapped up in a Figma-style editor. The best part? Developers get clean code and business teams control structures on these pages — everyone wins!

## Unique perks of [Builder.io](http://Builder.io)’s visual headless CMS

Besides the best features of headless CMSs and site builders, Builder’s Visual CMS brings unique capabilities to the table.

Unlike other visual editors, Builder’s visual CMS allows developers to have as much control as they want over the components your marketing/design team can use inside the editor.

 ![a diagram showing visual development, code components, and structured data.](https://cdn.builder.io/api/v1/image/assets%2FYJIGb4i01jvw0SRdL5Bt%2F48668861c1844e968769172f36cd349b?width=800)

Content doesn’t have to live inside code because Builder’s visual CMS **connects to your frontend tech stack**.

The gist of it is you just use a component from the Builder SDK in your code base, no matter if you’re using Vue, Svelte, React, Angular, Solid, or Qwik, and then it appears in the editor UI.

Say you’re using [Next.js](https://nextjs.org/) with [Tailwind](https://tailwindcss.com/) for your app (or site), you can write some generic card component, like this:

```ts
// src/components/card.tsx

export const Card = ({ text, title }: { text: string, title: string }) => {
  return (
    <div className="relative rounded-xl overflow-auto p-8">
      <a
        href="#"
        className="group block max-w-xs mx-auto rounded-lg p-4 bg-white ring-1 ring-slate-900/5 shadow-lg space-y-3 hover:bg-sky-500 hover:ring-sky-500"
      >
        <div className="flex items-center space-x-3">
          <svg>{/* ... */}</svg>
          <h3 className="text-sm text-slate-900 font-semibold group-hover:text-white">
            {title}  
          </h3>
        </div>
        <p className="text-sm text-slate-500 group-hover:text-white">
          {text}
        </p>
      </a>
    </div>
  );
};
```

And then you can [register the component to the Builder editor](https://www.builder.io/c/docs/custom-components-setup):

```ts
// [...page].tsx

// Register this component for use in the Visual Editor
Builder.registerComponent(Card,{
  name: 'Card',
  inputs: [
    // 'name' is the name of your prop
    { name: 'text', type: 'text' },
    { name: 'title', type: 'text' },
  ],
)

// Fetch the builder content as JSON
export async function getStaticProps({ params }) {
  const page = await builder.get('page', { url: '/' + params.page.join('/') });
  return { props: { page } };
}

// Render the content dynamically
export default function Page({ page }) {
  return <BuilderComponent model="page" content={page} />;
}
```

Then we just drag and drop it into our page:

 ![a screenshot showing Builder's visual editor.](https://cdn.builder.io/api/v1/image/assets%2FYJIGb4i01jvw0SRdL5Bt%2F03c0b5c99a4148ed9236b6f9f2ef009c?width=800)

That is what Builder is. A layer between your data and your frontend code.

 ![A diagram of Builder headless visual CMS architecture.](https://cdn.builder.io/api/v1/image/assets%2FYJIGb4i01jvw0SRdL5Bt%2F002590a5b20e45bdb23bb237dc554eb1?width=500)
## Conclusion

The benefits of a Visual CMS for your organization can be game-changing. It frees business teams to manage their requests and allows developers to focus on crucial projects. It eliminates content development bottlenecks and speeds up growth. Plus, it fosters autonomy and collaboration, leading to happier and more productive teams.

But that's not all. A Visual CMS brings with it a range of optimization features and incremental adoption capabilities that take your digital experience management to the next level. With its optimization features, testing and personalizing your ideas is a breeze. You can [personalize experiences](https://www.builder.io/blog/how-to-ship-your-first-personalized-web-experience) for individual visitors based on various attributes, delivering top-notch, performant experiences.

And the best part? You don't need to overhaul your front end or schemas. A Visual CMS plays well with your existing tech stack. You can use your current design system and component library, bring in any data source, and migrate content created in the Visual CMS to your front-end choice.

Now, imagine the possibilities. A Visual CMS empowers your team to unleash their creativity and build exceptional digital experiences. You have the power to transform your organization's content and digital experience management.

It's a big leap forward, enabling you to **build your way, build faster, and build together**.

Now that's a win-win in my book!

 ![](https://cdn.builder.io/api/v1/image/assets%2FYJIGb4i01jvw0SRdL5Bt%2F83677fb912dd4a539a3f3bb5c0c82de1?width=405)<video muted autoplay loop playsinline controls>
      <source src="https://cdn.builder.io/o/assets%2FYJIGb4i01jvw0SRdL5Bt%2F77cc5249f71948568195e7314bcc5766%2Fcompressed?apiKey=YJIGb4i01jvw0SRdL5Bt&amp;token=77cc5249f71948568195e7314bcc5766&amp;alt=media&amp;optimized=true" type="video/mp4">
    </source></video>

Visually build with your components

[Builder.io](https://www.builder.io/m/developers) is a headless CMS that lets you [drag and drop](https://www.builder.io/m/products) with [**your** components](https://www.builder.io/m/developers) right within your existing site.

[Try it out](https://builder.io/signup) [Learn more](/m/developers) 
```ts
// Dynamically render your components
export function MyPage({ json }) {
  return <BuilderComponent content={json} />
}

registerComponents([MyHero, MyProducts])
```

##### _Read the [full post](https://www.builder.io/blog/visual-headless-cms) on the [Builder.io blog](https://www.builder.io/blog)_