Two widescreen monitors on a meeting table showing two different community layouts, one a classic forum tree and one a topic list

XenForo and Discourse both run serious communities in 2026. They do not run the same kind of community. XenForo is a forum-first PHP product with a node tree, group permissions, widgets, and a paid license you drop onto a normal VPS. Discourse is a Ruby-on-Rails product whose official production install is Docker, whose default homepage is a topic list, and whose access model starts with automated trust levels. Pick the product whose default shape matches the next three years. Do not pick the one whose demo looks newer on a Tuesday.

This is not the Invision Community versus XenForo piece. That one is suite versus forum-first. This one is XenForo versus Discourse as two ways to run a discussion site. It is also not the stay-or-migrate decision that follows it, not the Discourse versus traditional forums category essay, and not the pros-and-cons ops note. Those own lock-in, phpBB/vBulletin as a class, and opinionated “who should pick which.” This article owns the matrix: information architecture, access, layout, extensibility, money, and the direction of the official importers.

Official XenForo facts below come from the public manuals (docs.xenforo.com). Official Discourse facts come from Meta documentation and the cloud install guide on GitHub. Where a public page is silent, the article says so. It does not invent an ACP path.

What each product is actually for

XenForo is a forum. Threads live in forums. Forums live in a node tree you can nest, hide, and permission independently. Members live in user groups. Staff live in the same group math plus extra tools. The homepage is usually the forum list, What’s New, or a page you built. Extra official products (Media Gallery, Resource Manager, Enhanced Search) sit around that forum. Third-party add-ons sit around it more.

Discourse is a modern discussion platform that replaced the classic forum tree with categories, topics, and tags. Meta’s new-user guide is explicit: a topic is “a series of messages grouped together… similar to what other platforms might call a thread”; a category is “the primary way of organizing topics” and is “similar to forums on other sites”; a tag is “a marker used to describe a topic.” The default homepage is Latest, not a board index. New users are sandboxed by trust levels. Layout changes are themes and theme components. Server-side changes are plugins. Official production hosting is either Discourse’s own plans or a Docker container on a Linux box.

Neither product is “dead.” Neither is “just a forum clone of the other.” If you describe your site as “boards, usergroups, a sidebar, and a style I can tune for ten years,” you are describing XenForo. If you describe it as “a topic stream, tags, automated trust, and I do not want to own PHP-FPM,” you are describing Discourse.

1. Information architecture: nodes versus categories, topics, and tags

This is the difference that decides the rest.

XenForo: a tree of nodes

Official XenForo information architecture is the node tree. A node is a row that can be a category (a heading), a forum (threads live here), a page (arbitrary HTML), or a link forum. You nest them. You set a display order. You hide a branch with Private node or with View node = Never. The nodes article owns the switches. The important comparison fact is: structure is a tree, and permissions hang off that tree.

A XenForo thread has a title, a first post, replies, an optional prefix, optional custom thread fields, and a forum it belongs to. Replies are a flat list. There is no official “tag the thread with five topics so it appears in five places.” Cross-listing is a link, a prefix convention, or an add-on. Deep trees are a XenForo specialty and a XenForo tax: every extra node multiplies the permission rebuild.

Pages in the node tree are first-class. Official use cases include a FAQ, a manual, a knowledge base. Help pages sit under /help/{portion} and ship defaults (Smilies, BB codes, Trophies, cookies, Terms, Privacy). That is a different object from a forum. Discourse does not have “page nodes” in the XenForo sense; documentation there is usually a category, a topic, or a plugin.

Discourse: one category, many tags

Discourse puts each topic in one category. Categories can have subcategories. Meta practice, repeated for years, is to keep the category list short and push the long tail into tags. A topic can carry multiple tags. Category settings can require a minimum number of tags and can restrict which tag groups are allowed. That is the official replacement for the 40-child-board maze a phpBB or vBulletin admin grew over a decade.

The homepage is a topic list, filterable by category, tag, Latest, Top, New, Unread. There is no stock “forum index with last-post columns and a subforum list under every heading” unless you install a theme component that fakes one. People who migrate from XenForo and immediately try to rebuild a 12-level node tree in Discourse are fighting the product.

Object XenForo Discourse
Container Node (category / forum / page / link) Category (optional subcategory)
Conversation Thread in one forum Topic in one category
Extra classification Prefixes, custom thread fields, add-on tags Tags (multiple per topic), tag groups
Static HTML Page nodes + help pages A topic, a category, or a plugin/theme
Default home Forum list, new posts, or a page route Latest (and related topic lists)
Nesting culture Deep trees are normal Deep trees are a smell; tags carry the tail

