You already have a two-column scoreboard. The 2026 XenForo versus Discourse matrix compared nodes to categories and tags, groups to trust levels, widgets to theme components, add-ons to plugins, and the ugly fact that XenForo officially imports Discourse 3.x while the other direction is a Discourse-side script. This article will not reprint that table. It adds the third product people actually shortlist when they say “modern forum”: Flarum.
Three products. Three stacks. Three different answers to “where does a conversation live.” If you came here for a NodeBB bake-off, skip to the sidebar near the end and then leave — NodeBB is a realtime Node.js forum, not a fourth column on this grid.
This is also not the stay-or-migrate framework, not the Discourse versus traditional forums category essay, and not the ops close. Those own lock-in, phpBB as a class, and opinionated “who should pick which.” This article owns a three-way matrix: stack, information architecture, moderation, hosting, cost shape, extensions, and migrations.
Official XenForo numbers come from xenforo.com/purchase. Official Discourse install facts come from INSTALL-cloud.md (2026). Official Flarum facts come from docs.flarum.org for the 1.x line. Prices and plan grids change — re-check the live pages before you budget.
What each product is actually for
XenForo is a forum-first PHP product. 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. The third-party add-on culture sits around it more. You buy a license, you drop it on PHP 8.3 and MySQL, you are the sysadmin or you pay one.
Discourse is a Rails discussion platform whose official production install is Docker (or official hosted). The default homepage is Latest, not a board index. Each topic lives in one category and can carry several tags. New users are sandboxed by trust levels. Layout changes are themes and theme components. Server-side changes are plugins. If you describe your site as “a topic stream, tags, automated trust, and I do not want to own PHP-FPM,” you are describing Discourse.
Flarum is a lightweight PHP forum with a Mithril single-page front end. Most of what XenForo ships as core (likes, tags, mentions, flags, approval) arrives as extensions. It runs on Apache with mod_rewrite or Nginx, PHP 7.3+ (docs recommend PHP 8.3 for 1.x), and MySQL 5.6+/8.0.23+ or MariaDB 10.0.5+. Shared PHP hosting is possible. The latest 1.x archive at the time of writing is 1.8.17. The 1.x line is on life support (critical and security fixes only). 2.0 is in release-candidate; do not treat 2.0 as stable GA unless you are quoting the docs as RC. Flarum is the right small/modern PHP choice. It is not a XenForo replacement for an add-on-heavy board, and it is not a Discourse replacement for a hosted support community.
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 “Latest plus tags plus I will pay someone else to run Redis,” you are describing Discourse. If you describe it as “a small PHP community, Composer, I accept a thinner catalogue,” you are describing Flarum.
1. Stack: what you actually operate on Tuesday
The stack is not a nerd flex. It is who you can hire at 22:00 when the box is down.
| Concern | Discourse | Flarum | XenForo |
|---|---|---|---|
| Language / runtime | Ruby on Rails in Docker | PHP (Mithril SPA) | PHP |
| Database | PostgreSQL (inside the official container) | MySQL / MariaDB | MySQL 5.7+ / MariaDB |
| Official production | Docker one-liner, or official hosted | Composer or unpack an archive onto Apache/Nginx | Upload / Composer-free typical VPS |
| Shared PHP hosting | No | Yes, if rewrite and PHP extensions exist | Common, with caveats |
| Front end | Ember | Mithril SPA | Server-rendered + JS |
| Day-two ritual | ./launcher rebuild app (~5–10 min) |
composer update / Extension Manager |
ACP add-on upgrade + template merge |
| Contractor you can find | Smaller set: Docker + Discourse | Any PHP person who will learn Composer | Any PHP forum person |
Discourse’s official production path is not “upload PHP files to cPanel.” It is a 64-bit Linux box you can SSH into as root (Ubuntu LTS preferred) or an official hosted plan that skips the box. Minimum they publish: 1 GB RAM with swap, 1 core, 10 GB disk. Recommended: 2 GB+ RAM, 2+ cores, 20 GB+. The installer auto-tunes UNICORN_WORKERS and db_shared_buffers. Ports 80 and 443 must be free. Rebuilds take the site down for a few minutes. That is a different species from a PHP-FPM pool.
Flarum’s stack is the same species as XenForo: PHP, MySQL, a web server, rewrite rules. The difference is Composer culture and a SPA front end. You can unpack a 1.8.17 archive if you do not have SSH. You can composer create-project flarum/flarum:^1.8.0 . if you do. The Extension Manager (composer require flarum/extension-manager:"*") can install any Composer package. Official docs are blunt: only install it if you trust every admin. That is not a XenForo ACP zip. It is a supply-chain decision.
XenForo wants PHP 7.2 minimum, 8.3 recommended, MySQL 5.7+. A small community fits on a modest VPS that already looks like WordPress. You already know this stack if you have ever hosted a PHP forum. That familiarity is the product.
Do not pick Discourse to “save money on the same $6 VPS as the old phpBB.” Do not pick Flarum because the demo looks like Discourse. Do not pick XenForo because you are afraid of Docker if you have no PHP person either. Pick the stack your Tuesday operator can restore.
2. Information architecture: rooms, tags, and the last-post column
This is the row that decides the rest. The two-way matrix already said “nodes versus categories and tags.” The three-way version has to say what Flarum actually is: a discussion list whose taxonomy is mostly tags as extensions, not a XenForo node tree and not Discourse’s first-class category-plus-tag split.
XenForo is a tree. A node is a category heading, a forum, a page, or a link. You nest them. You hide a branch. Permissions hang off that tree. A thread belongs to one forum. Extra classification is prefixes, custom thread fields, or an add-on. Deep trees are a XenForo specialty and a XenForo tax. Community practice (and this site’s own node writing) is still: broad rooms plus prefixes beat an 80-node maze. The tree is there when you need it.
Discourse puts each topic in one category. Categories can have subcategories. Years of Meta practice: keep the category list short and push the long tail into tags. A topic can carry several tags. Category settings can require a minimum number of tags and restrict which tag groups are allowed. The homepage is a topic list (Latest, Top, New, Unread). There is no stock last-post board index unless a theme component fakes one. People who migrate from XenForo and immediately rebuild a 12-level tree in Discourse are fighting the product.
Flarum looks, to a visitor, closer to Discourse than to XenForo: a discussion stream, tags, a composer that feels modern. Officially, most of that taxonomy is extensions, not a XenForo-style node ACP. You will not get page nodes. You will not get Discourse’s category-security-plus-tag-group depth out of the box. You will get a small, flat community that a PHP host can serve. If your members navigate by place (“Help → Billing → Chargebacks”), Flarum will feel thin. If they navigate by what is new, Flarum and Discourse occupy the same mental model — Discourse just has more official furniture for it.
| Object | Discourse | Flarum | XenForo |
|---|---|---|---|
| Primary container | Category (optional subcategory) | Tags / extensions, flatter list | Node (category / forum / page / link) |
| Conversation | Topic in one category | Discussion | Thread in one forum |
| Extra classification | Tags + tag groups, required tags | Extension tags | Prefixes, custom thread fields, add-on tags |
| Static HTML / docs | Topic, category, or a plugin (Doc Categories on hosted Business+) | A discussion or an extension | Page nodes + help pages |
| Default home | Latest | Discussion list | Forum list, What’s New, or a page route |
| Last-post column | Theme territory | Not the classic index | Default |
| Nesting culture | Deep trees are a smell | Flat by design | Deep trees are normal |
If your members already think in Slack, GitHub Issues, and Discord channels, Discourse and Flarum match the reflex. If they already think in “Forum 7, Subforum 3,” XenForo matches the reflex. Flarum will not grow you a XenForo tree later. Discourse will not grow you a last-post index without a fight. XenForo will not become Latest-plus-tags without discipline you have to apply yourself.
3. Moderation: trust levels, groups, and what Flarum does not automate
XenForo does not sandbox anyone you did not sandbox. Registered can post in every public node the day they confirm, unless you built promotions, a validating group, and a staff habit. Access is user groups plus Never / Yes / No permissions. The diagnostic is Analyze permissions. Promotions run hourly for recently-active users. Disabling a promotion does not demote people already in the group. You draw the roles; the software does not promote someone because they read thirty posts.
Discourse starts with trust levels. The ladder you must be able to explain, without inventing visit counts that belong on Meta’s current Trust Level Permissions Reference:
| Level | Name | How it is earned (shape) |
|---|---|---|
| TL0 | New | Everyone new (invited users default to TL1). Sandbox. |
| TL1 | Basic | Automatic, mostly reading. Permanent once earned. |
| TL2 | Member | Automatic, sustained participation. Permanent. |
| TL3 | Regular | Automatic on a 100-day rolling window. Can be lost. Daily job. |
| TL4 | Leader | Staff / manual or SSO. Not an activity grind. |
Exact topic/read/like thresholds are admin-configurable and have moved. Quote Meta, not a blog from last quarter. What the notebook and Meta practice do lock down as behaviour:
- TL0 defaults include a 1-image cap (
newuser max embedded media), 2 links, 2 mentions, 50 likes/day, 24-hour own-post edit, cannot flag / mute / ignore, chat 20 messages / 30 seconds. - TL1 can flag and mute; chat 40 / 30s.
- TL2: like limit ×1.5, 30-day edit, invite-to-topic default is TL2.
- TL3: like ×2, can create tags,
edit_all_topic_groupsdefaults totrust_level_3. Flags weigh more. Demotion if activity drops; a grace period exists so the first promotion is not a badge-spam trap. - TL4: like ×3, unlimited own-post edit,
edit_all_post_groupsdefaults totrust_level_4, plus pin, timers, split/merge.
Since 2023–2025 many “minimum trust level” settings became allowed groups (edit_all_topic_groups, edit_all_post_groups, anonymous posting allowed groups, user_api_key_allowed_groups). Review is TL1+ flags. Diverse TL3 flags on a TL0 account can auto-silence and hide. Reviewable scoring exists; the formula is not something this article will invent. Watched words can flag, block, replace, or censor.
Flarum has flags, approval, and groups as extensions and permissions, not as a Discourse-shaped trust machine. There is no official TL0→TL3 daily job. There is no 100-day Regular that demotes itself. If you need a sandbox, you build it (or you accept that a small site’s spam problem is a captcha and a human). If you need Analyze permissions down a twelve-node tree, you are not on Flarum.
Common Discourse new-admin mistakes (do not copy them onto Flarum or XenForo either): renaming trust-level groups and then seeing stale names until daily jobs run; adding Admin + Mod + TL1 + TL2 + TL3 + TL4 redundantly to category security (hierarchy plus Staff already cover this) and producing “not permitted to view”; turning off the TL0 sandbox on a public signup site; being surprised that a new user’s intro post cannot embed four screenshots.
| Concern | Discourse | Flarum | XenForo |
|---|---|---|---|
| Default new-user sandbox | TL0 by design | You build it | You build it |
| Automatic regulars | TL3, 100-day window, can demote | No official equivalent | Promotions you design |
| Staff-only top rung | TL4, manual or SSO | Groups you create | Administrative / Moderating |
| Private area | Category security via groups | Group permissions | Private node + View node |
| Diagnostic | User admin + groups + TL | Extension permissions | Analyze permissions |
| Review queue | Flags + reviewables | Flags / approval extensions | Reports + approval queue |
If your community is an ACL — factions, regional officers, application stages, donor wings — XenForo is the language. If your community is “new people read, regulars earn tools, a few leaders help moderate,” Discourse is already doing the job. If your community is twelve people and a PHP host, Flarum’s lack of a trust-level machine is not a defect. It is a smaller product.
4. Hosting shape: Docker, a PHP box, or someone else’s pager
Discourse has three honest shapes:
- Official hosted at discourse.org/pricing. Public 2026 grid: Free, Pro $100/month, Business $500/month, Enterprise custom. Pro has been listed with unlimited members and chat, 5 staff seats, 15+ plugins, custom domain, API/webhooks. Business adds SSO (OIDC/OAuth2), automation, events, gamification, 15 staff, 20+ extra plugins, migration services. Enterprise adds a 99.9% SLA, 50+ plugins, unlimited staff. Prices are USD and change — re-check the live grid. Hosted can move via backup. Data belongs to the customer.
- Self-hosted official Docker. The one-liner is
wget -qO- https://raw.githubusercontent.com/discourse/discourse_docker/main/install-discourse | sudo bash. Own domain via DNS A record; Let’s Encrypt is automatic. Free*.discourse.diysubdomain via Discourse ID; verification codes last 10 minutes. SMTP is optional at install (Discourse ID + Google/Facebook/Apple/GitHub + web push). Digests, mailing-list mode, and reply-by-email need SMTP later under Admin → Email. - A partner or unofficial image. Meta support expects the standard install. Bitnami-style images are a frequent dead end.
Flarum lives on the PHP hosting you already understand. Shared hosting works when Apache has mod_rewrite (or Nginx includes .nginx.conf), PHP has curl/dom/fileinfo/gd/json/mbstring/openssl/pdo_mysql/tokenizer/zip, and you can write to storage and assets. No Docker. No PostgreSQL. No 5–10 minute rebuild to change a plugin. The cost is a thinner official ops story and a 1.x line that is winding down.
XenForo is a license on a host. There are excellent third-party XenForo hosts. There is no first-party “XenForo Inc. runs the box” tier with the same gravity as Discourse’s own cloud. Cloud from XenForo exists as Starter / Standard / Business monthly plans (see the cost section); it is still a licensed forum on their PHP stack, not Discourse-shaped Docker.
| Hosting job | Discourse | Flarum | XenForo |
|---|---|---|---|
| Official first-party cloud | Yes (Free / Pro / Business / Enterprise) | No (Free Flarum is a community host, not the vendor) | XenForo Cloud exists; not Docker-shaped |
| Typical self-host | 2 GB+ Docker VPS | Cheap PHP / good shared | Cheap PHP VPS / good shared |
| You own the OS? | Only if self-hosted | Usually | Usually |
| TLS | Let’s Encrypt on official Docker / hosted | You or the panel | You or the panel |
| Upgrade downtime | Rebuild window, or hosted handles it | Composer / file replace | File replace + ACP |
If your organization wants a community and wants to fire the sysadmin role, Discourse hosted is the row that ends the meeting. If your organization has a PHP person and a $12 VPS, Flarum and XenForo are the same shape of Tuesday — XenForo is the deeper product on that shape.
5. Cost shape (not a three-year spreadsheet)
A later article on this site will own a three-year TCO table against phpBB. This matrix only needs shape. Re-check live pricing. VAT is extra. Staff time is the real line.
XenForo (xenforo.com/purchase, 2026): self-hosted license $195 (ex VAT), lifetime use + 12 months support/updates. Extension $60/year. Multi-license: 1–2 $195, 3–5 $185, 6–10 $175, 11+ $165. Official add-ons: Enhanced Search $60 (+$10 ext), Resource Manager $70 (+$15), Media Gallery $70 (+$15), Installation $60, Branding removal $350. Cloud: Starter $60/month ($54 annual), Standard $100/month ($90 annual), Business $250/month ($225 annual), with page-view and storage caps, Complete suite including XFES, daily backups, no SSH.
Discourse: software is free and open source. Hosted is the paid product (Free / $100 Pro / $500 Business / Enterprise custom). Self-host is a 2 GB+ VPS plus the person who can rebuild. SMTP, S3, and a CDN are extra line items you will eventually want.
Flarum: software is free. Cost is hosting + time + the extensions you trust. There is no $195 license. There is also no official hosted vendor with a $100/$500 grid. Free Flarum (freeflarum.com) is a community service, not affiliated with the Flarum team — treat it as a demo host, not a procurement plan.
| Line | Discourse | Flarum | XenForo |
|---|---|---|---|
| Software | $0 self-host; hosted is the product | $0 | $195 + $60/yr to stay current |
| Small-site host | 2 GB Docker or official hosted | Cheap PHP | Cheap PHP or XF Cloud $60–250/mo |
| First-party extras | Hosted plugin tiers | Community extensions | XFRM / XFMG / XFES priced above |
| Who this is “cheaper” for | Orgs that value hosted; teams that already run containers | Tiny PHP communities | Hobby and mid-size trees with a PHP person |
“Discourse is free” is only true if your time is free and you are good at Docker. “Flarum is free” is only true if you accept a smaller catalogue and a 1.x→2.0 project. “XenForo is expensive” is only true if you ignore the VPS you were already paying for and the years of add-ons you will not rebuild.
6. Extensions: plugins, Composer, and the add-on market
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 (Customer area). The third-party market is why gaming, roleplay, credits, whitelist applications, and “this exact widget” communities stay. Add-ons upgrade with the board, or they do not, and that risk is a project — not a vibe.
Discourse plugins are Ruby. Official and popular plugins live on Meta. Hosted plans restrict which plugins you may run; the public pricing page is explicit that Pro includes 15+ plugins and Business 20+ extra. Self-hosting means you edit /var/discourse/containers/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 behaviour, you are in plugin territory.
Flarum extensions are the product. Tags, likes, flags, approvals — the catalogue is Composer packages. The Extension Manager can install anything Composer can see. The catalogue is smaller than XenForo’s. There is no honest scoreboard that says “Flarum has more extensions than XenForo.” It does not. It has a modern, small set, and a 2.0 RC that will reshuffle compatibility.
Count the three features you cannot live without.
- If two of them are a XenRio-shaped stream directory, a credits shop, and a whitelist application node, you are not moving to Discourse or Flarum this year.
- If two of them are trust-level automation, official hosted so you do not own Redis, and topic + tag IA, you are not staying on XenForo because a style looks familiar, and you are not picking Flarum to save RAM.
- If two of them are “must stay on shared PHP hosting,” “must look modern,” and “we have fifty members,” Flarum is the row. XenForo is heavier than you need. Discourse Docker is the wrong animal.
7. Migrations: the arrows are not symmetric
This is the row that ends arguments in procurement meetings. It is also the row people get wrong when they add Flarum.
Into XenForo. Official Importers (Customer area) list Discourse 3.x, phpBB 3.2–3.3, vBulletin, IPS 4.x, SMF 2.0, MyBB 1.8, and XenForo 2.x. CLI is php cmd.php xf:import. Retain IDs only on an empty XenForo. The source is never modified.
Into Discourse. There is no XenForo ACP button that pushes a board out. The stock path is a Discourse-side Ruby script (script/import_scripts/xenforo.rb): users, categories, posts, private messages, likes. Banned users are skipped in the stock script. Node depth greater than two is flattened to tags. Permalinks board/{node_name} and threads/{thread_id} are created. Page nodes, XFRM, XFMG, custom thread fields, and most add-on tables are not in the stock script. Passwords often need a reset — do not claim a clean password import unless your source says so. Run on staging, never first on live prod. XenForo is not the only source; Meta’s migrate-from-one-platform guide covers other engines too.
Into Flarum. No official importers. Community unofficial scripts exist for FluxBB, MyBB, phpBB, and SMF2. Docs say you can hop through phpBB. The Flarum team does not guarantee those scripts and does not support them. Treat a Flarum import as a community project with a redirect plan, not as a vendor feature.
| Direction | Who owns it | What you can cite |
|---|---|---|
| Discourse 3.x → XenForo | Official XF Importers | Listed source |
| phpBB / vB / IPS / MyBB / SMF → XenForo | Same add-on | Listed sources |
| XenForo → Discourse | Discourse-side xenforo.rb + Meta practice |
Not an XF product |
| Anything → Flarum | Unofficial community scripts | No official importer |
| Flarum → XenForo / Discourse | Not a first-class listed path | Plan a hop or a custom job |
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 might want Flarum later,” you are choosing a platform whose import story is the weakest of the three. If the fear is “we are on Discourse and want a classic forum,” XenForo has already named your source.
8. The three-way matrix
Use this as a briefing table, not a score. A “win” means “this product’s default matches the job.” This is not a reprint of the two-way matrix.
| Job | Discourse | Flarum | XenForo |
|---|---|---|---|
| Deep board tree | Weak (tags carry the tail) | Weak | Yes |
| Topic / discussion list as home | Default | Default | Possible (route / widgets) |
| Classic last-post index | Theme territory | No | Default |
| Page / FAQ in the tree | Topic or plugin | Discussion or extension | Page nodes + help |
| New-user sandbox | TL0–TL1 by default | You build it | You build it |
| Automatic regulars | TL3, 100-day, can lose | No | Promotions you design |
| Hand-picked leaders | TL4, staff/SSO | Groups | Secondary groups |
| Never/Yes/No node ACL | Different model | Different model | Core |
| Official hosted | Yes | No (community hosts only) | XF Cloud (PHP-shaped) |
| Shared PHP hosting | No | Yes | Common |
| Typical small VPS | Heavier Docker (2 GB+) | Cheapest PHP | Cheap PHP |
| Gaming / credits / listings | Thin | Thin | Add-on market |
| Support + docs community | Solved, Assign, Doc Categories | Thin | Pages + tickets add-ons |
| Extension model | Plugins + rebuild | Composer extensions | ACP add-ons |
| Import from the others | Scripts / Meta | Unofficial only | Official Discourse 3.x + classic engines |
| 2026 upgrade cloud | Stable product + hosted | 1.x life support, 2.0 RC | 2.3 current |
| Staff already know PHP forums | Retrain | Partial retrain | Yes |
| Staff already know Docker / SaaS | Yes | Retrain | Retrain |
Read the 2026 upgrade cloud row twice. Flarum 1.x on life support is not a moral failure. It is a calendar. If you start a new Flarum today, your first year includes a 2.0 plan. If you start Discourse or XenForo today, your first year includes learning the product you bought, not surviving an RC.
9. Who should pick which (without reprinting the ops close)
Pick XenForo when the site is a tree, the add-on market is load-bearing, staff already think in boards, or you need an official path off Discourse later. A 15-year hobby forum with 80 nodes and three veteran moderators belongs here. A game community that needs a server list, a whitelist app, and a donor shop belongs here. Re-read the ops close if you are still romantic about “modern UI.”
Pick Discourse when the site is a topic stream, you want trust-level automation on day one, you want official hosted so nobody owns Redis, or the work is support-plus-docs (Solved, Assign, Doc Categories). An open-source project that does not want PHP belongs here. A company that will pay $100 or $500 a month to fire the sysadmin role belongs here. Start with the beginner’s first week after you pick it — do not start by cloning a phpBB tree.
Pick Flarum when the site is small, the host is PHP (including shared), you accept a Composer extension culture, and you can schedule a 2.0 upgrade. A ten-person club, a local meetup, a lightweight product community that will never need XFRM or a 40-node tree. Do not pick Flarum as a stealth XenForo. Do not pick Flarum because Discourse’s RAM number scared you and you still want Discourse’s product. Those are different fears.
Do not pick any of them if the real problem is “we have no one to answer flags at 21:00.” Software will not staff the room.
Sidebar: where NodeBB sits (and why it is not a column)
NodeBB is a Node.js forum (docs: Node.js ≥ 22, MongoDB ≥ 5 or Redis ≥ 7.2, clone the v4.x branch, ./nodebb setup then ./nodebb start, default port 4567, nginx plus websocket Upgrade headers). Realtime websockets are the point. Plugins live on npm as nodebb-plugin-*. Memory: more than 512 MB for npm install; swap recommended.
It makes sense for realtime, chatty communities and for shops that already live in JavaScript. It does not make sense on PHP shared hosting, and it does not make sense if what you actually wanted was a classic paginated board index. Putting NodeBB on this matrix as a fourth column would pretend the decision is “which modern forum logo.” The decision is stack plus IA. NodeBB is a different stack and a different realtime bet. If that is your bet, stop reading this article and go evaluate NodeBB on its own terms. If it is not, do not add it to the shortlist to feel thorough.
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.
It will not decide whether “forums are dead.” Discourse versus phpBB as a category is already written. Flarum versus Discourse as a look is a bad reason to move. XenForo versus Flarum as a license price is a bad reason if the add-on rebuild is a year of work.
It will not give you a plugin-by-plugin inventory. Official docs do not publish one that survives a quarter. If a feature is not in the rows above, name the extension yourself or do not invent it in a comparison.
It will not replace a staging import. The arrows in section 7 are facts about who owns the tool, not a promise that your 200 custom fields will arrive intact.
Takeaways
- XenForo is a node tree + groups + widgets + add-ons on a PHP license. Discourse is a category + topic + tag + trust-level product you host in Docker or pay Discourse to host. Flarum is a lightweight PHP SPA whose features are mostly Composer extensions, with 1.x on life support and 2.0 in RC.
- The information-architecture gap is still the real gap. Deep trees and page nodes are XenForo. Latest-plus-tags is Discourse. A flat discussion list on shared PHP is Flarum. Do not rebuild one inside another for sport.
- Moderation: Discourse sandboxes and promotes by default (TL3 is a 100-day window and can be lost; TL4 is staff or SSO). XenForo and Flarum do not run that machine unless you build it.
- Hosting: Discourse official hosted is a product. Discourse self-host wants 2 GB+ RAM and a rebuild person. Flarum and XenForo share a PHP-shaped Tuesday; XenForo is the deeper product on that Tuesday.
- Money is a shape, not a screenshot. Re-check discourse.org/pricing and xenforo.com/purchase. Flarum’s license is $0; its upgrade calendar is not.
- Importers are not symmetric. XenForo officially eats Discourse 3.x and the classic PHP engines. Discourse eats XenForo via a Discourse-side script. Flarum has unofficial community importers only.
- NodeBB is a Node.js realtime sidebar, not a fourth cell on this grid.
If you cannot fill the matrix without writing “we need an 80-node tree and trust-level automation and shared PHP hosting and a $0 license,” you do not have a platform problem. You have a sitemap problem. Fix the map, then pick the one tool that already looks like it.

