diff --git a/CHANGES.md b/CHANGES.md
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -23,6 +23,14 @@
 See also the hledger changelog.
 
 
+# 1.50.3 2025-11-18
+
+- The old "threaded" build flag, which cabal could turn off, has been dropped.
+  [#2495]
+
+- Uses hledger 1.50.3
+
+
 # 1.50.2 2025-09-26
 
 - Uses hledger 1.50.2
diff --git a/Hledger/Web/App.hs b/Hledger/Web/App.hs
--- a/Hledger/Web/App.hs
+++ b/Hledger/Web/App.hs
@@ -21,12 +21,12 @@
 import Control.Applicative ((<|>))
 import Control.Monad (join, when, unless)
 -- import Control.Monad.Except (runExceptT)  -- now re-exported by Hledger
-import qualified Data.ByteString.Char8 as BC
+import Data.ByteString.Char8 qualified as BC
 import Data.Traversable (for)
 import Data.IORef (IORef, readIORef, writeIORef)
 import Data.Maybe (fromMaybe)
 import Data.Text (Text)
-import qualified Data.Text as T
+import Data.Text qualified as T
 import Data.Time.Calendar (Day)
 import Network.HTTP.Conduit (Manager)
 import Network.HTTP.Types (status403)
diff --git a/Hledger/Web/Handler/AddR.hs b/Hledger/Web/Handler/AddR.hs
--- a/Hledger/Web/Handler/AddR.hs
+++ b/Hledger/Web/Handler/AddR.hs
@@ -11,7 +11,7 @@
   ) where
 
 import Data.Aeson.Types (Result(..))
-import qualified Data.Text as T
+import Data.Text qualified as T
 import Network.HTTP.Types.Status (status400)
 import Text.Blaze.Html (preEscapedToHtml)
 import Yesod
diff --git a/Hledger/Web/Handler/MiscR.hs b/Hledger/Web/Handler/MiscR.hs
--- a/Hledger/Web/Handler/MiscR.hs
+++ b/Hledger/Web/Handler/MiscR.hs
@@ -22,10 +22,10 @@
   , getOpenApiR
   ) where
 
-import qualified Data.Map as M
-import qualified Data.Text as T
-import qualified Data.Yaml as Yaml
-import qualified Data.ByteString as BS
+import Data.Map qualified as M
+import Data.Text qualified as T
+import Data.Yaml qualified as Yaml
+import Data.ByteString qualified as BS
 import Yesod.Default.Handlers (getFaviconR, getRobotsR)
 
 import Hledger
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
@@ -10,7 +10,7 @@
 module Hledger.Web.Handler.RegisterR where
 
 import Data.List (intersperse, nub, partition)
-import qualified Data.Text as T
+import Data.Text qualified as T
 import Safe (tailSafe)
 import Text.Hamlet (hamletFile)
 
diff --git a/Hledger/Web/Handler/UploadR.hs b/Hledger/Web/Handler/UploadR.hs
--- a/Hledger/Web/Handler/UploadR.hs
+++ b/Hledger/Web/Handler/UploadR.hs
@@ -10,10 +10,10 @@
   ) where
 
 import Control.Monad.Except (runExceptT)
-import qualified Data.ByteString.Lazy as BL
+import Data.ByteString.Lazy qualified as BL
 import Data.Conduit (connect)
 import Data.Conduit.Binary (sinkLbs)
-import qualified Data.Text.Encoding as TE
+import Data.Text.Encoding qualified as TE
 
 import Hledger.Web.Import
 import Hledger.Web.Widget.Common (fromFormSuccess, journalFile404, writeJournalTextIfValidAndChanged)
diff --git a/Hledger/Web/Main.hs b/Hledger/Web/Main.hs
--- a/Hledger/Web/Main.hs
+++ b/Hledger/Web/Main.hs
@@ -30,7 +30,7 @@
 #endif
 import Control.Monad (when)
 import Data.String (fromString)
-import qualified Data.Text as T
+import Data.Text qualified as T
 import Network.Socket
 import Network.Wai (Application)
 import Network.Wai.Handler.Warp (runSettings, runSettingsSocket, defaultSettings, setHost, setPort)
diff --git a/Hledger/Web/Settings.hs b/Hledger/Web/Settings.hs
--- a/Hledger/Web/Settings.hs
+++ b/Hledger/Web/Settings.hs
@@ -13,7 +13,7 @@
 import Data.Default (def)
 import Data.Maybe (fromMaybe)
 import Data.Text (Text)
