diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,36 +1,40 @@
-## [1.0.0] - 2022-11-03
+## [2.0.0] - November 5, 2023
 
+- Update to `termbox-2.0.0`
+
+## [1.0.0] - November 2, 2022
+
 - Rework `run` type
 - Bump to `termbox-1.1.0`, whose API changes are visible here, too
 
-## [0.4.0] - 2022-07-16
+## [0.4.0] - July 16, 2022
 
 - Parameterize `TermboxEvent` (now `Event`) by user event
 - Add `Program` type alias for readability
 - Remove `TermboxEvent` alias
 - Drop GHC 8.2 support
 
-## [0.3.1] - 2022-04-02
+## [0.3.1] - April 2, 2022
 
 - Remove example executables
 
-## [0.3.0] - 2020-09-20
+## [0.3.0] - September 20, 2020
 
 - Support GHC 8.8, GHC 8.10
 - Depend on `termbox ==0.3`
 - Remove `Scene`
 
-## [0.2.0] - 2019-06-28
+## [0.2.0] - June 29, 2019
 
 - Add `run`
 - Rename `main` to `run_`
 - Bump `termbox` lower bound
 
-## [0.1.1] - 2019-04-19
+## [0.1.1] - April 19, 2019
 
 - Remov unnecessary `stm` dependency
 - Bump `base` upper bound
 
-## [0.1.0] - 2018-07-22
+## [0.1.0] - July 22, 2018
 
 - Initial release
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright 2018-2022 Mitchell Rosen
+Copyright 2018-2023 Mitchell Rosen
 
 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
 
