diff --git a/CHANGES.md b/CHANGES.md
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -21,6 +21,12 @@
 User-visible changes in hledger-web.
 See also the hledger changelog.
 
+# 1.31 2023-09-03
+
+Improvements
+
+- Allow aeson 2.2, megaparsec 9.5
+
 # 1.30 2023-06-01
 
 Fixes
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" "June 2023" "hledger-web-1.30 " "hledger User Manuals"
+.TH "HLEDGER-WEB" "1" "September 2023" "hledger-web-1.31 " "hledger User Manuals"
 
 
 
@@ -15,7 +15,7 @@
 \f[V]hledger web -- [--serve|--serve-api] [OPTS] [ARGS]\f[R]
 .SH DESCRIPTION
 .PP
-This manual is for hledger\[aq]s web interface, version 1.30.
+This manual is for hledger\[aq]s web interface, version 1.31.
 See also the hledger manual for common concepts and file formats.
 .PP
 hledger is a robust, user-friendly, cross-platform set of programs for
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.30
+version:        1.31
 synopsis:       Web-based user interface for the hledger accounting system
 description:    A simple web-based user interface for the hledger accounting system,
                 providing a more modern UI than the command-line or terminal interfaces.
@@ -28,7 +28,7 @@
 license-file:   LICENSE
 build-type:     Simple
 tested-with:
-    GHC==8.10.7, GHC==9.0.2, GHC==9.2.4
+    GHC==8.10.7, GHC==9.0.2, GHC==9.2.8, GHC==9.4.5
 extra-source-files:
     CHANGES.md
     README.md
@@ -151,10 +151,10 @@
   hs-source-dirs:
       ./
   ghc-options: -Wall -Wredundant-constraints -Wincomplete-record-updates -Wincomplete-uni-patterns
-  cpp-options: -DVERSION="1.30"
+  cpp-options: -DVERSION="1.31"
   build-depends:
       Decimal >=0.5.1
-    , aeson >=1
+    , aeson >=1 && <2.3
     , base >=4.14 && <4.19
     , base64
     , blaze-html
@@ -171,13 +171,13 @@
     , extra >=1.6.3
     , filepath
     , hjsmin
-    , hledger ==1.30.*
-    , hledger-lib ==1.30.*
+    , hledger ==1.31.*
+    , hledger-lib ==1.31.*
     , hspec
     , http-client
     , http-conduit
     , http-types
-    , megaparsec >=7.0.0 && <9.4
+    , megaparsec >=7.0.0 && <9.6
     , mtl >=2.2.1
     , network
     , shakespeare >=2.0.2.2
@@ -212,7 +212,7 @@
   hs-source-dirs:
       app
   ghc-options: -Wall -Wredundant-constraints -Wincomplete-record-updates -Wincomplete-uni-patterns
-  cpp-options: -DVERSION="1.30"
+  cpp-options: -DVERSION="1.31"
   build-depends:
       base >=4.14 && <4.19
     , hledger-web
@@ -232,7 +232,7 @@
   hs-source-dirs:
       test
   ghc-options: -Wall -Wredundant-constraints -Wincomplete-record-updates -Wincomplete-uni-patterns
-  cpp-options: -DVERSION="1.30"
+  cpp-options: -DVERSION="1.31"
   build-depends:
       base >=4.14 && <4.19
     , hledger
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.30.  See also
+   This manual is for hledger's web interface, version 1.31.  See also
 the hledger manual for common concepts and file formats.
 
    hledger is a robust, user-friendly, cross-platform set of programs
diff --git a/hledger-web.txt b/hledger-web.txt
--- a/hledger-web.txt
+++ b/hledger-web.txt
@@ -1,8 +1,6 @@
 
 HLEDGER-WEB(1)               hledger User Manuals               HLEDGER-WEB(1)
 
-
-
 NAME
        hledger-web - robust, friendly plain text accounting (Web version)
 
@@ -11,18 +9,18 @@
        hledger web -- [--serve|--serve-api] [OPTS] [ARGS]
 
 DESCRIPTION
-       This manual is for hledger's web interface, version 1.30.  See also the
+       This manual is for hledger's web interface, version 1.31.  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.
 
@@ -41,11 +39,11 @@
        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.
@@ -55,7 +53,7 @@
 
 OPTIONS
        Command-line options and arguments may be used to set an initial filter
