diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,10 @@
 # Changelog for passman
 
+## 0.3.1.1
+
+- updated documentation to on longer mention GitHub
+- updated resolver to LTS 20.19
+
 ## 0.3.1
 
 - set maximum version of transformers package
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
 # passman
 
-Copyright (C) 2018-2021 Jonathan Lamothe
+Copyright (C) 2018-2023 Jonathan Lamothe
 <jonathan@jlamothe.net>
 
 This program is free software: you can redistribute it and/or modify
@@ -41,16 +41,11 @@
 this, you can simply enter the command `stack install passman` in the
 terminal to install passman.
 
-## GitHub
+## Codeberg
 
-The most recent version of passman can be found on GitHub at
-<https://github.com/jlamothe/passman>.
+The most recent version of passman can be found on Codeberg at
+<https://codeberg.org/jlamothe/passman>.
 
 ## Pull Requests
 
 Pull requests are welcome, but should be made to the `dev` branch.
-
-## Donations
-
-Bitcoin donations are accepted (but not required) at:
-18hqEsXCinyauDp6smPUEVuscjDdasTKvr
diff --git a/app/Types.hs b/app/Types.hs
--- a/app/Types.hs
+++ b/app/Types.hs
@@ -26,7 +26,7 @@
 
 import Lens.Micro (set, (^.))
 import Lens.Micro.TH (makeLenses)
-import System.Random (RandomGen (next, split), StdGen)
+import System.Random (RandomGen (genWord64, split), StdGen)
 
 import Password
 
@@ -40,8 +40,8 @@
 makeLenses ''Status
 
 instance RandomGen Status where
-  next s = (x, s') where
-    (x, g') = next g
+  genWord64 s = (x, s') where
+    (x, g') = genWord64 g
     s' = set gen g' s
     g = s^.gen
   split s = (s1, s2) where
diff --git a/passman.cabal b/passman.cabal
--- a/passman.cabal
+++ b/passman.cabal
@@ -1,51 +1,49 @@
-cabal-version: 1.12
+cabal-version: 2.2
 
--- This file has been generated from package.yaml by hpack version 0.33.0.
+-- This file has been generated from package.yaml by hpack version 0.35.1.
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: e3bd0ca2b360b025666f4503e3115caaaed34c7719487d90ae4d5eb58f9621e9
+-- hash: da6c3020622e5c4c06814752b3f3334e52925005f8b3be9516efb9fd1976af9c
 
 name:           passman
-version:        0.3.1
+version:        0.3.1.1
 synopsis:       a simple password manager
-description:    Please see the README on GitHub at <https://github.com/jlamothe/passman#readme>
+description:    a simple password manager - see README.md for details
 category:       Security
-homepage:       https://github.com/jlamothe/passman#readme
-bug-reports:    https://github.com/jlamothe/passman/issues
+homepage:       https://codeberg.org/jlamothe/passman
+bug-reports:    https://codeberg.org/jlamothe/passman/issues
 author:         Jonathan Lamothe
 maintainer:     jonathan@jlamothe.net
-copyright:      (C) 2018-2021 Jonathan Lamothe
-license:        LGPL-3
+copyright:      (C) 2018-2023 Jonathan Lamothe
+license:        LGPL-3.0-or-later
 license-file:   LICENSE
 build-type:     Simple
 extra-source-files:
     README.md
     ChangeLog.md
 
-source-repository head
-  type: git
-  location: https://github.com/jlamothe/passman
-
 library
   exposed-modules:
       Password
   other-modules:
       Paths_passman
+  autogen-modules:
+      Paths_passman
   hs-source-dirs:
       src
   ghc-options: -Wall
   build-depends:
       SHA >=1.6.4.4 && <1.7
-    , aeson >=1.5.6.0 && <1.6
+    , aeson >=2.0.3.0 && <2.1
     , base >=4.7 && <5
-    , base16-bytestring >=0.1.1.7 && <0.2
-    , base64-bytestring >=1.1.0.0 && <1.2
-    , bytestring >=0.10.12.0 && <0.11
+    , base16-bytestring >=1.0.2.0 && <1.1
+    , base64-bytestring >=1.2.1.0 && <1.3
+    , bytestring >=0.11.4.0 && <0.12
     , containers >=0.6.2.1 && <0.7
     , microlens >=0.4.11.2 && <0.5
     , microlens-th >=0.4.3.6 && <0.5
-    , random >=1.1 && <1.2
+    , random >=1.2.1.1 && <1.3
     , text >=1.2.4.1 && <1.3
   default-language: Haskell2010
 
@@ -56,20 +54,22 @@
       UI
       Util
       Paths_passman
+  autogen-modules:
+      Paths_passman
   hs-source-dirs:
       app
   ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N
   build-depends:
-      HCL >=1.8 && <1.9
-    , aeson >=1.5.6.0 && <1.6
+      HCL ==1.8.*
+    , aeson >=2.0.3.0 && <2.1
     , base >=4.7 && <5
-    , bytestring >=0.10.12.0 && <0.11
+    , bytestring >=0.11.4.0 && <0.12
     , containers >=0.6.2.1 && <0.7
     , easy-file >=0.2.2 && <0.3
     , microlens >=0.4.11.2 && <0.5
     , microlens-th >=0.4.3.6 && <0.5
     , passman
-    , random >=1.1 && <1.2
+    , random >=1.2.1.1 && <1.3
     , transformers >=0.5.6.2 && <0.6
   default-language: Haskell2010
 
@@ -92,17 +92,19 @@
       Spec.ValidatePWDatabase
       Spec.ValidatePWPolicy
       Paths_passman
+  autogen-modules:
+      Paths_passman
   hs-source-dirs:
       test
   ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N
   build-depends:
       HUnit
-    , aeson >=1.5.6.0 && <1.6
+    , aeson >=2.0.3.0 && <2.1
     , base >=4.7 && <5
-    , bytestring >=0.10.12.0 && <0.11
+    , bytestring >=0.11.4.0 && <0.12
     , containers >=0.6.2.1 && <0.7
     , microlens >=0.4.11.2 && <0.5
     , microlens-th >=0.4.3.6 && <0.5
     , passman
-    , random >=1.1 && <1.2
+    , random >=1.2.1.1 && <1.3
   default-language: Haskell2010
diff --git a/src/Password.hs b/src/Password.hs
--- a/src/Password.hs
+++ b/src/Password.hs
@@ -63,6 +63,7 @@
 import qualified Data.ByteString.Base64.Lazy as B64
 import Data.Char (isUpper, isLower, isDigit, isAlphaNum, toLower)
 import Data.Digest.Pure.SHA
+import Data.Either (fromRight)
 import qualified Data.Map as M
 import Data.Maybe (fromMaybe)
 import qualified Data.Text as T
@@ -341,7 +342,7 @@
 mkSeed pw d = toUTF8 pw `B.append` (d^.pwSalt.to runPWSalt)
 
 mkHash :: B.ByteString -> B.ByteString
-mkHash = fst . B16.decode . toUTF8 . show . sha256
+mkHash = fromRight "" . B16.decode . toUTF8 . show . sha256
 
 nextPolicy :: Char -> PWPolicy -> PWPolicy
 nextPolicy x p = over pwLength pred $