If your members navigate by place (“I always go to Help → Billing → Chargebacks”), XenForo’s tree is the map they already have in their head. If they navigate by what is new and then filter (“show me billing and chargeback”), Discourse’s list-plus-tags is the map. Neither is more professional. They are different indexes.

2. Access: groups and permissions versus trust levels and groups

XenForo: groups, Never / Yes / No, Analyze permissions

XenForo access is user groups plus permissions. Official default groups you cannot remove: Unregistered / unconfirmed, Registered, Administrative, Moderating. Every registered human keeps Registered as PRIMARY, including admins and moderators. Extra roles are secondary groups. Permission math is Never > Yes > No. Node permissions default to Inherit. Never cannot be overridden, even by a child node. Private node only affects View node; the rest still inherit. The diagnostic is Groups & permissions → Analyze permissions. User permissions on one account are a last “group of one” with the same Yes/Never math.

Promotions (Groups & permissions → User group promotions) run on an hourly cron, only for recently-active users. Empty criteria means the promotion never auto-awards. Disabling a promotion does not demote people already in the group. Whole-register changes are Users → Batch update users. Display styling (title override, username CSS, banners) is a separate priority from access. The permissions starter is the map. The later groups-at-scale article is the factory. This comparison only needs the shape: you draw the roles; the software does not promote people because they read 30 posts.

Discourse: trust levels first, groups second

Discourse access starts with trust levels. Meta’s 2026 reference (Discourse Trust Levels: A Detailed Explanation, February 2026) is the current official explanation. Defaults:

Level Name How you get it
TL0 New Default for all new users
TL1 Basic Automatic, reading activity. Default for invited users
TL2 Member Automatic, sustained participation
TL3 Regular Automatic, 100-day rolling activity. Can be lost
TL4 Leader Manual promotion by staff only

TL1 (defaults): enter 5 topics, read 30 posts, spend 10 minutes reading. All-time, permanent once earned. Personal messages do not count toward posts read.

TL2 (defaults): 20 topics entered, 100 posts read, 60 minutes reading, 15 days visited, 1 like given, 1 like received, replies in 3 different topics. Permanent once earned. Replies to your own topics do not count. PMs do not count toward posts read, likes, or topics replied to.

TL3 is a different machine. It looks at a rolling 100-day window. Defaults include viewing 25% of topics created in that window (capped at 500), reading 25% of posts (capped at 20,000), 10 different topics replied to, visits on 50% of the last 100 days with actual reading, 30 likes given, 20 likes received from at least 5 unique users on at least 7 different days, no more than 5 confirmed spam/offensive flags, and no suspension or silence in the last six months. There are also all-time floors (200 topics viewed, 500 posts read). Meta notes that default TL3 numbers are in flux; check the current “Default changes for trust level 3 requirements” topic before you quote a threshold to staff. You can lose TL3. There is a roughly 90% low-water mark, a 14-day grace after first promotion, and a daily job. Demotion returns you to TL2; you must meet the full bar again.

TL4 is not an activity trophy. Meta 2026: it must be granted by administrators or moderators. Staff promote people they trust to help moderate. That matches the research note you will see elsewhere on this site: TL4 is staff-only promotion.

Admins can set any trust level by hand and lock it so automation cannot move the account. Groups can also grant a minimum trust level, which is why some users sit higher than their activity explains.

Discourse still has groups. Categories can be restricted to groups. That is how you build a staff category, a paying-customer category, or a regional lounge. It is not XenForo’s Never/Yes/No matrix. There is no Analyze permissions screen that walks Never versus Inherit down a twelve-node tree, because there is no twelve-node tree. If your community’s access model is “Registered can read, Verified can post in Applications, Donator can see the private patch forum, Moderating can warn, Administrative can ACP,” XenForo is the language you already speak. If your model is “new people are sandboxed until they read, regulars get extra tools, a few leaders help moderate,” Discourse is already doing the job.

Concern XenForo Discourse
Default new-user sandbox Whatever you set on Registered / Unregistered TL0 by design
Automatic promotion User group promotions you configure (hourly, recently-active) TL0→TL3 by activity; TL3 is rolling
Staff-only top rank Administrative / Moderating groups TL4, manual
Private area Private node + View node Category security via groups
Diagnostic Analyze permissions User admin + group membership + TL
Styling a role Display styling priority, banners, username CSS Groups, flair, title — not the same depth

Do not try to simulate XenForo groups by creating a Discourse group for every mood. Trust levels already are the default ladder. Extra groups are for access and mentionable teams, not for “Member II.”

