diff --git a/package.yaml b/package.yaml
--- a/package.yaml
+++ b/package.yaml
@@ -1,5 +1,5 @@
 name: rattletrap
-version: 4.0.3
+version: 4.0.4
 
 category: Game
 description: Rattletrap parses and generates Rocket League replays.
@@ -15,19 +15,19 @@
 synopsis: Parse and generate Rocket League replays.
 
 dependencies:
-  aeson-pretty: == 0.8.5.*
-  aeson: == 1.2.3.*
-  base: == 4.10.1.*
-  binary-bits: == 0.5.*
-  binary: == 0.8.5.*
-  bytestring: == 0.10.8.*
-  containers: == 0.5.10.*
-  filepath: == 1.4.1.*
-  http-client-tls: == 0.3.5.*
-  http-client: == 0.5.8.*
-  template-haskell: == 2.12.*
-  text: == 1.2.2.*
-  transformers: == 0.5.2.*
+  aeson-pretty: '>= 0.8.5 && < 0.9'
+  aeson: '>= 1.2.3 && < 1.3'
+  base: '>= 4.10.1 && < 4.11'
+  binary-bits: '>= 0.5 && < 0.6'
+  binary: '>= 0.8.5 && < 0.9'
+  bytestring: '>= 0.10.8 && < 0.11'
+  containers: '>= 0.5.10 && < 0.6'
+  filepath: '>= 1.4.1 && < 1.5'
+  http-client-tls: '>= 0.3.5 && < 0.4'
+  http-client: '>= 0.5.8 && < 0.6'
+  template-haskell: '>= 2.12.0 && < 2.13'
+  text: '>= 1.2.2 && < 1.3'
+  transformers: '>= 0.5.2 && < 0.6'
 ghc-options:
   - -Weverything
   - -Wno-implicit-prelude
@@ -49,9 +49,9 @@
 tests:
   test:
     dependencies:
-      HUnit: == 1.6.*
+      HUnit: '>= 1.6.0 && < 1.7'
       rattletrap:
-      temporary: == 1.2.1.*
+      temporary: '>= 1.2.1 && < 1.3'
     ghc-options:
       - -rtsopts
       - -threaded
diff --git a/rattletrap.cabal b/rattletrap.cabal
--- a/rattletrap.cabal
+++ b/rattletrap.cabal
@@ -2,10 +2,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 794396087569fe653e22d0066906ab0145122b6335a98d589524faa339f4d4e5
+-- hash: 789416c7a58f581b763bb6e99f5edaacea39df1cccd1190de962318661d466b0
 
 name:           rattletrap
-version:        4.0.3
+version:        4.0.4
 synopsis:       Parse and generate Rocket League replays.
 description:    Rattletrap parses and generates Rocket League replays.
 category:       Game
@@ -32,19 +32,19 @@
       library
   ghc-options: -Weverything -Wno-implicit-prelude -Wno-missing-import-lists -Wno-safe -Wno-unsafe
   build-depends:
-      aeson ==1.2.3.*
-    , aeson-pretty ==0.8.5.*
-    , base ==4.10.1.*
-    , binary ==0.8.5.*
-    , binary-bits ==0.5.*
-    , bytestring ==0.10.8.*
-    , containers ==0.5.10.*
-    , filepath ==1.4.1.*
-    , http-client ==0.5.8.*
-    , http-client-tls ==0.3.5.*
-    , template-haskell ==2.12.*
-    , text ==1.2.2.*
-    , transformers ==0.5.2.*
+      aeson >=1.2.3 && <1.3
+    , aeson-pretty >=0.8.5 && <0.9
+    , base >=4.10.1 && <4.11
+    , binary >=0.8.5 && <0.9
+    , binary-bits >=0.5 && <0.6
+    , bytestring >=0.10.8 && <0.11
+    , containers >=0.5.10 && <0.6
+    , filepath >=1.4.1 && <1.5
+    , http-client >=0.5.8 && <0.6
+    , http-client-tls >=0.3.5 && <0.4
+    , template-haskell >=2.12.0 && <2.13
+    , text >=1.2.2 && <1.3
+    , transformers >=0.5.2 && <0.6
   exposed-modules:
       Rattletrap
       Rattletrap.Console.Main
@@ -270,20 +270,20 @@
       executables
   ghc-options: -Weverything -Wno-implicit-prelude -Wno-missing-import-lists -Wno-safe -Wno-unsafe -rtsopts -threaded
   build-depends:
-      aeson ==1.2.3.*
-    , aeson-pretty ==0.8.5.*
-    , base ==4.10.1.*
-    , binary ==0.8.5.*
-    , binary-bits ==0.5.*
-    , bytestring ==0.10.8.*
-    , containers ==0.5.10.*
-    , filepath ==1.4.1.*
-    , http-client ==0.5.8.*
-    , http-client-tls ==0.3.5.*
+      aeson >=1.2.3 && <1.3
+    , aeson-pretty >=0.8.5 && <0.9
+    , base >=4.10.1 && <4.11
+    , binary >=0.8.5 && <0.9
+    , binary-bits >=0.5 && <0.6
+    , bytestring >=0.10.8 && <0.11
+    , containers >=0.5.10 && <0.6
+    , filepath >=1.4.1 && <1.5
+    , http-client >=0.5.8 && <0.6
+    , http-client-tls >=0.3.5 && <0.4
     , rattletrap
-    , template-haskell ==2.12.*
-    , text ==1.2.2.*
-    , transformers ==0.5.2.*
+    , template-haskell >=2.12.0 && <2.13
+    , text >=1.2.2 && <1.3
+    , transformers >=0.5.2 && <0.6
   other-modules:
       Paths_rattletrap
   default-language: Haskell2010
@@ -295,22 +295,22 @@
       tests
   ghc-options: -Weverything -Wno-implicit-prelude -Wno-missing-import-lists -Wno-safe -Wno-unsafe -rtsopts -threaded
   build-depends:
-      HUnit ==1.6.*
-    , aeson ==1.2.3.*
-    , aeson-pretty ==0.8.5.*
-    , base ==4.10.1.*
-    , binary ==0.8.5.*
-    , binary-bits ==0.5.*
-    , bytestring ==0.10.8.*
-    , containers ==0.5.10.*
-    , filepath ==1.4.1.*
-    , http-client ==0.5.8.*
-    , http-client-tls ==0.3.5.*
+      HUnit >=1.6.0 && <1.7
+    , aeson >=1.2.3 && <1.3
+    , aeson-pretty >=0.8.5 && <0.9
+    , base >=4.10.1 && <4.11
+    , binary >=0.8.5 && <0.9
+    , binary-bits >=0.5 && <0.6
+    , bytestring >=0.10.8 && <0.11
+    , containers >=0.5.10 && <0.6
+    , filepath >=1.4.1 && <1.5
+    , http-client >=0.5.8 && <0.6
+    , http-client-tls >=0.3.5 && <0.4
     , rattletrap
-    , template-haskell ==2.12.*
-    , temporary ==1.2.1.*
-    , text ==1.2.2.*
-    , transformers ==0.5.2.*
+    , template-haskell >=2.12.0 && <2.13
+    , temporary >=1.2.1 && <1.3
+    , text >=1.2.2 && <1.3
+    , transformers >=0.5.2 && <0.6
   other-modules:
       Paths_rattletrap
   default-language: Haskell2010
