diff --git a/CHANGES.md b/CHANGES.md
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,10 +1,10 @@
 <!--
-       _ 
+       _
  _   _(_)
 | | | | |
 | |_| | |
  \__,_|_|
-         
+
 Breaking changes
 
 Fixes
@@ -21,6 +21,23 @@
 User-visible changes in hledger-ui.
 See also the hledger changelog.
 
+# 1.33 2024-04-18
+
+Fixes
+
+- Require process 1.6.19.0+ to avoid any vulnerabilities on Windows from
+  [HSEC-2024-0003](https://haskell.github.io/security-advisories/advisory/HSEC-2024-0003.html).
+
+Features
+
+- Add a `dark` theme. (Jonathan Dowland)
+
+Improvements
+
+- Allow building with GHC 9.8.
+
+- Require safe >=0.3.20.
+
 # 1.32.3 2024-01-28
 
 - Use hledger-1.32.3
@@ -42,10 +59,10 @@
 - Allow megaparsec 9.6
 
 # 1.32.1 2023-12-07
-
 - Use hledger-1.32.1
 
 # 1.32 2023-12-01
+
 Fixes
 
 - The V key now preserves the valuation mode specified at the command
@@ -53,6 +70,8 @@
 
 - The hledger-ui package no longer wastefully builds its modules
   twice.
+
+- Add upper bounds for vty & brick.
 
 # 1.31 2023-09-03
 
diff --git a/Hledger/UI/AccountsScreen.hs b/Hledger/UI/AccountsScreen.hs
--- a/Hledger/UI/AccountsScreen.hs
+++ b/Hledger/UI/AccountsScreen.hs
@@ -1,5 +1,6 @@
 -- The accounts screen, showing accounts and balances like the CLI balance command.
 
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE TupleSections #-}
@@ -23,7 +24,11 @@
 import Brick.Widgets.Edit
 import Control.Monad
 import Control.Monad.IO.Class (liftIO)
+#if MIN_VERSION_base(4,19,0)
+import Data.List hiding (reverse, (!?))
+#else
 import Data.List hiding (reverse)
+#endif
 import Data.Maybe
 import qualified Data.Text as T
 import Data.Time.Calendar (Day)
@@ -80,7 +85,7 @@
             displayitems = ass ^. assList . listElementsL
 
             acctwidths = V.map (\AccountsScreenItem{..} -> asItemIndentLevel + realLength asItemDisplayAccountName) displayitems
-            balwidths  = V.map (maybe 0 (wbWidth . showMixedAmountB oneLine) . asItemMixedAmount) displayitems
+            balwidths  = V.map (maybe 0 (wbWidth . showMixedAmountB oneLineNoCostFmt) . asItemMixedAmount) displayitems
             preferredacctwidth = V.maximum acctwidths
             totalacctwidthseen = V.sum acctwidths
             preferredbalwidth  = V.maximum balwidths
@@ -169,7 +174,7 @@
       splitAmounts balBuilder
       where
         balBuilder = maybe mempty showamt asItemMixedAmount
-        showamt = showMixedAmountB oneLine{displayMinWidth=Just balwidth, displayMaxWidth=Just balwidth}
+        showamt = showMixedAmountB oneLineNoCostFmt{displayMinWidth=Just balwidth, displayMaxWidth=Just balwidth}
         balspace = T.replicate (2 + balwidth - wbWidth balBuilder) " "
         splitAmounts = foldr1 (<+>) . intersperse (str ", ") . map renderamt . T.splitOn ", " . wbToText
         renderamt :: T.Text -> Widget Name
diff --git a/Hledger/UI/RegisterScreen.hs b/Hledger/UI/RegisterScreen.hs
--- a/Hledger/UI/RegisterScreen.hs
+++ b/Hledger/UI/RegisterScreen.hs
@@ -19,7 +19,11 @@
 import Control.Monad
 import Control.Monad.IO.Class (liftIO)
 import Data.Bifunctor (bimap, Bifunctor (second))
+#if MIN_VERSION_base(4,19,0)
+import Data.List hiding ((!?))
+#else
 import Data.List
+#endif
 import Data.Maybe
 import qualified Data.Text as T
 import qualified Data.Vector as V
diff --git a/Hledger/UI/Theme.hs b/Hledger/UI/Theme.hs
--- a/Hledger/UI/Theme.hs
+++ b/Hledger/UI/Theme.hs
@@ -21,9 +21,10 @@
 import Data.Maybe
 import Graphics.Vty
 import Brick
+import Safe (headErr)
 
 defaultTheme :: AttrMap
-defaultTheme = fromMaybe (snd $ head themesList) $ getTheme "white"
+defaultTheme = fromMaybe (snd $ headErr themesList) $ getTheme "white"  -- PARTIAL headErr succeeds because themesList is non-null
   -- the theme named here should exist;
   -- otherwise it will take the first one from the list,
   -- which must be non-empty.
@@ -101,6 +102,29 @@
     (attrName "border"                                         , white `on` black),
     (attrName "list"                                           , defAttr),
     (attrName "list" <> attrName "selected"                             , defAttr & reverseVideo)
+  ])
+
+  ,("dark", attrMap (white `on` black & dim) [
+      (attrName "border"                                                                   , white `on` black)
+    , (attrName "border" <> attrName "bold"                                                , currentAttr & bold)
+    , (attrName "border" <> attrName "depth"                                               , active)
+    , (attrName "border" <> attrName "filename"                                            , currentAttr)
+    , (attrName "border" <> attrName "key"                                                 , active)
+    , (attrName "border" <> attrName "minibuffer"                                          , white `on` black & bold)
+    , (attrName "border" <> attrName "query"                                               , active)
+    , (attrName "border" <> attrName "selected"                                            , active)
+    , (attrName "error"                                                                    , fg red)
+    , (attrName "help"                                                                     , currentAttr & bold)
+    , (attrName "help" <> attrName "heading"                                               , fg blue)
+    , (attrName "help" <> attrName "key"                                                   , active)
+    , (attrName "list" <> attrName "amount" <> attrName "decrease"                         , fg red)
+    , (attrName "list" <> attrName "amount" <> attrName "decrease" <> attrName "selected"  , red `on` black & bold)
+    , (attrName "list" <> attrName "balance"                                               , currentAttr)
+    , (attrName "list" <> attrName "balance" <> attrName "negative"                        , fg red)
+    , (attrName "list" <> attrName "balance" <> attrName "positive"                        , fg white)
+    , (attrName "list" <> attrName "balance" <> attrName "negative" <> attrName "selected" , red `on` black    & bold)
+    , (attrName "list" <> attrName "balance" <> attrName "positive" <> attrName "selected" , yellow `on` black & bold)
+    , (attrName "list" <> attrName "selected"                                              , yellow `on` black & bold)
   ])
 
   ]
