diff --git a/CHANGES.md b/CHANGES.md
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -9,6 +9,18 @@
 User-visible changes in hledger-web.
 See also the hledger changelog.
 
+# 1.26 2022-06-04
+
+Fixes
+
+- Don't add link URLs when printing.
+
+Improvements
+
+- Now builds with GHC 9.2.
+
+- Uses hledger 1.26.
+
 # 1.25 2022-03-04
 
 - Uses hledger 1.25.
diff --git a/Hledger/Web/Foundation.hs b/Hledger/Web/Foundation.hs
--- a/Hledger/Web/Foundation.hs
+++ b/Hledger/Web/Foundation.hs
@@ -17,6 +17,7 @@
 
 import Control.Applicative ((<|>))
 import Control.Monad (join, when)
+-- import Control.Monad.Except (runExceptT)  -- now re-exported by Hledger
 import qualified Data.ByteString.Char8 as BC
 import Data.Traversable (for)
 import Data.IORef (IORef, readIORef, writeIORef)
@@ -256,16 +257,16 @@
 -- ui message.
 getCurrentJournal :: IORef Journal -> CliOpts -> Day -> Handler (Journal, Maybe String)
 getCurrentJournal jref opts d = do
-  -- XXX put this inside atomicModifyIORef' for thread safety
-  j <- liftIO (readIORef jref)
-  (ej, changed) <- liftIO $ journalReloadIfChanged opts d j
   -- re-apply any initial filter specified at startup
   let initq = _rsQuery $ reportspec_ opts