-       on the data.  These filter options are not shown in the web UI, but  it
+       on  the data.  These filter options are not shown in the web UI, but it
        will be applied in addition to any search query entered there.
 
        hledger-web provides the following options:
@@ -64,7 +62,7 @@
               serve and log requests, don't browse or auto-exit after timeout
 
        --serve-api
-              like  --serve,  but  serve  only  the  JSON web API, without the
+              like --serve, but serve only  the  JSON  web  API,  without  the
               server-side web UI
 
        --host=IPADDR
@@ -74,13 +72,13 @@
               listen on this TCP port (default: 5000)
 
        --socket=SOCKETFILE
-              use a unix domain socket file to listen for requests instead  of
-              a  TCP socket.  Implies --serve.  It can only be used if the op-
+              use  a unix domain socket file to listen for requests instead of
+              a TCP socket.  Implies --serve.  It can only be used if the  op-
               erating system can provide this type of socket.
 
        --base-url=URL
-              set the base url (default: http://IPADDR:PORT).   Note:  affects
-              url  generation but not route parsing.  Can be useful if running
+              set  the  base url (default: http://IPADDR:PORT).  Note: affects
+              url generation but not route parsing.  Can be useful if  running
               behind a reverse web proxy that does path rewriting.
 
        --file-url=URL
@@ -108,10 +106,10 @@
        running multiple hledger-web instances.
 
        Both of these options are ignored when --socket is used.  In this case,
-       it creates an AF_UNIX socket file at the supplied path  and  uses  that
-       for  communication.   This  is  an  alternative way of running multiple
-       hledger-web instances behind a reverse proxy that  handles  authentica-
-       tion  for  different  users.   The path can be derived in a predictable
+       it  creates  an  AF_UNIX socket file at the supplied path and uses that
+       for communication.  This is an  alternative  way  of  running  multiple
+       hledger-web  instances  behind a reverse proxy that handles authentica-
+       tion for different users.  The path can be  derived  in  a  predictable
        way, eg by using the username within the path.  As an example, nginx as
        reverse  proxy  can use the variable $remote_user to derive a path from
        the username used  in  a  HTTP  basic  authentication.   The  following
@@ -122,13 +120,13 @@
 
        You can use --base-url to change the protocol, hostname, port and  path
        that appear in hyperlinks, useful eg for integrating hledger-web within
-       a larger website.  The default is http://HOST:PORT/ using the  server's
+       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).
 
-       With  --file-url  you can set a different base url for static files, eg
+       With --file-url you can set a different base url for static  files,  eg
        for better caching or cookie-less serving on high performance websites.
 
-       hledger-web also supports many of hledger's general  options  (and  the
+       hledger-web  also  supports  many of hledger's general options (and the
        hledger manual's command line tips also apply here):
 
    General help options
@@ -151,7 +149,7 @@
               $LEDGER_FILE or $HOME/.hledger.journal)
 
        --rules-file=RULESFILE
-              Conversion  rules  file  to  use  when  reading  CSV   (default:
+              Conversion   rules  file  to  use  when  reading  CSV  (default:
               FILE.rules)
 
        --separator=CHAR
@@ -206,7 +204,7 @@
               fects)
 
        --today=DATE
-              override   today's  date  (affects  relative  smart  dates,  for
+              override  today's  date  (affects  relative  smart  dates,   for
               tests/examples)
 
        -U --unmarked
@@ -225,21 +223,21 @@
               hide/aggregate accounts or postings more than NUM levels deep
 
        -E --empty