diff --git a/Hledger/UI/UIScreens.hs b/Hledger/UI/UIScreens.hs
--- a/Hledger/UI/UIScreens.hs
+++ b/Hledger/UI/UIScreens.hs
@@ -291,7 +291,7 @@
                             ,rsItemTransaction   = t
                             }
             where
-              showamt = showMixedAmountB oneLine{displayMaxWidth=Just 3}
+              showamt = showMixedAmountB oneLineNoCostFmt{displayMaxWidth=Just 3}
               wd = whichDate ropts'
 
     -- blank items are added to allow more control of scroll position; we won't allow movement over these.
diff --git a/hledger-ui.1 b/hledger-ui.1
--- a/hledger-ui.1
+++ b/hledger-ui.1
@@ -1,5 +1,5 @@
 
-.TH "HLEDGER\-UI" "1" "January 2024" "hledger-ui-1.32.3 " "hledger User Manuals"
+.TH "HLEDGER\-UI" "1" "April 2024" "hledger-ui-1.33 " "hledger User Manuals"
 
 
 
@@ -12,7 +12,7 @@
 .PD
 \f[CR]hledger ui \-\- [OPTS] [QUERYARGS]\f[R]
 .SH DESCRIPTION
-This manual is for hledger\[aq]s terminal interface, version 1.32.3.
+This manual is for hledger\[aq]s terminal interface, version 1.33.
 See also the hledger manual for common concepts and file formats.
 .PP
 hledger is a robust, user\-friendly, cross\-platform set of programs for