3. Layout: widgets versus theme components

XenForo: definitions, instances, positions

XenForo layout is widgets. A definition is a type (HTML, New posts, Members online, or a PHP class an add-on registered). An instance is one configured copy with a widget key, title, options, display condition, cache lifetime, and assigned positions. A position is a named hole in a template (<xf:widgetpos>). Admins live in Appearance → Widgets. Designers who need a new hole use Development → Widget positions. The widgets article is the manual. Combined with style properties (color palette, light/dark variations in 2.3, CSS-type properties, @xf-stylePropertyName in Less), you can build a portal without writing a plugin.

That depth is the XenForo advantage people miss when they only compare “modern UI.” A sidebar of three New posts instances, a guest welcome HTML widget, a member-stat block, and a page-node homepage is stock. Discourse does not have an equivalent Appearance → Widgets screen.

Discourse: themes and theme components

Discourse layout is a theme plus theme components. Official Meta distinction, repeated in developer docs: a theme or theme component changes the Ember front end (HTML, CSS, JavaScript, plugin outlets). A plugin is server-side Ruby (and usually some client code) and can change almost anything. There is no stock “add a New posts widget to sidebar_s1 and cache it 60 seconds.” You install a component that adds a featured-topic list, or you write CSS, or you accept the default topic stream.

If your brand is the homepage — magazine hero, three columns, a campaign landing, a server list in the sidebar — XenForo plus widgets is the shorter path. If your brand is the conversation and you are happy with Latest plus a clean theme, Discourse is already there.

Layout job XenForo stock Discourse stock
Sidebar “new posts” Widget instance Theme component or accept Latest
Guest welcome block HTML widget + display condition Banner / welcome topic / theme
Portal homepage Page node + widget positions + index route Theme, or a category as home
Light / dark 2.3 style variations Core color schemes / theme
Per-page layout Widget positions, template conditionals Theme + category settings

4. Extensibility: add-ons versus plugins

XenForo add-ons are PHP packages you install from the ACP. The official first-party set includes Media Gallery, Resource Manager, Enhanced Search, and the Importers add-on (separate download from the Customer area). The third-party market is the reason gaming, roleplay, credits, and “this exact widget” communities stay on XenForo. Add-ons upgrade with the board, or they do not, and that risk is real — the 2.3 upgrade article already treated it as a project.

Discourse plugins are Ruby. Official and popular plugins live on Meta. Many hosted plans restrict which plugins you may run; self-hosting means you edit app.yml and ./launcher rebuild app. Theme components cover a surprising amount of “I just want the topic list to look like X.” When you need server-side behavior (SSO beyond the official DiscourseConnect protocol, a custom import, a new model), you are in plugin territory.

There is no honest “XenForo has more add-ons” scoreboard that survives a year. XenForo has a deeper forum-and-gaming catalogue. Discourse has a deeper modern-discussion catalogue (chat, assign, calendar, documentation categories, official hosting extras). Count the three features you cannot live without. If two of them are “XenRio-style stream directory,” “credits shop,” and “whitelist application node,” you are not moving to Discourse this year. If two of them are “trust-level automation,” “official hosted so I do not own Redis,” and “topic + tag IA,” you are not staying on XenForo because a style looks familiar.

5. Money and machines: license plus VPS versus Docker RAM

This is the row people quote first and still get wrong.

XenForo cost is a license (purchased from XenForo, with a period of official support and upgrade entitlement) plus whatever VPS or shared host can run PHP 8.3/8.4, MySQL 8 or MariaDB, and a web server. A small community fits on a modest VPS. You already know this stack if you have ever hosted WordPress. Add-ons are extra line items. Official Enhanced Search is an extra product plus an Elasticsearch or OpenSearch box. You are the sysadmin, or you pay one.

Discourse cost is one of three shapes:

  1. Official hosted at discourse.org/pricing. In 2026 the public grid is Free, Pro, Business, and Enterprise. Pro has been listed around $100/month and Business around $500/month; staff seats, monthly email caps, and feature gates change — read the live page before you budget. Hosted means you do not run Docker.
  2. Self-hosted official Docker install. The production guide is discourse/docs/INSTALL-cloud.md. Minimum they publish: 1 GB RAM with swap, 2 GB+ recommended, 1 CPU core (2+ recommended), 10 GB disk (20 GB+ recommended), 64-bit Linux, Ubuntu LTS preferred. The installer tunes UNICORN_WORKERS and db_shared_buffers from the box size. Discourse is Redis + PostgreSQL + Rails + Sidekiq inside that container. That is heavier than a typical XenForo PHP-FPM footprint on the same size VPS.
  3. A partner or unofficial image. Official Meta support expects the standard install. Bitnami-style images are a frequent “why is this using more RAM” story. Do not pick one to save an hour.
