diff --git a/CHANGES.md b/CHANGES.md
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,10 +1,10 @@
 <!--
-              _     
-__      _____| |__  
-\ \ /\ / / _ \ '_ \ 
+              _
+__      _____| |__
+\ \ /\ / / _ \ '_ \
  \ V  V /  __/ |_) |
-  \_/\_/ \___|_.__/ 
-                    
+  \_/\_/ \___|_.__/
+
 Breaking changes
 
 Fixes
@@ -21,6 +21,33 @@
 User-visible changes in hledger-web.
 See also the hledger changelog.
 
+# 1.33 2024-04-18
+
+Fixes
+
+- Exclude base64 >=1.0 to avoid compilation failure. [#2166]
+
+- Preserve line breaks when showing an error message. [#2163] (Martijn van der Ven)
+
+Improvements
+
+- Zero amounts are now shown with their commodity symbol.
+  This was mainly to make the sidebar more informative,
+  but also affects and hopefully helps amounts displayed elsewhere.
+  [#2140]
+
+- Amounts in the sidebar now also have the `amount` HTML class.
+
+- Allow building with GHC 9.8.
+
+- Require safe >=0.3.20.
+
+Docs
+
+- Mention the `-E/--empty` flag for hiding zeros,
+  the non-display of costs,
+  and non-zeros that look like zero because of hidden costs.
+
 # 1.32.3 2024-01-28
 
 - Use hledger-1.32.3
@@ -45,7 +72,6 @@
   rather than "any of our IPv4 or IPv6 addresses" and 3000,
 
 # 1.32.1 2023-12-07
-
 - Use hledger-1.32.1
 
 # 1.32 2023-12-01
diff --git a/Hledger/Web/Handler/RegisterR.hs b/Hledger/Web/Handler/RegisterR.hs
--- a/Hledger/Web/Handler/RegisterR.hs
+++ b/Hledger/Web/Handler/RegisterR.hs
@@ -11,6 +11,7 @@
 
 import Data.List (intersperse, nub, partition)
 import qualified Data.Text as T
+import Safe (tailDef)
 import Text.Hamlet (hamletFile)
 
 import Hledger
@@ -44,7 +45,7 @@
       addCommas xs =
           zip xs $
           zip (map (T.unpack . accountSummarisedName . paccount) xs) $
-          tail $ (", "<$xs) ++ [""]
+          tailDef [""] $ (", "<$xs)
       items =
         styleAmounts (journalCommodityStylesWith HardRounding j) $
         accountTransactionsReport rspec{_rsQuery=q} j acctQuery
@@ -108,8 +109,8 @@
    charttitle = if null title then "" else title ++ ":"
    colorForCommodity = fromMaybe 0 . flip lookup commoditiesIndex
    commoditiesIndex = zip (map fst percommoditytxnreports) [0..] :: [(CommoditySymbol,Int)]
-   simpleMixedAmountQuantity = maybe 0 aquantity . listToMaybe . amounts . mixedAmountStripPrices
-   showZeroCommodity = wbUnpack . showMixedAmountB oneLine{displayCost=False,displayZeroCommodity=True}
+   simpleMixedAmountQuantity = maybe 0 aquantity . listToMaybe . amounts . mixedAmountStripCosts
+   showZeroCommodity = wbUnpack . showMixedAmountB oneLineNoCostFmt{displayCost=False,displayZeroCommodity=True}
    shownull c = if null c then " " else c
    nodatelink = (RegisterR, [("q", T.unwords $ removeDates q)])
 
diff --git a/Hledger/Web/Widget/Common.hs b/Hledger/Web/Widget/Common.hs
--- a/Hledger/Web/Widget/Common.hs
+++ b/Hledger/Web/Widget/Common.hs
@@ -95,7 +95,7 @@
 
 mixedAmountAsHtml :: MixedAmount -> HtmlUrl a
 mixedAmountAsHtml b _ =
-  for_ (lines (showMixedAmountWithoutPrice False b)) $ \t -> do
+  for_ (lines (showMixedAmountWith noCostFmt{displayZeroCommodity=True} b)) $ \t -> do
     H.span ! A.class_ c $ toHtml t
     H.br
   where
diff --git a/hledger-web.1 b/hledger-web.1
--- a/hledger-web.1
+++ b/hledger-web.1
@@ -1,5 +1,5 @@
 
-.TH "HLEDGER\-WEB" "1" "January 2024" "hledger-web-1.32.3 " "hledger User Manuals"
+.TH "HLEDGER\-WEB" "1" "April 2024" "hledger-web-1.33 " "hledger User Manuals"
 
 
 
@@ -12,7 +12,7 @@
 .PD
 \f[CR]hledger web \-\- [\-\-serve|\-\-serve\-api] [OPTS] [ARGS]\f[R]
 .SH DESCRIPTION
-This manual is for hledger\[aq]s web interface, version 1.32.3.
+This manual is for hledger\[aq]s web 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
@@ -128,6 +128,15 @@
 Query options and arguments may be used to set an initial filter, which
 although not shown in the UI, will restrict the data shown, in addition
 to any search query entered in the UI.
+.PP
+Note that hledger\-web shows accounts with zero balances by default,
+like \f[CR]hledger\-ui\f[R] (and unlike \f[CR]hledger\f[R]).
+Using the \f[CR]\-E/\-\-empty\f[R] flag at startup will hide them.
+.PP
+If you see accounts which appear to have a zero balance, but cannot be
+hidden with \f[CR]\-E\f[R]: these have a mixed\-cost balance which looks
+like zero when costs are hidden.
+Currently hledger\-web does not show costs at all.
 .SS General help options
 .TP
 \f[CR]\-h \-\-help\f[R]
diff --git a/hledger-web.cabal b/hledger-web.cabal
--- a/hledger-web.cabal
+++ b/hledger-web.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           hledger-web
-version:        1.32.3
+version:        1.33
 synopsis:       Web user interface for the hledger accounting system
 description:    A simple web user interface for the hledger accounting system,
                 providing a more modern UI than the command-line or terminal interfaces.
@@ -151,12 +151,12 @@
   hs-source-dirs:
       ./
   ghc-options: -Wall -Wredundant-constraints -Wincomplete-record-updates -Wincomplete-uni-patterns
-  cpp-options: -DVERSION="1.32.3"
+  cpp-options: -DVERSION="1.33"
   build-depends:
       Decimal >=0.5.1
     , aeson >=1 && <2.3
-    , base >=4.14 && <4.19
-    , base64
+    , base >=4.14 && <4.20
+    , base64 <1
     , blaze-html
     , blaze-markup
     , bytestring
@@ -171,8 +171,8 @@
     , extra >=1.6.3
     , filepath
     , hjsmin
-    , hledger >=1.32.3 && <1.33
-    , hledger-lib >=1.32.3 && <1.33
+    , hledger ==1.33.*
+    , hledger-lib ==1.33.*
     , hspec
     , http-client
     , http-conduit
@@ -180,7 +180,7 @@
     , megaparsec >=7.0.0 && <9.7
     , mtl >=2.2.1
     , network
-    , safe >=0.3.19
+    , safe >=0.3.20
     , shakespeare >=2.0.2.2
     , template-haskell
     , text >=1.2.4.1
@@ -213,9 +213,9 @@
   hs-source-dirs:
       app
   ghc-options: -Wall -Wredundant-constraints -Wincomplete-record-updates -Wincomplete-uni-patterns
-  cpp-options: -DVERSION="1.32.3"
+  cpp-options: -DVERSION="1.33"
   build-depends:
-      base >=4.14 && <4.19
+      base >=4.14 && <4.20
     , hledger-web
   default-language: Haskell2010
   if (flag(dev)) || (flag(library-only))
@@ -225,7 +225,7 @@
   if flag(library-only)
     buildable: False
   if flag(threaded)
-    ghc-options: -threaded
+    ghc-options: -threaded -with-rtsopts=-T
 
 test-suite test
   type: exitcode-stdio-1.0
@@ -233,9 +233,9 @@
   hs-source-dirs:
       test
   ghc-options: -Wall -Wredundant-constraints -Wincomplete-record-updates -Wincomplete-uni-patterns
-  cpp-options: -DVERSION="1.32.3"
+  cpp-options: -DVERSION="1.33"
   build-depends:
-      base >=4.14 && <4.19
+      base >=4.14 && <4.20
     , hledger-web
   default-language: Haskell2010
   if (flag(dev)) || (flag(library-only))
diff --git a/hledger-web.info b/hledger-web.info
--- a/hledger-web.info
+++ b/hledger-web.info
@@ -16,7 +16,7 @@
    'hledger-web [--serve|--serve-api] [OPTS] [ARGS]'
 'hledger web -- [--serve|--serve-api] [OPTS] [ARGS]'
 
-   This manual is for hledger's web interface, version 1.32.3.  See also
+   This manual is for hledger's web 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
@@ -142,6 +142,15 @@
 although not shown in the UI, will restrict the data shown, in addition
 to any search query entered in the UI.
 
+   Note that hledger-web shows accounts with zero balances by default,
+like 'hledger-ui' (and unlike 'hledger').  Using the '-E/--empty' flag
+at startup will hide them.
+
+   If you see accounts which appear to have a zero balance, but cannot
+be hidden with '-E': these have a mixed-cost balance which looks like
+zero when costs are hidden.  Currently hledger-web does not show costs
+at all.
+
 * Menu:
 
 * General help options::
@@ -629,30 +638,30 @@
 
 Tag Table:
 Node: Top223
-Node: OPTIONS2577
-Ref: #options2682
-Node: General help options5256
-Ref: #general-help-options5406
-Node: General input options5688
-Ref: #general-input-options5874
-Node: General reporting options6531
-Ref: #general-reporting-options6696
-Node: PERMISSIONS10086
-Ref: #permissions10225
-Node: EDITING UPLOADING DOWNLOADING11437
-Ref: #editing-uploading-downloading11618
-Node: RELOADING12452
-Ref: #reloading12586
-Node: JSON API13019
-Ref: #json-api13134
-Node: DEBUG OUTPUT18622
-Ref: #debug-output18747
-Node: Debug output18774
-Ref: #debug-output-118875
-Node: ENVIRONMENT19292
-Ref: #environment19411
-Node: BUGS19528
-Ref: #bugs19612
+Node: OPTIONS2575
+Ref: #options2680
+Node: General help options5645
+Ref: #general-help-options5795
+Node: General input options6077
+Ref: #general-input-options6263
+Node: General reporting options6920
+Ref: #general-reporting-options7085
+Node: PERMISSIONS10475
+Ref: #permissions10614
+Node: EDITING UPLOADING DOWNLOADING11826
+Ref: #editing-uploading-downloading12007
+Node: RELOADING12841
+Ref: #reloading12975
+Node: JSON API13408
+Ref: #json-api13523
+Node: DEBUG OUTPUT19011
+Ref: #debug-output19136
+Node: Debug output19163
+Ref: #debug-output-119264
+Node: ENVIRONMENT19681
+Ref: #environment19800
+Node: BUGS19917
+Ref: #bugs20001
 
 End Tag Table
 
diff --git a/hledger-web.txt b/hledger-web.txt
--- a/hledger-web.txt
+++ b/hledger-web.txt
@@ -9,41 +9,41 @@
        hledger web -- [--serve|--serve-api] [OPTS] [ARGS]
 
 DESCRIPTION
-       This  manual  is for hledger's web interface, version 1.32.3.  See also
-       the hledger manual for common concepts and file formats.
+       This manual is for hledger's web 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
-       tracking  money,  time,  or any other commodity, using double-entry ac-
-       counting and a simple, editable file format.  hledger  is  inspired  by
-       and  largely  compatible  with  ledger(1), and largely interconvertible
+       hledger  is a robust, user-friendly, cross-platform set of programs for
+       tracking money, time, or any other commodity,  using  double-entry  ac-
+       counting  and  a  simple, editable file format.  hledger is inspired by
+       and largely compatible with  ledger(1),  and  largely  interconvertible
        with beancount(1).
 
-       hledger-web is a simple web application for browsing and adding  trans-
-       actions.   It  provides a more user-friendly UI than the hledger CLI or
-       hledger-ui TUI, showing more at once  (accounts,  the  current  account
+       hledger-web  is a simple web application for browsing and adding trans-
+       actions.  It provides a more user-friendly UI than the hledger  CLI  or
+       hledger-ui  TUI,  showing  more  at once (accounts, the current account
        register, balance charts) and allowing history-aware data entry, inter-
        active searching, and bookmarking.
 
-       hledger-web  also lets you share a journal with multiple users, or even
-       the public web.  There is no access control, so if you  need  that  you
-       should  put  it  behind  a  suitable  web proxy.  As a small protection
-       against data loss when running an unprotected  instance,  it  writes  a
+       hledger-web also lets you share a journal with multiple users, or  even
+       the  public  web.   There is no access control, so if you need that you
+       should put it behind a suitable  web  proxy.   As  a  small  protection
+       against  data  loss  when  running an unprotected instance, it writes a
        numbered backup of the main journal file (only) on every edit.
 
-       Like  hledger,  it reads from (and appends to) a journal file specified
-       by   the    LEDGER_FILE    environment    variable    (defaulting    to
-       $HOME/.hledger.journal);  or you can specify files with -f options.  It
-       can also read timeclock files, timedot files, or any  CSV/SSV/TSV  file
+       Like hledger, it reads from (and appends to) a journal  file  specified
+       by    the    LEDGER_FILE    environment    variable    (defaulting   to
+       $HOME/.hledger.journal); or you can specify files with -f options.   It
+       can  also  read timeclock files, timedot files, or any CSV/SSV/TSV file
        with a date field.  (See hledger(1) -> Input for details.)
 
        hledger-web can be run in three modes:
 
        o Transient mode (the default): your default web browser will be opened
-         to  show  the  app if possible, and the app exits automatically after
-         two minutes of inactivity (no requests received and no  open  browser
+         to show the app if possible, and the app  exits  automatically  after
+         two  minutes  of inactivity (no requests received and no open browser
          windows viewing it).
 
-       o With  --serve:  the  app runs without stopping, and without opening a
+       o With --serve: the app runs without stopping, and  without  opening  a
          browser.
 
        o With --serve-api: only the JSON API is served.
@@ -61,36 +61,36 @@
               like --serve, but serve only the JSON web API, not the web UI
 
        --allow=view|add|edit
-              set the user's access level for changing  data  (default:  add).
-              It  also  accepts sandstorm for use on that platform (reads per-
+              set  the  user's  access level for changing data (default: add).
+              It also accepts sandstorm for use on that platform  (reads  per-
               missions from the X-Sandstorm-Permissions request header).
 
        --cors=ORIGIN
-              allow cross-origin requests from the specified  origin;  setting
+              allow  cross-origin  requests from the specified origin; setting
               ORIGIN to "*" allows requests from any origin
 
        --host=IPADDR
               listen on this IP address (default: 127.0.0.1)
 
-       By  default the server listens on IP address 127.0.0.1, which is acces-
-       sible only to requests from the local machine..  You can use --host  to
-       listen  on  a  different address configured on the machine, eg to allow
-       access from other machines.  The special address 0.0.0.0 causes  it  to
+       By default the server listens on IP address 127.0.0.1, which is  acces-
+       sible  only to requests from the local machine..  You can use --host to
+       listen on a different address configured on the machine,  eg  to  allow
+       access  from  other machines.  The special address 0.0.0.0 causes it to
        listen on all addresses configured on the machine.
 
        --port=PORT
               listen on this TCP port (default: 5000)
 
-       Similarly,  you can use --port to listen on a TCP port other than 5000.
-       This is useful if you want to run multiple hledger-web instances  on  a
+       Similarly, you can use --port to listen on a TCP port other than  5000.
+       This  is  useful if you want to run multiple hledger-web instances on a
        machine.
 
        --socket=SOCKETFILE
-              listen  on  the  given  unix socket instead of an IP address and
+              listen on the given unix socket instead of  an  IP  address  and
               port (unix only; implies --serve)
 
-       When --socket is used,  hledger-web  creates  and  communicates  via  a
-       socket  file  instead of a TCP port.  This can be more secure, respects
+       When  --socket  is  used,  hledger-web  creates  and communicates via a
+       socket file instead of a TCP port.  This can be more  secure,  respects
        unix file permissions, and makes certain use cases easier, such as run-
        ning per-user instances behind an nginx reverse proxy.  (Eg: proxy_pass
        http://unix:/tmp/hledger/${remote_user}.socket;.)
@@ -98,21 +98,30 @@
        --base-url=URL
               set the base url (default: http://IPADDR:PORT).
 
-       You can use --base-url to change the protocol, hostname, port and  path
-       that  appear in hledger-web's hyperlinks.  This is useful eg when inte-
-       grating  hledger-web  within  a  larger  website.    The   default   is
-       http://HOST:PORT/  using  the  server's configured host address and TCP
-       port (or http://HOST if PORT is 80).  Note this affects url  generation
+       You  can use --base-url to change the protocol, hostname, port and path
+       that appear in hledger-web's hyperlinks.  This is useful eg when  inte-
+       grating   hledger-web   within   a  larger  website.   The  default  is
+       http://HOST:PORT/ using the server's configured host  address  and  TCP
+       port  (or http://HOST if PORT is 80).  Note this affects url generation
        but not route parsing.
 
-       --test run  hledger-web's  tests  and exit.  hspec test runner args may
+       --test run hledger-web's tests and exit.  hspec test  runner  args  may
               follow a --, eg: hledger-web --test -- --help
 
        hledger-web also supports many of hledger's general options.  Query op-
-       tions and arguments may be used to set an  initial  filter,  which  al-
-       though  not  shown in the UI, will restrict the data shown, in addition
+       tions  and  arguments  may  be used to set an initial filter, which al-
+       though not shown in the UI, will restrict the data shown,  in  addition
        to any search query entered in the UI.
 
+       Note  that  hledger-web  shows  accounts with zero balances by default,
+       like hledger-ui (and unlike hledger).  Using  the  -E/--empty  flag  at
+       startup will hide them.
+
+       If  you see accounts which appear to have a zero balance, but cannot be
+       hidden with -E: these have a mixed-cost balance which looks  like  zero
+       when  costs  are  hidden.  Currently hledger-web does not show costs at
+       all.
+
    General help options
        -h --help
               show general or COMMAND help
@@ -549,4 +558,4 @@
 SEE ALSO
        hledger(1), hledger-ui(1), hledger-web(1), ledger(1)
 
-hledger-web-1.32.3               January 2024                   HLEDGER-WEB(1)
+hledger-web-1.33                  April 2024                    HLEDGER-WEB(1)
diff --git a/static/hledger.css b/static/hledger.css
--- a/static/hledger.css
+++ b/static/hledger.css
@@ -86,6 +86,11 @@
     padding-left: 30px;
 }
 
+#message {
+    white-space: pre;
+    overflow-x: auto;
+}
+
 #sidebar-menu {
     overflow:hidden;
     border-right: 1px solid #ebebeb;
diff --git a/templates/balance-report.hamlet b/templates/balance-report.hamlet
--- a/templates/balance-report.hamlet
+++ b/templates/balance-report.hamlet
@@ -17,9 +17,9 @@
         $if hasSubAccounts acct
           <a href="@?{(registerR, [("q", replaceInacct qparam $ accountOnlyQuery acct)])}" .only.hidden-sm.hidden-xs
              title="Show transactions affecting this account but not subaccounts">only
-    <td>
+    <td .amount>
       ^{mixedAmountAsHtml abal}
 <tr .total>
   <td>
-  <td>
+  <td .amount>
     ^{mixedAmountAsHtml total}
