Theme a forum
theme.forum is the part of a space's theme that only a Community (forum) space reads: how its topic list, front page, categories, tags and sidebar, topic page, and reader account surfaces look, beyond the keys every space shares. It lives inside the same theme you already set with PUT or PATCH /orgs/{orgId}/spaces/{spaceId}/theme.
Setting
theme.forumon a space of any other type is refused with a422. A site theme may carry it; it then reaches the site's forums.What a reader renders is
forumThemeOf(theme): the forum defaults, under the site's theme, under the space's own. Every key you set wins.Unset on a forum means the forum default — the
cleanlook since 2026-10-12 (the defaults).look: "paper"brings back the previous forum look in one key.GET …/themealways answers with what you stored, never the resolved theme, so you can send it back whole without freezing the defaults into it.
Topic list and dates
theme.forum.list shapes the topic list — the forum's own list and a front page's forum feed drawn as rows. Every key is optional; unset draws the list as it always was.
Key | Values | What it does |
|---|---|---|
|
| Faces on rows: the opener's before the title, or the thread's posters (the opener, the latest replier, the most frequent — up to five; on the dense table a "Posters" column) |
| 16–48 (px) | The faces' size. Unset: 24 (posters), 28 (opener) |
| up to five of | The dense table's stat columns, in order. Unset: replies, views, activity. Counts stay under the front door's |
|
| A number at or past a threshold is tinted, stronger at each step. A theme key, not a setting, because the theme already reaches the reader |
|
| The excerpt under the title |
| 1–4 | How many lines it may take. Unset: 2 |
|
| The topic's picture beside the row: its cover, else the first image in the opening post |
| 40–160 (px) | Unset: 64 |
| boolean | A lock on a closed thread, a box on an archived one, a bookmark on one you saved. Unset: on |
|
|
|
|
| Row padding. |
|
|
|
|
| The Q&A stats box. Naming |
| boolean | A "3 new topics — show" bar when topics are posted while the page is open (checked every minute while the tab is visible) |
|
| A pinned row says "Pinned", or shows a pin |
| boolean | An "Unpin for me" link under pinned rows, for signed-in readers |
|
| The dense table's header row. |
| a length | The row title's and meta line's type size |
| hex | The row title's ink, light and dark |
|
|
|
| 1–4, or | How many lines a title wraps to before it is clamped — per breakpoint with an object ( |
| boolean |
|
| up to five of | A muted line under the title: "kaito asked 9 hours ago in Q&A · Unanswered". |
|
|
|
|
|
|
|
| Where the tags sit: on the meta line, or under the excerpt. Unset: under the excerpt on the card list, on the badge line in the dense table |
|
| The faces' shape. Unset: circle |
| boolean |
|
{
"forum": {
"list": {
"titleLines": { "sm": 3, "md": 2, "lg": 2 },
"kindChip": false,
"meta": ["author", "asked", "category", "state"],
"stats": { "position": "start", "fields": ["votes", "answers", "views"], "style": "pill", "phone": "strip" },
"byline": "end",
"categoryMark": "tile",
"statusGlyph": "none"
}
}
}reputation shows the opener's points when the forum's list sends them on each row (authorPoints); a list that does not draws the rest of the line.
theme.forum.dates spells the list's dates:
Key | Values | What it does |
|---|---|---|
|
| "Oct 3" (unset), "3 hours ago", or "3h" |
| boolean | The full date and time in the tooltip. Unset: on |
The Activity column shows when a thread last moved, not when it was posted. Closed and archived threads stay in the list (their pages are still served), marked by stateGlyphs. On a phone the dense table's numbers fold into a line under each title instead of scrolling sideways.
The front door's showVotes (default on) turns the card list's vote column off; the reply count stands in for it.
Theme components can target forum-topic-row-after-title, after each row's title in both anatomies.
The list's root carries data-forum-list and one data-fl-* attribute per key you set (data-fl-density, data-fl-avatars, data-fl-title-lines, data-fl-stats-style, …) for your own CSS. The meta line is [data-fl-meta-line], the end byline [data-fl-byline], a category tile [data-fl-cat-tile], the phone stats strip [data-fl-stats-strip].
Round-4 list keys (2026-10)
Each of these is a theme key (forum.list.*) that you can also set per category (forum.categoryOverrides.<slug>.list) and per front-page feed (the spaceFeed block's listPatch). The most specific one wins: the block, then the category, then the space theme, then the look.
Key | Values | Unset | What it does |
|---|---|---|---|
|
| follows the layout preset (Dense list = |
|
|
| the box when |
|
| 64–160 (px) | 4.5rem minimum | The stats column's width; numbers are right-aligned in it. The table column is that width plus a 16px gap before the title (the gap now always applies) |
| adds | the table puts tags after the category badge; cards put them after the excerpt |
|
|
| both shown | Below 640px: |
|
|
| Below 1024px: |
| — | — | With any stats showing, the meta line drops its replies/views words. Round 5 moved this choice to its own key, |
{
"forum": {
"list": {
"anatomy": "table",
"stats": { "show": "strip", "fields": ["votes", "answers"], "width": 96 },
"tagsPosition": "inline",
"phone": { "avatar": false, "replies": "number" },
"pinPlacement": "above"
}
}
}Bug fixes with no key: the table always writes its column widths (<colgroup>), so header.show: false no longer lets the title column collapse. Row rules in both anatomies use the theme's --line, so paletteDark.line applies.
Per category — forum.categoryOverrides. Up to 50 entries, keyed by category slug: { "<slug>": { "list": {…}, "categoryPage": {…} } }. The entry's keys are merged over the space's on that category's page (c/<slug>) and on the front-page feeds kept to it (filter.category: "$current"). Inside categoryPage, banner and filters merge field by field. A slug that names no category does nothing.
{
"forum": {
"list": { "anatomy": "table" },
"categoryOverrides": {
"announcements": { "list": { "anatomy": "cards", "excerpt": "all" } },
"help": { "list": { "stats": { "show": "box" } }, "categoryPage": { "banner": { "align": "center" } } }
}
}
}Round-5 list keys (2026-10)
These are theme keys (forum.list.*). You can also set them per category (categoryOverrides.<slug>.list) and per feed block (spaceFeed.listPatch). The FORUM default layer sets none of them.
Key | Values | Unset | What it does |
|---|---|---|---|
|
|
|
|
| 16–48 (px) | the list's | The size of the faces on a phone row (below 640px): the opener's face at the start of the row, and any poster stack |
| 1–3, or |
| How many lines a title wraps to on a phone row (below 640px) before it is clamped. |
| boolean | drawn | The rule between rows below 640px. |
|
| the built-in words | The table's column headings. |
{
"forum": {
"list": {
"byline": { "at": "end", "counts": "show" },
"phone": { "avatarSize": 40 },
"header": { "labels": { "topic": "Thread", "posters": "", "activity": "Last post" } }
}
}
}Bug fixes with no key:
Counts appear once.
byline.counts: "auto"now really is the default. Before, a Q&A row showed its replies and views twice: once in the stats and again on the line under the title.Status glyphs stay with the title. The solved, closed, archived and saved glyphs sit inside the title's own text, in both anatomies and at every width. They no longer end up alone on a line above a long title that wrapped.
Front page
theme.forum.front — the filter row over the topic list, and the board panel around it. The row is the forum's, not the front page's: a category page draws the same one.
{
"forum": {
"front": {
"filters": {
"items": ["latest", "top", "solved", "unanswered", "categories"],
"links": ["rss", "leaderboard"],
"custom": [{ "label": "Guidelines", "href": "/guidelines", "icon": "book" }],
"style": "underline",
"pickers": ["category", "tags"],
"newTopic": true,
"count": true,
"activeColor": "#4f46e5"
},
"panel": { "background": "#ffffff", "backgroundDark": "#111827", "radius": 12, "padding": 16, "page": "#f5f5f4" }
}
}
}Key | What it does |
|---|---|
| The tabs, in order, from |
landing view | The first tab is what a bare visit to the front page shows: |
| The links at the row's end, in order, from |
| Up to six of your own links after them: |
|
|
| Dropdowns before the tabs: |
| A New topic button at the row's end; its composer opens under the row. Signed out it is the sign-in action, with the same words. Pair it with the front door's |
| "N topics" at the row's start, when the topic list reports its total. |
| The active tab's colour (#hex). Unset: the brand. |
| The filter row and the topic list as one panel: |
| Where the GENERATED front page puts its category rail: |
|
|
|
|
| A second rail beside the topic list, from 1280px (not drawn below it): |
| boolean (on a box) |
{
"forum": {
"front": {
"categories": "aside",
"welcome": "auto",
"align": "start",
"rail": {
"width": 300,
"items": [
{ "kind": "leaderboard", "title": "Most helpful", "period": "month" },
{ "kind": "box", "title": "Featured on Meta", "tone": "note", "body": "- [Our new tagging policy](/f/meta/tag-policy)" }
]
}
}
}
}The front door (PUT …/preset, frontDoor) adds two switches for a community: showSearch (the search band; it was tied to showFilters, and an owner who turned the filters off keeps the search off too) and showIdentity (who is reading and the New topic box). Both default on. A wrong value is now a 422 that names the values the key takes (badgeStyle must be one of pill, outline, text), not "not a setting".
Round-4 front-page keys (2026-10)
All are theme keys under forum. (scope: the forum space, or a site theme for its forums). categoryPage.* keys can also be set per category through categoryOverrides.
Key | Values | Unset | What it does |
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
| From 640px the end links (RSS, Members, Badges, About…) stay on the tabs' line: the first |
| 0–7 | 2 | How many end links stay inline under |
| any of the forum page kinds (as |
| The pages that wear the panel. On |
| 0–48, or | 16 |
|
| boolean | off | Joins a box to the one above it: one panel with a rule between them |
|
| the look's choice | The generated home's category band, under any look. Unset, it is |
|
| 16 / 24 | The space between whatever sits above a forum page (header, banner, sub-nav, the phone Menu row) and its first line, on every forum page. The column's own top and the first element's top margin are folded into it. |
|
|
|
|
{
"forum": {
"front": {
"filters": {
"newTopic": { "placement": "start" },
"pickers": ["category", "tags"],
"pickerStyle": "crumb",
"linksInline": 1
},
"panel": { "background": "#ffffff", "page": "#f3f4f6", "padding": { "sm": 4, "lg": 24 }, "scope": ["front", "topic", "categories", "category"] },
"rail": {
"items": [
{ "kind": "box", "title": "The Overflow Blog", "tone": "note", "body": "- [Shipping faster](/b/blog/shipping)" },
{ "kind": "box", "title": "Featured on Meta", "tone": "note", "group": true, "body": "- [New tag policy](/f/meta/tags)" }
]
},
"categoriesLayout": "tiles"
},
"pageHead": { "placement": "above-sidebar" }
}
}Fixes with no key:
Category logos. On the generated home, a forum whose top-level categories all have a logo now gets 3-up logo tiles before the topics, and the welcome band when there are four or more categories (
front.welcomeunset). This applies undercleanas well ascards. Wherever a category has a logo, the sidebar and the home's aside rows draw the logo (20px) instead of a colour square.Top spacing. A page that opens on the search box, the filter row or the list starts 24px under the header, not about 70px.
Phone search. A wide
searchWidthon a search band stays inside the screen on a phone.Categories tab on the landing view. When a bare visit opens on a
showOn: "landing"categories block, the Categories tab is the current tab.
Round-5 front-page keys (2026-10)
These are theme keys under forum.front (scope: the forum space, or a site theme for its forums). The FORUM default layer sets only categories: "auto".
Key | Values | Unset | What it does |
|---|---|---|---|
| adds |
|
|
| 1100–1920 (px) | drawn wherever the aside draws (1024px up) | Below this viewport width the generated home's categories aside is hidden by a media query and the list takes the whole row. Nothing moves after the first paint |
|
|
| Below 640px. |
| 12–20 (px), or a | as today (14px tabs) | The filter row's text: tabs, pickers and the phone select |
| hex colours | as today (the button's ink, or muted for | The pickers' ink, light and dark. Works with both picker styles |
|
| the built-in names | A tab's own words. Its link and its place in the row stay the same |
|
|
|
|
| 720–1600 (px) | 1152 (the board width, 72rem) | How wide the |
| boolean | drawn |
|
{
"forum": {
"front": {
"categories": "aside",
"asideMinWidth": 1280,
"filters": {
"phone": "select",
"size": 17,
"pickerInk": "#2563eb",
"pickerInkDark": "#93c5fd",
"labels": { "latest": "Active", "new": "Recent" }
},
"panel": { "scope": ["front", "topic"], "width": "frame" }
}
}
}front.categories: "auto" and the sidebar sections it reads are resolved on the server, so the home is drawn once, with its final column count.
Categories, tags and sidebar
Every key is optional; unset draws what the forum drew before.
sidebar — the forum's own sidebar
On every forum page (topics, a category, /categories, /tags, a topic, a profile) when enabled is true.
Key | Values | Unset |
|---|---|---|
|
| off |
|
|
|
| up to four of | community, categories, tags |
| category slugs to list, in order | every top-level category, with its subcategories |
| tags to list, in order | the ten most used |
| up to 20 | none |
| show each category's topic count | off |
| subcategories fold under their parent | always shown |
| draw each category's mark | on |
| 180–320 (px) | 240 |
|
| none |
|
| the brand |
|
| none |
|
|
|
|
| shown |
|
| off |
|
|
|
Below the desktop width the sidebar folds into a Menu button — except under a header that has its own menu and no sidebar toggle (chrome.sidebarToggle): there the header's menu button opens the forum drawer, with the header's own links at its foot, so a phone shows one menu control and the page starts right under the header. A header button carrying data-forum-sidebar-opener (the header's sidebar toggle) opens the drawer too, as does a forumulate:forum-sidebar event on window. With position: "end", theme components targeting the forum side column stack under the sidebar.
categoriesPage — the /categories index
Key | Values | Unset |
|---|---|---|
|
|
|
|
|
|
|
| off |
| 1–4, for | 3 |
| which of | description, counts, latest, unread, logo |
categoryPage — a category's own page (c/<slug>)
Key | Values | Unset |
|---|---|---|
| text with |
|
|
|
|
|
|
|
| up to three of | none |
|
| off |
|
| off |
|
| the old strip |
|
| shown |
|
| off |
A category's own colorDark always wins over the lift.
tagsPage — the /tags index
Key | Values | Unset |
|---|---|---|
|
|
|
|
| one list |
|
| off |
tagStyle and categories
tagStyle— how tags look on forum pages:chip,outline,outline-mono,text,eyebrow(the blog's tag looks, in each tag's own colours), orplain(muted words). Unset, a tag follows the front door's badge style.categories.icons—truedraws a mark beside every category name (its icon, else its emoji, else a colour square), even for a category with nostyle.
Badge styles
The front door's badgeStyle setting takes three more values on a forum: dot (a coloured dot before muted text), square (a coloured square) and bar (a coloured bar on the leading edge), beside pill, outline and text.
Round-4 keys (2026-10)
Header links only in the ☰ menu. chrome.headerLinks[].placement (bar unset, menu, both) puts a link in the menu alone — the ☰ is then drawn at every width — or in the row and the menu. A ☰ with nothing to list is never drawn. See Theming, advanced.
sidebar (theme)
Key | Values | Unset | What it does |
|---|---|---|---|
| any of | every page | The pages that draw the sidebar. On the rest the page takes the full width |
| also an array of | shown | The sections that keep their heading. |
| boolean | off | The CATEGORIES / TAGS headings fold behind a chevron. Each section starts open, and the reader's choice is remembered in their browser |
| boolean | off | Adds an "All categories" row (to |
|
|
| The current row: a tinted row ( |
{ "forum": { "sidebar": { "enabled": true, "pages": ["front", "category", "categories"], "headings": ["categories", "tags"], "sectionFold": true, "allLinks": true, "activeStyle": "ink" } } }A sidebar link to the forum's root is now current only on the root itself, not on every forum page. Below 1024px the sidebar's background is no longer drawn as an empty band where the Menu button used to be.
categoriesPage (theme)
Key | Values | Unset | What it does |
|---|---|---|---|
|
| today's face, an unclamped title, replies over age | The rows of the |
| boolean | drawn |
|
|
| ink | A category name's colour. |
| 12–32 (px), or a type level ( | today's size | A category name's size. A level name follows |
| 11–20 (px) | 14 | Descriptions and "Latest" lines on cards and rows. These were 12px before round 4 |
{ "forum": { "categoriesPage": { "layout": "table", "beside": "latest", "besideRow": { "avatarSize": 40, "meta": ["category", "tags"], "titleLines": 2 }, "title": false, "nameInk": "category", "nameSize": 16 } } }In the grid layout, subcategory chips now sit inside each bordered card, under the description. The front page's categories table reads list.statusGlyph (with checkbox, open topics get an empty box), draws a mark before each name under categories.icons, spells ages with forum.dates, and shows each topic's reply count on a phone.
categoryPage (theme, or per category through categoryOverrides.<slug>.categoryPage)
Key | Values | Unset | What it does |
|---|---|---|---|
|
|
| The banner's words, logo and search, centred |
|
|
|
|
| 200–960 (px) | the banner's width | The width of the banner's search box |
|
|
|
|
A category page with its own rail now splits the forum's frame into the list plus an 18rem rail, so it ends at the header's right edge instead of running 24rem past it.
{ "forum": { "categoryPage": { "banner": { "style": "color", "search": true, "align": "center", "width": "full", "searchWidth": 560 }, "filters": { "placement": "title-end" }, "rail": ["solved", "related"] } } }Round-5 keys (2026-10)
Unset, every key below draws the page it drew before, except the one the FORUM defaults layer sets (the "Layer" column).
sidebar (theme)
Key | Values | Unset | Layer | What it does |
|---|---|---|---|---|
|
|
|
|
|
| boolean | on | — | The phone drawer (and the |
{ "forum": { "sidebar": { "enabled": true, "subcategories": "nested", "phoneHeaderLinks": false } } }categoriesPage (theme)
Key | Values | Unset | What it does |
|---|---|---|---|
| 11–20 (px), or a type level ( |
| A category's description, in every layout (list, grid, boxes, table) |
| also | — | Named only: the table's Topics column reads "14 / week" for a category with a weekly rate, and the total for one without. Never on unless named |
| boolean | on |
|
|
|
| The beside column's faces. |
|
| the beside heading upper case, the table head as before |
|
|
| the rate when | The |
|
|
| Where that line sits: |
{ "forum": { "categoriesPage": { "layout": "table", "fields": ["description", "subcategories", "perWeek"], "descSize": 15, "beside": "latest", "besideRow": { "icons": false }, "headCase": "none" } } }categoryPage (theme, or per category through categoryOverrides.<slug>.categoryPage)
Key | Values | Unset | What it does |
|---|---|---|---|
| also | the content column | A full-bleed band ABOVE the sidebar and the list, from the header's bottom edge, square and unbordered. Only when a banner is drawn ( |
| also | the "Forum › Parent" crumb, on a subcategory only |
|
|
|
| With |
{ "forum": { "categoryPage": { "banner": { "style": "color", "width": "shell", "align": "center" }, "breadcrumb": "above-banner", "stats": true, "subscribe": true, "subscribeStyle": "button" } } }Mix and match: list, front page and categories
Every key above works under every look. A look (clean, board, cards, qa, paper) only sets defaults for individual keys. No renderer checks which look you chose, so any key you set wins over the look, field by field. Each key also has a scope, the place it can be set:
Scope | Where | Example |
|---|---|---|
theme |
|
|
category |
| the Announcements category as cards |
block | a front-page block's own attributes ( | one feed on the home as a table |
The most specific scope wins: block, then category, then theme, then the look. None of the three combinations below is a replica of another forum.
1. A board table under the cards look, with Q&A stats only in Help. The cards look supplies its thumbnails, avatars and post cards. The list is the table, and the help category gets a votes/answers strip.
{
"forum": {
"look": "cards",
"list": { "anatomy": "table", "columns": ["posters", "replies", "activity"], "header": { "show": false } },
"categoryOverrides": {
"help": { "list": { "stats": { "show": "strip", "fields": ["votes", "answers"] } } }
},
"front": { "categoriesLayout": "tiles", "categories": "before" }
}
}2. The qa look with its stats switched off, on a white card on grey. qa still sorts replies by votes and pins the accepted answer. The list is a plain rows list, and every page sits in the panel card.
{
"forum": {
"look": "qa",
"list": { "anatomy": "rows", "stats": { "show": "none" }, "phone": { "avatar": false } },
"front": {
"panel": { "background": "#ffffff", "page": "#f1f5f9", "radius": 16, "padding": { "sm": 4, "lg": 24 }, "scope": ["front", "category", "categories", "topic"] },
"filters": { "style": "underline", "pickerStyle": "crumb", "pickers": ["category", "tags"], "newTopic": { "placement": "start" } }
}
}
}3. paper type and colours with a modern sidebar and a full-width head. Nothing from clean comes in except what is named here.
{
"forum": {
"look": "paper",
"sidebar": { "enabled": true, "pages": ["front", "category"], "headings": ["categories"], "activeStyle": "bar", "allLinks": true },
"pageHead": { "placement": "above-sidebar" },
"categoryPage": { "title": true, "banner": { "style": "color", "align": "center" }, "filters": { "placement": "title-end" } },
"categoriesPage": { "layout": "grid", "nameInk": "category", "textSize": 15 }
}
}5. A cards-look forum with table heads in its own words and a select on phones. The cards look keeps its avatars and thumbnails. One category is a table with its own column heads, the list keeps its counts under a stats strip, and phones get the tabs as one select under a framed topic card.
{
"forum": {
"look": "cards",
"list": {
"stats": { "show": "strip", "fields": ["votes", "views"] },
"byline": { "counts": "show" },
"phone": { "avatarSize": 36 }
},
"categoryOverrides": {
"releases": { "list": { "anatomy": "table", "header": { "labels": { "topic": "Release", "posters": "" } } } }
},
"front": {
"categories": "auto",
"asideMinWidth": 1360,
"filters": { "phone": "select", "labels": { "hot": "Trending" }, "size": "small" },
"panel": { "scope": ["topic"], "width": "frame" }
}
}
}The building blocks this adds: list.byline.counts, list.phone.avatarSize, list.header.labels, front.categories: "auto", front.asideMinWidth, front.filters.phone, front.filters.size, front.filters.pickerInk, front.filters.labels and front.panel.width. Each works under every look, and a look only ever supplies a default for one of them.
4. A nested sidebar beside a shell-wide category band, under board. The board look keeps its table and underline tabs. Each category opens on a band across the whole page with the trail under it, the sidebar lists only the top level, and the /categories table reads weekly rates in sentence case.
{
"forum": {
"look": "board",
"sidebar": { "enabled": true, "subcategories": "nested", "activeStyle": "bar", "phoneHeaderLinks": true },
"categoryPage": { "banner": { "style": "image", "width": "shell" }, "breadcrumb": "below-banner", "subscribe": true, "subscribeStyle": "button" },
"categoriesPage": { "layout": "table", "fields": ["description", "perWeek"], "descSize": "small", "headCase": "none", "beside": "top", "besideRow": { "icons": false } }
}
}Topic page
Two families: post (one post's anatomy) and topic (the page around the posts). Every key is optional; unset renders the topic page as it was.
{
"forum": {
"post": {
"avatar": { "position": "gutter", "size": "md", "shape": "circle", "positionSm": "inline" },
"date": "relative",
"opChip": true,
"staffAccent": "brand",
"reactions": "both",
"menu": ["like", "link", "reply"],
"menuHidden": ["bookmark", "quote", "branch", "flag"],
"actions": { "align": "end", "style": "icons" },
"bodySize": "base",
"headingScale": "body",
"style": "card",
"gapMarkers": 7,
"reactionsRow": "inline",
"badges": "hover",
"acceptedStyle": "gutter-check",
"header": "stacked",
"bodySurface": "#f3f4f6",
"bodySurfaceDark": "#1f2937",
"quote": { "avatar": true }
},
"topic": {
"breadcrumb": "trail",
"map": { "show": "auto", "minReplies": 3, "style": "full" },
"answerPlacement": "excerpt",
"share": { "mode": "icon", "align": "end" },
"actions": ["share", "bookmark"],
"rail": ["related", "solved"],
"replyBar": { "signedOut": "bar", "placement": ["after-op", "end"] },
"align": "start",
"timeline": { "placement": "beside-column", "phone": "pill" },
"measure": 760
}
}
}post
Key | Values | What it does |
|---|---|---|
|
| The author's picture: a column left of the post, first in the header row, or none. Unset: no avatar. |
| same | The same under 640px (unset: |
|
| Its size in px. |
|
| |
|
| Which name the header shows; the second, muted. |
| — | The handle without its |
|
| The header date ("3 hr. ago"). It is always the post's |
| boolean | Prefix the date with |
| hex · | Owners, admins and moderators get a shield and this colour on their name; system lines take it too. |
| boolean | An "Author" chip on the topic starter's replies. |
| boolean | A "New member" chip on trust-level-0 authors. |
|
| The emoji chips (today), one heart bound to 👍 in the action row, or both (the heart owns 👍, the palette the rest). |
| list of | The action row, in order. |
| same | Items folded into the "…" menu. |
|
| Where the row sits and whether it shows labels (icons keep them for screen readers). |
|
| Post text size (unset: 14px). A |
|
|
|
|
| How a quote of another post looks; |
|
| A ruled list (today), bordered cards, or no rules. |
|
| The author line at the top, or a Stack Overflow user card at the end of the post. |
|
| ▲ score ▼: in the action row or a column left of the post. Answers always; the opening post only on a question. |
| boolean | The author's status emoji and message after their name (when members may set one). |
|
| Group flair as a chip (today) or a disc on the avatar. |
| boolean | Points and gold/silver/bronze badge counts. |
| 1–365 · | "N days later" between posts that far apart (chronological order only). |
|
| Where the emoji chips and the add-reaction button go: their own row under the actions (unset), or inside the action row, chips first. |
|
| The badge glyphs after a name: always (unset), only while the header is hovered or focused (never on a touch screen), or never. |
|
| The accepted reply: a green frame and chip (unset), drawn as a plain post, or a green check under the vote gutter (in the header when the post has no gutter). |
|
| The author line as one row (unset), or the name over "role • date" (the role is the author's title, else Staff/Moderator). |
| hex | A rounded bubble behind the post text, in light / dark mode. |
| boolean | The quoted author's face before the name in a quote's head (their picture, else their initials disc). |
| 20–64 | The face's size under 640px. Unset: 32. Example: |
|
| The 👍 chip (and like heart) beside a vote. |
|
| The add-reaction (smiley) button. |
topic
Key | Values | What it does |
|---|---|---|
|
| The category link (with its colour) and the tag chips under the title. |
| boolean |
|
| boolean · | A check before a solved question's title, a lock before a closed one. |
| boolean |
|
|
| ONE solved pill, replacing |
| hex · | The solved pill's own colour. Unset: |
|
| A button at the end of the title row ("Ask Question"). |
|
| The button under 640px: |
|
| The meta line as a list of facts (unset) or one sentence: "tvoronov asked this question in Q&A" ("started this discussion in" for a discussion; the category part drops when there is none), in the reader's language. The author is named as |
| text, ≤80 | The sentence in your own words, with the tokens |
| boolean | The topic's number after the title, muted: "#24636". It is the topic's |
| — | A green "Solved" pill after the meta line on a solved question. |
| list of | The meta line, in order. Unset: author · replies · views. |
|
| "All topics" (today), Forum › Parent › Category, or nothing. |
| text, ≤40 | The trail's first crumb (unset: "Forum") — "Community › Help". The JSON-LD trail uses it too. |
|
| The topic map under the first post; |
|
| Discourse's boxed stats, one line ("322 views · 9 likes · 8 users") with an avatar stack, or |
| 1–200 | The full box only from this many replies; below it, the strip. Unset: |
|
| Reply order. Unset: chronological; a question keeps accepted-then-votes. |
| boolean | Oldest / Newest / Votes links above the replies ( |
|
| A solved question's answer: first (today), in place, in place plus a "Solved by" card under the question, or that card INSIDE the opening post, before its actions. |
|
| The "Solved by" card: an outline with a tinted head (unset), a filled tint with no outline, or |
|
| What the "Solved by" card says: the answer's first 300 characters (unset), or |
| hex · | The colour of EVERY solved marker: the card, the Solved pill, the accepted reply's frame and chip, the gutter check, the list's solved check. Unset: |
| boolean | The "Accepted answer · jump to it" card under the head ( |
|
| The share control; |
|
| The row's icon frame, as on a post; |
|
| Where the share control sits in the actions row (unset: in its place in |
| list of | The actions row under the title, in order; |
|
| The actions as their own row under the head (unset), or as icons at the end of the meta line — no ~50px band. The FORUM defaults use |
|
| Translate's visibility. |
|
| The Watch / Subscribe control as a plain link or a solid button. Unset: an outlined button. |
|
| A sticky side rail: facts (category, tags, participants, dates), related topics, or the timeline. A list stacks its sections in order (each section once); |
|
| Today's right edge, just right of the column (≥1280px), or off. |
|
| A "3 / 40" pill on phones that jumps to a post. |
| 1–200 / ink | When it appears (unset: 5) and its fill. |
|
| The end dates: "Oct 3, 2025" in mono (unset), "Oct 2025" in the page's sans, as Discourse prints them, or |
|
| Per space. Unset: the org setting ( |
| boolean / 1–500 | A "Summarize this topic" button for signed-in readers, when the org has connected an AI provider. Summaries are cached per reply count. |
| 560–1000 | The reading column in px. |
|
| Unset: against the forum sidebar where there is one at the start edge (≥1024px), centred otherwise. |
| length, or | The topic title's size. Unset: |
|
| The title (with its meta line and chips) above the thread (unset), inside the opening post over its author line, or |
|
| The "Sign in to join in" box at the thread's foot for a signed-out reader (unset: |
|
| Per-category overrides of |
|
| A "Leave a reply…" bar. |
| list of | Where the bar appears (unset: |
| boolean |
|
| boolean | An "N Answers" heading over the replies (the sort control beside it). |
Fixed for everyone, no key: the composer, presence line and the linked/related/suggested lists sit in the topic column (they used to run flush left); a topic's tags are drawn; an uncategorised topic no longer shows readers a "Category" chip; closed and archived topics carry a lock chip and say so where the reply box was; post anchors (#post-N) are each post's own number everywhere; a reply that arrives live looks like the same reply after a reload; staff see a whisper marked "Only staff see this".
Also fixed for everyone (round 3): "Translate" is drawn only when the org has connected a translation provider; a post that takes votes no longer shows a 👍 chip (or like heart) beside its ▲ score — the score is that reaction; the topic title scales with the screen (clamp(1.5rem, 1.1rem + 2vw, 2.25rem), line height 1.2) unless typography.levels.topicTitle or h1 sets a size; the meta line counts in your language ("1 view", "1 reply"); the topic map's stats are an even grid; the phone timeline pill sits bottom-right above the safe area, under a docked composer, and hides while you write.
Also for everyone (round 4): every solved marker — the "Solved by" card, the Solved pill, the accepted reply's frame and chip, the gutter check and the list's solved check — is the success green, not the brand (answerColor changes it, "brand" puts it back to the brand); the topic map lays its stats on equal columns, never one stat alone on a second row (7 on one row, or 4 + 3); beside a forum sidebar the topic column starts at the sidebar's edge instead of centring ~200px away (align: "center" keeps the centring); a post's face on a phone is 32px (post.avatar.sizeSm).
Also for everyone (round 5):
One marker per accepted answer. A solved question's accepted reply is marked by exactly one thing, whatever
answerPlacement,acceptedBannerandpost.acceptedStylesay. Withexcerpt/excerpt-in-postthe "Solved by" card marks it and the reply is drawn plain. Withinlinethe reply's own marker does. Withpinned-first(unset) it is the reply's own marker (frame and chip, or the gutter check) and no "jump to it" bar — unlessacceptedBanner: trueoracceptedStyle: "none", in which case the bar marks it and the reply is plain.The phone pill keeps out of the way. With
timeline.phone: "pill", the thread keeps the pill's height plus its gaps free at its foot, and jumps to a post stop that far above the screen's bottom edge, so the pill never sits on a post's actions.reactionPicker: "auto"is one control (seepost.reactionPicker).
Mix and match
Every key on this page is a building block: it works under every look and next to every other key, and a look is only a PATCH of these same keys (see "Looks and defaults") — pick a look, then override any key it set, or skip the look and set the keys yourself. Scope, from widest to narrowest:
theme —
theme.forum.post.*andtheme.forum.topic.*apply to every topic in the space;category —
theme.forum.topic.byCategory["<slug>"]overridesanswerStyle,answerColor,answerColorDark,actions,map,rail,replyBar,header,share,timeline,threadingandpostfor one category's topics (a subcategory with no entry of its own takes its parent's);page — a single topic's own customization is drawn over both: its custom CSS, theme colours, and its own
forumkeys (forum.post.*,forum.topic.*) undercustomization.theme. Another type's namespace is refused there with a 422 naming it.
Three combinations that are not any replica. Each is a complete PATCH /orgs/{orgId}/spaces/{spaceId}/theme body.
A board-style table for the list, a solid green "Solved" header card inside the question, Stack Overflow's checkbox in the title, and an "Ask Question" button beside it:
{
"forum": {
"list": { "avatars": "posters", "columns": ["posters", "replies", "views", "activity"] },
"post": { "style": "card", "avatar": { "position": "gutter", "positionSm": "inline", "sizeSm": 32 } },
"topic": {
"answerPlacement": "excerpt-in-post",
"answerStyle": "header",
"header": {
"statusGlyph": "checkbox",
"category": "text",
"cta": { "label": "Ask Question", "href": "c/questions" }
},
"actionsPlacement": "meta",
"share": { "mode": "icon", "frame": "box" }
}
}
}One space, two kinds of category: Help reads as Q&A (votes, the answered pill, the full map), Announcements as a broadcast (no map, no reply bar, no actions), and the solved colour is the brand everywhere:
{
"forum": {
"post": { "voteStyle": "gutter", "likeChip": "show", "reactionPicker": "auto" },
"topic": {
"answerColor": "brand",
"answerPlacement": "excerpt",
"header": { "solvedPill": { "text": "answeredBy", "placement": "meta", "style": "outline" } },
"map": { "show": "auto", "style": "full", "fullFrom": 5 },
"replyBar": { "signedOut": "bar", "placement": ["after-answer", "end"] },
"byCategory": {
"help": { "answerStyle": "header", "rail": ["solved", { "kind": "box", "title": "Before you ask", "body": "Search first — most questions have an answer.", "tone": "note" }] },
"announcements": { "map": { "show": "never" }, "replyBar": false, "actions": [] }
}
}
}
}A discussions-style thread that is not any replica: the title after the author inside the opening post with a solid Solved pill, the meta line as a sentence, the topic's number after the title, stacked map stats, "Sep 20" timeline ends, an "Ask" button kept beside the title on a phone, and two grouped boxes in the rail:
{
"forum": {
"post": { "avatar": { "position": "inline", "size": "sm" }, "name": "username-plain" },
"topic": {
"titlePlacement": "in-first-post-after-author",
"header": {
"solvedPill": { "placement": "before-title", "style": "solid" },
"metaStyle": "sentence",
"number": true,
"cta": { "label": "Ask", "href": "new", "phone": "inline" }
},
"map": { "show": "always", "style": "stacked" },
"timeline": { "placement": "beside-column", "phone": "pill", "dateStyle": "day-month" },
"rail": [
"meta",
{ "kind": "box", "title": "Guidelines", "body": "Be kind.", "tone": "note" },
{ "kind": "box", "title": "Office hours", "body": "Thursdays.", "tone": "note", "group": true }
]
}
}
}A quiet reading page: the title inside the first post, short timeline dates, no Translate even with a provider, Watch as a link, and nothing at the foot for signed-out readers:
{
"forum": {
"topic": {
"titlePlacement": "in-first-post",
"titleSize": { "sm": "22px", "lg": "34px" },
"align": "start",
"translate": "never",
"watch": { "style": "link" },
"acceptedBanner": false,
"timeline": { "placement": "beside-column", "dateStyle": "short" },
"composer": { "signedOut": "none" },
"header": { "stateChip": false, "statusGlyph": true }
}
}
}With post.style: "card" and topic.threading: "nested", a reply's replies are drawn inside its card under an "N replies" disclosure (open when there are three or fewer), nesting at most three deep.
Quotes: the Quote button writes > text then > — [Name](/f/…#post-N). A quote's last line may also be {: cite="Name" cite-href="…"}. Either links the cite back to the post and notifies the quoted author. [grid] … [/grid] around images is read as a gallery.
typography.levels.topicTitle sizes topic titles ([data-fx-topic-title]) apart from every other page title. The theme component outlet forum-post-author-after sits after the author name in every post header.
Account, search and composer
Forum-only behaviour lives under theme.forum.chrome. Header keys that apply on every surface (signInStyle, ctas[].action, sidebarToggle, header.accentTop, subnav.*Dark, subnav.active) are chrome.* keys: see "The reader's account control, and the forum header keys" in the theming guide.
Key | What it does |
|---|---|
|
|
| Where the |
| A result's starter face: |
| The results' heading: |
{
"forum": {
"chrome": {
"composer": { "mode": "dock" },
"searchPage": { "filters": "top" }
}
}
}Mix and match: filters and avatar are independent of each other and of every look. A combination that is not any replica — the filters folded away and faces beside each result, beside a docked composer:
{
"forum": {
"chrome": {
"composer": { "mode": "dock" },
"searchPage": { "filters": "disclosure", "avatar": "start" }
}
}
}What a signed-in reader gets with no key set:
An account menu in the header in place of their name: My activity, Profile, Bookmarks, Notifications, Preferences, Account & privacy, Sign out — the same menu on every surface of your organization, configurable with
chrome.accountMenu(entries, order, your own links, the name, the bell). There is no "Drafts" entry: a reader's drafts are kept per composer in their browser, not on the server./me— "My activity": everything the reader posted, replied, reacted to, bookmarked and watched across your organization, with edit, delete, unreact, unbookmark and unwatch (one at a time or in bulk), and their account and privacy controls. See "Who sees what" in the theming guide, which also coversaudienceon every header, sidebar (forum.sidebar.custom[]) and front-page item — "Start free" for signed-out readers, "My activity" for members.A bell beside it, with a dot for unread notifications. It checks once a minute while the tab is visible. "See all" opens
/notifications./preferences: watch, track or mute the forum, its categories and its tags; email delivery and per-type settings; name, bio, location, website, cover image and status./search: the full search page with filters (see the forum guide).
The reader composer's toolbar has heading, bold, italic, strike, code, quote, list, link, table, a collapsible :::details block and an attachment button (images and PDF). The poll builder offers choice, ranked and number polls and "Show who voted". Profiles and user cards show the member's cover image, status and custom fields (a field marked "show on card" also appears on the card, up to three). A group flair pill draws the group's flairIcon before its label — a glyph name or an https: picture (see "Seeding a forum with real authors" in the forum guide).
profile — a member's page (/u/<username>)
Key | Shape | Default | What it does |
|---|---|---|---|
| integer px, 45–160 |
| The avatar beside the member's name. Discourse draws 120 |
| array (≤9) of | unset | The Summary tab's sections, in this order. Consecutive list sections ( |
| array (≤2) of | unset | A right-hand column at ≥1280px: the topics this member solved in this forum, and the forum's trending tags (last 30 days, else all-time). Not drawn below 1280px. Unset = no rail |
|
|
| The Summary's six numbers as the tile grid, or as one line — "12 Topics created · 40 Posts created · …". The same numbers either way |
| array (1–3) of | unset | The facts under each top-topic and top-reply row, in this order, joined by " · " — |
| array (1–3) of |
| The tabs, in this order; the first one opens. |
{
"forum": {
"profile": {
"avatarSize": 120,
"summary": {
"sections": ["stats", "topReplies", "topTopics", "topLinks", "mostRepliedTo",
"mostLikedBy", "mostLiked", "topCategories", "topBadges"]
},
"rail": ["solved", "tags"]
}
}
}One line of numbers, dated rows and a Badges tab (all three scope: theme — the whole forum's profiles):
{
"forum": {
"profile": {
"statsStyle": "inline",
"itemMeta": ["date", "likes"],
"tabs": ["summary", "activity", "badges"]
}
}
}Every list is at most six rows and holds only what the reader may see: topics in a category they cannot open never appear on someone's profile. A section with nothing in it says "Nothing yet." rather than disappearing, so the layout you chose holds. The data is GET …/forum/u/{username}/summary (add ?rail=solved,tags for the rail).
Search results (/search) lead each row with the starter's avatar — their picture, or their initials on their own colour.
Rows, posts, print and your own words
More building blocks. Each is optional, works under every look, and unset keeps what the forum drew before.
Key | Values | Unset | What it does |
|---|---|---|---|
|
|
| Where a row's title takes a signed-in reader: the first post, or the first post they have not read (Discourse's default) unless the category says to open at the first post. A signed-out reader, and a topic read to the end, always open at the first post. Also per category and per feed block |
|
|
| What the excerpt line says: the opening post's first words, the topic's one-line AI gist (nothing until one is written), or the gist where there is one and the excerpt otherwise. Gists exist once the forum's |
|
|
|
|
| hex |
| The staff accent on the dark page |
|
|
| What a printed topic carries: every post, or the opening post (and an accepted answer) only. The reply bar, filter row, action rows, timeline and composer never print |
| any of | topics, categories, tags, members, leaderboard, badges, about | The sidebar's COMMUNITY section. |
|
| the built-in names | Those links in your own words |
|
| the built-in names | The filter row's end links in your own words (the tabs already had |
| adds | — | A signed-in reader's own lists: topics assigned to them, topics they started, topics they replied in |
| as before | — | A category's own |
|
| none | Your own forum words in each reader language. See below |
Your words in other languages. Sixteen forum keys hold words you typed: tab and link labels, the topic header's button and meta template, the breadcrumb root, rail and sidebar titles, the category page title. On a forum translated into Spanish those showed your English on every /es/ page. forum.translations maps your original words to their translation, per language, wherever the words appear; reordering the tabs does not scramble it.
{
"forum": {
"front": { "filters": { "labels": { "latest": "Active" }, "linkLabels": { "about": "Our rules" } } },
"translations": {
"es": { "labels": { "Active": "Activos", "Our rules": "Nuestras normas", "Ask Question": "Preguntar" } },
"de": { "labels": { "Active": "Aktiv", "Our rules": "Unsere Regeln" } }
}
}
}Per category, more of the topic page. topic.byCategory["<slug>"] now also takes header, share, timeline, threading and post, so an announcements category can read flat with no timeline while Help reads as Q&A comments with gutter votes:
{
"forum": {
"topic": {
"byCategory": {
"announcements": {
"threading": "flat",
"timeline": { "placement": "none" },
"share": { "mode": "row" },
"header": { "metaStyle": "sentence", "metaTemplate": "{author} announced this {age}" }
},
"help": {
"threading": "comments",
"post": { "voteStyle": "gutter", "acceptedStyle": "gutter-check", "staffAccent": "success" }
}
}
}
}
}A category override that names its own list anatomy also gets that anatomy's faces (the poster stack with table, the opener with cards or rows), unless it sets avatars itself.
Every forum page is stamped. Tag pages, the member directory, the leaderboard, badges, about, the reader's account pages and the live rooms now carry their page kind, so sidebar.pages, front.panel.scope, layout.topGap and pageHead.placement reach them. Forum pages also follow the theme.mobile scale.
Header and footer. A forum outside a site draws the reader's sign-in in the header (see the defaults below). When it replaces a sign-in link of your own and you set no order, it takes that link's place before the light/dark and language controls. chrome.signInStyle.order chooses explicitly: before-ctas, after-ctas or before-controls. The organization setting general.show_powered_by: false drops the "Powered by Forumulate" credit from the reader footer.
Theme components on forum pages
Theme components draw into these outlets. "Repeats" outlets draw once per row or post; a wrapping outlet's before and after add to the part, replace draws your own.
Outlet | Where | Context |
|---|---|---|
| The forum's front page and category pages, above and below the topic list (below the pager) | — |
| After each row's title, in every anatomy |
|
| The heading of a category page: banner, logo and name |
|
| The | — |
| The forum side column (front page and topic pages). The column appears only when something fills it | — |
| A topic page, around the title and its byline |
|
| Between the opening post (and its polls) and the replies |
|
| After every post's body, the first included |
|
| After the author name in every post header |
|
| After the last post |
|
| The member card on a member page |
|
See Theme components.
Where to change it in the studio
Open the forum in the studio. The look picker sits in the front-door panel (Look, which also names an automatic Q&A look). Every other key is in the theme panel's forum group, and clicking a part of the live forum (a row, the filter row, a post header) offers the keys that style it. A category's own fields (approvals, experts, language, list style) are under Categories and tags. A single topic's look is Page look & sharing on the topic. How the forum behaves, rather than how it looks, is in the Forum behaviour sheet; see Community spaces.
Looks and defaults
look — one of clean, board, cards, qa, paper. A look is a set of defaults: every key it sets sits under your own, so any key you write still wins, field by field. Nothing is copied into your theme; change the look and the defaults change with it.
| What the forum reads like | Suggested arrangement |
|---|---|---|
| Neutral white paper and ink in light, near-black in dark, a UI sans; avatars, relative dates, coloured tag chips, a dot category badge, wider columns (72rem list, 760px topic), the topic map at 3+ replies. | (keep yours) |
|
| Dense list |
|
| Categories |
|
| (keep yours) |
| The forum as it was before 2026-10: warm paper, Archivo, no avatars, absolute dates, the pill badge. | (keep yours) |
PATCH /orgs/{orgId}/spaces/{spaceId}/theme
{ "forum": { "look": "board" } }The arrangement column is a suggestion only: a look never changes the space's layout preset (PUT …/preset), which stays yours.
What each look sets. clean is the full default layer (the table in the defaults); every other look is a small patch over it, and these are all the keys each one patches:
Look | Keys it sets |
|---|---|
|
|
|
|
| the Q&A keys below, plus |
| turns the |
The Q&A keys are list.stats (position: "start", fields: ["votes","answers","views"], acceptedStyle: "box", phone: "strip"), post.voteStyle: "gutter", post.acceptedStyle: "gutter-check" and topic replySort: "votes", sortControl: true, answerPlacement: "pinned-first". forum.qa: "on" lays exactly these on top of whatever look you chose ("auto": only when most topics are questions; "off": never, not even the automatic switch).
Because a look is only these keys, you can take one look's part and another's part. Two combinations no look or replica gives:
The board table and sidebar, with Q&A voting only where it matters, rows that open where the reader left off, and the AI gist as the excerpt:
{
"forum": {
"look": "board",
"list": { "rowLink": "unread", "excerpt": "all", "excerptSource": "gist-first" },
"topic": {
"byCategory": {
"help": { "threading": "comments", "post": { "voteStyle": "gutter", "acceptedStyle": "gutter-check" } }
}
}
}
}The cards list with clean posts (one key overridden), a renamed and reordered COMMUNITY section, and topics that print as the question alone:
{
"forum": {
"look": "cards",
"post": { "style": "rule", "staffAccent": "#0f766e", "staffAccentDark": "#5eead4" },
"sidebar": {
"enabled": true,
"communityLinks": ["topics", "search", "members", "about"],
"communityLabels": { "topics": "Everything", "about": "House rules" }
},
"topic": { "print": "op" }
}
}An unset look can be qa (2026-10-12). When you have not chosen a look and at least half of the forum's published topics — five or more of them — are questions (kind: "QUESTION"), the forum reads with qa instead of clean: the votes / answers / views column, the accepted answer first. It is worked out when a page is read (re-counted every few minutes), so it follows the forum as it grows, and a look you set always wins. The studio's front-door panel names the result: Look → "Q&A (automatic)". To keep clean on a question-heavy forum, set it:
{ "forum": { "look": "clean" } }Where a look reaches. Set on the space, it governs that forum. Set on a site theme, it reaches every forum in the site — the theme keys, the paper and type. The front page's switches (the category badge, the vote count, the identity band, the search band) follow the look set on the forum space itself; the studio's front-door panel shows that one.
What paper keeps and what it does not. paper turns every default above back off, the front page's switches included. It does not undo the bug fixes that shipped with the forum looks, which have no switch: the Activity column shows the last activity, the dense list stacks on phones, counts read "1 reply", the composer and the related/suggested topics sit in the topic column, and the signed-in reader has an account menu and a bell. It does not change your layout preset either.
Front-page switches a look sets (settings.frontDoor, under whatever you stored there — a stored true/false always wins):
Key |
|
|
|
|---|---|---|---|
|
|
| off |
|
|
|
|
| off (the card's right column shows the reply count) | on | on |
| off ("New topic" moves into the filter row) | off | on |
| off when the header has its own search box, otherwise on | as left | on |
The defaults
Since 2026-10-12 a forum whose owner left these keys unset reads with the clean look — existing forums included. Nothing was written to any space: the defaults are resolved when a page is read, under every key you (or your site) set, so a key you write still wins field by field. {"forum":{"look":"paper"}} turns every row below back off.
Key | Default |
|
|---|---|---|
neutral paper + UI sans ( | white / near-black papers, | warm paper, Archivo |
|
| off |
|
|
|
| off | on |
| off / off under a header search | on / on |
| on ("New topic" in the filter row) | off |
|
| muted text |
|
| the preset's (cards) |
|
| none |
|
|
|
| on, | as before |
|
| absolute |
| on for the Categories and Dense list arrangements | off |
|
| today's stack |
| on (category colours lifted for dark) | off |
home category rail ( | ruled rows; | grid |
|
| none |
|
| as before (14px) |
| on, | none |
| icons at the end; like, link, reply; the rest under "…" | today's text row |
|
| none |
|
| 42rem, 48rem |
|
| none |
|
|
|
|
| the full row |
|
| the full row |
|
| none |
|
| 1 |
| off — no "question" chip on rows | on |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| on — the quoted author's face in a quote card | off |
|
| — |
|
| none |
|
| fixed at the window's edge |
|
| "All topics"; the kind chip |
|
| shown |
|
|
|
|
| a text link |
|
| the header row's 14px |
header sign-in | always drawn on a forum that accepts reader accounts, in the server HTML (it opens the platform sign-in until the forum's own providers are known) | the same — not a look key |
Inside a site the site's header governs, so the two chrome rows apply only to a forum on its own. A site whose blog should match its forums' warm paper can set {"forum":{"look":"paper"}} on the site theme, which reaches every forum in it. The layout preset is unchanged: a forum that never chose one is still Categories.