diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,15 @@
 
 ## Unreleased
 
+## 0.1.0.4 — 2026-03-11
+
+### Changed
+
+- Added PVP-compliant upper bounds to all dependencies.
+- Moved `CHANGELOG.md` to `extra-doc-files` so Hackage renders it on
+  the package page.
+- Fixed `description` URL to point to the correct GitHub repository.
+
 ## 0.1.0.3 — 2026-03-11
 
 ### Fixed
diff --git a/sofetch.cabal b/sofetch.cabal
--- a/sofetch.cabal
+++ b/sofetch.cabal
@@ -5,9 +5,9 @@
 -- see: https://github.com/sol/hpack
 
 name:           sofetch
-version:        0.1.0.3
+version:        0.1.0.4
 synopsis:       A low-boilerplate Haxl-like data fetching library
-description:    Please see the README on GitHub at <https://github.com/githubuser/sofetch#readme>
+description:    Please see the README on GitHub at <https://github.com/iand675/sofetch#readme>
 category:       Data
 homepage:       https://github.com/iand675/sofetch#readme
 bug-reports:    https://github.com/iand675/sofetch/issues
@@ -19,6 +19,7 @@
 build-type:     Simple
 extra-source-files:
     README.md
+extra-doc-files:
     CHANGELOG.md
 
 source-repository head
@@ -52,17 +53,17 @@
       src
   ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints
   build-depends:
-      async
+      async ==2.2.*
     , base >=4.7 && <5
-    , containers
-    , exceptions
-    , hashable
-    , semigroupoids
-    , text
-    , time
-    , transformers
-    , unliftio-core
-    , unordered-containers
+    , containers >=0.6 && <0.8
+    , exceptions ==0.10.*
+    , hashable >=1.4 && <1.6
+    , semigroupoids ==6.0.*
+    , text >=1.2 && <2.2
+    , time >=1.9 && <1.15
+    , transformers >=0.5 && <0.7
+    , unliftio-core ==0.2.*
+    , unordered-containers >=0.2.16 && <0.3
   default-language: Haskell2010
 
 executable github-explorer
@@ -72,22 +73,22 @@
   ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded
   build-depends:
       aeson
-    , async
+    , async ==2.2.*
     , base >=4.7 && <5
     , bytestring
-    , containers
-    , exceptions
-    , hashable
+    , containers >=0.6 && <0.8
+    , exceptions ==0.10.*
+    , hashable >=1.4 && <1.6
     , http-client
     , http-client-tls
     , http-types
-    , semigroupoids
+    , semigroupoids ==6.0.*
     , sofetch
-    , text
-    , time
-    , transformers
-    , unliftio-core
-    , unordered-containers
+    , text >=1.2 && <2.2
+    , time >=1.9 && <1.15
+    , transformers >=0.5 && <0.7
+    , unliftio-core ==0.2.*
+    , unordered-containers >=0.2.16 && <0.3
   default-language: Haskell2010
   if !flag(examples)
     buildable: False
@@ -98,20 +99,20 @@
       examples
   ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded
   build-depends:
-      async
+      async ==2.2.*
     , base >=4.7 && <5
     , bytestring
-    , containers
-    , exceptions
-    , hashable
-    , semigroupoids
+    , containers >=0.6 && <0.8
+    , exceptions ==0.10.*
+    , hashable >=1.4 && <1.6
+    , semigroupoids ==6.0.*
     , sofetch
     , sqlite-simple
-    , text
-    , time
-    , transformers
-    , unliftio-core
-    , unordered-containers
+    , text >=1.2 && <2.2
+    , time >=1.9 && <1.15
+    , transformers >=0.5 && <0.7
+    , unliftio-core ==0.2.*
+    , unordered-containers >=0.2.16 && <0.3
   default-language: Haskell2010
   if !flag(examples)
     buildable: False
@@ -127,17 +128,17 @@
       test
   ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N
   build-depends:
-      async
+      async ==2.2.*
     , base >=4.7 && <5
-    , containers
-    , exceptions
-    , hashable
+    , containers >=0.6 && <0.8
+    , exceptions ==0.10.*
+    , hashable >=1.4 && <1.6
     , hspec
-    , semigroupoids
+    , semigroupoids ==6.0.*
     , sofetch
-    , text
-    , time
-    , transformers
-    , unliftio-core
-    , unordered-containers
+    , text >=1.2 && <2.2
+    , time >=1.9 && <1.15
+    , transformers >=0.5 && <0.7
+    , unliftio-core ==0.2.*
+    , unordered-containers >=0.2.16 && <0.3
   default-language: Haskell2010
