Markdown front matter is the metadata section at the beginning of Markdown files that provides structured information about your content. Used extensively in static site generators like Jekyll, Hugo, and Gatsby, front matter enables powerful content management, automated organization, and dynamic website generation from simple Markdown files.

This comprehensive guide covers everything you need to know about Markdown front matter, from basic syntax to advanced use cases, helping you leverage metadata to build sophisticated documentation and content management systems.

What is Markdown Front Matter?

Front matter is a block of metadata placed at the very beginning of a Markdown file, enclosed between triple dashes (---). This metadata is invisible when the Markdown is rendered as HTML but is processed by static site generators and other tools to enhance content management and site functionality.

Basic Front Matter Structure

---
title: "Your Document Title"
date: 2025-10-30
author: "Your Name"
tags: [markdown, tutorial]
---

# Your Markdown Content Starts Here

This is your regular Markdown content...

The front matter section uses structured data formats, most commonly YAML, but can also use TOML or JSON depending on your platform’s requirements.

Front Matter Formats

YAML Front Matter (Most Common)

YAML is the most widely supported format for front matter due to its readability and flexibility:

---
title: "Complete Guide to Markdown Tables"
description: "Learn how to create and style tables in Markdown"
author: "Matthew Rathbone"
date: 2025-10-30
published: true
categories: 
  - tutorial
  - markdown
tags: [tables, formatting, guide]
excerpt: "Tables are a powerful feature in Markdown..."
featured: false
comments: true
---

TOML Front Matter

Some static site generators like Hugo support TOML format:

+++
title = "Complete Guide to Markdown Tables"
description = "Learn how to create and style tables in Markdown"
author = "Matthew Rathbone"
date = 2025-10-30T10:00:00Z
published = true
categories = ["tutorial", "markdown"]
tags = ["tables", "formatting", "guide"]
featured = false
+++

JSON Front Matter

JSON format is less common but supported by some platforms:

{
  "title": "Complete Guide to Markdown Tables",
  "description": "Learn how to create and style tables in Markdown",
  "author": "Matthew Rathbone",
  "date": "2025-10-30",
  "published": true,
  "categories": ["tutorial", "markdown"],
  "tags": ["tables", "formatting", "guide"]
}

Essential Front Matter Fields

Core Content Fields

Title: The document title displayed in headers and metadata

title: "Your Document Title"
# Can include HTML entities and special characters
title: "How to Use <code> Tags in Markdown"

Description: SEO description and content summary

description: "A comprehensive guide to using Markdown effectively"
# Keep descriptions between 150-160 characters for optimal SEO
description: "Learn advanced Markdown techniques including tables, code blocks, and formatting options for professional documentation."

Date: Publication or creation date

date: 2025-10-30
# ISO format with time
date: 2025-10-30T14:30:00Z
# Date with timezone
date: 2025-10-30 14:30:00 -0500

Author and Attribution

Author Information:

author: "Matthew Rathbone"
# Or structured author data
author:
  name: "Matthew Rathbone"
  email: "[email protected]"
  url: "https://matthewrathbone.com"
  avatar: "/images/author-avatar.jpg"

Multiple Authors:

authors:
  - name: "Matthew Rathbone"
    role: "Technical Writer"
  - name: "Jane Smith"
    role: "Developer"

Categorization and Organization

Categories: Hierarchical content organization

category: "Tutorial"
# Or multiple categories
categories: 
  - "Tutorials"
  - "Markdown"
  - "Documentation"

Tags: Flexible content labeling

tags: [markdown, tutorial, beginner]
# Or array format
tags:
  - markdown
  - tutorial
  - beginner
  - documentation

Keywords: SEO and search optimization

keywords: "markdown tutorial, front matter, static site generator, jekyll"
# Or array format
keywords: 
  - markdown tutorial
  - front matter
  - static site generator
  - jekyll

Platform-Specific Front Matter

Jekyll Front Matter

Jekyll uses YAML front matter extensively for site generation:

---
layout: post
title: "Your Post Title"
date: 2025-10-30 14:30:00 -0500
categories: [blog, tutorial]
tags: [markdown, jekyll]
permalink: /custom-url-structure/
excerpt_separator: <!--more-->
author: matthew
published: true
sitemap: true
comments: true
---

Jekyll-Specific Fields:

  • layout: Template to use for rendering
  • permalink: Custom URL structure
  • excerpt_separator: Define where post excerpts end
  • sitemap: Include in XML sitemap generation

Hugo Front Matter

Hugo supports multiple front matter formats with extensive customization:

---
title: "Your Post Title"
date: 2025-10-30T14:30:00Z
lastmod: 2025-10-30T15:00:00Z
draft: false
weight: 10
aliases: [/old-url/, /another-old-url/]
author:
  name: "Matthew Rathbone"
  email: "[email protected]"
params:
  subtitle: "A comprehensive guide"
  featured_image: "/images/featured.jpg"
