Guides

Notion Contentlayer: Making Notion a Practical Content Source for Your WEB App

RG

Rikard WikströmNov 8, 2024

Cover about Notion Contentlayer: Making Notion a Practical Content Source for Your WEB App
Learn how Notion Contentlayer turns Notion into a structured, type-safe content source for blogs, documentation, and notes.

TLDR;

Notion Contentlayer makes it easy to use Notion as a type-safe, structured content source for blogs, documentation, and notes. It pulls content directly from Notion databases, keeping everything organised and up-to-date with minimal setup—ideal for developers looking to seamlessly integrate Notion into their applications.
We use Notion to manage everything from project notes to documentation, and we wanted a way to bring that content directly into our apps without complex setups. Notion Contentlayer does exactly that. It transforms Notion databases into structured, type-safe data that’s easy to work with, keeping content organised and current without constant backend tweaks. Now, Notion can be a powerful, developer-friendly content source.

Why Notion Contentlayer?

Notion Contentlayer bridges the gap between Notion’s flexibility and the structured needs of content-driven applications. It converts Notion data into a format compatible with MDAST, making Notion a structured, type-safe data source that integrates easily into any project. Ideal for anyone who wants to use Notion for blogs, documentation, or internal notes with minimal configuration.

Core Features

  • Type-Safe Content: Notion Contentlayer makes content from Notion databases type-safe, so it’s easy to handle in your code.
  • MDAST Compatibility: Converts Notion blocks into MDAST format, making it easy to integrate with tools like Remark and Rehype for custom rendering.
  • Built-In Error Handling: Inspired by Rust’s error-handling style, Notion Contentlayer provides clear error states to keep your app predictable and manageable.
  • Quickstart

    Getting started with Notion Contentlayer is simple:
    1. Install Notion Contentlayer:

    $ npm install notion-contentlayer
    2. Configure Your Notion Database: Add your Notion API key and database ID to your environment file.

    .env file

    # -----------------------------------------------------------------------------
    # Blog (Notion)
    # -----------------------------------------------------------------------------
    NOTION_API_KEY="secret_..."
    NOTION_TABLE_ID="..."
    3. Define the Notion Source:

    import { createNotionSource, url, people, checkbox, text, date, select, status, title } from "notion-contentlayer"
    import { Client } from "@notionhq/client"
    
    const notionClient = new Client({
      auth: process.env.NOTION_API_KEY,
    })
    
    const notionSource = createNotionSource({
      properties: {
        cover: url("Image"),
        authors: people("Authors"),
        isFeatured: checkbox("Featured"),
        slug: text("Slug"),
        publishedDate: date("Date"),
        isPublished: checkbox("Published"),
        description: text("Description"),
        category: select("Category"),
        status: status("Status"),
        featuredCover: text("FeaturedImage"),
        title: title("Page"),
      },
      client: notionClient,
      databaseId: process.env.NOTION_TABLE_ID as string,
    })
    4. Fetch and Use Content:

    // 👇 `content`: true fetches the content for each blog post
    const postResult = await notionSource.fetchPosts({ content: true })
    //    ^^^^^^^^^^ postResult is a `Result`
    
    if (postResult.isErr()) {
      // Render error state
      console.error(postResult.error)
      return
    }
    
    const posts = postResult.value;
    /*
    import { Root } from "@types/mdast"
    
    `posts` is of type:
    type Posts = {
      cover: string
      authors: User[]
      isFeatured: boolean
      slug: string
      publishedDate: Date
      isPublished: boolean
      category: string
      status: string
      featuredCover: string
      title: string
      blocks: Root
    }[]
    */

    To-do

  • Rendering:We're working on a way to easily render the MDAST into React components that you can customize. If you want to contribute, pull requests are welcome!
  • Visit Notion Contentlayer on GitHub to learn more about the project, report issues, or contribute. Join our Discord community to connect with other developers, discuss improvements, and stay updated.

    Get started

    Describe the bug.

    Automate the fix.

    Get verified bug fixes directly in your editor.

    © 2024 Flytrap

    Built with ♥ in Helsinki, FI.