diff --git a/CHANGELOG.md b/CHANGELOG.md
index 348ddea26..9b181c996 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,84 @@
 # Changelog
 
+## [v1.5.0](https://github.com/flarum/framework/compare/v1.4.0...v1.5.0)
+### Fixed
+- (a11y) add accessible labels to notification grid options [#3520]
+- (a11y) present post streams as feeds [#3522]
+- (a11y) set `aria-busy` when editing a post stream item [#3521]
+- (compilation) versioner not inject into compilers [#3589]
+- (mentions) accessing `id` of null `user` relation [#3618]
+- (subscriptions) add missing table prefix for filter gambit [#3599]
+- (tags) use default index sortmap [#3615]
+- Move guzzle requirement to core [#3544]
+- MyISAM tables for extensions during installation ([75aaef7](75aaef7d76317bc8578eac1439fed8091c87213b), [f926c58](f926c58e0143fe75a4a4c2e93810970c5910afc8))
+- Set the translator locale to user preference for email notifications [#3525]
+- `$events` property declared dynamically [#3598]
+- core settings header has no priority ([33bf228](33bf2284c77863a1bb18d71d87b8516483056a74))
+- html entities shown raw in page title [#3542]
+- incorrect centring of deleted user avatars in notification list [#3569]
+- intellisense imports defaulting to absolute path from `src` folder [#3549]
+- minor backward compatible fix for php 8.1 in st_replace ([07b2f86](07b2f86dcc90a3ef17c8ee19a1a07e99a4b17360))
+- post query wildcard selection causes ambiguity [#3621]
+- potential static caching memory exhaustion [#3548]
+- prepare release workflow has invalid layout ([70e483d](70e483d1b185332910be9513fd06cc6342830d49))
+- remove deprecation warning for decoding null values ([590639f](590639f5f3e1fe883f28c41e1f175c2826b4b5f4))
+- replace `.fa()` mixin usage with `.fas()` [#3537]
+- return type hint static is php 8+ ([b01b75e](b01b75e36790d8026dd27ce59051d9581ad47940))
+- sticky nav content displays below post stream [#3575]
+- titles positioned wrongly with custom header height [#3550]
+- typo in error message ([1a189f4](1a189f492320071365286a8835bc49d5a9571753))
+- unread notifications are globally cached between users. [#3543]
+- update workflow name ([628c281](628c281c39855f01069ddc40b698d80d29fec870))
+- user has wrong discussion read status [#3591]
+### Changed
+- (approval, likes) use subscribers [#3577]
+- (package-manager) last tweaks before beta tag ([335c602](335c602cea3fbaee9ad7c32ceecaaf222e5d89a7))
+- (statistics) add release notes for 1.4.1 ([f4ace73](f4ace73a3c59434b8717efb2d83f50084f470fe4))
+- (statistics) rewrite for performance on very large communities [#3531]
+- (statistics) split timed data into per-model XHR requests [#3601]
+- (tags) Replace event helper with event dispatcher [#3570]
+- Add `loading="lazy"` attribute for avatars [#3578]
+- Apply fixes from StyleCI ([bb64114](bb641144b6bc5c59798351459fbf8df8cbf6aec6))
+- Create CODEOWNERS ([6e48a03](6e48a0303e45bcf210e550ba3e0772bc8443a207))
+- MyISAM tables for extensions during installation" ([f128190](f128190f143398dd1262fd1379e634794daee4c1))
+- convert `AlertManager` `IndexPage` and `UserPage` components to TS [#3536]
+- convert `Badge` `Checkbox` and `Navigation` components to TS [#3532]
+- convert core modals to TypeScript [#3515]
+- convert page components to TypeScript [#3538]
+- debug line slipped in while rebasing a PR [#3580]
+- don't pass password field between auth modals [#3626]
+- fix github issue templates ([d3e456a](d3e456a1bf42d13b7cd2542c371f392712247c09))
+- format code ([4954621](495462183bfb3b33046b293e6b1088ab225968df))
+- getting the release workflow in ([5530400](5530400b093b5fd07d670e5c92d8a7da96634cfe))
+- link logo at the top with the official website [#3552]
+- prevent running both `push` and `pull_request` actions at the same time [#3597]
+- refactor prefix matrix and add `MySQL 8.0` & `PHP 7.3` to workflows [#3595]
+- relying on a third-party for avatar URL tests is unreliable  [#3586]
+- require guzzle 6 or 7 ([46b3b7a](46b3b7a9527b935c3c52269aaad2010c75dcb6d8))
+- split FA imports into separate Less file for easy overriding [#3535]
+- unify JS actions into one (rewritten `flarum/action-build`) [#3573]
+- update version constant during cycle 22 ([d864405](d86440506dd37101e60adec591d4b017e7765ec6))
+- use `isCollapsed` instead of `rangeCount` [#3581]
+- use github issue template forms [#3526]
+### Added
+- (likes) Add likes tab to user profile [#3528]
+- (likes) Option to prevent users liking their own posts [#3534]
+- (modals) support stacking modals, remove bootstrap modals dependency [#3456]
+- (subscriptions) add option to send notifications when not caught up [#3503]
+- Add custom class for email confirmation alert [#3584]
+- Admin debug mode warning [#3590]
+- Delete all notifications [#3529]
+- Queue package manager commands [#3418]
+- Restart the queue worker after cache clearing, ext enable/disable, save settings [#3565]
+- add createTableIfNotExists migration helper [#3576]
+- add new workflow for generating release meta ([0901e59](0901e59a58a3e1f017762583a2adf419f7f34257))
+- clear password & email tokens when appropriate [#3567]
+- discussion UTF-8 slug driver [#3606]
+- expose assets base url to frontend forum model [#3566]
+- extender to add custom less variables [#3530]
+- publish assets on admin dashboard cache clear [#3564]
+- throttle email change, email confirmation, and password reset endpoints. [#3555]
+
 ## [1.4.0](https://github.com/flarum/framework/compare/v1.3.1...v1.4.0)
 
 ### Added
diff --git a/extensions/akismet/composer.json b/extensions/akismet/composer.json
index 68a767108..18f7ff9bc 100644
--- a/extensions/akismet/composer.json
+++ b/extensions/akismet/composer.json
@@ -19,7 +19,7 @@
         }
     ],
     "require": {
-        "flarum/core": "^1.4",
+        "flarum/core": "^1.5",
         "flarum/approval": "^1.2"
     },
     "autoload": {
diff --git a/extensions/approval/composer.json b/extensions/approval/composer.json
index 068387ee2..b262fcc0c 100644
--- a/extensions/approval/composer.json
+++ b/extensions/approval/composer.json
@@ -19,7 +19,7 @@
         }
     ],
     "require": {
-        "flarum/core": "^1.4",
+        "flarum/core": "^1.5",
         "flarum/flags": "^1.2"
     },
     "autoload": {
diff --git a/extensions/bbcode/composer.json b/extensions/bbcode/composer.json
index 5cf436b1f..aa0787322 100644
--- a/extensions/bbcode/composer.json
+++ b/extensions/bbcode/composer.json
@@ -19,7 +19,7 @@
         }
     ],
     "require": {
-        "flarum/core": "^1.4"
+        "flarum/core": "^1.5"
     },
     "extra": {
         "branch-alias": {
diff --git a/extensions/embed/composer.json b/extensions/embed/composer.json
index 6f94f94ed..9e4431267 100644
--- a/extensions/embed/composer.json
+++ b/extensions/embed/composer.json
@@ -19,7 +19,7 @@
         }
     ],
     "require": {
-        "flarum/core": "^1.4"
+        "flarum/core": "^1.5"
     },
     "autoload": {
         "psr-4": {
diff --git a/extensions/emoji/composer.json b/extensions/emoji/composer.json
index 15783a2b3..c185d7fa3 100644
--- a/extensions/emoji/composer.json
+++ b/extensions/emoji/composer.json
@@ -19,7 +19,7 @@
         }
     ],
     "require": {
-        "flarum/core": "^1.4"
+        "flarum/core": "^1.5"
     },
     "extra": {
         "branch-alias": {
diff --git a/extensions/flags/composer.json b/extensions/flags/composer.json
index af99d01c6..610e237ff 100644
--- a/extensions/flags/composer.json
+++ b/extensions/flags/composer.json
@@ -19,7 +19,7 @@
         }
     ],
     "require": {
-        "flarum/core": "^1.4"
+        "flarum/core": "^1.5"
     },
     "autoload": {
         "psr-4": {
diff --git a/extensions/lang-english/composer.json b/extensions/lang-english/composer.json
index 577f4317b..42fe0ea20 100644
--- a/extensions/lang-english/composer.json
+++ b/extensions/lang-english/composer.json
@@ -7,7 +7,7 @@
     ],
     "license": "MIT",
     "require": {
-        "flarum/core": "^1.4"
+        "flarum/core": "^1.5"
     },
     "extra": {
         "branch-alias": {
diff --git a/extensions/likes/composer.json b/extensions/likes/composer.json
index 32652877e..77ed21f2f 100644
--- a/extensions/likes/composer.json
+++ b/extensions/likes/composer.json
@@ -19,7 +19,7 @@
         }
     ],
     "require": {
-        "flarum/core": "^1.4"
+        "flarum/core": "^1.5"
     },
     "autoload": {
         "psr-4": {
diff --git a/extensions/lock/composer.json b/extensions/lock/composer.json
index 76777f75e..5de09f018 100644
--- a/extensions/lock/composer.json
+++ b/extensions/lock/composer.json
@@ -19,7 +19,7 @@
         }
     ],
     "require": {
-        "flarum/core": "^1.4"
+        "flarum/core": "^1.5"
     },
     "autoload": {
         "psr-4": {
diff --git a/extensions/markdown/composer.json b/extensions/markdown/composer.json
index 3a5b41a05..705ce0af3 100644
--- a/extensions/markdown/composer.json
+++ b/extensions/markdown/composer.json
@@ -19,7 +19,7 @@
         }
     ],
     "require": {
-        "flarum/core": "^1.4"
+        "flarum/core": "^1.5"
     },
     "extra": {
         "branch-alias": {
diff --git a/extensions/mentions/composer.json b/extensions/mentions/composer.json
index 45fad1a7a..370ebb124 100644
--- a/extensions/mentions/composer.json
+++ b/extensions/mentions/composer.json
@@ -19,7 +19,7 @@
         }
     ],
     "require": {
-        "flarum/core": "^1.4"
+        "flarum/core": "^1.5"
     },
     "autoload": {
         "psr-4": {
diff --git a/extensions/nicknames/composer.json b/extensions/nicknames/composer.json
index 3e81cce2c..7031cd234 100644
--- a/extensions/nicknames/composer.json
+++ b/extensions/nicknames/composer.json
@@ -19,7 +19,7 @@
         }
     ],
     "require": {
-        "flarum/core": "^1.4"
+        "flarum/core": "^1.5"
     },
     "autoload": {
         "psr-4": {
diff --git a/extensions/pusher/composer.json b/extensions/pusher/composer.json
index dba83dc97..b0038dc15 100644
--- a/extensions/pusher/composer.json
+++ b/extensions/pusher/composer.json
@@ -19,7 +19,7 @@
         }
     ],
     "require": {
-        "flarum/core": "^1.4",
+        "flarum/core": "^1.5",
         "pusher/pusher-php-server": "^2.2"
     },
     "require-dev": {
diff --git a/extensions/statistics/composer.json b/extensions/statistics/composer.json
index c1010e0bd..288bcdf72 100644
--- a/extensions/statistics/composer.json
+++ b/extensions/statistics/composer.json
@@ -19,7 +19,7 @@
         }
     ],
     "require": {
-        "flarum/core": "^1.4"
+        "flarum/core": "^1.5"
     },
     "autoload": {
         "psr-4": {
diff --git a/extensions/sticky/composer.json b/extensions/sticky/composer.json
index 8ef8d35a6..b39e6ec02 100644
--- a/extensions/sticky/composer.json
+++ b/extensions/sticky/composer.json
@@ -19,7 +19,7 @@
         }
     ],
     "require": {
-        "flarum/core": "^1.4"
+        "flarum/core": "^1.5"
     },
     "autoload": {
         "psr-4": {
diff --git a/extensions/subscriptions/composer.json b/extensions/subscriptions/composer.json
index bcbaa7472..8da8732fa 100644
--- a/extensions/subscriptions/composer.json
+++ b/extensions/subscriptions/composer.json
@@ -19,7 +19,7 @@
         }
     ],
     "require": {
-        "flarum/core": "^1.4"
+        "flarum/core": "^1.5"
     },
     "autoload": {
         "psr-4": {
diff --git a/extensions/suspend/composer.json b/extensions/suspend/composer.json
index e6732d7c4..bb8398a1b 100644
--- a/extensions/suspend/composer.json
+++ b/extensions/suspend/composer.json
@@ -19,7 +19,7 @@
         }
     ],
     "require": {
-        "flarum/core": "^1.4"
+        "flarum/core": "^1.5"
     },
     "autoload": {
         "psr-4": {
diff --git a/extensions/tags/composer.json b/extensions/tags/composer.json
index eb192d730..6b7ea1b75 100644
--- a/extensions/tags/composer.json
+++ b/extensions/tags/composer.json
@@ -19,7 +19,7 @@
         }
     ],
     "require": {
-        "flarum/core": "^1.4"
+        "flarum/core": "^1.5"
     },
     "autoload": {
         "psr-4": {
diff --git a/framework/core/src/Foundation/Application.php b/framework/core/src/Foundation/Application.php
index dff5fc8a8..2f22ac4f5 100644
--- a/framework/core/src/Foundation/Application.php
+++ b/framework/core/src/Foundation/Application.php
@@ -21,7 +21,7 @@ class Application
      *
      * @var string
      */
-    const VERSION = '1.5.0-dev';
+    const VERSION = '1.5.0';
 
     /**
      * The IoC container for the Flarum application.
diff --git a/php-packages/testing/composer.json b/php-packages/testing/composer.json
index 761006d1d..3969df565 100644
--- a/php-packages/testing/composer.json
+++ b/php-packages/testing/composer.json
@@ -9,7 +9,7 @@
     "license": "MIT",
     "require": {
         "ext-json": "*",
-        "mockery/mockery": "^1.4",
+        "mockery/mockery": "^1.5",
         "phpunit/phpunit": "^9.0"
     },
     "require-dev": {