markup: goldmark
---

Hugo-Specific Features:

  • lastmod: Last modification date
  • weight: Ordering priority
  • aliases: URL redirects from old paths
  • params: Custom parameters for templates
  • markup: Markdown processor to use

Gatsby Front Matter

Gatsby processes front matter through GraphQL queries:

---
title: "Your Post Title"
date: "2025-10-30"
slug: "/blog/your-post-title"
featuredImage: "./images/featured.jpg"
excerpt: "Brief description of the post content"
author: "Matthew Rathbone"
categories: ["Tutorial", "Markdown"]
tags: ["gatsby", "markdown", "static-site"]
published: true
---

Advanced Front Matter Techniques

Custom Fields and Structured Data

Create custom fields for specific use cases:

---
title: "API Documentation: User Authentication"
type: "api-doc"
version: "2.1"
api:
  endpoint: "/auth/login"
  method: "POST"
  deprecated: false
  rate_limit: 100
related_endpoints:
  - "/auth/refresh"
  - "/auth/logout"
code_examples:
  - language: "javascript"
    file: "examples/auth-login.js"
  - language: "python"
    file: "examples/auth-login.py"
---

SEO and Social Media Optimization

Enhanced metadata for search engines and social platforms:

---
title: "Complete Markdown Guide"
description: "Master Markdown with this comprehensive tutorial"
keywords: [markdown, tutorial, documentation]
# Open Graph metadata
og:
  type: "article"
  image: "/images/og-markdown-guide.jpg"
  url: "https://blog.markdowntools.com/markdown-guide"
# Twitter Card metadata
twitter:
  card: "summary_large_image"
  creator: "@markdowntools"
  image: "/images/twitter-card.jpg"
# Schema.org structured data
schema:
  type: "TechnicalArticle"
  difficulty: "beginner"
  time_required: "PT30M"
---

Multilingual Support

Support for multiple languages and internationalization:

---
title: "Markdown Tutorial"
date: 2025-10-30
lang: "en"
translations:
  es: "/es/tutorial-markdown"
  fr: "/fr/tutoriel-markdown"
  de: "/de/markdown-anleitung"
hreflang:
  - lang: "en"
    url: "/markdown-tutorial"
  - lang: "es" 
    url: "/es/tutorial-markdown"
---

Content Series and Navigation

Organize related content into series:

---
title: "Markdown Tables: Part 2 - Advanced Features"
series: 
  name: "Mastering Markdown"
  part: 2
  total: 5
navigation:
  previous:
    title: "Markdown Tables: Part 1 - Basics"
    url: "/markdown-tables-part-1"
  next:
    title: "Markdown Tables: Part 3 - Styling"
    url: "/markdown-tables-part-3"
related_posts:
  - "/markdown-syntax-guide"
  - "/advanced-markdown-techniques"
---

Working with Front Matter in Code

Parsing Front Matter with JavaScript

const yaml = require('js-yaml');
const fs = require('fs');

function parseFrontMatter(filePath) {
  const fileContent = fs.readFileSync(filePath, 'utf8');
  const frontMatterRegex = /^---\n([\s\S]*?)\n---\n([\s\S]*)$/;
  const match = fileContent.match(frontMatterRegex);
  
  if (!match) {
    return { frontMatter: {}, content: fileContent };
  }
  
  try {
    const frontMatter = yaml.load(match[1]);
    const content = match[2];
    
    return { frontMatter, content };
  } catch (error) {
    console.error('Error parsing YAML front matter:', error);
    return { frontMatter: {}, content: fileContent };
  }
}

// Usage
const { frontMatter, content } = parseFrontMatter('post.md');
console.log('Title:', frontMatter.title);
console.log('Author:', frontMatter.author);

Python Front Matter Processing

import yaml
import re
from pathlib import Path

def parse_front_matter(file_path):
    """Parse front matter from a Markdown file."""
    content = Path(file_path).read_text(encoding='utf-8')
    
    # Match front matter pattern
    pattern = r'^---\n(.*?)\n---\n(.*)$'
    match = re.match(pattern, content, re.DOTALL)
    
    if not match:
        return {}, content
    
    try:
        front_matter = yaml.safe_load(match.group(1))
        markdown_content = match.group(2)
        return front_matter, markdown_content
    except yaml.YAMLError as e:
        print(f"Error parsing YAML: {e}")
        return {}, content

# Usage
front_matter, content = parse_front_matter('post.md')
print(f"Title: {front_matter.get('title')}")
print(f"Date: {front_matter.get('date')}")

Front Matter Validation and Best Practices

Schema Validation

Define schemas to validate front matter structure:

# schema.yml - Front matter validation schema
type: object
required:
  - title
  - date
  - author
