Why Markdown matters (and who this guide is for)
Whenever you push a repository to GitHub, document an API, or take notes in tools like Obsidian or Notion, you interact with Markdown. Created in 2004 by John Gruber and Aaron Swartz, Markdown is a lightweight markup language designed to be readable as plain text while converting cleanly into valid HTML.
Most developers learn just enough Markdown to write a title and a bulleted list, leaving their project documentation looking messy or half-finished. A clear, well-structured README.md signals that your code is thoughtful, maintained, and easy to use.
This guide is built for beginners and working developers who want to master everyday GitHub Flavored Markdown (GFM) in about 15 minutes. No fluff—just practical syntax, real render comparisons, and a copy-paste template you can adapt today.
Part 1: Headings, emphasis, and quotes
Headings organize your document hierarchy. In Markdown, headings start with # symbols followed by a space. Always match your heading levels logically: use one # for your document title, ## for main sections, and ### for sub-sections.
# Level 1 Heading (Document Title)
## Level 2 Heading (Major Section)
### Level 3 Heading (Sub-section)
#### Level 4 Heading (Minor Detail)
Text styling
Format your inline text using asterisks (*) or underscores (_):
| Desired Style | Markdown Syntax | Rendered Result |
|---|---|---|
| Bold | **Bold text** |
Bold text |
| Italic | *Italic text* |
Italic text |
| Bold & Italic | ***Bold and italic*** |
Bold and italic |
~~Strikethrough text~~ |
Blockquotes
Use the greater-than sign (>) for quotes, side notes, or tips:
> **Note:** Always install your dependencies in a virtual environment before running the build script.
Rendered result:
Note: Always install your dependencies in a virtual environment before running the build script.
Part 2: Lists, links, and media
Lists keep instructions scannable. GFM supports unordered lists, ordered lists, and interactive task lists.
Bulleted and numbered lists
Use - or * for bullet points. Indent two or four spaces to nest items:
- Frontend assets
- Stylesheets (`main.css`)
- Scripts (`app.js`)
- Backend services
- Auth service
- Database connector
Use numbers followed by a period for ordered sequences. Markdown auto-numbers them in the output, but writing actual numbers makes raw text easier to read:
1. Clone the repository.
2. Run `npm install`.
3. Start the dev server with `npm run dev`.
Task lists (Checkboxes)
GFM supports interactive checkboxes using - [ ] (open) and - [x] (completed):
- [x] Configure PostgreSQL connection
- [x] Write authentication middleware
- [ ] Add unit tests for password reset
Links and images
The syntax for links and images is almost identical. The only difference: images start with an exclamation mark (!).
Link syntax: [Visible Anchor Text](https://example.com)
Read the official [Node.js Documentation](https://nodejs.org/en/docs) for API details.
Image syntax: 

Always write descriptive alt text. It improves accessibility for screen readers and acts as a placeholder if an image link breaks.
Part 3: Code blocks and syntax highlighting
Displaying code cleanly is the most important skill for technical documentation.
Inline code
Wrap single keywords, variable names, file paths, and terminal commands in single backticks (`):
Run `python -m unittest` to test the `UserAuth` class in `auth.py`.
Fenced code blocks with language tags
For multi-line snippets, wrap the block in triple backticks (```). Always append the language identifier right after the opening backticks. This triggers syntax highlighting in GitHub, GitLab, and most documentation engines.
```python
def calculate_tax(subtotal: float, rate: float = 0.08) -> float:
"""Calculate the final tax amount rounded to two decimal places."""
if subtotal < 0:
raise ValueError("Subtotal cannot be negative.")
return round(subtotal * rate, 2)
```
Common language identifiers include bash, python, javascript, typescript, json, html, css, sql, yaml, and markdown.
To show a plain terminal interaction without code syntax colors, use bash or text:
```bash
git checkout -b feature/user-profile
git commit -m "feat: add avatar upload"
git push origin feature/user-profile
```
Part 4: Tables and horizontal dividers
GFM tables use pipes (|) to separate columns and hyphens (-) to separate the header row from the data rows. You can align column text using colons (:).
Column alignment syntax
- Left-aligned (default):
:--- - Center-aligned:
:---: - Right-aligned:
---:
| Parameter | Type | Default | Description |
| :--- | :---: | ---: | :--- |
| `host` | `string` | `localhost` | Server binding address |
| `port` | `integer` | `8080` | Port for incoming traffic |
| `debug` | `boolean` | `false` | Enables verbose SQL logging |
Rendered result:
| Parameter | Type | Default | Description |
|---|---|---|---|
host |
string |
localhost |
Server binding address |
port |
integer |
8080 |
Port for incoming traffic |
debug |
boolean |
false |
Enables verbose SQL logging |
Horizontal dividers
Create visual breaks between unrelated topics by placing three or more hyphens (---) or asterisks (***) on their own line with blank lines above and below:
End of configuration section.
---
## Next Steps
Hands-on example: A polished project README
Here is a complete, production-ready README.md template for a fictional CLI tool. Copy this structure to document your next personal or work project.
# quick-hash-cli
A fast, zero-dependency command-line utility for hashing files and strings using SHA-256 or MD5.
## Features
- Zero external runtime dependencies
- Hashes plain text strings and large binary files
- Verifies checksum files automatically (`--check`)
## Installation
Clone the repository and install the binary globally:
```bash
git clone https://github.com/example/quick-hash-cli.git
cd quick-hash-cli
make install
Quick Start
Hash a text string
quick-hash --string "Code easier" --algo sha256
Output:
f3a8b41...7d82 (sha256)
Hash a local file
quick-hash --file ./dist/bundle.js
CLI Reference
| Flag | Short | Default | Description |
|---|---|---|---|
--file |
-f |
None | Path to input file |
--string |
-s |
None | Raw string input to hash |
--algo |
-a |
sha256 |
Algorithm (sha256, md5) |
--help |
-h |
None | Print help message |
Roadmap
- Support raw string hashing
- Implement SHA-256 and MD5
- Add SHA-512 support
- Publish pre-compiled binaries for ARM64
License
This project is licensed under the MIT License. See the LICENSE file for details. ```
Common mistakes and how to fix them
- Missing a space after
#or-:- Broken:
#Project Titleor-item one - Fix: Always leave a space:
# Project Titleand- item one. Without the space, parsers treat them as plain text tags or dashes.
- Broken:
- Forgetting blank lines around blocks:
- Broken: Running text directly into a list or code block without an empty line between them causes parsers to lump them together.
- Fix: Always place an empty line before and after lists, tables, and fenced code blocks.
- Malformed table divider rows:
- Broken: Missing the separator row between header and content makes the table render as a jumble of pipe characters.
- Fix: Verify that line 2 of every table has at least three hyphens per column (
| --- | --- |).
- Unescaped reserved symbols:
- Broken: Typing
*Important*when you want literal asterisks instead of italics. - Fix: Escape special characters with a backslash:
\*Important\*.
- Broken: Typing
Try it yourself
Open your code editor, create a file named PROFILE.md, and complete this 5-minute task:
- Add your name as a
#Level 1 header. - Add a
## Tech Stacksection containing an unordered list with three nested sub-items (e.g., Languages, Frameworks, Databases). - Create a
## Current Projectssection containing a 3-item task list with at least one completed item (- [x]). - Include a 3-column table showing three tools you use daily, their primary use case, and a rating from 1 to 5.
- Preview the file inside VS Code (
Ctrl+Shift+VorCmd+Shift+V) or directly in a GitHub Gist.
What’s next
- Explore GitHub alerts (
> [!NOTE]and> [!WARNING]) to make critical notices pop in your documentation. - Add real-time status badges from Shields.io to display build passes, code coverage, and package versions.
- Check out our upcoming guide: “Mermaid.js in Markdown: Render architecture diagrams without leaving your editor.”
Bookmark this reference page so you always have clean Markdown syntax right at your fingertips.