Markdown

5000blogs uses goldmark, a CommonMark-compliant markdown parser. All standard CommonMark syntax is supported. Extensions are toggled via config.

CommonMark basics

Headings

# Heading 1
## Heading 2
### Heading 3

Auto-generated id attributes for anchor linking (e.g. <h2 id="heading-2">).

Emphasis

*italic* or _italic_
**bold** or __bold__
***bold italic***
[Link text](https://example.com)
![Alt text](image.jpg)

Relative .md links are rewritten to post URLs. Relative non-markdown links become /media/... URLs. See Writing Posts: Media files.

Code

Inline: `code`

Fenced blocks:

```go
fmt.Println("hello")
```

Blockquotes

> This is a blockquote.
> It can span multiple lines.

Lists

- Unordered item
- Another item

1. Ordered item
2. Another item

Horizontal rules

---

(Use blank lines around it to avoid confusion with front matter.)

HTML

Raw HTML in markdown is passed through as-is.


Extensions

Toggled in config under features. See Configuration: Features.

Tables

Config: features.tables: true (default: on)

GFM-style pipe tables:

| Name  | Value |
|-------|-------|
| Alpha | 1     |
| Beta  | 2     |

Alignment with ::

| Left | Center | Right |
|:-----|:------:|------:|
| a    | b      | c     |

Strikethrough

Config: features.strikethrough: true (default: on)

~~deleted text~~

Config: features.wiki_links: true (default: on)

Link to posts by title using [[Title]] syntax:

See [[Setup: Docker]] for container instructions.

Resolution: the title is matched against all loaded posts. If found, links to that post's slug. If not found, falls back to a URL-encoded path.

Compatible with Obsidian-style wikilinks.

Embedded posts

Inline another post's rendered HTML at any point in a post. Two syntaxes are supported:

Wikilink-style (requires features.wiki_links: true):

![[Post Title]]

The title is resolved against all loaded posts. If the title matches a known post, its HTML is inlined. If not, renders as a regular image (fallback to WikiImage).

Relative-path image syntax (always available):

![](./relative/path/to/post.md)

Any ![...](path.md) where the destination ends in .md is treated as an embed. The path is resolved relative to the current post's directory.

If the target post is not yet rendered (e.g. during initial load), it is rendered on demand. Recursive embeds (A embeds B which embeds A) are detected; the cycle is broken with an HTML comment in place of the nested embed.

Actually, this section on embeds was embedded itself - you can look at the original here. Very meta.

Config: features.autolinks: false (default: off)

Bare URLs are automatically converted to clickable links:

Visit https://example.com for details.

Task lists

Config: features.task_list: false (default: off)

- [x] Completed task
- [ ] Pending task

Renders as checkboxes.

Footnotes

Config: features.footnotes: false (default: off)

This has a footnote[^1].

[^1]: Footnote content here.

Renders as superscript references with a footnote section at the bottom.

Comments

Config: features.comments: false (default: off)

Text wrapped in %% is stripped from output entirely. Works inline or as a block:

Visible. %%This is an inline comment.%% Still visible.

%%
This is a block comment.

Block comments can span multiple lines.
%%

Comments are removed before rendering - they produce no HTML output and do not appear in any content presented to your visitors.


Relative links in markdown are rewritten automatically:

Markdown Rendered href
[text](other.md) /other
[text](sub/page.md) /sub/page
[text](image.png) /media/image.png
[text](#section) #section (unchanged)
[text](https://...) https://... (unchanged)

For posts in subdirectories, relative paths resolve relative to that subdirectory.