pdf to markdown
← Blog

How Developers Use Markdown for Internal Documentation

Markdown for developers is not a trend -- it is the established default. Most engineering teams already write their internal documentation in Markdown, whether they made a conscious decision to do so or simply followed the path of least resistance. READMEs, architecture decision records, runbooks, onboarding guides, and API references all live as .md files in the repository, right next to the code they describe.

Why developers prefer Markdown

The reasons are practical, not ideological. Markdown solves specific problems that other documentation formats create:

  • It lives in the repo. When documentation is stored alongside the code, it gets updated in the same pull request that changes the feature. Documentation that lives in a separate wiki or Google Doc tends to go stale because updating it requires switching tools and contexts.
  • It diffs cleanly. Markdown is plain text. When someone changes a paragraph in a doc, the pull request shows exactly which lines changed. Reviewers can comment on specific sentences. Try doing that with a PDF or a Confluence page.
  • No special tools required. Every developer already has a text editor. Every code hosting platform renders Markdown natively. There is no license to buy, no app to install, and no account to create.
  • It scales down. A one-paragraph README and a 50-page architecture guide both work in Markdown. You do not need to set up infrastructure to start writing. A single .md file is enough.

Types of internal docs written in Markdown

Engineering teams use Markdown for a wide range of documentation. Each type serves a different audience and purpose, but they all benefit from the same plain-text, version-controlled workflow.

READMEs

The entry point for any repository. A good README explains what the project does, how to set it up locally, how to run tests, and where to find more detailed documentation. It is the first thing a new team member reads.

Architecture Decision Records (ADRs)

ADRs document the reasoning behind significant technical decisions. Each ADR is a short Markdown file with a consistent structure: title, status, context, decision, and consequences. They create a searchable history of why the system was built the way it was.

Runbooks and incident response docs

Step-by-step procedures for handling production incidents, deploying releases, or performing maintenance tasks. Runbooks in Markdown can include code blocks with actual commands to run, making them directly actionable during an incident.

Onboarding guides

New-hire setup instructions, team norms, service ownership maps, and links to key resources. Keeping these in the repo means they are versioned, reviewable, and updated by the same people who maintain the codebase.

API documentation

Endpoint descriptions, request and response examples, and authentication instructions. While some teams use OpenAPI specs for machine-readable API docs, many supplement those with Markdown guides that explain higher-level concepts and usage patterns.

Architecture Decision Records in detail

ADRs deserve special attention because they solve a problem every growing engineering team faces: six months from now, nobody remembers why a particular technology, pattern, or tradeoff was chosen. ADRs capture that reasoning at the time the decision is made.

A typical ADR follows this structure:

# ADR-0012: Use PostgreSQL for the billing service ## Status Accepted ## Context The billing service needs a relational database. We considered PostgreSQL, MySQL, and DynamoDB. The team has production experience with PostgreSQL and our existing infrastructure supports it. ## Decision Use PostgreSQL 15 with managed hosting on AWS RDS. ## Consequences - Positive: familiar tooling, strong ecosystem - Positive: JSONB support for flexible invoice metadata - Negative: requires connection pooling at scale - Negative: vertical scaling limits compared to DynamoDB

Each ADR is a separate file stored in a docs/adr/ directory. Over time, this folder becomes a searchable log of every major technical decision the team has made, with full context preserved.

Runbooks: documentation you use during incidents

Runbooks are different from other documentation because they are read under pressure. When a service is down at 2 AM, the on-call engineer needs clear, step-by-step instructions, not a narrative overview. Markdown is ideal for this because code blocks can contain the exact commands to run:

## High memory usage on api-server 1. Check current memory usage: kubectl top pods -n production 2. Identify the offending pod: kubectl describe pod <pod-name> -n production 3. If memory exceeds 90%, restart the deployment: kubectl rollout restart deployment/api-server -n production 4. Monitor recovery: kubectl get pods -n production -w

Engineers can copy commands directly from the runbook into their terminal. There is no ambiguity about syntax, flags, or namespaces.

The documentation-as-code workflow

The most effective engineering teams treat documentation the same way they treat code. The workflow looks like this:

  1. Write docs in Markdown and store them in the same repository as the code they describe.
  2. Review docs in pull requests. When a feature PR includes documentation changes, reviewers check both the code and the docs. This prevents docs from falling behind.
  3. Deploy docs with CI. A static site generator converts the Markdown files into a published documentation website on every merge to the main branch.
  4. Enforce quality with linting. Tools like markdownlint and vale can check for broken links, inconsistent heading levels, and style guide violations in CI.

This workflow ensures documentation stays current because it is part of the same review and deployment process as the code itself.

Tools for publishing Markdown documentation

ToolLanguageBest for
MkDocsPythonInternal engineering docs, especially with the Material theme
DocusaurusReactPublic-facing docs with versioning and i18n
mdBookRustLightweight book-style docs, popular in the Rust ecosystem
GitHub WikiSaaSQuick team wikis that live alongside the repo

All of these tools accept Markdown as input and produce navigable websites. Most can be deployed automatically via GitHub Actions or similar CI pipelines.

Converting legacy documentation into the repo

Most engineering teams have legacy documentation scattered across Google Docs, Confluence, SharePoint, or -- very commonly -- PDFs. Old design documents, architecture specs, API guides from a previous vendor, or compliance documentation that was originally authored in Word and exported to PDF. This content is valuable but invisible to developers who live in the codebase.

Converting these PDFs to Markdown brings legacy knowledge into the same searchable, version-controlled system as the rest of your documentation. Upload a PDF to the converter, review the output, clean up any formatting issues, and commit the .md file to your docs folder. The document is now discoverable through code search, reviewable through pull requests, and maintained alongside everything else.

This is particularly valuable for:

  • Old design specs that explain why the system architecture looks the way it does. Converting them to Markdown and placing them in the ADR folder preserves institutional knowledge.
  • Vendor documentation for third-party services or APIs that your team integrates with. Having this in the repo means engineers do not need to hunt for the original PDF when debugging an integration.
  • Compliance and security docs that auditors originally delivered as PDFs. Converting them to Markdown makes it easier to track which requirements have been addressed and which remain open.

Start with what you have

You do not need to overhaul your documentation system overnight. Start with the docs that matter most: the README, a few key ADRs, and the runbooks for your most critical services. As the habit builds, expand to onboarding guides and API references. If you have existing PDFs worth preserving, convert them and commit them to the repo. The goal is not perfection -- it is making documentation accessible, current, and part of the same workflow developers already use every day.