@@ -49,7 +49,7 @@
 \f[CR]\-w \-\-watch\f[R]
 watch for data and date changes and reload automatically
 .TP
-\f[CR]\-\-theme=default|terminal|greenterm\f[R]
+\f[CR]\-\-theme=default|terminal|greenterm|dark\f[R]
 use this custom display theme
 .TP
 \f[CR]\-\-menu\f[R]
diff --git a/hledger-ui.cabal b/hledger-ui.cabal
--- a/hledger-ui.cabal
+++ b/hledger-ui.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           hledger-ui
-version:        1.32.3
+version:        1.33
 synopsis:       Terminal interface for the hledger accounting system
 description:    A simple terminal user interface for the hledger accounting system.
                 It can be a more convenient way to browse your accounts than the CLI.
@@ -68,11 +68,11 @@
   hs-source-dirs:
       ./
   ghc-options: -Wall -Wno-incomplete-uni-patterns -Wno-missing-signatures -Wno-orphans -Wno-type-defaults -Wno-unused-do-bind
-  cpp-options: -DVERSION="1.32.3" -DVERSION="1.32.3"
+  cpp-options: -DVERSION="1.33" -DVERSION="1.33"
   build-depends:
       ansi-terminal >=0.9
     , async
-    , base >=4.14 && <4.19
+    , base >=4.14 && <4.20
     , brick >=2.1.1 && <2.4
     , cmdargs >=0.8
     , containers >=0.5.9
@@ -82,14 +82,14 @@
     , extra >=1.6.3
     , filepath
     , fsnotify ==0.4.*
-    , hledger >=1.32.3 && <1.33
-    , hledger-lib >=1.32.3 && <1.33
+    , hledger ==1.33.*
+    , hledger-lib ==1.33.*
     , megaparsec >=7.0.0 && <9.7
     , microlens >=0.4
     , microlens-platform >=0.2.3.1
     , mtl >=2.2.1
-    , process >=1.2
-    , safe >=0.3.19
+    , process >=1.6.19.0
+    , safe >=0.3.20
     , split >=0.1
     , text >=1.2.4.1
     , text-zipper >=0.4
@@ -113,10 +113,10 @@
   hs-source-dirs:
       app
   ghc-options: -Wall -Wno-incomplete-uni-patterns -Wno-missing-signatures -Wno-orphans -Wno-type-defaults -Wno-unused-do-bind
-  cpp-options: -DVERSION="1.32.3"
+  cpp-options: -DVERSION="1.33"
   build-depends:
-      base >=4.14 && <4.19
+      base >=4.14 && <4.20
     , hledger-ui
   default-language: Haskell2010
   if flag(threaded)
-    ghc-options: -threaded
+    ghc-options: -threaded -with-rtsopts=-T
diff --git a/hledger-ui.info b/hledger-ui.info
--- a/hledger-ui.info
+++ b/hledger-ui.info
@@ -16,7 +16,7 @@
    'hledger-ui [OPTS] [QUERYARGS]'
 'hledger ui -- [OPTS] [QUERYARGS]'
 
-   This manual is for hledger's terminal interface, version 1.32.3.  See
+   This manual is for hledger's terminal interface, version 1.33.  See
 also the hledger manual for common concepts and file formats.
 
    hledger is a robust, user-friendly, cross-platform set of programs
