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:
- 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.
- 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 tunesUNICORN_WORKERSanddb_shared_buffersfrom 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. - 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 |
| 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.

