diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,9 @@
+# Changelog
+
+## [0.0.0.1] - 2025-07-14
+
+### Added
+
+- `--skip-passed`: Skip passing tests and rerun once the entire suite is
+  skipped.
+
diff --git a/prometheus-wai.cabal b/prometheus-wai.cabal
--- a/prometheus-wai.cabal
+++ b/prometheus-wai.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           prometheus-wai
-version:        0.0.0.0
+version:        0.0.0.1
 description:    Prometheus metrics for WAI applications
 homepage:       https://github.com/NorfairKing/prometheus-wai#readme
 bug-reports:    https://github.com/NorfairKing/prometheus-wai/issues
@@ -14,6 +14,8 @@
 copyright:      Copyright (c) 2025 Tom Sydney Kerckhove
 license:        MIT
 build-type:     Simple
+extra-source-files:
+    CHANGELOG.md
 
 source-repository head
   type: git
diff --git a/src/System/Metrics/Prometheus/Wai/Middleware.hs b/src/System/Metrics/Prometheus/Wai/Middleware.hs
--- a/src/System/Metrics/Prometheus/Wai/Middleware.hs
+++ b/src/System/Metrics/Prometheus/Wai/Middleware.hs
@@ -4,9 +4,11 @@
 
 module System.Metrics.Prometheus.Wai.Middleware
   ( registerWaiMetrics,
+    WaiMetrics (..),
     instrumentWaiMiddleware,
     metricsEndpointMiddleware,
     metricsEndpointAtMiddleware,
+    metricsEndpointAtMiddlewareWithHook,
   )
 where
 
@@ -31,8 +33,6 @@
 import qualified System.Metrics.Prometheus.MetricId as Labels
 import qualified System.Metrics.Prometheus.MetricId as Prometheus (Labels (..))
 
--- TODO ignore websocket requests when gathering info
-
 data WaiMetrics = WaiMetrics
   { waiMetricsStatusCode :: !(Map Int Prometheus.Counter),
     waiMetricsDuration :: !Prometheus.Histogram
@@ -74,29 +74,54 @@
 
 -- | Record the given Wai metrics in a middleware.
 instrumentWaiMiddleware :: WaiMetrics -> Wai.Middleware
-instrumentWaiMiddleware WaiMetrics {..} application request sendResponse = do
-  begin <- getMonotonicTimeNSec
-  application request $ \response -> do
-    end <- getMonotonicTimeNSec
+instrumentWaiMiddleware WaiMetrics {..} application request sendResponse =
+  let isWebSocketsReq =
+        lookup "upgrade" (Wai.requestHeaders request) == Just "websocket"
+      shouldInstrument =
+        -- Don't instrument WebSocket requests because they don't have a
+        -- response but some libraries still pretend that it does and will
+        -- give it a 500 status code.
+        -- Moreover, the 'latency' will be 'how long the connection was open'
+        -- which is also useless.
+        not isWebSocketsReq
+   in if shouldInstrument
+        then do
+          begin <- getMonotonicTimeNSec
+          application request $ \response -> do
+            end <- getMonotonicTimeNSec
 
-    -- Count the status code
-    mapM_ Counter.inc (M.lookup (HTTP.statusCode (Wai.responseStatus response)) waiMetricsStatusCode)
+            -- Count the status code
+            mapM_ Counter.inc (M.lookup (HTTP.statusCode (Wai.responseStatus response)) waiMetricsStatusCode)
 
-    -- Count the application response duration
-    let nanos = end - begin
-        millis = fromIntegral nanos / 1_000_000
-    Histogram.observe millis waiMetricsDuration
+            -- Count the application response duration
+            let nanos = end - begin
+                millis = fromIntegral nanos / 1_000_000
+            Histogram.observe millis waiMetricsDuration
 
-    sendResponse response
+            sendResponse response
+        else application request sendResponse
 
--- | Add a metrics endpoint using the given industry.
+-- | Add a metrics endpoint using the given registry.
 metricsEndpointMiddleware :: Registry -> Wai.Middleware
 metricsEndpointMiddleware = metricsEndpointAtMiddleware "/metrics"
 
+-- | Add a metrics endpoint at a given path using the given registry.
 metricsEndpointAtMiddleware :: ByteString -> Registry -> Wai.Middleware
-metricsEndpointAtMiddleware path registry application request sendResponse =
+metricsEndpointAtMiddleware =
+  metricsEndpointAtMiddlewareWithHook (pure ())
+
+-- | Add a metrics endpoint at a given path and last-minute hook using the given registry.
+--
+-- This lets you set metrics that are evaluated when the /metrics endpoint is hit.
+metricsEndpointAtMiddlewareWithHook ::
+  IO () ->
+  ByteString ->
+  Registry ->
+  Wai.Middleware
+metricsEndpointAtMiddlewareWithHook lastMinuteHook path registry application request sendResponse =
   if Request.rawPathInfo request == path
     then do
+      lastMinuteHook
       s <- Registry.sample registry
       sendResponse
         $ Wai.responseBuilder
