Skip to content

Steam BBCode

Joël Deffner edited this page Sep 21, 2026 · 3 revisions

Steam BBCode

Everything Steam shows as text on a Workshop item, the description, each translation and every changenote, is BBCode. It is the only markup Steam accepts there: HTML is printed as-is and Markdown is printed as-is. This page says how the markup works, lists every tag Steam renders, and shows how the toolkit lets you write the same text as Markdown.

The tag list is Steam's own, from its formatting help, plus the two tags the Workshop renders without documenting. Every tag here renders in the toolkit's BBCode preview and in the Workshop panel.

How the markup works

A tag is a name in square brackets. It opens as [b] and closes as [/b], and the text between is what the tag applies to:

This mod adds [b]forty[/b] new events.

Some tags carry a parameter after = in the opening tag: [url=https://example.com]the site[/url], [quote=Anna]…[/quote]. Tags nest, so [b][i]both[/i][/b] is bold and italic, and a heading can hold a link.

Three rules explain most surprises:

  • Every newline is a line break. Steam shows the text the way the file wraps it. Two lines in the file are two lines on the page, and a blank line is an empty line. Markdown joins soft-wrapped lines; Steam does not.
  • Unknown tags are printed. [color=red] is not a Steam tag, so the reader sees [color=red] in the text. Mistyped tags show the same way.
  • Nothing escapes a bracket except [noparse]. To show a tag as text, wrap it: [noparse][b]not bold[/b][/noparse].

The tags

Headings and text

Tag Renders as
[h1]text[/h1] Heading, largest
[h2]text[/h2] Heading
[h3]text[/h3] Heading, smallest
[b]text[/b] Bold
[i]text[/i] Italic
[u]text[/u] Underlined
[strike]text[/strike] Struck through
[spoiler]text[/spoiler] Hidden until the reader hovers or clicks
[code]text[/code] Fixed-width font, spaces and line breaks kept
[noparse][b]text[/b][/noparse] The tags inside are printed, not applied
[hr][/hr] A horizontal rule

There is no [h4]. Steam stops at three heading levels.

Links and media

Tag Renders as
[url=https://example.com]text[/url] A link with its own text
[url]https://example.com[/url] A link showing its address
[img]https://example.com/picture.png[/img] An image from that address
[previewyoutube=VIDEO_ID;full][/previewyoutube] A YouTube player
A YouTube link on its own line A video player
A Steam store link on its own line A store widget
A Workshop link on its own line A Workshop item widget

An image has to be hosted somewhere already: Steam does not upload pictures out of a description. The gallery is separate from the text and is not BBCode. The Workshop panel keeps it in previews/, with previews/videos.txt holding one YouTube id or link per line.

Lists

[list]
[*]First item
[*]Second item
[/list]

[olist] in place of [list] numbers the items. Items are opened with [*] and never closed.

Quotes

[quote=author]The quoted text.[/quote]

Leave out =author for a quote with no name on it.

Tables

[table]
[tr][th]Column[/th][th]Column[/th][/tr]
[tr][td]Cell[/td][td]Cell[/td][/tr]
[/table]

[table noborder=1] hides the borders. [table equalcells=1] stretches the table to the full width with columns of equal width.

Limits

A description holds at most 8000 bytes of BBCode, tags included, and a title at most 128 bytes. Bytes, not characters: a Cyrillic description reaches the limit at about half the visible length of an English one, a Chinese one at about a third. The Workshop panel's pre-upload checks say when a draft is over, and an upload that gets through anyway comes back with k_EResultLimitExceeded (Steam Workshop Error Codes).

Writing it as Markdown

You do not have to type BBCode. Paradox: Edit BBCode as Markdown opens a .bbcode file as Markdown, and saving converts it back. The changenote sources, a changelog file or a commit message, are Markdown too and convert on their way up. The mapping is fixed, so the same Markdown always produces the same BBCode:

Markdown BBCode
# Title, ## Title, ### Title [h1], [h2], [h3]
#### Title and deeper [h3], since Steam has no deeper heading
**bold** or __bold__ [b]bold[/b]
*italic* or _italic_ [i]italic[/i]
~~struck~~ [strike]struck[/strike]
<u>underlined</u> [u]underlined[/u]
<details><summary>Spoiler</summary>text</details> [spoiler]text[/spoiler]
`code span` [noparse]code span[/noparse]
A fenced code block [code]…[/code]
--- on its own line [hr][/hr]
- item or * item [list][*] item[/list]
1. item [olist][*] item[/olist]
Indented list items Nested lists
> quoted [quote]quoted[/quote]
> **Anna** then > quoted [quote=Anna]quoted[/quote]
A pipe table with a header row [table] with [th] cells in the first row
![alt](https://…/a.png) [img]https://…/a.png[/img]
[text](https://…) [url=https://…]text[/url]
<https://…> [url]https://…[/url]

Markdown with no BBCode counterpart passes through as text: HTML other than <u> and <details>, footnotes, task-list checkboxes. Steam then prints it, which is what the preview shows you before the upload.

The one thing that changes shape on a round trip is the line breaks. Steam breaks on every newline, so the converter keeps every newline, and VS Code's own Markdown preview of the .bbcode.md face joins soft-wrapped lines the way Markdown does. The BBCode preview and the Workshop panel show Steam's reading, which is the one that counts.

In the editor

A .bbcode file is its own language: highlighting, tag completion on [, a closer list after [/, and a live preview to the side (Ctrl+K V) or in place (Ctrl+Shift+V). The ? button in its title bar opens the same tag list inside VS Code, as the Steam BBCode page of the Wiki hub. The Workshop panel renders the description and each translation with the same preview, and its Edit file button opens the .bbcode file. Editor Features and Steam Workshop have the details.

Preview through the editor selector (0.5.0)

Open a .bbcode file and choose Reopen Editor With... > BBCode Preview. Open BBCode Source returns to text. Open BBCode Preview to the Side keeps the source and preview visible together. The preview reads current editor text, including unsaved edits, and leaves the file's language mode unchanged. These preview actions do not convert or save the document; Edit as Markdown is the separate round-trip editing mode described above.

Related

  • Steam Workshop for the panel, the listing files and what an upload sends.
  • Steam Workshop Error Codes for the result Steam gives a description that is over the limit.
  • Configuration for px.workshop.changelog, which says where the Markdown changenotes come from.
  • Examples Wiki for the Wiki hub that carries this tag list inside VS Code.

Clone this wiki locally