diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,18 @@
 # Changelog
 
+## 1.1.0.1
+
+All changes contributed by [@sectore](https://github.com/sectore) — thanks!
+
+* Fix double URL-decoding of the `datastar` query parameter in `readSignals`
+  (GET/DELETE requests). `WAI.queryString` is already decoded, so the extra
+  decode corrupted signal values containing literal `+` or `%` characters
+  ([#8](https://github.com/starfederation/datastar-haskell/pull/8))
+* Fix GHC warnings in the add-on packages' test suites
+  ([#6](https://github.com/starfederation/datastar-haskell/pull/6))
+* Add a `haskell-flake` based Nix flake for development
+  ([#7](https://github.com/starfederation/datastar-haskell/pull/7))
+
 ## 1.1.0.0
 
 * **Breaking**: the compressor modules moved to add-on packages so that the
diff --git a/datastar-hs.cabal b/datastar-hs.cabal
--- a/datastar-hs.cabal
+++ b/datastar-hs.cabal
@@ -1,6 +1,6 @@
 cabal-version:   3.0
 name:            datastar-hs
-version:         1.1.0.0
+version:         1.1.0.1
 synopsis:        Haskell bindings for Datastar
 description:
   Server-side SDK for building real-time hypermedia applications with
@@ -98,8 +98,10 @@
     Hypermedia.Datastar.NegotiationSpec
     Hypermedia.Datastar.PatchElementsSpec
     Hypermedia.Datastar.PatchSignalsSpec
+    Hypermedia.Datastar.ReadSignalsSpec
     Hypermedia.Datastar.SSESpec
   build-depends:
+    , aeson
     , base
     , bytestring
     , datastar-hs
diff --git a/src/Hypermedia/Datastar/WAI.hs b/src/Hypermedia/Datastar/WAI.hs
--- a/src/Hypermedia/Datastar/WAI.hs
+++ b/src/Hypermedia/Datastar/WAI.hs
@@ -274,8 +274,7 @@
 parseFromQuery :: (FromJSON a) => WAI.Request -> Either String a
 parseFromQuery req =
   case lookup "datastar" (WAI.queryString req) of
-    (Just (Just val)) ->
-      A.eitherDecodeStrict $ WAI.urlDecode True val
+    (Just (Just val)) -> A.eitherDecodeStrict val
     _ -> Left "missing 'datastar' query parameter"
 
 parseFromBody :: (FromJSON a) => WAI.Request -> IO (Either String a)
diff --git a/test/Hypermedia/Datastar/ReadSignalsSpec.hs b/test/Hypermedia/Datastar/ReadSignalsSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Hypermedia/Datastar/ReadSignalsSpec.hs
@@ -0,0 +1,23 @@
+module Hypermedia.Datastar.ReadSignalsSpec (spec) where
+
+import Test.Hspec
+
+import Data.Aeson (FromJSON (..), withObject, (.:))
+import Data.Text (Text)
+
+import Network.Wai (defaultRequest, queryString, requestMethod)
+
+import Hypermedia.Datastar.WAI (readSignals)
+
+newtype Msg = Msg Text deriving (Eq, Show)
+
+instance FromJSON Msg where
+  parseJSON = withObject "Msg" $ \o -> Msg <$> o .: "msg"
+
+spec :: Spec
+spec = describe "readSignals" $ do
+  let req q = defaultRequest{requestMethod = "GET", queryString = [("datastar", Just q)]}
+
+  it "decodes JSON signals from the query string exactly as sent" $ do
+    result <- readSignals (req "{\"msg\":\"a+b\"}")
+    result `shouldBe` Right (Msg "a+b")
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -6,6 +6,7 @@
 import Hypermedia.Datastar.NegotiationSpec qualified
 import Hypermedia.Datastar.PatchElementsSpec qualified
 import Hypermedia.Datastar.PatchSignalsSpec qualified
+import Hypermedia.Datastar.ReadSignalsSpec qualified
 import Hypermedia.Datastar.SSESpec qualified
 
 main :: IO ()
@@ -14,4 +15,5 @@
   Hypermedia.Datastar.NegotiationSpec.spec
   Hypermedia.Datastar.PatchElementsSpec.spec
   Hypermedia.Datastar.PatchSignalsSpec.spec
+  Hypermedia.Datastar.ReadSignalsSpec.spec
   Hypermedia.Datastar.SSESpec.spec
