A category is expensive. It is a permission domain, a row on the index, a URL that search engines will crawl, and a room that can look empty. A prefix or a tag is cheap. Most boards that feel “complete” on the whiteboard feel dead on the public site because someone opened a shelf every time they named a topic.
This is a taxonomy article: when to create a section, what type of container it should be, how to name it, and how to close it when it fails the empty-section test. It is not the return-loop information architecture piece. That one owns the first screen, the last-post column, and the reason people come back tomorrow. Stay here if you are about to click Add node or New category. Paint and icons live in the XenForo node guide. Do that after the tree is honest.
The only decision that matters
Every request to “add a section” is one of three jobs. Mix them and you will pay for a wall you did not need.
| Job | What the member needs | Right tool | Wrong tool |
|---|---|---|---|
| Different people | Some accounts must not see this at all | A category / node with its own View wall | A prefix that anyone can filter past |
| Different verb | Announce, apply, trade, or ticket — not “discuss” | A content node with different permissions or thread type | Another child of General |
| Different label | EU, Solved, 2.3, LFG, Screenshot | Prefix (XenForo) or tag (Discourse) | A new empty forum |
If you cannot point at a row in that table, you do not have a taxonomy ticket. You have a misplaced thread and a moderator who is tired of moving it. Move the thread. Do not open a room.
The sentence that survives every platform: open a section when the audience or the rules change; mark a thread when only the label changes. XenForo community practice has said the same thing for years on gaming and support boards — broad nodes plus prefixes. Discourse Meta says it every time a phpBB migrant arrives with two hundred forums. Jeff Atwood’s 2017 line is still the one people quote in 2022: four walls make a room, twenty-four make a maze.
The empty-section test
Before you create anything, write the name on a staff page and leave a blank for “first thirty days.” After a month, run this test. After a quarter, run it again.
A section is valuable if all three are true:
- Someone who is not staff started or replied in it this month. Staff seed threads do not count. A welcome post from Admin does not count.
- A stranger can say what belongs here after reading the title and one sentence of description. If staff have to explain the shelf in a DM, the name is wrong.
- Merging it upward would make someone angry for a reason you can write down. “The map would look incomplete” is not a reason. “Donors would see private tickets” is a reason. “LFG threads would drown lore” is a reason.
Fail any one and it is a marker, or it is a thread inside the parent, or it is nothing. Hide it, merge it, or never create it.
The test is also how you close rooms. An empty row on the XenForo forum list is a vacancy sign. New members read vacancies as “this place closed.” Veterans stop scanning the index. Staff then add another child “so the new topic has a home,” which adds another vacancy. Discourse Latest has the same shape with different nouns: forty categories with three topics each make the product look like a junk drawer.
Do not wait for a redesign. Archive or merge on a calendar. A room that has not earned a non-staff post in thirty days is a candidate. A room that has not earned one in ninety is a ghost. Ghosts go away.
Name the shelf before you click
Bad names are how empty rooms get created. People invent a heading that sounds like a department, then discover nobody talks in departments.
Rules that keep names honest:
- One job per name. “Support” is a job. “Support / 2.3 / EU / Unsolved” is four markers pretending to be a path.
- Member language, not org-chart language. “Looking for group” beats “Player services.” “Patch notes” beats “Communications.”
- No leftover pile with four aliases. General, Off-topic, Misc, Other, and Test are the same drawer. One leftover drawer is enough.
- No version, region, or status in the title unless that version, region, or status is a separate community with separate people or separate law.
- A description that fails. If you cannot write one sentence that a new member would use as a posting rule, you do not have a section. You have a mood.
Write the name and the one-sentence rule on the staff page before the ACP. If two proposed names share a sentence, they share a room.
XenForo: pick a node type, not a forum
On XenForo the tree lives in Forums → Nodes. Members never see the word “node.” You should still think in nodes, because the type is the first customization they feel.
Official types from the current manual:
| Type | What it is | When it is the right shelf |
|---|---|---|
| Category | A container. Clicking it usually opens the child list. Nobody posts here. | A heading over two or more content nodes that share an audience. |
| Forum | Threads and posts. The product. From 2.2 a forum can be discussion, article, question, or suggestion (or a mix). | People must start threads and reply. |
| Page | Static HTML that sits in the tree. Template syntax is allowed. | Rules, a short handbook, a welcome that does not need replies. |
| Link forum | A redirect to a URL you type in the ACP. | The destination already exists — a specific thread, a help page, an off-site resource you truly want in the tree. |
The official recommendation is the one you should follow unless you have a reason: categories at the top, content nodes inside. Example from the manual itself: a “XenForo support” category over Troubleshooting, Styling, and a link to the manual; an “Official XenForo add-ons” category over Media gallery, Resource manager, Enhanced search.
A category of one child is a wasted tap on a phone — unless the next two rooms are coming this week. A forum used as a heading is a lie: it looks postable and then you revoke posting, or you leave it postable and it becomes a junk drawer with a fancy name.
Use the forum type as the verb:
- Discussion when the thread is a conversation.
- Article when the first post is the artefact (patch notes, editorial) and replies are comments. Converting a living discussion forum later is messy.
- Question when a thread should mark a solution. Support belongs here.
- Suggestion when votes should change the sort. Feature requests yes. “Where should we eat” no.
A page is how you publish rules without inventing a “Rules forum” that then collects off-topic replies. If that page is the first thing a new member should see, hang it off the 30-day onboarding path, not under Archive / Meta / Other. A link forum is how you stop cloning a destination that already exists. Two rules documents is how you get two contradictory versions.
Display order is a number. Humans should not manage it as a number. Use Sort and drag the tree. Put living rooms above ghosts. Put Announcements where a stranger will see them. Then stop.
Search forums exist in the product as a fifth shape: a saved search that looks like a row. Treat them as a view (“Unanswered this week”), not as a home. “Everything about cars” is a real forum plus a prefix.
Permission cost is why XenForo prefixes exist
On stock XenForo, changing group settings or node-specific permissions rebuilds a permission cache. Community practice writes the cost as C ∝ U × N — users (through their groups) times nodes. A medium board on the order of 80 nodes and 60 groups can spend two to four minutes on a single primary-group change. At 700+ nodes those rebuilds run into timeouts, PHP execution limits, and table locks. The site feels offline while you “just add a forum.”
Prefixes do not do that. A prefix is a field plus an index. It is not a permission domain. If you are creating a node so you can grant a different ACL, you have a real permission problem. If you are creating a node so the title can say “EU” or “unsolved,” you have a prefix problem you are paying for with cache rebuilds.
That is the operational reason the return-loop article prefers broad rooms. This article is the clerk’s version: do not add a node unless you are willing to pay C again every time you touch groups.
Permissions themselves still follow the official rules, and they will punish a decorative tree:
- Values cascade. A parent that is unviewable blocks children even if the child says Yes.
- Never beats Yes. Never is for discipline groups, not for “Registered should not see this one room.”
- Private node strips View node globally. You then re-grant View node = Yes to the groups that belong. Other permissions inherit. You do not re-tick Post on the private node unless you mean to change it.
- Confirm with Groups & permissions → Analyze permissions. Guessing is how a Staff room leaks or a help desk vanishes.
The official Staff-room walkthrough is the pattern for every “different people” shelf: Forums → Nodes → Add node (a real forum), then Permissions → Private node, then View node = Yes for Administrative and Moderating. Adapt the groups; do not invent a sixth type.
If a proposed section is only “so EU people can find EU threads,” that is a required prefix on the existing forum, not a child. Automated ACP rules can require the prefix. Computational cost is negligible next to a rebuild.
Discourse: categories are walls, tags are not
Discourse uses different nouns for the same split. A category is a wall. It can hold permissions, a default notification level, a colour, and a place in the nav. A tag is lightweight. It applies to many topics, it stacks, and it is not a security boundary.
That last clause is the one phpBB migrants miss. Hiding a tag does not hide a topic. If the topic must be invisible to a group, it needs a category (or a personal message, or a group). If the topic must be findable under two headings — “2.3” and “bug” — it needs tags.
Atwood’s maze line is about categories, not tags. Four public walls is a room a new member can learn. Twenty-four is a place they will post in General and wait for a moderator to sort them. Discourse Meta still points people at that 2017 blog in 2022 because the importer does not delete the extra walls for you.
Practical Discourse rules that belong in this article, not in a return-loop essay:
- Start with few categories. Graduate a popular tag into a category later, when the tag has traffic and a distinct audience or rule. Do not open the category first and hope the tag-shaped traffic arrives.
- Tags do not replace permissions.
create tag allowed groupsdefaults to trust_level_3.tag topic allowed groupsis a separate control. For a new site, start with members who cannot create tags. You can loosen later. A global soup of two hundred user-created tags is not a taxonomy. - Do not stack redundant groups on a category. Admins + mods + TL1–TL4 on the same wall fights Discourse’s hierarchy and is a known way to produce “not permitted to view.” Trust the hierarchy. Add a group when the wall is actually different.
- Keep a public Site Feedback category. Meta’s own practice: the product needs a room where the room can be complained about. That is a different verb from General. It is one of the few extra walls that earns itself.
edit_all_topic_groupsdefaults to trust_level_3. Recategorising and retagging is a privilege. Your taxonomy will rot if every new account can invent a heading.
A Support category that only accepts a version tag group is usable. A Support category plus Support-2.2, Support-2.3, Support-iOS, and Support-Android is the maze again.
When to graduate a marker into a room
The healthy direction is marker first, room later. The unhealthy direction is room first, emptiness later.
Graduate a prefix or tag into a section when you can tick most of this list:
- The marker is used every week by people who are not staff.
- Threads with that marker have a different lifespan or different rules from the parent (LFG expires; lore does not; trading has a scam line).
- Moderators are spending real time moving those threads out of the parent because they do not belong there, not because the title would look nicer somewhere else.
- You can name the audience who would be angry if you left it as a marker.
- On XenForo, you have measured the extra node against C ∝ U × N and still want it. On Discourse, you are not already in the maze.
Do the reverse — demote a room to a marker — when the empty-section test fails or when two rooms share an audience and a verb. Merge the threads. Keep the old name as a prefix for a quarter if people search for it. Then delete the ghost.
Never graduate a marker because a loud regular wants “their” board. That is how you get a vanity shelf with three threads and a last post from the person who asked.
Worked examples (so the table is not abstract)
A product-support board
Open as rooms: Announcements (staff write, everyone reads), Help (questions, solutions), Development / Feature requests (suggestions), Lounge, Site Feedback, Staff (private).
Keep as prefixes or tags: version (2.2, 2.3), platform (iOS, Android, web), status (Question, Solved, Bug), product SKU if you have more than one.
Do not open: Help / 2.3 / iOS / Crash. That is four markers. Require two of them on thread create if you must.
Help should be a question forum on XenForo so a solution can be marked. On Discourse it is a category with a required tag group for version. Same job.
A gaming / roleplay hub
Open as rooms: Announcements, the game itself (one room), Looking for group if LFG has different rules and a shorter life than lore, Applications / whitelist if that is a verb with a queue, Trading if money or items change hands, Lounge, Staff.
Keep as prefixes or tags: region (EU, NA) unless those are legally separate communities, faction, map, status (Open, Full, Closed).
Do not open: a child per city, per class, per season, per patch. Seasons are a hype-fade problem, not a taxonomy problem. A season child will be empty in six weeks and you will be afraid to delete it because “the history is there.” The history is in the threads. Prefix the season. Leave the room.
Whitelist and applications are a different verb. They belong in a dedicated request flow, not in a decorative “Applications” category that is actually a forum with no form.
A magazine / news community
Open as rooms: an article forum for editions, a discussion forum for talk-about-the-news, Announcements if that is not the same as editions.
Keep as prefixes or tags: desk (Politics, Sport), format (Interview, Review).
Do not open: a category per desk on day one. A magazine with three writers does not have eight desks. The newsroom article owns how staff publish. The portal article owns the first screen. This article only says: do not clone the masthead into the node tree.
If the homepage job is “look like a magazine,” that is a route and a widget problem (Setup → Options → Basic board information → Index page route), not a reason to add twelve categories.
A Discourse technical community
Open as walls: Announcements (default watching), the product, Support (required version tags), Site Feedback, Staff / internal if you need it.
Keep as tags: version, component, OS. TL3 creates tags until you have a reason to let everyone.
Do not open: a wall per component. Components are tags. The Discourse beginners and technical community pieces already assume a short wall list. Honour that.
Opening a section without making a mess
When the test passes and the type is chosen, open it like an adult.
XenForo
- Write the name, the one-sentence rule, and the audience on the staff page.
- Forums → Nodes → Add node. Pick the type. Parent it under a category, not under a random forum.
- Set the URL portion to a word you are willing to keep. Renames are redirects you will forget.
- If it is a “different people” room, make it Private and grant View node = Yes to the groups that belong. Analyze a test user before you announce it.
- If it is a “different label” you refused to open, add the prefix group on the existing forum instead and require it.
- Seed one thread that demonstrates the rule — not five welcome posts from Admin. Then wait for a member.
- Put the row in Sort where a stranger will understand it. Do not hide a living room under Archive.
Discourse
- Same staff-page sentence.
- Create the category. Set permissions from the hierarchy; do not tick every group.
- Attach a tag group if the wall needs a required marker. Do not create the wall and five child walls.
- Default notification: watching on Announcements, normal or tracking on the product, muted on archives.
- Leave Site Feedback public.
Announce the new shelf in the room that already has traffic, not only inside the empty one. A section nobody can find is an empty section with extra steps.
Permissions on a new XenForo node inherit. That is usually what you want. The two times it is not:
- The new room is Staff, donors, or another “different people” wall — Private node, then View node = Yes for the groups that belong. Analyze a Registered test user and a staff test user before you announce.
- The new room is Announcements — Registered should usually not start threads. Revoke that verb on the node for Registered. Do not Never it. Staff secondary groups still Yes.
On Discourse, set the default notification before the first topic. Watching on Announcements after fifty people have muted the category is how you train them to ignore the next change. Normal or tracking on the product. Muted on anything you already know is an archive.
Closing and merging (the half people skip)
Creating is cheap on the ego. Closing is the work.
- Hide before you delete if you are unsure. A hidden XenForo node stops teaching new members the wrong map. Threads remain for people who have the URL.
- Merge into the parent when two rooms share a verb. Move threads. Add a prefix that preserves the old name for a while.
- Do not delete a node to “clean up” if you have not moved the threads. On XenForo, deleting a node deletes its threads. Community practice is blunt about this because people learn it the hard way.
- Do not keep a ghost “for SEO.” Thin forum-index URLs do not help. Thread URLs do the work. The return-loop piece already said this; the taxonomy version is: every extra index is a page you now have to keep from looking dead.
- Write the redirect. If an old category URL existed, send it to the parent or to a search. Do not leave a 404 that used to be a heading.
Run the empty-section test on a calendar — monthly on a new board, quarterly on a stable one. The health-metrics article owns the graphs. This test is a count of empty rows, not a dashboard.
What this is not (so you do not file the wrong ticket)
- Not a first-screen redesign. If the tree is already short and the index still feels dead, you have a return-loop problem. Go back to structure people return to.
- Not paint. Icons,
extra.less, 2.3 variations, and category headers are the nodes article. - Not permissions school. Registered stays primary; Never is for discipline. That is the starter map and the scale piece.
- Not a migration reason. An 80-node maze on XenForo becomes an 80-category maze on Discourse if you copy the tree. Read the old-forum filters if the software is the excuse.
Checklist before you add a category
Print this. Tick it on the staff page. If you cannot tick it, add a prefix or a tag instead.
- I can name the audience or the verb that is different from the parent.
- I wrote a one-sentence rule a new member could follow.
- I chose a type (XenForo category / forum / page / link, or a Discourse wall) and not “another forum because that is the button.”
- I am not encoding version, region, or status in the title unless those are separate communities.
- On XenForo I accepted the C ∝ U × N cost, or I used a prefix. On Discourse I did not add a wall I could have tagged.
- I know how I will fail this section in thirty days if nobody but staff posts.
- I know where the threads will go if we merge it.
- I will not post the first five threads as the root Admin account.
That last box is identity, not taxonomy. It still belongs here: a new shelf whose only voice is the nuclear badge teaches people the shelf is a noticeboard, not a room. The loyalty article owns the rest of that habit.
Takeaways
- A valuable category is a wall — different people or different rules — not a heading you liked in a meeting.
- Run the empty-section test. No non-staff post this month, unclear name, or no one who would be angry at a merge: do not open it, or close it.
- On XenForo, pick a node type from the official four (plus search forums as views). Categories at the top, content inside. Private node plus View node = Yes for the groups that belong.
- Permission rebuilds scale with groups × nodes. Prefixes do not. That is why “EU” is a prefix until EU is a separate community.
- On Discourse, categories are walls, tags are lightweight. Four walls make a room. Graduate a popular tag later. Keep Site Feedback. Do not stack every group on every category.
- Name in member language. One leftover drawer. No version paths. Merge ghosts; do not delete threads by deleting nodes.
The map is not the product. The threads are. Open a shelf when the threads need a wall. Mark them when they only need a label.