Line item XenForo Discourse
Software Paid license Open source; hosted is the paid product
Small-site host Cheap PHP VPS / good shared 2 GB Docker VPS, or official hosted
You own the OS? Usually yes Only if self-hosted
Typical RAM story PHP-FPM + MySQL on 1–2 GB can work Official recommended 2 GB+; 1 GB only with swap
Email You configure transport (PHP mail, SMTP, Google OAuth) Hosted includes a cap; self-host SMTP or skip via Discourse ID
Search at scale MySQL full-text, or buy XFES + ES/OS Built into the Rails app; you still size PostgreSQL

“Discourse is free” is only true if your time is free and you are good at Docker. “XenForo is expensive” is only true if you ignore the VPS you were already paying for. Compare three-year cost: license + renewals + add-ons + VPS + the person who can restore data/ and internal_data/, versus hosted monthly, versus Docker VPS + the person who can ./launcher rebuild app when Let’s Encrypt or PostgreSQL next moves.

6. Search, URLs, and the public web

XenForo SEO is an official options page: Setup → Options → Search engine optimization (SEO). Use full friendly URLs turns /index.php?threads/thread-title-here.12345/ into /threads/thread-title-here.12345/. Include content title in URLs is the slug. Title off is /threads/12345/. Apache needs htaccess.txt renamed to .htaccess plus mod_rewrite and AllowOverride. LiteSpeed matches Apache. IIS7 uses the official web.config snippet. Nginx uses try_files and must protect internal_data, src, install/data, install/templates. Sitemap is Setup → Options → XML sitemap generation. IndexNow is on the same SEO page.

Discourse URLs are topic-and-slug by default (/t/topic-title/123). Categories and tags have their own paths. The product was built after friendly URLs were normal; you do not spend a morning on mod_rewrite. Search is first-class in the header. What you do spend time on is teaching a XenForo member that “the forum index” is gone and that Latest is the front door.

Neither product makes Google love a dead community. Both can lose rankings if you change the URL scheme during a migration and skip redirects. That is a stay-or-migrate problem, not a matrix row with a winner.

SEO / URL job XenForo Discourse
Friendly permalinks Option: Use full friendly URLs + optional title-in-URL Default /t/slug/id
Server rewrite Apache .htaccess, LiteSpeed, IIS web.config, nginx try_files Official Docker / hosted owns this
Protect internals nginx must hide internal_data, src, install paths Container filesystem, not an XF-style public tree
Sitemap Setup → Options → XML sitemap generation Built-in; hosted/self-host both expose one
IndexNow Official SEO options page Not an XF-style ACP twin; do not invent a checkbox
Typical migration pain Old index.php?threads= or foreign showthread Old /threads/ or viewtopic.php/t/

If your only complaint is “we never turned on friendly URLs,” that is an afternoon on XenForo, not a reason to change products.

7. Importers: the direction is not symmetric

This is the row that ends arguments in procurement meetings.

XenForo can import Discourse. Official importers are a separate add-on from the Customer area. At the time of writing, XenForo 2 sources include XenForo 2.x, vBulletin 3.6–5.3, IPS 4.x, phpBB 3.2–3.3, SMF 2.0, MyBB 1.8, and Discourse 3.x. You start at Tools → Import data. Fastest path: backup the source, put both databases on one fast box, import, then deploy. Config asks for the source database (optional auto-fill from a leftover config), the steps (dependencies: posts need threads, threads need forums), Retain content IDs (only on an empty XenForo with no threads or posts), and an import_log table name. User merge: same email (usually yes), same username (depends). Run in the browser (prompt each step) or CLI php cmd.php xf:import from the XenForo root (cmd.php must be present). CLI is much faster. Both are resumable from Tools → Import data. Backup the XenForo database plus data/ plus internal_data/ first. Close the board (Board active). The source is never modified. Completing the import rebuilds caches. Redirect scripts use the import log; they 301 old URLs. Skip a dependent step (posts without threads) and you have a mess, not a shortcut.

Discourse importing XenForo is a Discourse-side project. There is no XenForo ACP button that pushes a board out to Discourse. Meta has migration topics (including XenForo 2.3 → Discourse threads) and a general “migrate from one platform to Discourse” guide. Treat that direction as a script, a consultant, and a redirect plan — not as an official XenForo feature. Do not tell a board that “both ways are official.” Only one way is an XF Customer-area add-on.