-              show items with zero amount, normally hidden (and vice-versa  in
+              show  items with zero amount, normally hidden (and vice-versa in
               hledger-ui/hledger-web)
 
        -B --cost
               convert amounts to their cost/selling amount at transaction time
 
        -V --market
-              convert  amounts to their market value in default valuation com-
+              convert amounts to their market value in default valuation  com-
               modities
 
        -X --exchange=COMM
               convert amounts to their market value in commodity COMM
 
        --value
-              convert amounts to cost or  market  value,  more  flexibly  than
+              convert  amounts  to  cost  or  market value, more flexibly than
               -B/-V/-X
 
        --infer-equity
@@ -249,38 +247,38 @@
               infer costs from conversion equity postings
 
        --infer-market-prices
-              use  costs as additional market prices, as if they were P direc-
+              use costs as additional market prices, as if they were P  direc-
               tives
 
        --forecast
-              generate transactions from periodic rules,  between  the  latest
-              recorded  txn  and  6 months from today, or during the specified
-              PERIOD (= is required).  Auto posting rules will be  applied  to
-              these  transactions  as  well.  Also, in hledger-ui make future-
+              generate  transactions  from  periodic rules, between the latest
+              recorded txn and 6 months from today, or  during  the  specified
+              PERIOD  (=  is required).  Auto posting rules will be applied to
+              these transactions as well.  Also, in  hledger-ui  make  future-
               dated transactions visible.
 
-       --auto generate extra postings by applying auto posting  rules  to  all
+       --auto generate  extra  postings  by applying auto posting rules to all
               txns (not just forecast txns)
 
        --verbose-tags
-              add  visible tags indicating transactions or postings which have
+              add visible tags indicating transactions or postings which  have
               been generated/modified
 
        --commodity-style
-              Override the commodity style in the  output  for  the  specified
+              Override  the  commodity  style  in the output for the specified
               commodity.  For example 'EUR1.000,00'.
 
        --color=WHEN (or --colour=WHEN)
-              Should  color-supporting  commands  use ANSI color codes in text
-              output.  'auto' (default): whenever stdout seems to be a  color-
-              supporting  terminal.  'always' or 'yes': always, useful eg when
-              piping output into  'less  -R'.   'never'  or  'no':  never.   A
+              Should color-supporting commands use ANSI color  codes  in  text
+              output.   'auto' (default): whenever stdout seems to be a color-
+              supporting terminal.  'always' or 'yes': always, useful eg  when
+              piping  output  into  'less  -R'.   'never'  or  'no': never.  A
               NO_COLOR environment variable overrides this.
 
        --pretty[=WHEN]
-              Show  prettier  output,  e.g.  using unicode box-drawing charac-
-              ters.  Accepts 'yes' (the default) or 'no' ('y', 'n',  'always',
-              'never'  also  work).   If  you provide an argument you must use
+              Show prettier output, e.g.  using  unicode  box-drawing  charac-
+              ters.   Accepts 'yes' (the default) or 'no' ('y', 'n', 'always',
+              'never' also work).  If you provide an  argument  you  must  use
               '=', e.g.  '--pretty=yes'.
 
        When a reporting option appears more than once in the command line, the
@@ -305,38 +303,38 @@
        You can restrict what the users who reach it can do, by
 
        o using the --capabilities=CAP[,CAP..] flag when you start it, enabling
-         one  or  more  of  the  following capabilities.  The default value is
+         one or more of the following  capabilities.   The  default  value  is
          view,add:
 
          o view - allows viewing the journal file and all included files
 
          o add - allows adding new transactions to the main journal file
 
-         o manage - allows editing, uploading or downloading the main  or  in-
+         o manage  -  allows editing, uploading or downloading the main or in-
            cluded files
 
-       o using  the  --capabilities-header=HTTPHEADER  flag  to specify a HTTP
-         header from which it will read capabilities to  enable.   hledger-web
-         on  Sandstorm  uses  the  X-Sandstorm-Permissions header to integrate
+       o using the --capabilities-header=HTTPHEADER flag  to  specify  a  HTTP
+         header  from  which it will read capabilities to enable.  hledger-web
+         on Sandstorm uses the  X-Sandstorm-Permissions  header  to  integrate
          with Sandstorm's permissions.  This is disabled by default.
 
 EDITING, UPLOADING, DOWNLOADING
-       If you enable the manage capability mentioned above, you'll see  a  new
-       "spanner"  button  to the right of the search form.  Clicking this will
-       let you edit, upload, or download the journal file or any files it  in-
+       If  you  enable the manage capability mentioned above, you'll see a new
+       "spanner" button to the right of the search form.  Clicking  this  will
+       let  you edit, upload, or download the journal file or any files it in-
        cludes.
 
-       Note,  unlike any other hledger command, in this mode you (or any visi-
+       Note, unlike any other hledger command, in this mode you (or any  visi-
        tor) can alter or wipe the data files.
 
-       Normally whenever a file is changed in this way,  hledger-web  saves  a
-       numbered  backup  (assuming  file permissions allow it, the disk is not
-       full, etc.)  hledger-web is not aware of version control systems,  cur-
-       rently;  if  you  use one, you'll have to arrange to commit the changes
+       Normally  whenever  a  file is changed in this way, hledger-web saves a
+       numbered backup (assuming file permissions allow it, the  disk  is  not
+       full,  etc.)  hledger-web is not aware of version control systems, cur-
+       rently; if you use one, you'll have to arrange to  commit  the  changes
        yourself (eg with a cron job or a file watcher like entr).
 
-       Changes which would leave the journal file(s) unparseable or  non-valid
-       (eg  with  failing balance assertions) are prevented.  (Probably.  This
+       Changes  which would leave the journal file(s) unparseable or non-valid
+       (eg with failing balance assertions) are prevented.   (Probably.   This
        needs re-testing.)
 
 RELOADING
@@ -368,7 +366,7 @@
               /accounttransactions/ACCOUNTNAME
 
        Eg, all account names in the journal (similar to the accounts command).
-       (hledger-web's JSON does not include newlines, here we  use  python  to
+       (hledger-web's  JSON  does  not include newlines, here we use python to
        prettify it):
 
               $ curl -s http://127.0.0.1:5000/accountnames | python -m json.tool
@@ -409,22 +407,22 @@
                                       "aprice": null,
               ...
 
-       Most  of  the  JSON corresponds to hledger's data types; for details of
-       what the fields mean, see the Hledger.Data.Json haddock docs and  click
-       on  the various data types, eg Transaction.  And for a higher level un-
+       Most of the JSON corresponds to hledger's data types;  for  details  of
+       what  the fields mean, see the Hledger.Data.Json haddock docs and click
+       on the various data types, eg Transaction.  And for a higher level  un-
        derstanding, see the journal docs.
 
        In some cases there is outer JSON corresponding to a "Report" type.  To
        understand  that,  go to the Hledger.Web.Handler.MiscR haddock and look
        at the source for the appropriate handler to see what it  returns.   Eg
        for /accounttransactions it's getAccounttransactionsR, returning a "ac-
-       countTransactionsReport ...".  Looking up the haddock for that  we  can
-       see  that  /accounttransactions  returns  an AccountTransactionsReport,
-       which consists of a report title and a list  of  AccountTransactionsRe-
+       countTransactionsReport  ...".   Looking up the haddock for that we can
+       see that  /accounttransactions  returns  an  AccountTransactionsReport,
+       which  consists  of a report title and a list of AccountTransactionsRe-
        portItem (etc).
 
-       You  can  add  a  new  transaction to the journal with a PUT request to
-       /add, if hledger-web was started with the add  capability  (enabled  by
+       You can add a new transaction to the journal  with  a  PUT  request  to
+       /add,  if  hledger-web  was started with the add capability (enabled by
        default).  The payload must be the full, exact JSON representation of a
        hledger transaction (partial data won't do).  You can get  sample  JSON
        from  hledger-web's  /transactions  or /accounttransactions, or you can
@@ -523,14 +521,14 @@
                   "tstatus": "Unmarked"
               }
 
-       And  here's how to test adding it with curl.  This should add a new en-
+       And here's how to test adding it with curl.  This should add a new  en-
        try to your journal:
 
               $ curl http://127.0.0.1:5000/add -X PUT -H 'Content-Type: application/json' --data-binary @txn.json
 
 DEBUG OUTPUT
    Debug output
-       You can add --debug[=N] to the command line to  log  debug  output.   N
+       You  can  add  --debug[=N]  to the command line to log debug output.  N
        ranges from 1 (least output, the default) to 9 (maximum output).  Typi-
        cally you would start with 1 and increase until you are seeing  enough.
        Debug  output  goes  to stderr, interleaved with the requests logged on
@@ -539,12 +537,12 @@
        hledger-web --debug=3 2>hledger-web.log.
 
 ENVIRONMENT
-       LEDGER_FILE  The  main  journal  file  to  use  when not specified with
+       LEDGER_FILE The main journal  file  to  use  when  not  specified  with
        -f/--file.  Default: $HOME/.hledger.journal.
 
 BUGS
        We  welcome  bug  reports  in  the  hledger  issue  tracker  (shortcut:
-       http://bugs.hledger.org),  or on the #hledger chat or hledger mail list
+       http://bugs.hledger.org), or on the #hledger chat or hledger mail  list
        (https://hledger.org/support).
 
        Some known issues:
@@ -569,6 +567,4 @@
 SEE ALSO
        hledger(1), hledger-ui(1), hledger-web(1), ledger(1)
 
-
-
-hledger-web-1.30                   June 2023                    HLEDGER-WEB(1)
+hledger-web-1.31                September 2023                  HLEDGER-WEB(1)
