diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,13 @@
 
 All notable changes to the LaunchDarkly Haskell Server-side SDK will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org).
 
+## [4.0.4](https://github.com/launchdarkly/haskell-server-sdk/compare/4.0.3...4.0.4) (2024-03-05)
+
+
+### Bug Fixes
+
+* Downgrade verbose data source log messages to debug ([#76](https://github.com/launchdarkly/haskell-server-sdk/issues/76)) ([4de2b04](https://github.com/launchdarkly/haskell-server-sdk/commit/4de2b04ec99aa7a7338ac4673ec139767e410bc2))
+
 ## [4.0.3](https://github.com/launchdarkly/haskell-server-sdk/compare/4.0.2...4.0.3) (2024-02-07)
 
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -26,6 +26,10 @@
 
 We encourage pull requests and other contributions from the community. Check out our [contributing guidelines](CONTRIBUTING.md) for instructions on how to contribute to this SDK.
 
+## Verifying SDK build provenance with the SLSA framework
+
+LaunchDarkly uses the [SLSA framework](https://slsa.dev/spec/v1.0/about) (Supply-chain Levels for Software Artifacts) to help developers make their supply chain more secure by ensuring the authenticity and build integrity of our published SDK packages. To learn more, see the [provenance guide](PROVENANCE.md).
+
 ## About LaunchDarkly
 
 * LaunchDarkly is a continuous delivery platform that provides feature flags as a service and allows developers to iterate quickly and safely. We allow you to easily flag your features and manage them from the LaunchDarkly dashboard.  With LaunchDarkly, you can:
diff --git a/launchdarkly-server-sdk.cabal b/launchdarkly-server-sdk.cabal
--- a/launchdarkly-server-sdk.cabal
+++ b/launchdarkly-server-sdk.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           launchdarkly-server-sdk
-version:        4.0.3
+version:        4.0.4
 synopsis:       Server-side SDK for integrating with LaunchDarkly
 description:    Please see the README on GitHub at <https://github.com/launchdarkly/haskell-server-sdk#readme>
 category:       Web
diff --git a/src/LaunchDarkly/Server/Client/Internal.hs b/src/LaunchDarkly/Server/Client/Internal.hs
--- a/src/LaunchDarkly/Server/Client/Internal.hs
+++ b/src/LaunchDarkly/Server/Client/Internal.hs
@@ -21,7 +21,7 @@
 
 -- | The version string for this library.
 clientVersion :: Text
-clientVersion = "4.0.3" -- x-release-please-version
+clientVersion = "4.0.4" -- x-release-please-version
 
 -- |
 -- Client is the LaunchDarkly client. Client instances are thread-safe.
diff --git a/src/LaunchDarkly/Server/Network/Polling.hs b/src/LaunchDarkly/Server/Network/Polling.hs
--- a/src/LaunchDarkly/Server/Network/Polling.hs
+++ b/src/LaunchDarkly/Server/Network/Polling.hs
@@ -3,7 +3,7 @@
 import Control.Concurrent (threadDelay)
 import Control.Monad.Catch (MonadMask, MonadThrow)
 import Control.Monad.IO.Class (MonadIO, liftIO)
-import Control.Monad.Logger (MonadLogger, logError, logInfo)
+import Control.Monad.Logger (MonadLogger, logDebug, logError)
 import Data.Aeson (FromJSON (..), eitherDecode)
 import Data.Generics.Product (getField)
 import Data.Text (Text)
@@ -68,7 +68,7 @@
   where
     poll :: (MonadIO m, MonadLogger m, MonadMask m) => Request -> Int -> m ()
     poll req pollingMicroseconds = do
-        $(logInfo) "starting poll"
+        $(logDebug) "starting poll"
         processPoll (tlsManager $ httpConfiguration clientContext) dataSourceUpdates req >>= \case
             True -> do
                 liftIO $ threadDelay pollingMicroseconds
diff --git a/src/LaunchDarkly/Server/Network/Streaming.hs b/src/LaunchDarkly/Server/Network/Streaming.hs
--- a/src/LaunchDarkly/Server/Network/Streaming.hs
+++ b/src/LaunchDarkly/Server/Network/Streaming.hs
@@ -9,7 +9,7 @@
 import Control.Monad (mzero, void)
 import Control.Monad.Catch (Exception, MonadCatch, MonadMask, try)
 import Control.Monad.IO.Class (MonadIO, liftIO)
-import Control.Monad.Logger (MonadLogger, logDebug, logError, logInfo, logWarn)
+import Control.Monad.Logger (MonadLogger, logDebug, logError, logWarn)
 import Control.Monad.Loops (iterateUntilM)
 import Data.Aeson (FromJSON, Result (..), eitherDecode, fromJSON, parseJSON, withObject, (.!=), (.:), (.:?))
 import Data.Attoparsec.Text as P hiding (Result, try)
@@ -106,7 +106,7 @@
 processPut :: (MonadIO m, MonadLogger m) => DataSourceUpdates -> L.ByteString -> m Bool
 processPut dataSourceUpdates value = case eitherDecode value of
     Right (PathData _ (PutBody flags segments)) -> do
-        $(logInfo) "initializing dataSourceUpdates with put"
+        $(logDebug) "initializing dataSourceUpdates with put"
         liftIO (dataSourceUpdatesInit dataSourceUpdates flags segments) >>= \case
             Left err -> do
                 $(logError) $ T.append "dataSourceUpdates failed put: " err
@@ -133,7 +133,7 @@
         $(logError) $ T.concat ["failed to parse patch ", name, ": ", T.pack err]
         pure False
     insPatch name path insert (Success item) = do
-        $(logInfo) $ T.concat ["patching ", name, " with path: ", path]
+        $(logDebug) $ T.concat ["patching ", name, " with path: ", path]
         status <- liftIO $ insert dataSourceUpdates item
         either
             ( \err -> do
@@ -157,7 +157,7 @@
   where
     logDelete :: Text -> Text -> StoreResult () -> m Bool
     logDelete name path action = do
-        $(logInfo) $ T.concat ["deleting ", name, " with path: ", path]
+        $(logDebug) $ T.concat ["deleting ", name, " with path: ", path]
         status <- liftIO action
         either
             ( \err -> do