Direction Who owns it Maturity you can cite
Discourse 3.x → XenForo Official XF Importers add-on Listed source “at time of writing”
phpBB / vBulletin / IPS / MyBB / SMF → XenForo Same add-on Listed sources
XenForo → Discourse Discourse community / scripts / partners Meta threads, not an XF product
XenForo → XenForo Official XF 2.x importer Listed source

If the fear is “we might want Discourse later,” do not pretend the return ticket is the same as the outbound. If the fear is “we are on Discourse and want a classic forum,” XenForo has already named your source.

8. The matrix

Use this as a briefing table, not a score. A “win” here means “this product’s default matches the job.”

Job XenForo Discourse Notes
Deep board tree Yes Weak Tags replace most child boards on Discourse
Topic list as home Possible (route / widgets) Default
Classic last-post index Default Theme territory
Page / FAQ in the tree Page nodes + help Topic or plugin
New-user sandbox You build it TL0–TL1 by default
Automatic regulars Promotions you design TL3, 100-day window TL3 can be lost
Hand-picked leaders Secondary groups TL4, staff only
Never/Yes/No node ACL Core Different model Analyze permissions is XF-only
Sidebar widgets Core ACP Theme components
Style property depth Very high Theme settings 2.3 variations are XF dark/light
Gaming / credits / listings Add-on market Thin See server listing, points
Official hosted No (third-party hosts) Yes discourse.org plans
Typical small VPS Cheaper PHP box Heavier Docker 2 GB+ recommended for Discourse
Import the other one Discourse 3.x → XF official XF → Discourse is Meta-side Direction matters
Staff already know PHP forums Yes Retrain
Staff already know Docker / hosted SaaS Retrain Yes

9. Four communities, four honest answers

A 15-year hobby forum with 80 nodes and three veteran moderators. Stay on XenForo, or move to XenForo from phpBB/vBulletin with the official importer. Rebuilding that tree as Discourse categories will make the veterans angry and will not make new members less lost. Fix onboarding and engagement first.

A game community that needs a server list, a whitelist app, Discord, and a donor shop. XenForo. Those are solved patterns on this site. Discourse will make you invent them with plugins you then have to keep alive.

An open-source project that wants a modern support forum, official hosting, and no PHP. Discourse hosted. Trust levels will sandbox drive-by accounts. Categories can be Support, Announcements, Meta. Tags can be version numbers. You will not miss widgets until someone asks for a portal.

A company replacing a messy vBulletin plus a WordPress “community” blog. If the forum is the product, XenForo plus a page-node news section. If the company wants a single modern discussion site and will pay a monthly hosted bill to not own a server, Discourse. If they need blogs, files, and commerce in one ACP, that is still the IPS comparison, not this one.

10. What this matrix will not decide

It will not decide your stay-or-migrate call. Add-on lock-in, the person who can restore backups, and the cost of rewriting muscle memory are not features. They are operations.

It will not decide whether “forums are dead.” Discourse versus phpBB/vBulletin as a category is the next essay. XenForo is a traditional forum that kept up. Discourse is a replacement for the category. Those are different sentences.

It will not give you a plugin-by-plugin inventory. Official docs do not publish one. If a feature is not in the rows above, it is either an add-on/plugin you must name yourself or something you should not invent in a comparison.

Takeaways

  • XenForo is a node tree + groups + widgets + add-ons product you license onto a PHP stack. Discourse is a category + topic + tag + trust level product you host in Docker or pay Discourse to host.
  • The information-architecture gap is the real gap. Deep trees and page nodes are XenForo. Latest-plus-tags is Discourse. Do not rebuild one inside the other for sport.
  • XenForo permissions are Never / Yes / No on groups and nodes, with Analyze permissions. Discourse sandboxes with TL0–TL3 (TL3 is a 100-day rolling window) and TL4 is staff-only.
  • XenForo widgets and style properties are deeper than Discourse theme components. Discourse defaults are more modern if you do not want a portal.
  • XenForo’s typical VPS is cheaper and more familiar. Discourse’s official recommended self-host is 2 GB+ RAM in Docker; official hosted is the other door.
  • XenForo officially imports Discourse 3.x. The reverse is a Discourse-side migration. Direction is a fact, not a vibe.
  • Use this matrix to name the product. Use the next article to decide whether you should actually move.

If you cannot fill the matrix without writing “we need both a 40-node tree and trust-level automation and a $0 host,” you do not have a platform problem. You have a sitemap problem. Fix the map, then pick the tool that already looks like it.