diff --git a/gui-wm/miracle-wm/Manifest b/gui-wm/miracle-wm/Manifest
index 5e3959eecb..2397f31bf1 100644
--- a/gui-wm/miracle-wm/Manifest
+++ b/gui-wm/miracle-wm/Manifest
@@ -1,2 +1,3 @@
DIST miracle-wm-0.8.2.tar.gz 1188240 BLAKE2B 1aa8b45040f0e32fba94f3c2c692f3b812828eebd46bc0945077d7656e08d2990804cc42adb741d8a3f1a39bbd4f3dc32b7c8b5e2722ca08a6571fcebb62e5bb SHA512 2bbfcc8a1595013f396ef6aa2c57175efd455cc7c3633dfac86125eec38bbb6ea26e71e8050529e3b45c07545ff3e947fe24dd55dd2502d4ae07aa267144c4e0
DIST miracle-wm-0.8.3.tar.gz 1186888 BLAKE2B c4c693356c2792a0a2b03a65f9b99a2655112d54d36f47c06b5fbae96a4469c597f441ce32e1e989a75ac8fcaa5b8b4ff4b6246d172d0cc8b33dcaf0a2ee0979 SHA512 c9341976811a391340804ed536711160da798d1a25be737846f766495c8bc36ee942fcb117f3ae41fe18e102b7777beac3e4395e02a82d7754ba5f59a0a7eb66
+DIST miracle-wm-0.9.0.tar.gz 2655079 BLAKE2B c7f98a3179090b87e694a6fc7310093820ec926211a3e0d790b5b872b10f25bec5bcb25992928e0ff8179a725088267ba8dc9c5f7a35c65c7f2ed4e8c95185b4 SHA512 866d8947f45a1c8fae0964a9d1f70af5a3e6c359ca2f1a7b2005d340ffbff43361ca39da30a9ddcd47f637f37fc203372b7097a6a279e982eb119b8870199fef
diff --git a/gui-wm/miracle-wm/files/miracle-wm-0.9.0-add-missing-headers.patch b/gui-wm/miracle-wm/files/miracle-wm-0.9.0-add-missing-headers.patch
new file mode 100644
index 0000000000..76b9197e4c
--- /dev/null
+++ b/gui-wm/miracle-wm/files/miracle-wm-0.9.0-add-missing-headers.patch
@@ -0,0 +1,64 @@
+Add missing headers for no PCH build.
+--- a/src/shell_application_spawner.h
++++ b/src/shell_application_spawner.h
+@@ -19,6 +19,7 @@ along with this program. If not, see .
+ #define MIRACLE_WM_SHELL_APPLICATION_SPAWNER_H
+
+ #include
++#include
+
+ namespace miracle
+ {
+diff --git a/src/window_container.h b/src/window_container.h
+index e73c08f..88277bd 100644
+--- a/src/window_container.h
++++ b/src/window_container.h
+@@ -21,6 +21,7 @@ along with this program. If not, see .
+ #include "container.h"
+ #include "container_effect.h"
+ #include "synchronized_recursive.h"
++#include
+ #include
+
+ namespace miracle
+--- a/src/container_effect.h
++++ b/src/container_effect.h
+@@ -17,6 +17,7 @@ along with this program. If not, see .
+
+ #ifndef MIRACLE_CONTAINER_EFFECT_H
+ #define MIRACLE_CONTAINER_EFFECT_H
++#include
+ #include
+
+ namespace miracle
+--- a/src/plugin_managed_container.cpp
++++ b/src/plugin_managed_container.cpp
+@@ -21,6 +21,7 @@ along with this program. If not, see .
+ #include "compositor_state.h"
+ #include "container_listener.h"
+ #include "window_controller.h"
++#include
+ #include
+
+ using namespace miracle;
+--- a/src/freestyle_window_container.cpp
++++ b/src/freestyle_window_container.cpp
+@@ -23,6 +23,7 @@ along with this program. If not, see .
+ #include "container_listener.h"
+ #include "direction.h"
+ #include "window_controller.h"
++#include
+ #include
+
+ using namespace miracle;
+ --- a/src/plugin_handle.h
++++ b/src/plugin_handle.h
+@@ -15,7 +15,9 @@ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+ **/
+
++#include
++
+ namespace miracle
+ {
+ typedef uint32_t PluginHandle;
diff --git a/gui-wm/miracle-wm/files/miracle-wm-0.9.0-conditional-tests.patch b/gui-wm/miracle-wm/files/miracle-wm-0.9.0-conditional-tests.patch
new file mode 100644
index 0000000000..f0e0386850
--- /dev/null
+++ b/gui-wm/miracle-wm/files/miracle-wm-0.9.0-conditional-tests.patch
@@ -0,0 +1,26 @@
+Build tests only when requested.
+--- a/miracle-wm-c/CMakeLists.txt
++++ b/miracle-wm-c/CMakeLists.txt
+@@ -5,7 +5,9 @@ pkg_check_modules(MIRAL miral REQUIRED)
+ pkg_check_modules(YAML REQUIRED IMPORTED_TARGET yaml-cpp)
+ pkg_check_modules(XKBCOMMON REQUIRED xkbcommon)
+ pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0)
++if(ENABLE_TESTS)
+ find_package(GTest REQUIRED)
++endif()
+
+ add_library(miracle-wm-c
+ SHARED
+@@ -62,6 +64,7 @@ install(
+ )
+
+ # Tests
++if(ENABLE_TESTS)
+ add_executable(test_miracle_wm_c_api
+ tests/test_config_c.cpp
+ tests/test_config_cpp.cpp
+@@ -86,3 +89,4 @@ target_link_libraries(test_miracle_wm_c_api
+ )
+
+ add_test(NAME test_miracle_wm_c_api COMMAND test_miracle_wm_c_api)
++endif()
diff --git a/gui-wm/miracle-wm/files/miracle-wm-0.9.0-disable-mirtest.patch b/gui-wm/miracle-wm/files/miracle-wm-0.9.0-disable-mirtest.patch
new file mode 100644
index 0000000000..3ada8f352c
--- /dev/null
+++ b/gui-wm/miracle-wm/files/miracle-wm-0.9.0-disable-mirtest.patch
@@ -0,0 +1,11 @@
+mirtest is not packaged and only used for end to end tests.
+--- a/tests/CMakeLists.txt
++++ b/tests/CMakeLists.txt
+@@ -10,7 +10,6 @@ include_directories(
+ find_package(PkgConfig)
+ pkg_check_modules(MIRAL miral REQUIRED)
+ pkg_check_modules(MIRSERVER mirserver REQUIRED)
+-pkg_check_modules(MIRTEST mirtest REQUIRED)
+ pkg_check_modules(YAML REQUIRED IMPORTED_TARGET yaml-cpp)
+ find_package(GTest REQUIRED)
+ find_package(nlohmann_json 3.2.0 REQUIRED)
diff --git a/gui-wm/miracle-wm/miracle-wm-0.9.0.ebuild b/gui-wm/miracle-wm/miracle-wm-0.9.0.ebuild
new file mode 100644
index 0000000000..62f7fbff05
--- /dev/null
+++ b/gui-wm/miracle-wm/miracle-wm-0.9.0.ebuild
@@ -0,0 +1,83 @@
+# Copyright 2024-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+PYTHON_COMPAT=( python3_{13..14} )
+
+inherit cmake python-single-r1
+
+DESCRIPTION="Tiling Wayland compositor based on Mir"
+HOMEPAGE="https://github.com/miracle-wm-org/miracle-wm"
+SRC_URI="https://github.com/miracle-wm-org/miracle-wm/archive/refs/tags/v${PV}.tar.gz -> ${P}.tar.gz"
+
+LICENSE="GPL-3+ MIT"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE="systemd test"
+REQUIRED_USE="systemd? ( ${PYTHON_REQUIRED_USE} )"
+RESTRICT="!test? ( test )"
+
+COMMON_DEPEND="
+ dev-cpp/yaml-cpp:=
+ dev-cpp/nlohmann_json
+ dev-libs/glib:2
+ dev-libs/json-c:=
+ dev-libs/libevdev
+ dev-libs/libpcre2:=
+ dev-libs/wayland
+ >=gui-libs/mir-2.18:=
+ media-libs/libglvnd
+ x11-base/xwayland
+ x11-libs/libxkbcommon
+"
+RDEPEND="
+ ${COMMON_DEPEND}
+ systemd? (
+ ${PYTHON_DEPS}
+ $(python_gen_cond_dep '
+ dev-python/dbus-next[${PYTHON_USEDEP}]
+ dev-python/tenacity[${PYTHON_USEDEP}]
+ ')
+ )
+"
+DEPEND="
+ ${COMMON_DEPEND}
+ media-libs/glm
+"
+BDEPEND="
+ virtual/pkgconfig
+ test? ( dev-cpp/gtest )
+"
+
+PATCHES=(
+ "${FILESDIR}/${PN}-0.9.0-conditional-tests.patch"
+ "${FILESDIR}/${PN}-0.9.0-disable-mirtest.patch"
+ "${FILESDIR}/${PN}-0.7.0-no-automagic.patch"
+ "${FILESDIR}/${PN}-0.9.0-add-missing-headers.patch"
+)
+
+pkg_setup() {
+ use systemd && python-single-r1_pkg_setup
+}
+
+src_prepare() {
+ cmake_src_prepare
+ use test || cmake_comment_add_subdirectory tests/
+ use systemd && python_fix_shebang session/usr/bin/libexec/miracle-wm-wait-sni-ready
+}
+
+src_configure() {
+ local mycmakeargs=(
+ -DSYSTEMD_INTEGRATION=$(usex systemd)
+ -DENABLE_TESTS=$(usex test)
+ # depends on wasmedge, which is not available as a package
+ -DFEATURE_PLUGIN_SYSTEM=OFF
+ )
+ cmake_src_configure
+}
+
+src_test() {
+ "${BUILD_DIR}/tests/miracle-wm-tests" || die
+ "${BUILD_DIR}/miracle-wm-c/test_miracle_wm_c_api" || die
+}