Highlight a line on code block with Astro

Built WebSite with Astro allows you to highlight your code blocks with no configuration, But it cannot highlight a specific line.

If you use the Integration API Astro provided, you can modify markdown processes, but it is a bit too complex.

This post will show you how to highlight a line on your code block with rehype-pretty-code.


Astro documentation site is a very good example of cutom highlighting using the Integration API, and I encourage anyone interested to take a look.

Open on GitHub

It can highlight diff in the code block like that:

Astro document site

Start with mdx-template

Astro provides a template for mdx, and you can try it on StackBlitz, so let’s start with it.

Open in

If you open the above template on StackBlitz, you can see the following:


This page will eventually look like this:


Install Rehype Pretty Code

First, install Rehype Pretty Code with npm. Stop the dev server and run the following command:

npm install --save-dev rehype-pretty-code

What’s Rehype Pretty Code?

Rehype Pretty Code is a Rehype plugin that provides beautiful code blocks for your MD/MDX docs. It has advantages over other solutions such as Prism.

View on WebSite.

You will disable syntax highlighting with Astro’s built-in syntax highlighting, and use Rehype Pretty Code instead.

Add rehype-pretty-code to Astro config

Open astro.config.mjs and add the following code:

import { defineConfig } from "astro/config";
import mdx from "@astrojs/mdx";
import preact from "@astrojs/preact";
import rehypePrettyCode from "rehype-pretty-code";
const prettyCodeOptions = {
  theme: "solarized-dark",
  onVisitLine(node) {
    if (node.children.length === 0) {
      node.children = [
          type: "text",
          value: " ",
  onVisitHighlightedLine(node) {
  onVisitHighlightedWord(node) {
    node.properties.className = ["word"];
  tokensMap: {},
// https://astro.build/config
export default defineConfig({
  integrations: [mdx(), preact()],
  markdown: {
    extendDefaultPlugins: true,
    syntaxHighlight: false,
    rehypePlugins: [[rehypePrettyCode, prettyCodeOptions]],

On line 32, you’ve disabled syntax highlighting with Astro’s built-in. And on line 33, you’ve added Rehype Pretty Code to the rehypePlugins.

Now, you can start the dev server and see the result:


Add meta string to your code block

Rehype pretty format provides a way to highlight a specific line, but you need to add a meta string to your code block.

Open src/pages/index.mdx and add meta string {1-3} to code block.

```astro {1-3}

You can see the lines 1 to 3 are added highlighted css class if you insepect code block.



Rehype Pretty Code also provides another meta string to highlight a specific word or show line numbers. See the Rehype Pretty Code website for more information.

Add style to the highlighted line

You’ve already added a css class to the lines you want to highlight. Let’s add style to it.

First, create a layout to add <style> tag. Create src/components/Layout.astro and add the following code:

<html lang="en">
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <slot />
    <style is:global>
      div[data-rehype-pretty-code-fragment] { background-color: #111;}
      pre > code {
        display: grid;
        background-color: rgba(200, 200, 255, .09);
      .highlighted {
        background-color: rgba(200,200,255,.1);
        border-left-color: #60a5fa;
        border-left-width: 3px;
        border-left-style: solid;

And open src/pages/index.mdx, and set this layout using layout frontmatter.

layout: ../components/Layout.astro
import Counter from '../components/Counter.jsx';
import Title from '../components/Title.astro';
export const components = { h1: Title };

Now, you can see the highlighted line!



As you can see, you can highlight a line on a code block easily by using Rehyepe Pretty Code.

This blog also use it to be able to highlight a line and show line numbers and a show file name.

If you will check my blog’s source code, you can see the bottom link.