diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # Changelog for keid-frp-banana
 
+## 0.1.2.0
+
+- Switched to `geomancy-layout`.
+
 ## 0.1.1.0
 
 - Added more `Engine.Window.*` wrappers to `Engine.ReactiveBanana.Window`.
diff --git a/keid-frp-banana.cabal b/keid-frp-banana.cabal
--- a/keid-frp-banana.cabal
+++ b/keid-frp-banana.cabal
@@ -1,16 +1,16 @@
 cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.34.4.
+-- This file has been generated from package.yaml by hpack version 0.35.2.
 --
 -- see: https://github.com/sol/hpack
 
 name:           keid-frp-banana
-version:        0.1.1.0
+version:        0.1.2.0
 synopsis:       Reactive Banana integration for Keid engine.
 category:       Game Engine
 author:         IC Rainbow
 maintainer:     keid@aenor.ru
-copyright:      2022 IC Rainbow
+copyright:      2023 IC Rainbow
 license:        BSD3
 license-file:   LICENSE
 build-type:     Simple
@@ -36,68 +36,38 @@
   default-extensions:
       NoImplicitPrelude
       ApplicativeDo
-      BangPatterns
       BinaryLiterals
       BlockArguments
-      ConstrainedClassMethods
-      ConstraintKinds
       DataKinds
       DefaultSignatures
-      DeriveDataTypeable
-      DeriveFunctor
-      DeriveGeneric
-      DeriveLift
-      DeriveTraversable
       DerivingStrategies
       DerivingVia
       DuplicateRecordFields
-      EmptyCase
-      EmptyDataDeriving
-      ExistentialQuantification
-      ExplicitForAll
-      FlexibleContexts
-      FlexibleInstances
       FunctionalDependencies
-      GADTs
-      GeneralizedNewtypeDeriving
       HexFloatLiterals
       ImportQualifiedPost
-      InstanceSigs
-      KindSignatures
       LambdaCase
-      LiberalTypeSynonyms
-      MultiParamTypeClasses
       NamedFieldPuns
-      NamedWildCards
       NumDecimals
-      NumericUnderscores
+      OverloadedRecordDot
       OverloadedStrings
       PatternSynonyms
-      PostfixOperators
-      QuantifiedConstraints
       QuasiQuotes
-      RankNTypes
       RecordWildCards
-      ScopedTypeVariables
-      StandaloneDeriving
-      StandaloneKindSignatures
       StrictData
       TemplateHaskell
-      TupleSections
-      TypeApplications
       TypeFamilies
       TypeOperators
-      TypeSynonymInstances
-      UnicodeSyntax
       ViewPatterns
   ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wpartial-fields -Wredundant-constraints
   build-depends:
       base >=4.7 && <5
-    , geomancy >=0.2.4.0
-    , keid-core >=0.1.6.1
+    , geomancy >=0.2.6.0
+    , geomancy-layout
+    , keid-core >=0.1.9.0
     , reactive-banana >=1.3.0.0
     , resourcet
     , rio >=0.1.12.0
     , these
     , vulkan
-  default-language: Haskell2010
+  default-language: GHC2021
diff --git a/src/Engine/ReactiveBanana/Window.hs b/src/Engine/ReactiveBanana/Window.hs
--- a/src/Engine/ReactiveBanana/Window.hs
+++ b/src/Engine/ReactiveBanana/Window.hs
@@ -6,7 +6,6 @@
 import Engine.ReactiveBanana (eventHandler)
 import Engine.Types (StageRIO)
 import Engine.Types qualified as Engine
-import Engine.UI.Layout qualified as Layout
 import Engine.Window.CursorPos qualified as CursorPos
 import Engine.Window.Drop qualified as Drop
 import Engine.Window.Key qualified as Key
@@ -14,6 +13,7 @@
 import Engine.Window.Scroll qualified as Scroll
 import Engine.Worker qualified as Worker
 import Geomancy (Vec2, vec2, (^/))
+import Geomancy.Layout.Box (Box(..), box_)
 import GHC.Float (double2Float)
 import Reactive.Banana ((<@>), (<@>))
 import Reactive.Banana qualified as RB
@@ -73,7 +73,7 @@
 -- | Screen-sized layout base.
 setupScreenBox
   :: (forall a. StageRIO env a -> RBF.MomentIO a)
-  -> RBF.MomentIO (RB.Behavior Layout.Box)
+  -> RBF.MomentIO (RB.Behavior Box)
 setupScreenBox unlift = do
   screenExtent <- unlift Engine.askScreenVar >>=
     RBF.fromPoll . Worker.getOutputData
@@ -87,11 +87,8 @@
             (fromIntegral height)
 
     screenBox =
-      screenSize <&> \size ->
-        Layout.Box
-          { boxPosition = 0 -- XXX: since Camera.spawnOrthoPixelsCentered
-          , boxSize     = size
-          }
+      -- XXX: since Camera.spawnOrthoPixelsCentered
+      fmap box_ screenSize
 
   pure screenBox
 
@@ -99,7 +96,7 @@
 setupCursorPos
   :: RB.MonadMoment m
   => m (RB.Event (Double, Double))
-  -> RB.Behavior Layout.Box
+  -> RB.Behavior Box
   -> m (RB.Event Vec2, RB.Behavior Vec2)
 setupCursorPos fromCursorPos screenBox = do
   cursorPosRawE <- fromCursorPos
@@ -110,10 +107,10 @@
     cursorPosE
   pure (cursorPosE, cursorPos)
   where
-    convertPos Layout.Box{boxSize} (cx, cy) =
+    convertPos Box{size} (cx, cy) =
       -- XXX: since Camera.spawnOrthoPixelsCentered
       vec2 (double2Float cx) (double2Float cy) -
-      boxSize ^/ 2
+      size ^/ 2
 
 -- | Set up a per-button collection of fused (position, modifier) click ("button pressed") events.
 setupMouseClicks