diff --git a/examples/QuickStart.hs b/examples/QuickStart.hs
new file mode 100644
--- /dev/null
+++ b/examples/QuickStart.hs
@@ -0,0 +1,53 @@
+{-# LANGUAGE BlockArguments #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE ImportQualifiedPost #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedRecordDot #-}
+
+module Main (main) where
+
+import Data.Foldable (fold)
+import Data.Function ((&))
+import Reactive.Banana ((<@>))
+import Reactive.Banana qualified as Banana
+import Termbox.Banana qualified as Termbox
+
+main :: IO ()
+main = do
+  result <- Termbox.run network
+  putStrLn case result of
+    Left err -> "Termbox program failed to initialize: " ++ show err
+    Right state -> "Final state: " ++ show state
+
+network :: (Banana.MonadMoment m) => Termbox.Inputs -> m (Termbox.Outputs Int)
+network inputs = do
+  keysPressed <- Banana.accumB 0 ((+ 1) <$ inputs.keys)
+  pure
+    Termbox.Outputs
+      { scene = render <$> keysPressed,
+        done = Banana.filterJust (isDone <$> keysPressed <@> inputs.keys)
+      }
+  where
+    isDone :: Int -> Termbox.Key -> Maybe Int
+    isDone n = \case
+      Termbox.KeyEsc -> Just n
+      _ -> Nothing
+
+render :: Int -> Termbox.Scene
+render keysPressed =
+  fold
+    [ string ("Number of keys pressed: " ++ show keysPressed),
+      fold
+        [ string "Press",
+          string "Esc" & Termbox.bold & Termbox.atCol 6,
+          string "to quit." & Termbox.atCol 10
+        ]
+        & Termbox.atRow 2
+    ]
+    & Termbox.at Termbox.Pos {row = 2, col = 4}
+    & Termbox.image
+
+string :: [Char] -> Termbox.Image
+string chars =
+  zip [0 ..] chars & foldMap \(i, char) ->
+    Termbox.char char & Termbox.atCol i
diff --git a/src/Termbox/Banana.hs b/src/Termbox/Banana.hs
--- a/src/Termbox/Banana.hs
+++ b/src/Termbox/Banana.hs
@@ -6,116 +6,130 @@
 --
 -- * @<https://hackage.haskell.org/package/termbox-tea termbox-tea>@, an Elm Architecture interface.
 --
--- This module is intended to be imported qualified.
---
 -- ==== __👉 Quick start example__
 --
 -- This @termbox@ program displays the number of keys pressed.
 --
 -- @
+-- {-\# LANGUAGE BlockArguments \#-}
 -- {-\# LANGUAGE DuplicateRecordFields \#-}
 -- {-\# LANGUAGE ImportQualifiedPost \#-}
 -- {-\# LANGUAGE LambdaCase \#-}
 -- {-\# LANGUAGE OverloadedRecordDot \#-}
--- {-\# LANGUAGE OverloadedStrings \#-}
--- {-\# LANGUAGE NoFieldSelectors \#-}
 --
+-- module Main (main) where
+--
 -- import Data.Foldable (fold)
+-- import Data.Function ((&))
 -- import Reactive.Banana ((\<\@\>))
 -- import Reactive.Banana qualified as Banana
 -- import Termbox.Banana qualified as Termbox
 --
 -- main :: IO ()
--- main =
---   Termbox.'run' network \>\>= \\case
---     Left err -\> putStrLn (\"Termbox program failed to initialize: \" ++ show err)
---     Right n -\> putStrLn (\"Pressed \" ++ show n ++ \" keys.\")
+-- main = do
+--   result \<- Termbox.'run' network
+--   putStrLn case result of
+--     Left err -\> \"Termbox program failed to initialize: \" ++ show err
+--     Right state -\> \"Final state: \" ++ show state
 --
--- network :: Banana.MonadMoment m =\> Termbox.'Inputs' -\> m (Termbox.'Outputs' Int)
+-- network :: (Banana.MonadMoment m) =\> Termbox.'Inputs' -\> m (Termbox.'Outputs' Int)
 -- network inputs = do
---   keysPressed <- Banana.accumB 0 ((+ 1) \<$ inputs.keys)
+--   keysPressed \<- Banana.accumB 0 ((+ 1) \<$ inputs.keys)
 --   pure
 --     Termbox.'Outputs'
 --       { scene = render \<$\> keysPressed,
 --         done = Banana.filterJust (isDone \<$\> keysPressed \<\@\> inputs.keys)
 --       }
 --   where
---     isDone :: Int -\> Termbox.'Termbox.Banana.Key' -\> Maybe Int
+--     isDone :: Int -\> Termbox.'Key' -\> Maybe Int
 --     isDone n = \\case
---       Termbox.'Termbox.Banana.KeyEsc' -\> Just n
+--       Termbox.'KeyEsc' -\> Just n
 --       _ -\> Nothing
 --
--- render :: Int -\> Termbox.'Termbox.Banana.Scene'
+-- render :: Int -\> Termbox.'Scene'
 -- render keysPressed =
 --   fold
---     [ string
---         Termbox.'Termbox.Banana.Pos' {row = 2, col = 4}
---         (\"Number of keys pressed: \" ++ map Termbox.'Termbox.Banana.char' (show keysPressed)),
---       string
---         Termbox.'Termbox.Banana.Pos' {row = 4, col = 4}
---         (\"Press \" ++ map (Termbox.'Termbox.Banana.bold' . Termbox.'Termbox.Banana.char') \"Esc\" ++ \" to quit.\")
+--     [ string (\"Number of keys pressed: \" ++ show keysPressed),
+--       fold
+--         [ string \"Press\",
+--           string \"Esc\" & Termbox.'bold' & Termbox.'atCol' 6,
+--           string \"to quit.\" & Termbox.'atCol' 10
+--         ]
+--         & Termbox.'atRow' 2
 --     ]
+--     & Termbox.'at' Termbox.'Pos' {row = 2, col = 4}
+--     & Termbox.'image'
 --
--- string :: Termbox.'Termbox.Banana.Pos' -\> [Termbox.'Termbox.Banana.Cell'] -\> Termbox.'Termbox.Banana.Scene'
--- string pos cells =
---   foldMap (\\(i, cell) -\> Termbox.'Termbox.Banana.cell' (Termbox.'Termbox.Banana.posRight' i pos) cell) (zip [0 ..] cells)
+-- string :: [Char] -\> Termbox.'Image'
+-- string chars =
+--   zip [0 ..] chars & foldMap \\(i, char) -\>
+--     Termbox.'char' char & Termbox.'atCol' i
 -- @
 module Termbox.Banana
   ( -- * Main
     Inputs (..),
     Outputs (..),
     run,
-    Termbox.InitError (..),
+    InitError (..),
 
     -- * Terminal contents
 
     -- ** Scene
-    Termbox.Scene,
-    Termbox.cell,
-    Termbox.fill,
-    Termbox.cursor,
+    Scene,
+    image,
+    fill,
+    cursor,
 
-    -- ** Cell
-    Termbox.Cell,
-    Termbox.char,
-    Termbox.fg,
-    Termbox.bg,
-    Termbox.bold,
-    Termbox.underline,
-    Termbox.blink,
+    -- ** Image
+    Image,
+    char,
 
+    -- *** Color
+    fg,
+    bg,
+
+    -- *** Style
+    bold,
+    underline,
+    blink,
+
+    -- *** Translation
+    at,
+    atRow,
+    atCol,
+
     -- ** Colors
-    Termbox.Color,
+    Color,
 
     -- *** Basic colors
-    Termbox.defaultColor,
-    Termbox.red,
-    Termbox.green,
-    Termbox.yellow,
-    Termbox.blue,
-    Termbox.magenta,
-    Termbox.cyan,
-    Termbox.white,
-    Termbox.bright,
+    defaultColor,
+    red,
+    green,
+    yellow,
+    blue,
+    magenta,
+    cyan,
+    white,
+    bright,
 
     -- *** 216 miscellaneous colors
-    Termbox.color,
+    color,
 
     -- *** 24 monochrome colors
-    Termbox.gray,
+    gray,
 
     -- * Event handling
-    Termbox.Key (..),
-    Termbox.Mouse (..),
-    Termbox.MouseButton (..),
+    Key (..),
+    Mouse (..),
+    MouseButton (..),
 
     -- * Miscellaneous types
-    Termbox.Pos (..),
-    Termbox.posUp,
-    Termbox.posDown,
-    Termbox.posLeft,
-    Termbox.posRight,
-    Termbox.Size (..),
+    Pos (..),
+    posUp,
+    posDown,
+    posLeft,
+    posRight,
+    Size (..),
   )
 where
 
@@ -124,24 +138,64 @@
 import Data.Void (Void)
 import qualified Reactive.Banana as Banana
 import qualified Reactive.Banana.Frameworks as Banana
-import qualified Termbox
+import Termbox
+  ( Color,
+    Image,
+    InitError (..),
+    Key (..),
+    Mouse (..),
+    MouseButton (..),
+    Pos (..),
+    Scene,
+    Size (..),
+    at,
+    atCol,
+    atRow,
+    bg,
+    blink,
+    blue,
+    bold,
+    bright,
+    char,
+    color,
+    cursor,
+    cyan,
+    defaultColor,
+    fg,
+    fill,
+    getSize,
+    gray,
+    green,
+    image,
+    magenta,
+    poll,
+    posDown,
+    posLeft,
+    posRight,
+    posUp,
+    red,
+    underline,
+    white,
+    yellow,
+  )
+import qualified Termbox (Event (..), render, run)
 
 -- | The inputs to a @termbox@ FRP network.
 data Inputs = Inputs
   { -- | The initial terminal size.
-    initialSize :: !Termbox.Size,
+    initialSize :: !Size,
     -- | Key events.
-    keys :: !(Banana.Event Termbox.Key),
+    keys :: !(Banana.Event Key),
     -- | Resize events.
-    resizes :: !(Banana.Event Termbox.Size),
+    resizes :: !(Banana.Event Size),
     -- | Mouse events.
-    mouses :: !(Banana.Event Termbox.Mouse)
+    mouses :: !(Banana.Event Mouse)
   }
 
 -- | The outputs from a @termbox@ FRP network.
 data Outputs a = Outputs
   { -- | The scene to render.
-    scene :: !(Banana.Behavior Termbox.Scene),
+    scene :: !(Banana.Behavior Scene),
     -- | The events of arbitrary values, on the first of which is relevant, which causes 'run' to return.
     --
     -- /Note/: Wrapping this event in 'Banana.once' is not necessary, as this library does so internally.
@@ -158,13 +212,13 @@
   -- | The FRP network.
   (Inputs -> Banana.MomentIO (Outputs a)) ->
   -- | The result of the FRP network.
-  IO (Either Termbox.InitError a)
+  IO (Either InitError a)
 run program =
   Termbox.run (run_ program)
 
 run_ :: (Inputs -> Banana.MomentIO (Outputs a)) -> IO a
 run_ program = do
-  initialSize <- Termbox.getSize
+  initialSize <- getSize
 
   doneVar <- newEmptyMVar
   (keysAddHandler, fireKey) <- Banana.newAddHandler
@@ -191,7 +245,7 @@
   Banana.actuate network
 
   let loop = do
-        Termbox.poll @Void >>= \case
+        poll @Void >>= \case
           Termbox.EventKey key -> fireKey key
           Termbox.EventResize size -> fireResize size
           Termbox.EventMouse mouse -> fireMouse mouse
diff --git a/termbox-banana.cabal b/termbox-banana.cabal
--- a/termbox-banana.cabal
+++ b/termbox-banana.cabal
@@ -1,49 +1,42 @@
 cabal-version: 2.4
 
 author: Mitchell Rosen
-bug-reports: https://github.com/mitchellwrosen/termbox-banana/issues
+bug-reports: https://github.com/termbox/termbox-haskell/issues
 build-type: Simple
 category: User Interfaces
-copyright: (c) 2018-2022, Mitchell Rosen
+copyright: (c) 2018-2023, Mitchell Rosen
 description:
   This package provides a @reactive-banana@ FRP interface to @termbox@ programs.
   .
   See also:
   .
   * @<https://hackage.haskell.org/package/termbox-tea termbox-tea>@ for an Elm Architecture interface.
-homepage: https://github.com/mitchellwrosen/termbox-banana
+homepage: https://github.com/termbox/termbox-haskell
 license: BSD-3-Clause
 license-file: LICENSE
 maintainer: Mitchell Rosen <mitchellwrosen@gmail.com>
 name: termbox-banana
 synopsis: termbox + reactive-banana
-tested-with: GHC == 9.0.2, GHC == 9.2.4, GHC == 9.4.2
-version: 1.0.0
+tested-with: GHC == 9.2.7, GHC == 9.4.4, GHC == 9.6.1
+version: 2.0.0
 
-extra-source-files:
+extra-doc-files:
   CHANGELOG.md
 
 source-repository head
   type: git
-  location: git://github.com/mitchellwrosen/termbox-banana.git
+  location: git://github.com/awkward-squad/termbox.git
+  subdir: termbox-banana
 
-library
-  build-depends:
-    base ^>= 4.13 || ^>= 4.14 || ^>= 4.15 || ^>= 4.16 || ^>= 4.17,
-    reactive-banana ^>= 1.3,
-    termbox ^>= 1.1.0,
-  default-extensions:
-    BlockArguments
-    DerivingStrategies
-    GeneralizedNewtypeDeriving
-    InstanceSigs
-    LambdaCase
-    NamedFieldPuns
-    TypeApplications
+flag build-examples
+  default: False
+  manual: True
+
+common component
   default-language: Haskell2010
-  exposed-modules: Termbox.Banana
   ghc-options:
     -Weverything
+    -Wno-all-missed-specialisations
     -Wno-implicit-prelude
     -Wno-missing-import-lists
     -Wno-missing-local-signatures
@@ -57,4 +50,34 @@
   if impl(ghc >= 9.2)
     ghc-options:
       -Wno-missing-kind-signatures
+  if impl(ghc >= 9.8)
+    ghc-options:
+      -Wno-missing-role-annotations
+
+library
+  import: component
+  build-depends:
+    base ^>= 4.13 || ^>= 4.14 || ^>= 4.15 || ^>= 4.16 || ^>= 4.17 || ^>= 4.18 || ^>= 4.19,
+    reactive-banana ^>= 1.3,
+    termbox ^>= 2.0.0,
+  default-extensions:
+    BlockArguments
+    DerivingStrategies
+    GeneralizedNewtypeDeriving
+    InstanceSigs
+    LambdaCase
+    NamedFieldPuns
+    TypeApplications
+  exposed-modules: Termbox.Banana
   hs-source-dirs: src
+
+executable termbox-banana-example-quick-start
+  import: component
+  if !flag(build-examples)
+    buildable: False
+  build-depends:
+    base,
+    reactive-banana,
+    termbox-banana,
+  hs-source-dirs: examples
+  main-is: QuickStart.hs