properties:
  title:
    type: string
    minLength: 1
    maxLength: 100
  date:
    type: string
    pattern: '^\d{4}-\d{2}-\d{2}$'
  author:
    type: string
    minLength: 1
  description:
    type: string
    minLength: 50
    maxLength: 160
  tags:
    type: array
    items:
      type: string
    maxItems: 10
  published:
    type: boolean
    default: true

Validation Script

import yaml
import jsonschema
from pathlib import Path

def validate_front_matter(file_path, schema_path):
    """Validate front matter against a JSON schema."""
    
    # Load schema
    with open(schema_path, 'r') as f:
        schema = yaml.safe_load(f)
    
    # Parse front matter
    front_matter, _ = parse_front_matter(file_path)
    
    try:
        jsonschema.validate(front_matter, schema)
        print(f"{file_path}: Front matter is valid")
        return True
    except jsonschema.exceptions.ValidationError as e:
        print(f"{file_path}: {e.message}")
        return False

# Validate all posts
posts_dir = Path('_posts')
schema_file = 'front-matter-schema.yml'

for post_file in posts_dir.glob('*.md'):
    validate_front_matter(post_file, schema_file)

Automation and Templates

Front Matter Templates

Create templates for consistent front matter:

# templates/blog-post.yml
---
title: "{{ title }}"
description: "{{ description }}"
date: {{ date }}
author: "{{ author | default('Matthew Rathbone') }}"
category: "{{ category | default('Tutorial') }}"
tags: {{ tags | default(['markdown']) }}
published: {{ published | default(true) }}
comments: {{ comments | default(true) }}
image:
  asset: "{{ image_asset }}"
  alt: "{{ image_alt }}"
seo:
  canonical: "{{ canonical_url }}"
  robots: "{{ robots | default('index,follow') }}"
---

Automated Front Matter Generation

// generate-frontmatter.js
const fs = require('fs');
const yaml = require('js-yaml');
const { prompt } = require('inquirer');

async function generateFrontMatter() {
  const answers = await prompt([
    {
      type: 'input',
      name: 'title',
      message: 'Post title:',
      validate: input => input.length > 0
    },
    {
      type: 'input', 
      name: 'description',
      message: 'Post description:',
      validate: input => input.length >= 50 && input.length <= 160
    },
    {
      type: 'input',
      name: 'tags',
      message: 'Tags (comma-separated):',
      filter: input => input.split(',').map(tag => tag.trim())
    },
    {
      type: 'list',
      name: 'category',
      message: 'Category:',
      choices: ['Tutorial', 'Guide', 'Reference', 'News']
    }
  ]);

  const frontMatter = {
    ...answers,
    date: new Date().toISOString().split('T')[0],
    author: 'Matthew Rathbone',
    ai: true,
    layout: 'post',
    published: true,
    image: { asset: '' }
  };

  const yamlString = yaml.dump(frontMatter);
  console.log('\nGenerated Front Matter:');
  console.log('---');
  console.log(yamlString.trim());
  console.log('---');
}

generateFrontMatter();

Common Issues and Troubleshooting

YAML Syntax Errors

Common YAML issues in front matter:

# ❌ Incorrect: Unquoted strings with special characters
title: My Post: A Guide to Success

# ✅ Correct: Quote strings with special characters
title: "My Post: A Guide to Success"

# ❌ Incorrect: Inconsistent indentation
tags:
  - markdown
    - tutorial  # Wrong indentation

# ✅ Correct: Consistent indentation
tags:
  - markdown
  - tutorial

# ❌ Incorrect: Missing quotes for date strings
date: 2025-10-30 14:30:00

# ✅ Correct: Quoted date strings or ISO format
date: "2025-10-30 14:30:00"
# or
date: 2025-10-30T14:30:00Z

Encoding and Special Characters

Handle special characters properly:

---
title: "Café & Restaurant Guide"  # Escaped ampersand
description: "Guide to finding the best cafés in the city"
excerpt: |
  Multi-line content with
  proper YAML formatting
  using the pipe (|) operator
---

Front Matter Not Processing

Troubleshooting checklist:

  1. Verify Delimiters: Ensure front matter starts and ends with ---
  2. Check File Encoding: Use UTF-8 encoding
  3. Validate YAML: Use online YAML validators to check syntax
  4. Review Platform Documentation: Different static site generators have specific requirements
  5. Test with Minimal Front Matter: Start simple and add complexity gradually

Conclusion

Markdown front matter transforms simple text files into powerful, structured content that can drive sophisticated websites and documentation systems. By mastering front matter syntax and best practices, you can create maintainable, SEO-optimized content that integrates seamlessly with modern static site generators and content management workflows.

Whether you’re building a blog, documentation site, or complex content platform, understanding front matter enables you to leverage the full power of Markdown-based content management. From basic metadata to advanced structured data, front matter provides the foundation for scalable, automated content systems that grow with your needs.

Remember to validate your front matter regularly, maintain consistent schemas across your content, and use automation tools to streamline content creation while ensuring quality and consistency across your entire content library.