Flarum 2.0.0-rc.3 Released š ā and 2.0 is almost here
This is the one we've been working toward for years. Flarum 2.0 is no longer on the horizon ā it's right in front of us. Today we're shipping 2.0.0-rc.3, and with each release candidate the picture gets clearer: real forums, running real communities, on 2.0 today, with more upgrading every single day.
rc.3 is a fast, focused follow-up to rc.2 ā 10 merged PRs just a week later ā but the bigger story is the momentum behind it. The release-candidate series is doing exactly what it's meant to do: people are running 2.0 in production, telling us what they find, and we're turning fixes around in days. The bug reports are getting rarer and the edges are getting smoother. That's what the road to a stable 2.0 looks like, and we're nearly at the end of it.
š Production-ready for early adopters ā and people are already there. The upgrade from rc.2 is a plain composer update. Back up your database, test on staging if you can, keep a rollback plan ā the usual.
š This forum runs it. discuss.flarum.org is on rc.3. So is the nightly demo, rebuilt daily from the latest 2.x code. You're looking at 2.0 right now.
š¬ Already upgraded? Tell us. Drop a note inSupport ā every "running it in prod, all good" report builds confidence for the next forum about to take the leap.
š§ Where we are ā the last mile
We're in the final stretch. The release-candidate promise still holds, and every point of it is now battle-tested in production:
- The API is frozen ā for real, proven by real extensions. An extension built against rc.1 or rc.2 works unchanged on rc.3 and will work on 2.0.0 final. Extension authors: now is the time to ship your 2.0-compatible releases.
- The upgrade path is clean. rc.2 ā rc.3 ā 2.0.0 is
composer update the whole way. The forums upgrading daily are proof.
- Regressions go to the top of the pile ā and there are fewer of them every cycle.
rc.3 is a maintenance and hardening release: a couple of small new diagnostics, otherwise real-world rough edges sanded down. The fast turnaround is the whole point ā when you report something, we'd rather ship the fix in a week than sit on it. Every report you send moves 2.0 final closer. Keep them coming.
Where to report:
- Bugs in core ā flarum/frameworkissues
- General feedback, questions, extension behaviour āSupport
- Security issues ā
security@flarum.org (please don't post publicly)
š ļø What changed in rc.3
šļø Database & queue robustness
The headline of this cycle is making Flarum fail loudly and early instead of mysteriously:
- Database driver/server mismatches are now detected and surfaced. Since 2.x, Flarum treats MariaDB and MySQL as distinct drivers with their own connection classes and query grammars ā they are not interchangeable. A misconfigured
driver against the wrong server was behind a whole class of "some queries just fail" reports; Flarum now spots the mismatch and tells you, rather than letting it manifest as random query errors.
- The full Queue Pause/Resume surface is stubbed on
QueueFactory. Flarum hands its QueueFactory to Illuminate's worker in the role normally filled by the full QueueManager, but the Factory contract only guarantees connection(). The missing methods the worker and queue commands reach for are now stubbed, so queue tooling doesn't blow up on a method that was never there.
- The queue worker no longer crashes on a null connection name.
illuminate/queue 13.15 tightened the type on its WorkerIdle event to require a string connection name; Flarum never set one, so the worker threw a TypeError on every idle tick. Flarum now names its queue connection, which keeps the worker happy across Illuminate releases ā the same "a dependency bump shouldn't be able to crash the worker" hardening as the stub above.
š¦ Error handling
- Forum error handling now does content negotiation ā errors are rendered in the format the client actually asked for, instead of assuming one.
š± Frontend & mobile polish
- The user count and list refresh after creating a user in admin, so the new account shows up without a manual reload.
- The post divider is no longer lopsided on mobile.
- Emoji reserve a square box (
img.emoji), eliminating the layout shift (CLS) that nudged text around as emoji loaded.
- Mentions in a post now align with the rest of the text instead of sitting slightly off the baseline.
š§© Extension compatibility
- Tags and Sticky no longer fail to initialize alongside Realtime. With both enabled you could hit
flarum-tags failed to initialize / TypeError: mt(...) is not a constructor. The cause was load order: Realtime registers a JS extender that Tags and Sticky consume, but they weren't guaranteed to load after it. Declaring Realtime as an optional dependency fixes the ordering ā caught from a community bug report, exactly the kind the RC series is for.
ā” Performance
- N+1
group_user queries are gone when serializing users ā group membership is now loaded in bulk instead of per-user, a meaningful win on any list of accounts.
š This is a community release
Here's the part we're proudest of: most of rc.3 was written by the community, not the core team. Five of the ten PRs this cycle came from contributors outside the core ā people who hit something, fixed it, and sent it back upstream. That's not a footnote; that's the whole point of Flarum, and it's exactly the energy that carries a project across the finish line to a major release.
If you've ever thought about contributing, this is the moment. 2.0 is being built in the open, in real time, by people like you. Every PR, every bug report, every "I upgraded and here's what happened" makes the final release better.
Contributors this cycle:
- @datitisev ā content negotiation for forum error handling #4677, mention alignment #4692
- @davetodave178 ā refresh user count and list after user creation #4687
- @KBExit ā lopsided post divider on mobile #4691
- @IanM ā database mismatch detection, queue surface stub, queue worker connection-name fix, emoji CLS, the N+1 fix, and the Realtime load-order fix
š Be part of it
The best thing you can do for 2.0 right now is run it. Every forum that upgrades is one more real-world proving ground, and one more vote of confidence for the next person on the fence.
- See it live ā nightly.flarum.site, rebuilt daily, and right here on discuss.flarum.org
- Upgrade your install ā
composer update -W, then php flarum migrate, php flarum cache:clear, and php flarum assets:publish (back up first, and test on staging if you can)
- Then come back and tell us ā what worked, what didn't, what you'd want in 2.0 final
We're close. Let's bring 2.0 home together. šŖ
š Changelog
Added
- (core) detect and surface a database driver/server mismatch (e.g. MariaDB vs MySQL) by @IanM #4682
- (core) content negotiation for forum error handling by @datitisev #4677
Fixed
- (core) refresh the user count and list after user creation by @davetodave178 #4687
- (core) lopsided post divider on mobile by @KBExit #4691
- (core) stub the full Queue Pause/Resume surface on
QueueFactory by @IanM #4683
- (core) queue worker
TypeError on a null connection name with illuminate/queue 13.15+ by @IanM #4700
- (mentions) align mentions in post with the rest of the text by @datitisev #4692
- (emoji) reserve a square box for
img.emoji to avoid layout shift (CLS) by @IanM #4685
- (tags, sticky) declare
flarum/realtime as an optional dependency so the realtime extender loads before its consumers, fixing TypeError: mt(...) is not a constructor by @IanM #4699
Performance
- (core) fix N+1
group_user queries when serializing users by @IanM #4696