Flarum 2.0 is released. Go upgrade your forum.

This release was part of our first ever Flarum live launch event. Thanks to @clarkwinkelmann you can re-watch the whole event on his YouTube channel:
On 24 May 2023, a commit landed in this repository with the least dramatic message in its history:
1,234 days later — yes, really, one-two-three-four — it's done. Flarumchore: prepare v2.0 development
2.0.0 is stable, and you can install it today.- 17 pre-releases: eight betas, a beta.8.1 that fixed the beta, and eight release candidates
- 1,250 commits from 41 people
- Eleven years and nine months since Toby Zerner pushed
Hello world!into an empty repository
👋 Sami built this
Flarum 2.0 is Sami Mazouz's release. @Sami M I'm saying that first, before any feature list, so that when you read the list below you know whose work it is.Go through what 2.0 is actually made of, and the same name keeps coming up:
- The JSON:API rebuild that the entire extension ecosystem now hangs off — Sami.
- Search drivers, so search can be swapped for Elasticsearch or anything else — Sami.
- Code splitting, so your forum stops shipping one enormous JavaScript bundle — Sami.
- PostgreSQL. SQLite. The MariaDB driver. A decade of "Flarum means MySQL", over — Sami.
- The Messages extension. Private conversations, finally — Sami.
- Admin search, the extension list, extension bisect, the theming and extensibility overhaul — Sami, Sami, Sami, Sami.
Anyone can add a button. Sami went back into the parts of Flarum that had calcified — the API layer, the search system, the asset pipeline, the assumption that there would only ever be one database — and rebuilt them so that other people could extend them without patching core.
Thank you, Sami. This is your release, and I mean that.
🏁 And then someone had to land it
That was me.There's a gap between "the foundations are rebuilt" and "you can safely run this on a forum with ten thousand members", and it's much wider than it looks. When
beta.4 went out in November 2025, I took 2.0 the rest of the way across it:- 14 of the 17 pre-releases: every one from
beta.4torc.8 - 425 of the 529 commits since
beta.3, so four in every five - 388 commits in 2026 alone: 242 fixes, 63 features and 25 performance passes across the 2.0 line
- Deck, which you'll meet further down
- getting Messages ready for launch: live updates, unread counts you can trust, one email per conversation until it's read, and throttling against spam
- the queue dashboard, with failed-job management and pause/resume
- abandoned-package warnings, the extension health widget, collapsible categories, dashboard announcements and reset-to-default
- CJK search, the theme switcher, search in the mobile navigation, and haptic feedback
- HTML emails with unsubscribe links, which go back to 2023
- bringing Audit and GDPR into core, and giving Realtime an extender API so other extensions can plug into it
- a long performance pass on the discussion page, and integration tests that fail on N+1 queries so it stays fast
- two Laravel upgrades (12 and 13), FontAwesome 7, WebP avatars and logos, a Postmark mail driver and
tinker
Sami made 2.0 possible. I made it shippable. It's what you're about to install, and I'm proud of it.
🙋 If you just use a forum
No jargon in this bit. Here's what you'll actually notice:⚡ It's faster. Pages load sooner and send less. Your forum stops shipping a huge bundle of code to pages that don't need it.
💬 You can message people. Private conversations between members are built in, and new messages arrive live.
🔍 Search finds things. Post search works properly alongside discussion search, and you can find a member from any part of their name, not just the start. And if your forum is in Chinese, Japanese or Korean, a new mode actually understands where words begin and end, which Flarum never handled well before.
🌙 It looks right in the dark. Dark-mode logos, plus an optional theme switcher in the header so you can choose.
📱 On your phone or tablet, search sits in the navigation where you'd expect it, menus open on the first tap instead of the second, and there's optional haptic feedback.
📧 Emails make sense. Properly formatted HTML emails, and every notification email has an unsubscribe link, so you can turn off the ones you don't want without digging through settings. Turned too many off? There's now a button to put them all back to the defaults.
🛠️ If you look after a forum
This is where 2.0 changes your week.One of your thirty extensions just broke your forum. You know the drill: disable half, check, disable half again, lose an evening. Extension bisect does that for you now.
You can't remember which page has that setting. Neither can I. Admin search finds it.
Your extension list tells you things. Collapsible categories, a health widget, and a weekly check that warns you when a package you depend on has been abandoned by its maintainer, before it becomes an emergency.
Background jobs aren't a black box any more. There's a queue dashboard with failed-job management, and you can pause and resume queues before maintenance instead of crossing your fingers.
You choose your database. MySQL, MariaDB, PostgreSQL or SQLite, all properly supported. Flarum also notices when your driver and server disagree, and checks your database version up front rather than failing mysteriously later.
Plus advanced maintenance modes for when the doors need shutting, reset-to-default on settings, dashboard announcements, and a
tinker console for when you'd rather just ask the application directly.🧑💻 If you build for Flarum
The JSON:API layer has been rebuilt. Resources, endpoints and fields can be extended in ways the old serializer-and-controller pairing never allowed. An export registry lets extensions take part in the bundle properly. Underneath it all: PHP 8.3+, Laravel 13, Mithril 2.2, ES6 output.Testing got serious. Eloquent factories, integration tests that fail on N+1 queries, and, as of the final RCs, frontend tests that actually run in a standalone, Composer-installed extension. The docs had cheerfully described that for years, but it only ever worked inside this monorepo.
And the extension points people kept asking for: a JS
Notification extender, whenExtensionDisabled on Conditional, flexible frontend content ordering, custom avatar drivers, a reusable Hero, CloseWatcher for modals and dropdowns, slug drivers with display names, hooks throughout the queue dashboard, a Statistics extender so your extension's numbers can sit on the admin dashboard, and a DeckColumns extender so it can add its own columns to Deck.📖 The upgrade guide is at docs.flarum.org/extend/update-2_0. It's honest about what breaks.
🎁 Two extensions, now everyone's
For years, two of the things forums asked for most were premium extensions. If you wanted them, you paid for them, and you hoped they'd keep up with core. In 2.0, both are free, open source and first-party: maintained alongside core, MIT-licensed, and tested in the same suite as everything else.⚡ Realtime
How we got here: Realtime started life asblomstra/realtime, a paid premium extension. In December 2025, Daniël Klabbers (@luceos) donated it to the Flarum Foundation so it could be open source for Flarum 2 flarum/framework4295. Giving away something people were paying for, so every forum can have it, is a big deal, and it deserves saying out loud: thank you, Daniël.What it means for you: your forum comes alive. New discussions show up in the list, replies appear in the thread you're reading, and notifications arrive without anybody pressing refresh. Hide or delete a post and it disappears live for anyone who can no longer see it. It works for guests as well, and always respects permissions. There's even a typing indicator, so you can see when someone is writing a reply.
For admins: Realtime runs its own websocket service on your server, so you'll need somewhere you can keep a process running and a queue worker going (Redis recommended). That rules out most shared hosting. If that's you,
flarum/pusher is still there.🔎 Audit
How we got here: for years, a proper audit log meant Clark Winkelmann's kilowhat Audit, which many of you paid for. The Flarum Foundation bought Audit from Clark and made it open source. It's nowflarum/audit, and it shipped to 1.8.17 as well as 2.0, so nobody had to wait for the upgrade to get it. If you already have a kilowhat audit log, Flarum takes it over in place, with your history intact. Thank you, Clark, for building it and for letting it become everyone's.What it means for you: a record of who did what. Logins, renames, group and permission changes, settings, deleted posts, locked and stickied discussions, approvals, flags, suspensions, extensions switched on and off, GDPR erasures and exports, and private conversations, each with who processed them. When a moderator asks "who changed this?", the answer is a search away, filterable by actor, action, user, discussion or IP.
For developers: the
Audit extender lets any extension log its own actions. Every first-party extension now registers its own integration, and the integration does nothing if Audit isn't installed.🃏 One more thing: Deck
There's a brand-new bundled extension in 2.0 that hasn't been in any release candidate: Deck.What it is: one page, at
/deck, where you follow everything you care about in side-by-side columns that update live. Pick from all discussions, unread, notifications, a single discussion, everything a member starts or posts, posts from a group, or any filter you can type into search, such as tag:support is:unread. With the other bundled extensions enabled, you also get columns for the discussions you're following, your private messages, a tag, and (for moderators) flagged posts. Drag columns into place, resize them, arrange them in up to two rows, and go full screen. Found a discussion you want to keep an eye on? Add to Deck puts it in a column.Who it's for: members who want to keep up with a busy forum without clicking between pages, and staff who want flagged posts, a support tag and who's typing, all on one screen.
For admins: members can use Deck by default, and the Use Deck permission controls who else can. You also set the maximum number of columns per member (8 by default). It's live with Realtime, and without it, columns check for new activity every 60 seconds, so it works on shared hosting too. New installs get it with the other bundled extensions. On an upgraded forum, add it with
composer require flarum/deck, then enable it in the admin panel.For developers: the
DeckColumns extender lets your extension add its own column types. Messages, Subscriptions, Tags and Flags already use it.🗳️ The last mile
I said the release candidate would become2.0.0 when the community said so, and that it wasn't my call alone. You made the call.That wasn't a formality. Here's a sample of what almost six months of release candidates caught. Every one was found by somebody running a real forum, not by us:
- 🧱 An upgrade that aborted on a circular dependency between Audit, FoF GeoIP, FoF Ban IPs and the moderation extensions. It was a hard wall on the
1.x → 2.xmigration, for a completely ordinary set of extensions. flarum/framework4978 - 💥 A cache clear that could 500 the next visitor. Not the admin who cleared it, but whoever arrived next, with nothing in the logs, because a PHP memory fatal isn't an exception. flarum/framework4990
- 📧 Erasure emails arriving with the confirmation link rendered as
flarumsafevalue…endflarumsafevalue. Underneath it was a bigger discovery: core's own mail had never had markup-injection protection applied at all. flarum/framework4988 - 🕳️ A member requesting account erasure, cancelling, then requesting again, and the second confirmation email being silently discarded. They'd have waited for a link that was never coming. flarum/framework4989
- 👆 Every
⋮menu needing two taps on an iPad, because a touch screen has no hover and Safari fakes one. flarum/framework4992 - 👯 "Left the tab idle, came back to a duplicate discussion." flarum/framework4993
- 📉
flarum infounder-reporting your web memory limit on Debian and Ubuntu, which is the exact number people paste into support threads when asking for help. flarum/framework4991 - 🎯 And in the very last release candidate: a custom page built exactly as documented, crashing because an attribute the docs call optional was left out. The cause was a core utility turning
nullinto an empty object, one render away from taking down any extension that added a conditional item. flarum/framework5000 reported by @rafaucau)
rc.8, either. 81 more pull requests have landed since. If you've been running a release candidate, you'll notice that infinite scroll on the notifications list works again, and that your logo shows up in emails again: it's now a PNG copy every mail client can display, and you can upload a separate email logo. There's also a slimmer Font Awesome package, which takes around 23,000 files out of your vendor folder.Every one of those would have shipped in
2.0.0 and given somebody a bad afternoon. That's what release candidates are for, and they only work when people actually run them. You did.🚀 Upgrading
From1.8.x: in yourcomposer.json, setflarum/coreto^2.0and every extension to*, then runcomposer update --prefer-dist --no-plugins --no-dev -a --with-all-dependencies, followed byphp flarum migrateandphp flarum cache:clear --force. The full walkthrough is at docs.flarum.org/update.
Back up first. Stage it if you can. Keep a way back.
⚠️ Do this one from the command line.
If you can't get shell access, ask your host for help or wait until you can. It's better to upgrade a little later than to recover a broken forum.
- Don't upgrade through the Extension Manager. A major upgrade replaces the code that's running the upgrade while it's still running, and that can leave your forum half-upgraded and hard to recover.
- Run the migrations with
php flarum migrate, not the "Update" page your forum shows in the browser. A1.x → 2.xupgrade has a lot of migrations. In a browser they can hit a timeout or memory limit partway through, but on the command line they run to completion and show you exactly what went wrong if something does.
Core probably won't be what holds you up. Extensions will. Every extension needs a 2.0-compatible release, and one straggler can block the whole upgrade.
👀 discuss.flarum.org is already running it, the exact build you're about to download. The nightly demo tracks2.xtoo.
🧭 Check before you jump
The FoF Upgrade Advisor tells you whether your extensions will come with you before you touch anything, and checks your PHP and database versions against what 2.0 needs:composer require fof/upgrade-advisor:"*"
Read the verdict, clear what it flags, and uninstall it once you're green. ✅📜 Everything that changed since
rc.8 is in the changelog.🙏 Everyone else
Sami and I are two names on a list of 41 who committed to the 2.0 line, and a much longer list of people without whom none of this would exist.@davetodave178 hardened our CI, pinned the whole supply chain, and made migrations runnable in isolation. @datlechin, @luceos, @YUCLing, @Karl, @datitisev, @ekumanov, @huoxin233, @GianniG, @rafaucau, @iPurpl3x, @ClaudiusH, @edgeinfinity1, @OrdinaryJellyfish, @drewmt, @n-peugnet, @szepeviktor, @grimur82, @forumaker, @zxbmmmmmmmmm, @zDaleZ, @blt950, @Darkle, @garygreen, @JamesShaver, @johannsa, @xHeaven, @rob006, @novacuum, @Krinkle, @TowyTowy, @ksvijayan06, @Abdooo2235, @imdong, @ernestdefoe, plus Chisato Nishikigi and notanothervibecoder, whose commits aren't linked to an account I could resolve.
But commits are just the easiest thing to count. 223 people have contributed here since
1.0.0, and the ones who shaped this release most weren't always committing.💛 Our supporters
Private, commercial and institutional: you're the reason developers could keep working on this. Three years is a long time to build something before anyone can install it. Your support kept people working on Flarum through stretches when there was no release to show for it, and it told them the work mattered. Open source runs on people's time, and you made that time possible.The biggest of them is Glowing Blue. Thank you. Flarum 2.0 would look very different without you.
You'll find everyone who chips in on the supporters page. Thank you, every one of you. 💙
🧩 Extension developers
Sami laid the foundations, and I got them over the line. You're the ones who build on them. A forum is never just core: it's the dozens of extensions that make each community its own, and you built that landscape, often unpaid and often in your evenings. Then 2.0 asked you to port all of it to a new API, a new frontend and a new test suite. You did it, and you sent back the bug reports, edge cases and "this extender would really help" requests that shaped 2.0 itself. The new extension points are there because you asked for them.🧑🤝🧑 Admins and community managers
You run Flarum every day, and you've told us honestly where it hurts. A lot of this release exists because you described a problem clearly enough for us to fix it.Please keep it coming. Bring your ideas, problems and improvements toProposals. That's where what you see every day turns into the next release, and 2.1 is being shaped there right now.
🌍 And everyone who
- 🌐 translated a string into a language none of us speak,
- 🛟 sat inSupport answering the same question for the hundredth time,
- 🐛 read a stack trace and wrote it up properly instead of shrugging and moving on.
Hello world! on 20 December 2014, and to every maintainer since who kept Flarum going long enough to reach today. 💙🗓️ What happens now
2.0.0 isn't a finish line. It's a floor.2.0.x is for whatever the real world finds in the next few weeks. And it will find something: a stable release meets more forums in a day than every release candidate put together. Tell us and we'll fix it.2.1 is for what's next. That milestone is already filling up.1.8.x moves to security fixes and critical bugs only, with no new features or improvements. If you're staying on 1.x for now, that's fine and it's still safe, but nothing new will happen there. From today, Flarum lives on 2.0.🐛 Bugs → flarum/frameworkissues
💬 Questions →Support
🔒 Security → [email protected], privately
Eleven years and nine months from
Hello world! to 2.0.0. Thank you for being here for it, whether you arrived last week or have been waiting since the very first beta.
