A roleplay or gaming forum is not a dark skin and a Discord widget. It is a tree of rooms, a gate, a directory, a handful of facts about each player, and a ladder that does not pretend to be a shop. XenForo 2.3 already has those parts. The work is deciding which job each part owns before you create the twentieth “General Discussion” node.
This is not the whitelist article, not the server listing article, and not the custom user fields piece. Those own one shelf each. This one is the cupboard: how a game community hangs those shelves so a stranger can apply, find a server, pick a character name, and still know where lore lives.
If you arrived from an old Roleplay, Roleplay Dark, or Roleplay Light product page, stay. Those were skins. A dark gaming look is a style variation problem, not a product. The architecture below works on the Default style. Paint after the tree is honest.
Four jobs, four tools
Say “gaming forum” and five products answer. Mix them and you will build a directory that is also an application form that is also a lore wiki.
| Job | What the member wants | Stock shape | Owned by |
|---|---|---|---|
| Play / lore room | A place to post as a character, talk patch notes, or argue the map | Categories + forums, some Private | This article + nodes |
| Get in | A human yes/no on a character or a FiveM slot | Apply forum + Whitelisted secondary group |
Whitelist |
| Find a server | Connect string, version, whitelist flag | One directory forum + prefixes + thread fields | Server listing |
| Know who is talking | Character name, region, faction | Custom user fields | User fields |
Discord and ranks are optional fifth and sixth jobs. They are not the tree. The Discord article is OAuth, webhooks, and [8WR]. The ranks article is trophies, the title ladder, banners, and promotions. Link them after the rooms exist. Do not start with either.
A landing page that says “apply, then play” is a campaign page or a portal you send. It is not a substitute for the tree.
Build the tree before you invent rooms
Official node types still hold: Category, Forum, Link forum, Page, plus the unofficial fifth — Search forum. The nodes article already told you to stop at two public levels and to pick the type before the icon. A gaming board fails that rule in a specific way: one category per game, plus a leftover “Off-topic,” plus a staff dump, plus three lore forums nobody can tell apart.
A tree a stranger can scan in ten seconds looks like this.
Category: Start here
Public. One screen of orientation.
| Node | Type | Why it exists |
|---|---|---|
rules |
Page | The contract. One page. Not a thread that drifts |
how-this-works |
Page or a short Forum | Apply → wait → play. Link the apply forum. Do not paste the application here |
introductions |
Discussion forum | First post that is not an application. Staff answer it |
Turn Display in the node list off for a page you only reach from navigation if the index is already busy. The node still has a URL. The onboarding plan owns the first-week copy. This category is where that copy lives.
Category: The game (or The setting)
This is the product. Name it after the world, not after “Forums.”
| Node | Type | Who can see it |
|---|---|---|
announcements |
Article or Discussion | Everyone who can see the category. Staff post, members comment |
general |
Discussion | Public chatter that is about the game, not in-character |
lore |
Discussion or a Page plus one discussion | Public reference. Lock the “canon” threads if staff own canon |
play |
Discussion, Private node | Only Whitelisted (plus staff). In-character or in-game talk |
after-action |
Discussion, optional Private | Session reports. Only if you actually run sessions |
One game, one play forum, until that forum is noisy enough to split by region or faction. A play-eu and play-na pair is two private nodes and two permission overlays. Do not create them on day one because a custom field named region exists. Split when staff can no longer moderate one room.
If you run two games, two categories. Do not nest Game B under Game A. Parent View still wins: a member who cannot see the parent never sees the child.
Category: Directory
Only if you list other servers, or more than one official shard.
One Discussion forum. Prefixes and custom thread fields carry the connect string. That is the entire listing article. Do not hang the whitelist form off a listing thread. A prefix that says “whitelist required” is a label. The application is a different node.
Category: Support
Public enough that a banned or not-yet-whitelisted person can still ask why the launcher fails.
| Node | Type | Notes |
|---|---|---|
tech-support |
Question forum | Mark a solution. Not a dump of discussions with a hoped-for badge |
bugs |
Discussion or Suggestion | Suggestions if votes should change the sort. Bugs if staff will close them |
appeals |
Discussion, often Private to staff + the author workflow | If “only author + staff” is the product, stock XenForo cannot hide other threads. The whitelist article already said so |
A help page under /help/getting-started is the other half of Support. Official help pages are not nodes. They live in the Help manager. Use a Link forum if you truly want that URL in the tree. Do not clone the rules onto both a page node and a help page and then forget which one you edit.
Category: Staff
Private node on the category. View node = Yes on Administrative, Moderating, and any custom staff group. Official premium-forum walkthrough: do not forget staff. A sold or gated room staff cannot open is an unmoderated bunker. The permissions primer is the Yes / No / Never map; this article will not re-teach it.
Children: ops, applications-notes, ban-reviews. Node-specific moderators on The game are how FiveM staff stay out of billing. They inherit downward. They are not a substitute for Private.
Permissions: Registered stays primary
Official groups chapter, the sentence every gaming board tries to dodge: every registered human — including admins, moderators, and the person you just approved — keeps Registered as primary. Whitelisted, Storyteller, GM, Subscriber are secondary.
What goes wrong when you “promote” someone by changing primary to Whitelisted:
- Every add-on that assumes Registered as the baseline now has two baselines
- Analyze permissions becomes a novel
- A later promotion that removes
Whitelistedcan leave them with a primary you did not mean - The configuration mistakes article already listed this as item one because it is still the ticket
Fix: primary back to Registered. Put the key on a secondary group. Groups & permissions → Analyze permissions as that user, on the play node. You want View node = Yes coming from Whitelisted, not from a leftover user permission.
Private node only clears baseline View. Other permissions still inherit. If Registered has Post new thread = Yes on the parent and you only Private the child, an approved member can post; a guest still cannot see the row. Test three sessions after every overlay: guest, fresh Registered, same account after you add Whitelisted.
Do not use Never on Registered for play. Never cannot be overridden by a child or by Whitelisted. Private plus a Yes on the extra group is a room. Never is a lock.
The gate is a whitelist, not a promotion
A whitelist is a person who read the answers and said yes. Groups & permissions → User group promotions is a ladder. Official promotions: hourly cron, recently-active users only, empty criteria never award, disable does not demote.
Use promotions for “has an avatar,” “posted 30 times,” “registered a year.” Use a human for “this character sheet is not a meme and this Discord handle is real.” There is no official criterion for “thread in forum apply has prefix Approved.” If you try to fake the interview with “posted at least 1 message,” you will whitelist everyone who sneezed in Introductions.
The whitelist article owns the apply forum, prefixes (Pending / Interview / Approved / Denied), custom thread fields (backstory, age band, hours available), and the Monday-morning review. Plug it in as a public or staff-only apply node under Start here. Then:
- Applicant posts in
apply. - Staff decide in the thread.
- Staff add
Whitelistedon the profile’s secondary groups. Changing the prefix does not add the group. There is no stock listener. - Staff Analyze permissions on
play. - One reply: “You are in. The Play forum is on the list.”
Revoke is the inverse of step 3. Banned is not un-whitelisted. A ban is a separate tool. Do both if they are done.
Privacy: stock XenForo will not hide other applicants from each other. If Registered can View apply, they can read every visible application. The four honest policies are in the whitelist article (public queue, never-approved threads, staff-only plus a conversation, or an add-on). Pick one and write it in the forum description. Do not ask for a legal name, a phone, or a school. Age band, not date of birth.
The directory is a listing, not a browser
XenForo does not query FiveM, Minecraft, or a Discord invite. It stores a declaration. The server listing article is prefixes, custom thread fields, and optional Resource Manager. Use it when members need to find a server. Skip it when you run one official shard and the connect string belongs on a Page.
A listing thread can carry a Whitelist prefix so strangers filter “EU + whitelist.” It must not be the application form. Two forums, two jobs.
If you later want live player counts, you are buying or writing an add-on. Be honest on day one so members do not treat a stale “Online” prefix as telemetry.
Fields: the character, not the sheet
Official Users → Custom user fields: an alphanumeric ID you cannot rename, then either a text family or a choice family. Display with messages or in profiles. Admin edit-user includes all of them. Contact-classified fields sit under Additional contact.
The fields article already named the eight that earn rent. On a gaming or RP board, four of them do almost all the work:
| ID | Family | Where it prints | Consumer |
|---|---|---|---|
main_character |
Single-line text | With messages | “Who is this” while you read a post |
region |
Choice (eu, na, sa, af, as, oc, other) |
Profile, searchable | Notices, promotions, member stats |
faction or home_server |
Choice | Profile, maybe one chip with messages | Filters. Free-text class names become “mage” / “Mage” / “frost mage” |
discord_handle |
Single-line text, contact | Profile, not next to every post | Fallback when you do not run Discord OAuth |
Do not put the novel on the profile. A 400-word backstory is a thread field on apply, or a post in lore. Official user-fields page does not document every widget the ACP might show. It names text versus choice, editability, and display. That is enough.
Criteria: User field criteria sit on Search for users, Member statistics, Notices, Contact users, and promotions. A notice “EU maintenance Saturday 02:00 UTC” targeted at region = eu is the entire feature. Official promotions reminder: the hourly job only processes recently-active users. A region change on a lurker does nothing until they come back. Whole-register flips are Users → Batch update users.
Template path for the current visitor:
{$xf.visitor.Profile.custom_fields.fieldId}
Official note: a different variable is needed for the poster. If you paste the visitor form into message_macros you will print the reader’s character on every post. Prefer the field’s own display switches before you touch a template. Outdated templates after upgrade are a merge you will hate.
staff_notes as multi-line, admin-only, never public, never searchable, is the “spoke to them about the 12 May incident” box. The moderation article owns warnings. This field is the one-line memory warnings do not store. If the ACP will not hide it from the owner, do not put anything here you would not say on a staff forum.
Do not store a listing’s IP on the member. That is a thread field. Do not store “is VIP” as a checkbox you read in a template. VIP is a secondary group, usually from a user upgrade or a promotion.
Discord is one job
Stock 2.3 Setup → Connected accounts does not list Discord. Official 2.3 does name Discord as a place webhooks can notify. That is the honest split:
| Job | Stock? | Typical extra |
|---|---|---|
| Announce a public lore thread in a Discord channel | Almost — Setup → Webhooks can fire thread_insert; Discord wants its own JSON |
A formatter, or an add-on that posts Discord-shaped messages |
| Log in with Discord | No | A Discord connected-account add-on, or [8WR] |
Map Whitelisted to a guild role |
No | [8WR] Discord Integration |
The Discord article is the integration. This article’s rule: pick one job for launch. A board that requires Discord login, syncs every group, mirrors every post, and embeds chat on the first screen has four products and one outage.
Do not make Discord the only door. Official connected-account tests fail first on Board URL. A whitelist that can only be completed in Discord is a second site you do not moderate. Put the handle in discord_handle if you need a human string. Put the interview in the apply thread so the next moderator can read it.
Voice is not a XenForo node. A Link forum to the Discord invite is fine. A page that says “we also have a Discord” is fine. A requirement that every lore post be mirrored is how you kill the forum you just built.
Ranks are not a shop
XenForo already has ranks. They are named like an admin: trophies, a user title ladder, user banners on a group, and user group promotions. The ranks article is the design. On a gaming board the usual own-goals are:
- A trophy named “Regular,” a promotion named
Regular, and a ladder row “Regular” — three Regulars - A
Storytellerbanner group that also has View node = Yes onplay, so taking the banner off locks them out - Trophy points treated as a currency. Trophy points are not spendable. A credits economy is a later, different product
Ship five trophies (first post, first reaction, 30 posts, a year, first approved application if you can criteria-match something honest) and one New member banner you promote off after a week. Stop until people come back without them. The engagement article already said that. A GM title is a custom title or a banner on a staff group, not a trophy you cannot revoke.
Official trophies: once awarded, not revoked. Delete the trophy to pull points from everyone. A “has avatar this week” trophy is the wrong tool. That is a promotion.
Display styling priority — title override, username CSS, banners — lives under Setup → Options → User options → User banners. If two groups both print a chip, the priority number decides who wins. Put Whitelisted below Moderating. Members should not look more staff than staff.
The look is a style problem
A dark, high-contrast “gaming” palette is Appearance → Styles. Official style properties: Color palette plus a Light / Dark style-type switch that tells intensify/mix which way to push a colour. 2.3 community practice (not the short official styles page): open the style, enable variations, and keep two palettes on one style. The style chooser and the light/dark switch are different gadgets. You do not need a third-party theme switcher for this.
Historical shop pages sold Roleplay, Roleplay Dark, and Roleplay Light as if the skin was the community. It is not. Work in a child style. Put experiments in extra.less. After any upgrade, look at both variations. Hard-coded #111 does not flip. Official xf-intensify / xf-diminish do. The 2.3 upgrade article owns the merge. The later theme-customization articles own deep paint. This one stops at: do not buy a product to get a dark header.
Per-node icons can help a hub with twenty game rooms. A support community with six forums looks calmer with one read/unread pair and strong titles. 2.3 icons are SVG sprites. Raw content: "\f019" from a 2.2 extra.less is how you get a missing glyph. The nodes article already lost that war.
First screen and first week
Do not steal Setup → Options → Basic board information → Index page route on week one unless the whole site is “apply then play.” Forum-list widgets stop running on / when you move the index. A portal of three blocks is enough: New posts from announcements, a short HTML “how to apply,” Members online. A campaign landing page is a page node you send from ads, not a week of index-route theft.
Notices with user-field criteria beat a banner template. Maintenance for region = eu. “Applications closed this weekend” for everyone. Dismissible. One week.
Onboarding is still a human answering the first post. The 30-day plan does not change because the topic is a game. A whitelist that dumps approved members into an empty play forum is a locked empty room. Seed three lore threads, one “what are you playing this week,” and a staff character who posts like a member.
Week-one map: how-this-works and the apply form live on day 1; introductions answered in-thread by day 3; first lore thread and announcement by day 5; a non-staff play thread by day 7. Staff review the first Pending application the same day it lands, never set Approved without the group, and Analyze permissions again after any overlay tweak. If day 7 still has zero approved members, the problem is the form or the review SLA, not the skin.
Moderate new threads on apply if the queue is public and you do not want half-finished sheets on the index. Do not moderate the whole tree. The 2.3 approval queue is a page at a time. The moderation article owns that queue. This board’s extra risk is applications that contain PII. Delete the field, not just the post, if you asked for too much.
A worked Monday
You run one official RP shard and a small directory of community FiveM rooms.
- Forums → Nodes. Create the five categories above. URL portions:
start,setting,directory,support,staff. - Create
playundersetting. Permissions → Private node. View node = Yes on Administrative, Moderating, and a new groupWhitelisted. Leave Registered and Unregistered / Unconfirmed alone. - Create
applyunderstart. Discussion. Prefixes Pending / Interview / Approved / Denied. Thread fields:character_name,age_band,availability,backstory. Moderate new threads only if the queue must stay invisible. - Create
serversunderdirectory. Prefixes Minecraft / FiveM / Discord. Thread fields: connect string, version, region, whitelist yes/no. Follow the listing article. Do not put an apply form on the first post. - Users → Custom user fields.
main_character(text, with messages),region(choice, profile + search),discord_handle(contact, profile only). IDs you would type in a template. - Groups & permissions → User group promotions. One promotion: add
New memberstyling group when registered fewer than 14 days. Do not point it atWhitelisted. - Communication → Notices. One notice for
region = euwhen you have a maintenance window. Not before. - Setup → Webhooks only if you already have a Discord channel that should hear
thread_insertonannouncements. Otherwise skip. - Three test accounts. Guest cannot see
playorstaff. Fresh Registered can post inapplyandintroductions, cannot seeplay. After you addWhitelisted, they can. Analyze permissions on all three.
That is a community. The skin can wait.
What not to build
A node per class, faction, and timezone. You will moderate empty rooms. Prefixes and a faction field filter one forum. Search forums can view “threads tagged EU.” They are not a home.
A character database add-on on day one. A user field plus an application thread is a character.
Discord as required login. Official connected accounts already exist for other providers. Discord is not one of them. A required Discord add-on is how a guild outage becomes a forum outage.
Credits for whitelist. A user upgrade can sell Subscribers on a private node. That is a receipt. A human interview is a decision. Two doors, one group, no audit trail — unless “paid or interviewed” is really the rule, written down.
A theme that forks PAGE_CONTAINER. Official 2.3 CSS is unbundled. Cloning the container for a hero is how the next upgrade becomes a white screen. The mistakes article already named that row.
PII you cannot defend. Official Users → Data portability XML includes all custom user field values. The member-list CSV does not. If a field matters legally, confirm it appears in an export you actually run. If you do not have a deletion process, do not have the field.
Checklist before you announce
- The public tree is two levels. A stranger can name the rooms from the titles.
playis Private. Staff can View. Registered cannot.Whitelistedcan.- Primary group is still Registered on a staff account, a GM, and you.
applyandserversare different forums. Prefixes do not add groups.- Character name is a user field. Backstory is a thread field. The connect string is a thread field.
regionis a choice. You can target a notice with it.- Discord is at most one job (announce, or login, or role sync). Not all three on launch day.
- Ranks do not grant View on
play. - Both style variations are readable. You did not buy a Roleplay product to get there.
- Three sessions: guest, fresh Registered, approved. Analyze permissions on
playandstaff. - Cron last-run is today. Promotions and trophies will not fire if Tools → Cron entries is dead.
- You can name the first three threads in
play. If you cannot, the room is not ready.
Takeaways
- A gaming or RP board is a tree, a gate, a directory, and a few fields. Themes are paint.
- Keep Registered as primary.
Whitelistedis a secondary key to a Private node. - Link the whitelist, listing, and fields articles — do not rebuild them inside one node.
- Discord and ranks are optional jobs. They are not the architecture.
- Historical Roleplay skins were products. Dark mode is a 2.3 style variation.
- Prove the gate with three accounts before you post the invite.
Build the cupboard. Then put things on the shelves. Then, if you still hate the header, change the palette.

