Here is exactly how each Markdown construct maps to HTML:
#: a level-1 heading becomes <h1>. Example: # Routes → <h1>Routes</h1>.
##: a level-2 heading becomes <h2>. Example: ## Routes → <h2>Routes</h2>.
###: a level-3 heading becomes <h3>. Example: ### Routes → <h3>Routes</h3>.
####: a level-4 heading becomes <h4>. Example: #### Routes → <h4>Routes</h4>.
#####: a level-5 heading becomes <h5>. Example: ##### Routes → <h5>Routes</h5>.
######: a level-6 heading becomes <h6>. Example: ###### Routes → <h6>Routes</h6>.
Plain lines and blank lines: paragraphs become <p> blocks, and two or more spaces at the end of a line produce a <br> line break.
**bold**, *italic* and ~~strike~~: become <strong>, <em> and <del>. Combining them nests the tags, so ***both*** becomes <em><strong>both</strong></em>.
[text](url), bare URLs and images: links become <a href="..."> (with an alt populated from [text] for accessibility), bare URLs are turned into links automatically, and  becomes <img alt="..." src="...">.
- and 1. lists: bullet lists become <ul> and numbered lists become <ol>, with nested items indented into their own <ul> or <ol>.
- [x] and - [ ]: task list items become list items containing a disabled checkbox, checked or unchecked as you wrote it.
> quotations: quoted lines become a <blockquote> element, and a nested >> produces a quote inside the quote.
Fenced code blocks: code wrapped in ``` (or ~~~) becomes <pre><code>, keeping the language name as a class="language-..." attribute for syntax highlighting.
Pipe tables: GFM tables become proper <table> elements with <thead>, <tbody>, <th> and <td>, honouring the :---: alignment markers.
---, entities and raw HTML: three dashes or more become <hr>, entities such as © survive into the output, and any raw HTML you wrote is passed through untouched.