-  case (changed, filterJournalTransactions initq <$> ej) of
-    (False, _) -> return (j, Nothing)
-    (True, Right j') -> do
-      liftIO $ writeIORef jref j'
-      return (j',Nothing)
-    (True, Left e) -> do
+  -- XXX put this inside atomicModifyIORef' for thread safety
+  j <- liftIO (readIORef jref)
+  ej <- liftIO . runExceptT $ journalReloadIfChanged opts d j
+  case ej of
+    Left e -> do
       setMessage "error while reading journal"
       return (j, Just e)
+    Right (j', True) -> do
+      liftIO . writeIORef jref $ filterJournalTransactions initq j'
+      return (j',Nothing)
+    Right (_, False) -> return (j, Nothing)
diff --git a/Hledger/Web/Handler/EditR.hs b/Hledger/Web/Handler/EditR.hs
--- a/Hledger/Web/Handler/EditR.hs
+++ b/Hledger/Web/Handler/EditR.hs
@@ -10,6 +10,7 @@
   , postEditR
   ) where
 
+import Control.Monad.Except (runExceptT)
 import Hledger.Web.Import
 import Hledger.Web.Widget.Common
        (fromFormSuccess, helplink, journalFile404, writeJournalTextIfValidAndChanged)
@@ -36,7 +37,7 @@
   (f', txt) <- journalFile404 f j
   ((res, view), enctype) <- runFormPost (editForm f' txt)
   newtxt <- fromFormSuccess (showForm view enctype) res
-  writeJournalTextIfValidAndChanged f newtxt >>= \case
+  runExceptT (writeJournalTextIfValidAndChanged f newtxt) >>= \case
     Left e -> do
       setMessage $ "Failed to load journal: " <> toHtml e
       showForm view enctype
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
@@ -9,6 +9,7 @@
   , postUploadR
   ) where
 
+import Control.Monad.Except (runExceptT)
 import qualified Data.ByteString.Lazy as BL
 import Data.Conduit (connect)
 import Data.Conduit.Binary (sinkLbs)
@@ -52,7 +53,7 @@
         "where the transcoding should be handled by the browser."
       showForm view enctype
     Right newtxt -> return newtxt
-  writeJournalTextIfValidAndChanged f newtxt >>= \case
+  runExceptT (writeJournalTextIfValidAndChanged f newtxt) >>= \case
     Left e -> do
       setMessage $ "Failed to load journal: " <> toHtml e
       showForm view enctype
diff --git a/Hledger/Web/Import.hs b/Hledger/Web/Import.hs
--- a/Hledger/Web/Import.hs
+++ b/Hledger/Web/Import.hs
@@ -4,7 +4,7 @@
 
 import           Prelude              as Import hiding (head, init, last,
                                                  readFile, tail, writeFile)
-import           Yesod                as Import hiding (Route (..))
+import           Yesod                as Import hiding (Route (..), parseTime)
 
 import           Control.Monad        as Import
 import           Data.Bifunctor       as Import
@@ -15,7 +15,7 @@
 import           Data.List            as Import (unfoldr)
 import           Data.Maybe           as Import
 import           Data.Text            as Import (Text)
-import           Data.Time            as Import hiding (parseTime)
+import           Data.Time            as Import
 import           Data.Traversable     as Import
 import           Data.Void            as Import (Void)
 import           Text.Blaze           as Import (Markup)
diff --git a/Hledger/Web/Test.hs b/Hledger/Web/Test.hs
--- a/Hledger/Web/Test.hs
+++ b/Hledger/Web/Test.hs
@@ -4,7 +4,6 @@
   hledgerWebTest
 ) where
 
-import Control.Monad.Except (runExceptT)
 import qualified Data.Text as T
 import Test.Hspec (hspec)
 import Yesod.Default.Config
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
@@ -19,6 +19,7 @@
   , replaceInacct
   ) where
 
+import Control.Monad.Except (ExceptT, mapExceptT)
 import Data.Foldable (find, for_)
 import Data.List (elemIndex)
 import Data.Text (Text)
@@ -59,17 +60,15 @@
 -- The file will be written (if changed) with the current system's native
 -- line endings (see writeFileWithBackupIfChanged).
 --
-writeJournalTextIfValidAndChanged :: MonadHandler m => FilePath -> Text -> m (Either String ())
-writeJournalTextIfValidAndChanged f t = do
+writeJournalTextIfValidAndChanged :: MonadHandler m => FilePath -> Text -> ExceptT String m ()
+writeJournalTextIfValidAndChanged f t = mapExceptT liftIO $ do
   -- Ensure unix line endings, since both readJournal (cf
   -- formatdirectivep, #1194) writeFileWithBackupIfChanged require them.
   -- XXX klunky. Any equivalent of "hSetNewlineMode h universalNewlineMode" for form posts ?
   let t' = T.replace "\r" "" t
-  liftIO (readJournal definputopts (Just f) t') >>= \case
-    Left e -> return (Left e)
-    Right _ -> do
-      _ <- liftIO (writeFileWithBackupIfChanged f t')
-      return (Right ())
+  j <- readJournal definputopts (Just f) t'
+  _ <- liftIO $ j `seq` writeFileWithBackupIfChanged f t'  -- Only write backup if the journal didn't error
+  return ()
 
 -- | Link to a topic in the manual.
 helplink :: Text -> Text -> HtmlUrl r
diff --git a/hledger-web.1 b/hledger-web.1
--- a/hledger-web.1
+++ b/hledger-web.1
@@ -1,12 +1,12 @@
 
-.TH "HLEDGER-WEB" "1" "March 2022" "hledger-web-1.25 " "hledger User Manuals"
+.TH "HLEDGER-WEB" "1" "June 2022" "hledger-web-1.26 " "hledger User Manuals"
 
 
 
 .SH NAME
 .PP
 hledger-web is a web interface (WUI) for the hledger accounting tool.
-This manual is for hledger-web 1.25.
+This manual is for hledger-web 1.26.
 .SH SYNOPSIS
 .PP
 \f[C]hledger-web [OPTIONS]\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.25
+version:        1.26
 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.
@@ -150,8 +150,8 @@
       Paths_hledger_web
   hs-source-dirs:
       ./
-  ghc-options: -Wall -fwarn-tabs -Wcompat -Wincomplete-uni-patterns -Wincomplete-record-updates -Wredundant-constraints
-  cpp-options: -DVERSION="1.25"
+  ghc-options: -Wall -Wredundant-constraints -Wincomplete-record-updates -Wincomplete-uni-patterns
+  cpp-options: -DVERSION="1.26"
   build-depends:
       Decimal >=0.5.1
     , aeson >=1
@@ -171,8 +171,8 @@
     , extra >=1.6.3
     , filepath
     , hjsmin
-    , hledger ==1.25.*
-    , hledger-lib ==1.25.*
+    , hledger ==1.26.*
+    , hledger-lib ==1.26.*
     , hspec
     , http-client
     , http-conduit
@@ -211,8 +211,8 @@
       Paths_hledger_web
   hs-source-dirs:
       app
-  ghc-options: -Wall -fwarn-tabs -Wcompat -Wincomplete-uni-patterns -Wincomplete-record-updates -Wredundant-constraints
-  cpp-options: -DVERSION="1.25"
+  ghc-options: -Wall -Wredundant-constraints -Wincomplete-record-updates -Wincomplete-uni-patterns
+  cpp-options: -DVERSION="1.26"
   build-depends:
       base
     , hledger-web
@@ -231,8 +231,8 @@
   main-is: test.hs
   hs-source-dirs:
       test
-  ghc-options: -Wall -fwarn-tabs -Wcompat -Wincomplete-uni-patterns -Wincomplete-record-updates -Wredundant-constraints
-  cpp-options: -DVERSION="1.25"
+  ghc-options: -Wall -Wredundant-constraints -Wincomplete-record-updates -Wincomplete-uni-patterns
+  cpp-options: -DVERSION="1.26"
   build-depends:
       base
     , hledger
diff --git a/hledger-web.info b/hledger-web.info
--- a/hledger-web.info
+++ b/hledger-web.info
@@ -12,7 +12,7 @@
 **************
 
 hledger-web is a web interface (WUI) for the hledger accounting tool.
-This manual is for hledger-web 1.25.
+This manual is for hledger-web 1.26.
 
    'hledger-web [OPTIONS]'
 'hledger web -- [OPTIONS]'
diff --git a/hledger-web.txt b/hledger-web.txt
--- a/hledger-web.txt
+++ b/hledger-web.txt
@@ -5,7 +5,7 @@
 
 NAME
        hledger-web  is  a web interface (WUI) for the hledger accounting tool.
-       This manual is for hledger-web 1.25.
+       This manual is for hledger-web 1.26.
 
 SYNOPSIS
        hledger-web [OPTIONS]
@@ -585,4 +585,4 @@
 
 
 
-hledger-web-1.25                  March 2022                    HLEDGER-WEB(1)
+hledger-web-1.26                   June 2022                    HLEDGER-WEB(1)
diff --git a/static/hledger.css b/static/hledger.css
--- a/static/hledger.css
+++ b/static/hledger.css
@@ -1,6 +1,14 @@
 /* hledger web ui styles */
 
 /*------------------------------------------------------------------------------------------*/
+/* 0. revert some things */
+
+/* don't let bootstrap add link URLs when printing */
+@media print {
+  a[href]:after { content: none !important; }
+}
+
+/*------------------------------------------------------------------------------------------*/
 /* 1. colours */
 
 /* green */
