Recipes: How to parse Markdown in Next.js

Join the AI Workshop to learn more about AI and how it can be applied to web development. Next cohort February 1st, 2026

The AI-first Web Development BOOTCAMP cohort starts February 24th, 2026. 10 weeks of intensive training and hands-on projects.


I had a field with markdown and I wanted to print it in a Next.js page.

I used marked, dompurify and jsdom. Here’s an example in a Next.js dynamic page, to render an item’s description.

Note that I had to call DOMPurify.sanitize() server-side, as it assumes we’re in a Node.js environment, so I put it into getStaticProps():

import { useState, useEffect } from 'react'
import Head from 'next/head'
import Link from 'next/link'
import { useRouter } from 'next/router'
import { getJob, getJobs } from 'lib/data.js'
import prisma from 'lib/prisma'
import marked from 'marked'
import createDOMPurify from 'dompurify'
import { JSDOM } from 'jsdom'

export default function Item({ item }) {
  return <p>{item.description}</p>
}

export async function getStaticPaths() { //data fetching
  const items = await getItems(prisma)

  return {
    paths: items.map(job => ({
      params: {
        id: String(item.id),
      },
    })),
    fallback: false,
  }
}

export async function getStaticProps({ params }) {
  const id = String(params.id)
  const item = await getItem(prisma, id) //unrelated

  const window = new JSDOM('').window
  const DOMPurify = createDOMPurify(window)
  item.description = DOMPurify.sanitize(marked(item.description))

  return { props: { item } }
}

Lessons in this unit:

0: Introduction
1: Using the router to detect the active link in Next.js
2: Next.js Email Authentication using NextAuth
3: Next.js embed youtube video - next
4: How to force a page refresh in Next.js
5: How to add Google Analytics 4 to Next.js
6: Next.js, how to open a link in a new window
7: ▶︎ How to parse Markdown in Next.js
8: How to add ReCaptcha to a Next.js form
9: How to upload files in a Next.js form