DEV Community

Rizwan Saleem
Rizwan Saleem

Posted on

Publishing a Version-Control-Driven Documentation System with Git and MDX

Publishing a Version-Control-Driven Documentation System with Git and MDX

Publishing a Version-Control-Driven Documentation System with Git and MDX

Version control isn’t just for code. A solid Git-based workflow can vault your project’s documentation, tutorials, and API references into a living, maintainable system. This guide walks you through designing a documentation workflow that uses Git, Markdown/MDX, and static site tooling to produce reliable, reviewable, and publishable docs. It emphasizes structure, branching strategies, automation, and practical patterns you can adopt today.

Why a Git-centric docs workflow

  • Implements clear review and history for documentation changes.
  • Lets you treat docs as code, with tests, linting, and CI checks.
  • Enables staged previews for stakeholders before publishing.

Key ideas:

  • Treat content as code: keep docs in a dedicated content/ or docs/ directory, authored in Markdown or MDX.
  • Separate concerns: source docs vs. generated site vs. assets.
  • Use a predictable review flow: feature branches, pull requests, and mandatory reviews.

    Target setup

  • Repo layout

    • docs/
    • content/
      • guides/
      • references/
      • tutorials/
    • assets/
      • images/
      • diagrams/
    • _data/ (optional, for structured data)
    • config/
      • site.yaml or config.toml
    • site/ (your static site source, e.g., Next.js, Hugo, Docusaurus)
    • .github/workflows/ (CI workflows)
    • scripts/ (build scripts and tooling)
  • Tools

    • Git for version control
    • MDX or Markdown for content
    • Static site generator (Next.js with MDX, Docusaurus, Hugo)
    • Linting: remark-lint / markdownlint
    • Type checking (if you render MDX with React): TypeScript
    • CI: GitHub Actions or GitLab CI
    • Preview: Vercel, Netlify, or your CI’s preview environment ### Branching and workflow model
  • Main branches

    • main: Production-ready docs site
    • docs-preview: Staged docs that mirror the main site state for WIP previews
  • Feature branches

    • feature/docs-: For new sections or updates
  • Workflow steps

    1) Create a feature branch for a docs change

    2) Write content with clear, task-oriented headings

    3) Run local previews to verify rendering

    4) Open a PR targeting main

    5) Have at least one reviewer approve

    6) Merge and trigger a deployment to your preview environment or production

Tip: Use semantic prefixes for branches, like feat/docs/installation-guide or fix/docs/typo.

Content structure and conventions

  • Content types
    • Guides: how-to instructions with prerequisites and step-by-step tasks
    • References: API surfaces, CLI commands, and configuration options
    • Tutorials: longer, story-driven walkthroughs that introduce concepts progressively
  • Markdown conventions
    • H1 for the page title
    • H2 for sections, H3 for subsections
    • Tables for structured data (when needed)
    • Instructions as numbered steps
  • MDX where you want interactive components (code blocks, live examples)
  • Metadata
    • Use front matter (YAML or JSON) at the top of each doc with:
    • title
    • date
    • author
    • category
    • tags
    • summary
    • draft: true/false

Example front matter (YAML):
title: "Installing and Configuring the Local dev Environment"
date: 2026-05-31
author: "Your Name"
category: "Guides"
tags: ["dev-environment", "setup", "beginner"]
summary: "A practical setup for a reproducible local development environment."
draft: false

Writing style and quality checks

  • Be explicit and actionable
  • Include prerequisites, commands, and expected outcomes
  • Provide approximate time estimates
  • Include caveats or gotchas
  • Use code blocks with language hints for syntax highlighting

Quality checks to automate:

  • Markdown linting
  • Broken link checks
  • Image asset existence
  • MDX lint for React component usage (if MDX)
  • Basic accessibility checks (alt text, heading order)

    Tooling and automation

  • Local preview

    • Install dependencies and run site dev server
    • Example: npm run dev or yarn start from the site/ directory
  • Linting scripts

    • npm run lint:md
    • npm run lint:mdx
  • Pre-commit hooks

    • Husky for running tests and linting on commit
    • Example: eslint / markdownlint checks
  • CI workflow (GitHub Actions)

    • Lint docs, run tests, build preview
    • Deploy preview on PRs
    • Deploy main on merge