-import qualified Data.Text as T
+import Data.Text qualified as T
 import Data.Yaml
 import Language.Haskell.TH.Syntax (Q, Exp)
 import Text.Hamlet
diff --git a/Hledger/Web/Test.hs b/Hledger/Web/Test.hs
--- a/Hledger/Web/Test.hs
+++ b/Hledger/Web/Test.hs
@@ -43,7 +43,7 @@
 
 import Data.String (fromString)
 import Data.Function ((&))
-import qualified Data.Text as T
+import Data.Text qualified as T
 import Test.Hspec (hspec)
 import Yesod.Default.Config
 import Yesod.Test
diff --git a/Hledger/Web/WebOptions.hs b/Hledger/Web/WebOptions.hs
--- a/Hledger/Web/WebOptions.hs
+++ b/Hledger/Web/WebOptions.hs
@@ -7,7 +7,7 @@
 module Hledger.Web.WebOptions where
 
 import Data.ByteString (ByteString)
-import qualified Data.ByteString.Char8 as BC
+import Data.ByteString.Char8 qualified as BC
 import Data.ByteString.UTF8 (fromString)
 import Data.Default (Default(def))
 import Data.Maybe (fromMaybe)
@@ -20,7 +20,7 @@
 
 import Hledger.Cli hiding (packageversion, progname, prognameandversion)
 import Hledger.Web.Settings (defhost, defport, defbaseurl)
-import qualified Data.Text as T
+import Data.Text qualified as T
 import Data.Char (toLower)
 import Data.List (isPrefixOf)
 import Data.Either (fromRight)
diff --git a/Hledger/Web/Widget/AddForm.hs b/Hledger/Web/Widget/AddForm.hs
--- a/Hledger/Web/Widget/AddForm.hs
+++ b/Hledger/Web/Widget/AddForm.hs
@@ -19,10 +19,10 @@
 import Data.Foldable (toList)
 import Data.List (dropWhileEnd, unfoldr)
 import Data.Maybe (isJust, fromMaybe)
-import qualified Data.Set as S
+import Data.Set qualified as S
 import Data.Text (Text)
 import Data.Text.Encoding.Base64 (encodeBase64)
-import qualified Data.Text as T
+import Data.Text qualified as T
 import Data.Time (Day)
 import Text.Blaze.Internal (Markup, preEscapedText)
 import Text.Megaparsec (bundleErrors, eof, parseErrorTextPretty, runParser)
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
@@ -23,11 +23,11 @@
 import Data.Foldable (find, for_)
 import Data.List (elemIndex)
 import Data.Text (Text)
-import qualified Data.Text as T
+import Data.Text qualified as T
 import System.FilePath (takeFileName)
 import Text.Blaze ((!), textValue)
-import qualified Text.Blaze.Html5 as H
-import qualified Text.Blaze.Html5.Attributes as A
+import Text.Blaze.Html5 qualified as H
+import Text.Blaze.Html5.Attributes qualified as A
 import Text.Blaze.Internal (preEscapedString)
 import Text.Hamlet (hamletFile)
 import Text.Printf (printf)
@@ -36,7 +36,7 @@
 import Hledger
 import Hledger.Cli.Utils (writeFileWithBackupIfChanged)
 import Hledger.Web.Settings (manualurl)
-import qualified Hledger.Query as Query
+import Hledger.Query qualified as Query
 
 journalFile404 :: FilePath -> Journal -> HandlerFor m (FilePath, Text)
 journalFile404 f j =
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" "September 2025" "hledger-web-1.50.2 " "hledger User Manuals"
+.TH "HLEDGER\-WEB" "1" "November 2025" "hledger-web-1.50.3 " "hledger User Manuals"
 
 
 
@@ -17,7 +17,7 @@
 .PD
 \f[CR]hledger web [OPTS] [QUERY]\f[R]
 .SH DESCRIPTION
-This manual is for hledger\[aq]s web interface, version 1.50.2.
+This manual is for hledger\[aq]s web interface, version 1.50.3.
 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.50.2
+version:        1.50.3
 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.
@@ -120,19 +120,14 @@
 
 flag dev
   description: Turn on development settings, like auto-reload templates.
