Made in Builder

Made in

How to Build: Localization webinar on March 23rd @ 10am PST. Register Now




Use Cases





Log in




Talk to an Expert











Visual CMS

Drag-and-drop visual editor and headless CMS for any tech stack

Theme Studio for Shopify

Build and optimize your Shopify-hosted storefront, no coding required



Get StartedLogin

‹ Back to blog

Create a drag-and-drop editable blog with Next.js

July 22, 2022

Written By Aziz Abbas

Creating your blog with Builder empowers your editors to build exciting blog articles in an intuitive drag-and-drop UI.


If you like to start with a pre-configured space and codebase, check the full example on GitHub , this article goes through setting up a blog from zero.

If you don't have one already, create an account over at It's free!

In this example we are also assuming you are a developer and will be connecting this blog to a custom website or app.

First, we need to make a model for our blog articles. Here's the how-to:

  1. Go to
  2. Make a new model by clicking the + Create Model button and choosing Section.
  3. Name the model.
  4. Click the Create button.

5. Next, add some fields. Lots of blog posts usually include the following fields:




This is the article title when listing articles and for the page <title> tag for SEO; for example, "Announcing our new product line".



This is the URL handle; for example, new-product-line.



This is the main image for the blog post—for example, when listing articles—as well as the og:image for previewing on social media sites like Facebook.



This is the date for displaying when this was posted and for filtering by date posted.




This is the preview text when listing blog articles, and optionally can be the SEO meta description as well.




Use this to list info about authors. We recommend making a new data model—for example, with fields full name of type text and photo or type file—and using a reference type to reference the author for an article.

The following video shows how to add each of these fields to the model and specify each type. You can define the options of each field, such as default values or whether the field is required, to meet your particular needs. In practice, you might also want to fill in the Helper Text field so editors know the purpose of each field:

The image below shows a still screenshot of these fields in the Blog article model:

Tip: Consider marking some of those options, such as Title, Handle, Image, and Date required so the editor must enter those values to publish.

Now, you can query your Blog Articles using our Javascript SDK, Content API, or GraphQL API.

Displaying an article

Next, let's render an individual article.

Next.js Example

// pages/blog/[handle].jsx
import {
} from "";
import Head from "next/head";
import DefaultErrorPage from "next/error";


function BlogArticle({ article }) {
  const isPreviewing = useIsPreviewing();
  if (!article && !isPreviewing) {
    return (
          <meta name="robots" content="noindex" />
        <DefaultErrorPage statusCode={404} />

  return (
      options={{ includeRefs: true }}
      {(data, loading, fullContent) => (
            {/* Render meta tags from custom field */}
            <meta name="description" content={data?.blurb} />
            <meta name="og:image" content={data?.image} />

            {/* Render the Builder drag/drop'd content */}
              options={{ includeRefs: true }}

export async function getStaticProps({ params }) {
  const article = await builder
    .get("blog-article", {
      // Include references, like our `author` ref
      options: { includeRefs: true },
      query: {
        // Get the specific article by handle
        "data.handle": params.handle,
    .promise() || null;

  return {
    props: {

export async function getStaticPaths() {
  return {
    paths: [],
    fallback: true,

export default BlogArticle;

Tip: For more detailed instructions on integrating Builder with your site, check out Integrating Sections.

Searching for article API supports Mongodb style query of your data, for example to get a list of articles that has specific text in their title or description, you can do

import { builder } from '';
export const search = (searchString) => builder.getAll('blog-article', {
  query: {
    '$or': [{
        'data.description': {
          $regex: `${searchString}`,
          $options: 'i'
        'data.title': {
          $regex: `${searchString}`,
          $options: 'i'

Once you get the code setup locally, let's connect your local site to the Visual Editor. This will allow for accurate previewing and editing as well as using your custom components directly in the editor.

  1. Go to Models.
  2. Open the Blog Article model.
  3. Click on the code icon, < > to the right of the Preview URL field. This opens a code editor with comments giving more context on this feature.
  1. Use the code below which tells the editor to show the page on the blog/[handle], then save model changes.
return `http://localhost:3000/blog/${ || '_'}

Tip: For more detailed instructions on using a preview URL, check out Editing and Previewing Your Site.

Now you can go to, click + New Entry and choose Blog Article. You should now see the drag and drop editor loaded right onto your local site.

You can now create articles with drag-and-drop and publish them when you're ready.

To create a blog article content entry, do this:

  1. Go to Content where you should see the Blog article model in the list on the left.
  2. Click the + New button and select Blog article. The recommended fields we added in the first section of the tutorial are in the Options tab, ready for you to fill out.
  3. Add some content and publish!

When you publish your site updates to production, make sure to update your editing URL to be a production URL, such as and no longer localhost so other team members can create blog posts.

We've showed several key features here such as custom models, custom fields, and connecting to your website

If you have any questions, ask in our forum!


Facebook is a headless CMS that lets you drag and drop with your components.

Learn more

Like our content?

Sign up for our newsletter

Continue Reading
Web Development12 MIN
Signals vs. Observables, what's all the fuss about?
WRITTEN BYMiško Hevery
March 20, 2023
software engineering5 MIN
Using Feature Flags for API Version Upgrades
WRITTEN BYShyam Seshadri
March 20, 2023
performance optimization5 MIN
Inspect Source Code Performance with Deoptigate
WRITTEN BYMiško Hevery
March 14, 2023