Example GitHub Actions workflow scaffold (yaml):
name: Docs CI
on:
pull_request:
paths:
- 'docs/'
- 'site/
'
- '.github/workflows/docs/**'
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '18'
- name: Install
run: npm ci workspaces=false
- name: Lint Markdown
run: npm run lint:md
build-preview:
runs-on: ubuntu-latest
needs: lint
steps:
- uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '18'
- name: Install
run: npm ci
- name: Build site preview
run: npm run build:preview
- name: Deploy preview
uses: some-deploy-action

Adapt to your stack (Next.js, Docusaurus, Hugo, etc.).

Concrete step-by-step example: a 5-part guide

Goal: Publish a new "API authentication overview" section for a REST service.

1) Create a feature branch

  • git checkout -b feat/docs/api-auth-overview

2) Add content

  • Create docs/content/guides/api-auth-overview.md with:
    • Clear objective
    • Prerequisites
    • Step-by-step sections for token flow, required headers, error handling
    • Example requests and responses
    • TL;DR, pitfalls, and further reading
  • Add a corresponding MDX file if interactive code snippets are needed

3) Metadata and front matter

  • Ensure front matter includes title, date, author, category, tags, summary, draft: false

4) Local preview

  • Run your site locally and navigate to the new page
  • Validate rendering, check code blocks, and verify links

5) PR and review

  • Push branch, open PR against main
  • Ask for review on content accuracy, tone, and completeness
  • Address review feedback

6) Merge and deploy

  • Merge PR after approval
  • CI builds the site and deploys to preview or production

    Practical patterns you’ll likely reuse

  • Link consistency: Use relative links and a central navigation map so new docs automatically appear in the site structure.

  • Code blocks with commands: Use shell-highlighted blocks and show both short and complete command sequences.

  • Reusable content snippets: Create short MDX components for things like callouts, notes, and code examples. Example: a note component that renders a tip icon and shaded box.

  • Data-driven references: If you have a lot of API endpoints, store them in JSON/YAML under _data and render them with a table component to avoid duplicating data.

Code example: a reusable MDX snippet for a tip
Remember to rotate API keys regularly to minimize risk.

In MDX, you’d define a simple React component:
import React from 'react';
export const Tip = ({ children }) => (


Tip: {children}

);

And then import it in your MDX file as shown above.

Versioning and publishing strategy

  • Document versions: If you support multiple API versions, structure docs per version: docs/content/guides/v1/api-auth.md, docs/content/guides/v2/api-auth.md
  • Redirects: Maintain a redirects file to map old URLs to new ones if you restructure docs.
  • Release notes: Treat doc changes as part of release notes; auto-generate a changelog from PR titles or a dedicated docs changelog.

    Testing the docs flow

  • Render tests: Ensure each new doc renders without errors in the build.

  • Link checks: Ensure all internal links resolve.

  • Accessibility: Simple checks for heading structure and alt text on images.

  • Preview validation: Validate that preview URLs load and display correctly in your chosen hosting or CI environment.

    Accessibility and inclusivity considerations

  • Use descriptive link text, avoid “click here.”

  • Provide alternate text for images and diagrams.

  • Ensure keyboard navigability for any interactive components.

  • Use color-contrast friendly palettes for code blocks and UI elements in MDX components.

    Example: a small, runnable MDX page

Create docs/content/references/rest-endpoints.md with front matter and content:
title: "REST Endpoints Overview"
date: 2026-05-31
author: "Your Name"
category: "References"
tags: ["api", "rest", "endpoints"]
summary: "An at-a-glance map of REST resource endpoints used by the service."
draft: false

Endpoints

  • GET /api/v1/users
  • POST /api/v1/users
  • GET /api/v1/users/{id}
  • PATCH /api/v1/users/{id}
  • DELETE /api/v1/users/{id}

Expected responses and error handling are documented in the API guide.

Final tips

  • Start small: migrate a single doc and iterate on your workflow.
  • Document your conventions: a CONTRIBUTING.md in docs/ helps maintainers follow the same process.
  • Use previews: ensure teammates can view changes before merge.

Would you like a tailored starter template for your stack (Next.js MDX, Docusaurus, or Hugo) including a minimal repo skeleton and sample PR checklist?

-

Rizwan Saleem | https://rizwansaleem.co

Top comments (0)