Flarum 2.0.0-beta.8 Released ๐
Beta.8 is a big one. After the infrastructure groundwork laid in earlier betas, this release is packed with new features, a major icon library upgrade, meaningful performance wins, and a long list of fixes and polish. This is the most feature-rich beta we've shipped for 2.0.
๐ You're already running it. This very forum โ discuss.flarum.org โ has been updated to beta.8. Consider this your live preview.
๐งช Want to try Flarum 2.0 before committing? Check out our nightly demo at nightly.flarum.site, rebuilt every day from the latest 2.x code.
๐จ Beta.8 is the last feature release before RC. The 2.x branch is now in a bug-fix-only freeze โ no new features will be merged. 2.0.0-rc.1 is scheduled for April 20, 2026. If you've been waiting to test Flarum 2.0, the time is now.
๐ What's in beta.8?
โ ๏ธ New PHP requirement
Due to the Laravel upgrade in this release, Flarum 2.0 now has a minimum PHP requirement of 8.3
Supported versions are: 8.3, 8.4 and 8.5
๐จ FontAwesome 7.x
Flarum now ships with FontAwesome 7, upgraded from 6.5.2. FA7 brings a refreshed icon set, a cleaner package structure, and is the foundation for all future icon additions. The good news for extension developers: the .fas / .far / .fab class aliases are preserved, so existing icon class strings continue to work without changes.
Alongside the upgrade, the FontAwesome CDN/Kit is now loaded non-blocking, so it no longer holds up page rendering โ a meaningful improvement for forums relying on the CDN for Pro icons.
โก CSS loads asynchronously
Stylesheets are now loaded asynchronously to eliminate render-blocking CSS. This means the browser can start rendering the page sooner, reducing perceived load time โ particularly noticeable on first visit or cold cache.
๐ Realtime: extender API, per-extension integrations & notification toasts
The realtime extension has been significantly rearchitected. Extensions can now wire their own realtime behaviour via a dedicated Realtime extender, rather than requiring realtime to have hardcoded knowledge of every extension.
In practice this means:
- flarum/flags, flarum/likes, flarum/lock, and flarum/messages all now handle their own realtime push events
- A new
NotificationToast component shows incoming notifications as auto-dismissing toasts in the top-right corner โ you'll see these appear in real time as activity happens while you're browsing
๐ผ๏ธ WebP image conversion
Flarum now automatically converts uploaded avatars and logos to WebP โ a modern format that's typically 30โ50% smaller than JPEG/PNG with no visible quality loss. A batch migration command is included to convert existing avatars. Logos also gain support for animated GIF and a new dark mode logo setting.
๐ OAuth improvements
The OAuth flow has been rewritten to use a redirect-only model. This is a security improvement and fixes edge cases in the previous approach where the response type could vary.
๐ Admin panel additions
- Announcements widget on the admin dashboard โ keep your team informed directly from the admin panel
๐ณ Haptic feedback
Mobile users now get haptic feedback on key interactions (button taps, etc.), with a user preference to disable it if desired. This has been extended to core and bundled extensions.
๐ฆ Laravel 13
Flarum's Illuminate components have been upgraded to Laravel 13. No changes are needed for extensions that follow standard patterns.
๐ IdWithDisplayNameSlugDriver
A new slug driver that combines a model's ID with its display name โ giving you human-readable URLs that remain stable even if the display name changes. Available for discussions, users, tags, and mentions.
๐ง Mail improvements
- Postmark is now a supported mail driver out of the box
- Send failures are now logged and fire an
EmailSendFailed event, making it much easier to diagnose mail delivery issues
๐ Miscellaneous additions
- Logout is now a POST request (security improvement โ prevents CSRF-based logout)
- New
CloseWatcher API for modals and dropdowns uses the browser's native back-gesture/Escape handling where available
- Reusable
Hero component for use in custom pages
- Customizable user avatar drivers โ extensions can now register their own avatar sources
- (gdpr) PII field declarations, anonymized context support, confirmation token invalidation, IP logging and purge, and a safeguard for cancelled erasure requests
- (package-manager) Now searches Packagist directly instead of the flarum.org API; rejects extensions incompatible with the current Flarum major version
- (subscriptions) Auto-follow discussions on create
- (realtime) Notification toast duration is now configurable from the admin panel; set to 0 to disable toasts entirely
- (install) Queue driver configuration is now supported directly in the installer
- PostgreSQL
search_path is now configurable for multi-schema setups
๐ง Fixes & polish
Beta.8 also includes the most fixes of any beta so far. Highlights:
๐ฑ Mobile layout
Posts on mobile now have symmetric horizontal padding, fixing the visual asymmetry caused by the hidden avatar column.
๐ Notification contrast
Unread notifications now have a clear primary-colour left border in the notification dropdown, improving readability in dark mode where background contrast alone wasn't sufficient.
๐ Search & mentions
- User search is now case-insensitive across all supported databases
- Mentions no longer crash when a tag or group has no icon/color set
- An editor-ready race condition in mentions has been resolved without the previous arbitrary timeout workaround
- The
AuthorFilter in search now uses SlugManager so custom slug drivers are respected
๐ท๏ธ Other fixes
- Sticky discussions in hidden tags no longer appear on the "All Discussions" page
- Admin dropdown menus (maintenance mode, slug driver, FontAwesome source) now correctly show their default values on fresh and upgraded installs
- Extension boot order is now re-sorted during
php flarum migrate, so new optional-dependencies declarations take effect after a composer update without needing a manual enable/disable cycle
- Deleting a user account now also removes their avatar file from disk
- Emoji updated to Unicode 17
๐ Security
- Display names are now sanitized in HTML notification emails to prevent injection (nicknames extension)
- Notification queries are scoped to the authenticated user
- Package manager task list endpoint restricted to admins
๐ ๏ธ Developer-facing
- LESS mixin definitions corrected โ
Button--block, Button--icon and others are now proper parametric mixins, fixing the FA Kit icon alignment issues
- Boolean custom LESS functions now return the correct
Less_Tree_Keyword type
Uncaught ReferenceError for async default exports prevented
src/bootstrap/ typo fixed in jest-config (was src/boostrap/)
- Skip-to-content link visibility restored
๐ The ecosystem is getting ready
With RC1 targeted for April 20, 2026, the ecosystem push is in full swing.
๐ Language packs โ @rob006 continues to drive language pack updates for 2.0. If you maintain a translation, please check in on those threads.
๐ค Friends of Flarum โ FoF extensions are making great progress toward 2.0 compatibility, with only a handful of extensions left to go. Thank you to everyone involved.
๐ฃ Extension developers โ the API is now frozen. If something in core is blocking your extension update, open a discussion or file an issue immediately โ bug fixes are still being accepted before RC1 on April 20, but this is your last window.
๐ Try it yourself
- ๐ฅ๏ธ Live demo โ nightly.flarum.site, rebuilt daily
- ๐๏ธ Right here โ discuss.flarum.org is running beta.8
- โฌ๏ธ Update your install โ
composer update -W followed by php flarum migrate and php flarum cache:clear, and finally php flarum assets:publish (staging + backup first, as always)
๐ Thank you
Beta.8 has more community contributions than any previous 2.0 beta โ thank you to everyone who submitted a pull request.
- @datlechin (GitHub) โ customizable user avatar drivers #4130, skip password check for passwordless drivers #4435
- @davetodave178 โ reusable
Hero component #4215, IdWithDisplayNameSlugDriver #4470
- @rafaucau (GitHub) โ
CloseWatcher API #4433, dark mode logo support #4457, prevent Uncaught ReferenceError for async default exports #4397, missing content attr type on Alert #4495
- @edgeinfinity1 (GitHub) โ tags mutation improvements #4393
- @grimur82 (GitHub) โ GDPR safeguard for cancelled erasure requests #4387
- @johannsa (GitHub) โ PostgreSQL
search_path support #4241
- @huoxin233 (GitHub) โ auto-follow discussions on create #4464
- @IanM โ everything else
๐ Changelog
Added
- (realtime) extender API, per-extension integrations, and notification toasts by @IanM #4473
- (admin) announcements widget on admin dashboard by @IanM #4471
- (admin) collapsible extension categories, health widget & abandoned package support by @IanM #4392
- (core, mentions, likes) implement
IdWithDisplayNameSlugDriver by @davetodave178 #4470
- (core) redirect-only OAuth flow โ rewrite
ResponseFactory by @IanM #4461
- (core)
CloseWatcher API for modals and dropdowns by @rafaucau #4433
- (core) haptic feedback user preference and utility by @IanM #4430 #4434
- (core) reusable
Hero component by @davetodave178 #4215
- (core) customizable user avatar drivers by @datlechin #4130
- (core) convert uploaded avatars to WebP, add batch migration command by @IanM #4431
- (core) convert uploaded logos to WebP, support animated GIF by @IanM #4458
- (core) add dark mode logo support by @rafaucau #4457
- (core) change logout from GET to POST by @IanM #4448
- (core) upgrade FontAwesome from 6.x to 7.x by @IanM #4388
- (core) load FontAwesome CDN/Kit non-blocking by @IanM #4463
- (core) load CSS asynchronously to eliminate render-blocking stylesheets by @IanM #4462
- (gdpr) PII field declarations and anonymized context support by @IanM #4396
- (gdpr) port confirmation token invalidation, IP logging and IP purge by @IanM #4423
- (mail) add Postmark driver by @IanM #4455
- (mail) log send failures and fire
EmailSendFailed event by @IanM #4385
- (package-manager) replace flarum.org API with Packagist search by @IanM #4394
- (tags) fix tags mutation shows [deleted] and related improvements by @edgeinfinity1 #4393
- (realtime) make notification toast duration configurable; 0 disables toasts by @IanM #4497
- (subscriptions) add support for auto follow discussions on create by @huoxin233 #4464
- (install) support queue configuration in installer file by @IanM #4484
- (core) add support for pgsql's
search_path by @johannsa #4241
Fixed
- (core) various styling fixes: mobile post padding, unread notification contrast, primary button text colour by @IanM #4480
- (realtime) restore full-width new-activity banner; move state to IndexPage by @IanM #4481
- (core) make user search case-insensitive across all supported databases by @IanM #4467
- (core) normalize database version strings in admin dashboard by @IanM #4466
- (core) skip password check on update page for passwordless drivers by @datlechin #4435
- (core) add missing
method_not_allowed translation for error view by @IanM #4418
- (core) preserve translations when switching locale by @IanM #4400
- (core) return
Less_Tree_Keyword for boolean custom Less functions by @IanM #4406
- (core) prevent
Uncaught ReferenceError for async default exports by @rafaucau #4397
- (core) use correct
--page-bottom-padding CSS variable in App by @IanM #4438
- (core) use luma-based text colour for primary buttons to ensure contrast by @IanM #4451
- (core) add left padding to posts on mobile by @IanM #4422
- (core) reduce post horizontal padding on mobile to 15px by @IanM #4456
- (core) prevent hr at end of poststream if more children are present by @IanM #4460
- (core) LESS mixin definitions and skip-to-content link visibility by @IanM #4389
- (core) disable auto_tls for None encryption, add SSL cert verification bypass by @IanM #4445
- (approval) apply opacity to whole unapproved post, not child elements by @IanM #4453
- (formatter) handle null content in
HasFormattedContent and mentions unparsers by @IanM #4452
- (gdpr) add GDPR safeguard for cancelled erasure requests by @grimur82 #4387
- (jest-config) rename
src/boostrap/ to src/bootstrap/ and update all imports by @IanM #4413
- (less) fix FA Kit icon alignment and spurious icon regressions by @IanM #4409
- (mentions) prevent crash when tag or group has no icon/color by @IanM #4447
- (mentions) resolve editor-ready race condition without arbitrary timeout by @IanM #4411
- (messages) refresh
DialogMessage after create to resolve number expression by @IanM #4384
- (nicknames) sanitize display names to prevent injection in HTML notification emails by @IanM #4454
- (notifications) scope notification queries to the authenticated user by @IanM #4441
- (notifications) invalidate unread count cache on delete all by @IanM #4390
- (package-manager) reject extensions incompatible with current Flarum major version by @IanM #4412
- (package-manager) restrict task list endpoint to admins only by @IanM #4410
- (search) use SlugManager in AuthorFilter to support custom slug drivers by @IanM #4486
- (settings) register missing defaults for admin dropdown settings by @IanM #4491
- (sticky) sticky discussions in hidden tags appear on all-discussions page by @IanM #4492
- (user) delete avatar file from disk when user account is deleted by @IanM #4485
- (core) capture extension name by value in initializer error closure by @IanM #4482
- (core) add missing
content attr type to Alert component by @rafaucau #4495
- (emoji) update to Emoji/Unicode 17 by @datitisev #4489
Changed
- upgrade Illuminate components to Laravel 13 by @IanM #4468
- (core) flarum-webpack-config 3.0.3 by @IanM #4398
- (core) remove Array.prototype.flat polyfill by @IanM #4483
- (extensions) re-sort extension order during migrate to pick up new optional-dependencies by @IanM #4493