By Fatskills Exam Guides Team — the exam nerds behind 28,500+ quizzes and 2.1M practice questions across 500+ global exams.
For aspiring technical writers, developers transitioning into writing, and current writers modernizing their skills
Markdown and AsciiDoc are lightweight markup languages that let you write formatted text in plain text files—no clunky word processors required. They’re the backbone of docs-as-code workflows, where documentation lives alongside code in Git repos, gets reviewed via pull requests, and is published via static site generators (like Hugo, Docusaurus, or Antora). For example, Stripe’s API docs (a gold standard in tech writing) are written in Markdown and built with a custom static site generator. Mastering these tools means you can write faster, collaborate with engineers seamlessly, and publish beautiful, version-controlled docs.
Markdown (CommonMark, GitHub Flavored Markdown - GFM): A plain-text syntax for formatting (e.g., # Headings, bold, - lists). Used in GitHub READMEs, Slack, and most static site generators. Tools: VS Code (with Markdown preview), Typora, Obsidian.
# Headings
bold
- lists
AsciiDoc: A more powerful alternative to Markdown with built-in features like tables of contents, cross-references, and conditional content. Often used for complex docs (e.g., Kubernetes, Fedora). Tools: Asciidoctor, Antora, IntelliJ AsciiDoc plugin.
Docs-as-Code: Treating docs like code: stored in Git, written in Markdown/AsciiDoc, built with static site generators, and reviewed via PRs. Example: Google’s developer docs use this workflow.
Static Site Generator (SSG): A tool that converts Markdown/AsciiDoc files into HTML websites. Examples: Hugo (Markdown), Docusaurus (Markdown), Antora (AsciiDoc).
Front Matter: Metadata at the top of a Markdown/AsciiDoc file (e.g., title:, author:, date:) in YAML, TOML, or JSON. Used by SSGs to generate pages. Example: ```yaml
title:
author:
date:
title: "Payment API Reference" sidebar_label: "Payments"
```
Code Blocks: Formatted snippets in docs (e.g., ```python for Python). In AsciiDoc, you can add callouts (<1>) for annotations. Example: markdownbash curl -X POST https://api.example.com/payments \ -H "Authorization: Bearer $TOKEN"
```python
<1>
markdown
Cross-References: Links to other sections/files. Markdown uses [text](#heading-id), while AsciiDoc uses <<section-id>>. Example: asciidoc See <<authentication>> for details.
[text](#heading-id)
<<section-id>>
asciidoc See <<authentication>> for details.
Conditional Content: Showing/hiding content based on variables (e.g., ifdef::env-github[]). AsciiDoc supports this natively; Markdown requires SSG plugins.
ifdef::env-github[]
OpenAPI (Swagger): A spec for describing REST APIs. Tools like Swagger UI or Redoc auto-generate interactive docs from YAML/JSON files. Example: Stripe’s API reference uses OpenAPI + Markdown.
Mermaid: A Markdown extension for diagrams (e.g., flowcharts, sequence diagrams). Example: markdownmermaid graph TD; A-->B; A-->C;
Linting: Automated checks for syntax errors, style violations, or broken links. Tools: markdownlint, vale (for prose), textlint.
markdownlint
vale
textlint
Versioning: Managing docs for multiple product versions (e.g., v1, v2). AsciiDoc + Antora handles this natively; Markdown requires SSG plugins (e.g., Docusaurus versioning).
v1
v2
How to write and publish docs in Markdown/AsciiDoc:
git clone https://github.com/company/docs.git
Install dependencies (e.g., npm install for Docusaurus, gem install asciidoctor for AsciiDoc).
npm install
gem install asciidoctor
Write the Content
template.md
template.adoc
#
##
-
Example (Markdown): markdown --- title: "Getting Started" --- # Getting Started with Acme API To authenticate, send a `POST` request to `/auth` with your API key.bash curl -X POST https://api.acme.com/auth \ -H "Authorization: Bearer YOUR_API_KEY"
markdown --- title: "Getting Started" --- # Getting Started with Acme API To authenticate, send a `POST` request to `/auth` with your API key.
Add Diagrams and Media

For AsciiDoc: Use image::path/to/image.png[] or ASCII art for simple diagrams.
image::path/to/image.png[]
Preview Locally
npm run start
asciidoctor -D output/ file.adoc
Check for rendering issues (e.g., broken links, missing images).
Submit for Review
git add .
git commit -m "Add getting started guide"
git push origin add-getting-started
Open a PR and request reviews from engineers and other writers.
Publish
https://docs.company.com
Mistake: Using HTML in Markdown for complex layouts (e.g., <div> for columns). Correction: Stick to Markdown/AsciiDoc syntax. For complex layouts, use an SSG component (e.g., Docusaurus’s <Grid>) or switch to AsciiDoc, which supports tables, admonitions (NOTE:, WARNING:), and more natively.
<div>
<Grid>
NOTE:
WARNING:
Mistake: Hardcoding version numbers in docs (e.g., “This feature is available in v2.3.1”). Correction: Use variables (e.g., {version} in AsciiDoc) or SSG versioning features. Why: Hardcoded versions become outdated fast.
{version}
Mistake: Ignoring linting (e.g., inconsistent heading levels, trailing spaces). Correction: Set up markdownlint or textlint in your editor or CI pipeline. Why: Linting catches errors before PRs and enforces consistency.
Mistake: Writing long paragraphs without visual breaks (e.g., walls of text). Correction: Use lists, code blocks, and admonitions (> NOTE:) to improve scannability. Why: Developers skim docs; dense text frustrates them.
> NOTE:
Mistake: Not testing code examples. Correction: Run every code snippet in a sandbox (e.g., Postman for APIs, a REPL for CLI tools). Why: Broken examples erode trust in your docs.
A published doc (e.g., a GitHub Pages site or Netlify demo).
Know the Distinctions:
Swagger UI (interactive API explorer) vs. Redoc (static, beautiful API docs).
Talk About Workflows: Be ready to explain:
How you’d measure doc quality (e.g., “I’d track page views, time on page, and support tickets related to docs”).
Tool-Specific Tips:
markdown-it
ifdef::[]
<<>>
swagger-codegen
Use OpenAPI to auto-generate API docs from the spec (ensures accuracy). Why: Automation reduces manual updates and catches drift early.
Scenario: You’re writing a tutorial in Markdown. How do you decide whether to use a numbered list vs. a code block for steps? Answer: Use a numbered list for high-level steps (e.g., “1. Install the CLI”) and a code block for commands or code snippets (e.g., npm install -g acme-cli). Why: Lists are scannable; code blocks preserve formatting (e.g., line breaks, syntax highlighting).
npm install -g acme-cli
Scenario: Your team wants to add a warning box to a guide. How would you implement this in Markdown vs. AsciiDoc? Answer:
> WARNING:
WARNING: This will delete your data!
# Heading
- list
`code`
[link](url)
= Heading
*bold*
<<xref>>
title: "Guide"
```language
[source,language]
[text](#id)
<<id>>
| Syntax | Description |
|===
```mermaid
Join 4M+ learners. Unlock unlimited quizzes, wrong-answer tracking, flashcards + reminders, study guides, and 1-on-1 challenges.