@@ -66,7 +66,7 @@
 '-w --watch'
 
      watch for data and date changes and reload automatically
-'--theme=default|terminal|greenterm'
+'--theme=default|terminal|greenterm|dark'
 
      use this custom display theme
 '--menu'
@@ -671,46 +671,46 @@
 
 Tag Table:
 Node: Top221
-Node: OPTIONS1830
-Ref: #options1928
-Node: General help options2951
-Ref: #general-help-options3100
-Node: General input options3382
-Ref: #general-input-options3567
-Node: General reporting options4224
-Ref: #general-reporting-options4388
-Node: MOUSE7778
-Ref: #mouse7873
-Node: KEYS8110
-Ref: #keys8203
-Node: SCREENS12858
-Ref: #screens12956
-Node: Menu13536
-Ref: #menu13629
-Node: Cash accounts13824
-Ref: #cash-accounts13966
-Node: Balance sheet accounts14150
-Ref: #balance-sheet-accounts14331
-Node: Income statement accounts14451
-Ref: #income-statement-accounts14637
-Node: All accounts14801
-Ref: #all-accounts14947
-Node: Register15129
-Ref: #register15253
-Node: Transaction17537
-Ref: #transaction17660
-Node: Error19077
-Ref: #error19171
-Node: TIPS19415
-Ref: #tips19514
-Node: Watch mode19556
-Ref: #watch-mode19663
-Node: Debug output21122
-Ref: #debug-output21233
-Node: ENVIRONMENT21445
-Ref: #environment21555
-Node: BUGS21746
-Ref: #bugs21829
+Node: OPTIONS1828
+Ref: #options1926
+Node: General help options2954
+Ref: #general-help-options3103
+Node: General input options3385
+Ref: #general-input-options3570
+Node: General reporting options4227
+Ref: #general-reporting-options4391
+Node: MOUSE7781
+Ref: #mouse7876
+Node: KEYS8113
+Ref: #keys8206
+Node: SCREENS12861
+Ref: #screens12959
+Node: Menu13539
+Ref: #menu13632
+Node: Cash accounts13827
+Ref: #cash-accounts13969
+Node: Balance sheet accounts14153
+Ref: #balance-sheet-accounts14334
+Node: Income statement accounts14454
+Ref: #income-statement-accounts14640
+Node: All accounts14804
+Ref: #all-accounts14950
+Node: Register15132
+Ref: #register15256
+Node: Transaction17540
+Ref: #transaction17663
+Node: Error19080
+Ref: #error19174
+Node: TIPS19418
+Ref: #tips19517
+Node: Watch mode19559
+Ref: #watch-mode19666
+Node: Debug output21125
+Ref: #debug-output21236
+Node: ENVIRONMENT21448
+Ref: #environment21558
+Node: BUGS21749
+Ref: #bugs21832
 
 End Tag Table
 
diff --git a/hledger-ui.txt b/hledger-ui.txt
--- a/hledger-ui.txt
+++ b/hledger-ui.txt
@@ -9,7 +9,7 @@
        hledger ui -- [OPTS] [QUERYARGS]
 
 DESCRIPTION
-       This  manual  is for hledger's terminal interface, version 1.32.3.  See
+       This  manual  is  for  hledger's terminal interface, version 1.33.  See
        also the hledger manual for common concepts and file formats.
 
        hledger is a robust, user-friendly, cross-platform set of programs  for
@@ -44,7 +44,7 @@
        -w --watch
               watch for data and date changes and reload automatically
 
-       --theme=default|terminal|greenterm
+       --theme=default|terminal|greenterm|dark
               use this custom display theme
 
        --menu start in the menu screen
@@ -535,4 +535,4 @@
 SEE ALSO
        hledger(1), hledger-ui(1), hledger-web(1), ledger(1)
 
-hledger-ui-1.32.3                January 2024                    HLEDGER-UI(1)
+hledger-ui-1.33                   April 2024                     HLEDGER-UI(1)