-  manual: False
+  manual: True
   default: False
 
 flag library-only
   description: Build for use with "yesod devel"
-  manual: False
+  manual: True
   default: False
 
-flag threaded
-  description: Build with support for multithreaded execution.
-  manual: False
-  default: True
-
 library
   exposed-modules:
       Hledger.Web
@@ -158,8 +153,8 @@
       Paths_hledger_web
   hs-source-dirs:
       ./
-  ghc-options: -Wall -Wredundant-constraints -Wincomplete-record-updates -Wincomplete-uni-patterns
-  cpp-options: -DVERSION="1.50.2"
+  ghc-options: -Wall -Wredundant-constraints -Wincomplete-record-updates -Wincomplete-uni-patterns -threaded
+  cpp-options: -DVERSION="1.50.3"
   build-depends:
       Decimal >=0.5.1
     , aeson >=1 && <2.3
@@ -181,8 +176,8 @@
     , filepath
     , githash >=0.1.6.2
     , hjsmin
-    , hledger >=1.50.2 && <1.51
-    , hledger-lib >=1.50.2 && <1.51
+    , hledger >=1.50.3 && <1.51
+    , hledger-lib >=1.50.3 && <1.51
     , hspec
     , http-client
     , http-conduit
@@ -210,9 +205,7 @@
     , yesod-form >=1.4 && <1.8
     , yesod-static >=1.4 && <1.7
     , yesod-test
-  default-language: Haskell2010
-  if flag(threaded)
-    ghc-options: -threaded
+  default-language: GHC2021
   if (flag(dev)) || (flag(library-only))
     cpp-options: -DDEVELOPMENT
   if flag(dev)
@@ -228,14 +221,12 @@
       Paths_hledger_web
   hs-source-dirs:
       app
-  ghc-options: -Wall -Wredundant-constraints -Wincomplete-record-updates -Wincomplete-uni-patterns -with-rtsopts=-T
-  cpp-options: -DVERSION="1.50.2"
+  ghc-options: -Wall -Wredundant-constraints -Wincomplete-record-updates -Wincomplete-uni-patterns -threaded -with-rtsopts=-T
+  cpp-options: -DVERSION="1.50.3"
   build-depends:
       base >=4.18 && <4.22
     , hledger-web
-  default-language: Haskell2010
-  if flag(threaded)
-    ghc-options: -threaded
+  default-language: GHC2021
   if (flag(dev)) || (flag(library-only))
     cpp-options: -DDEVELOPMENT
   if flag(dev)
@@ -250,14 +241,12 @@
   main-is: test.hs
   hs-source-dirs:
       test
-  ghc-options: -Wall -Wredundant-constraints -Wincomplete-record-updates -Wincomplete-uni-patterns
-  cpp-options: -DVERSION="1.50.2"
+  ghc-options: -Wall -Wredundant-constraints -Wincomplete-record-updates -Wincomplete-uni-patterns -threaded
+  cpp-options: -DVERSION="1.50.3"
   build-depends:
       base >=4.18 && <4.22
     , hledger-web
-  default-language: Haskell2010
-  if flag(threaded)
-    ghc-options: -threaded
+  default-language: GHC2021
   if (flag(dev)) || (flag(library-only))
     cpp-options: -DDEVELOPMENT
   if flag(dev)
diff --git a/hledger-web.info b/hledger-web.info
--- a/hledger-web.info
+++ b/hledger-web.info
@@ -18,7 +18,7 @@
 or
 'hledger web [OPTS] [QUERY]'
 
-   This manual is for hledger's web interface, version 1.50.2.  See also
+   This manual is for hledger's web interface, version 1.50.3.  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
@@ -11,7 +11,7 @@
        hledger web [OPTS] [QUERY]
 
 DESCRIPTION
-       This manual is for hledger's web interface, version 1.50.2.   See  also
+       This manual is for hledger's web interface, version 1.50.3.   See  also
        the hledger manual for common concepts and file formats.
 
        hledger  is a robust, user-friendly, cross-platform set of programs for
@@ -480,4 +480,4 @@
 SEE ALSO
        hledger(1), hledger-ui(1), hledger-web(1), ledger(1)
 
-hledger-web-1.50.2              September 2025                  HLEDGER-WEB(1)
+hledger-web-1.50.3               November 2025                  HLEDGER-WEB(1)
