diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,10 @@
+2023-12-07 Ivan Perez <ivan.perez@keera.co.uk>
+    * Version bump (0.14.6) (#282).
+    * Document HTML + WebAssembly backend in README (#34).
+    * Relax version bounds on deepseq (#280).
+    * Update and improve documentation of Diagrams example (#281).
+    * Thanks to @AntanasKal.
+
 2023-10-07 Ivan Perez <ivan.perez@keera.co.uk>
     * Version bump (0.14.5) (#278).
     * Define Yampa.FRP.Task.return in terms of pure (#276).
diff --git a/Yampa.cabal b/Yampa.cabal
--- a/Yampa.cabal
+++ b/Yampa.cabal
@@ -30,7 +30,7 @@
 build-type:    Simple
 
 name:          Yampa
-version:       0.14.5
+version:       0.14.6
 author:        Henrik Nilsson, Antony Courtney
 maintainer:    Ivan Perez (ivan.perez@keera.co.uk)
 homepage:      https://github.com/ivanperez-keera/Yampa/
@@ -100,7 +100,7 @@
   build-depends:
       base < 6
 
-    , deepseq             >= 1.3.0.1 && < 1.5
+    , deepseq             >= 1.3.0.1 && < 1.6
     , random              >= 1.1     && < 1.3
     , simple-affine-space >= 0.1     && < 0.3
 
diff --git a/examples/Diagrams.hs b/examples/Diagrams.hs
--- a/examples/Diagrams.hs
+++ b/examples/Diagrams.hs
@@ -13,26 +13,29 @@
 --
 -- Install diagrams with Cairo support, together with Yampa:
 --
--- cabal sandbox init
--- cabal install Yampa diagrams -fcairo
+-- cabal v1-sandbox init
+-- cabal v1-install Yampa diagrams diagrams-cairo
 --
 -- Compile in a sandbox with:
 --
--- cabal exec -- ghc --make examples/Diagrams.hs
+-- cabal v1-exec -- ghc --make examples/Diagrams.hs
 --
 -- And run with:
 --
 -- ./examples/Diagrams -w 400 -h 400 -o output.gif
 
 import Diagrams.Backend.Cairo.CmdLine
-import Diagrams.Prelude
+import Diagrams.Prelude               hiding (Time)
 import FRP.Yampa                      hiding (norm, ( # ), (*^))
 
+main :: IO ()
 main = mainWith $ take 60 frames
 
+-- | Frames of the animation.
 frames :: [(Diagram B, Int)]
 frames = zip ((embed sfVF $ deltaEncode 1 $ repeat ())) (repeat 1)
 
+-- | Signal producing the diagram at a point in time.
 sfVF :: SF () (Diagram B)
 sfVF = proc () -> do
   t <- time -< ()
@@ -40,16 +43,24 @@
           <> ( square 3.5 # lw none # alignBL))
   returnA -< diag
 
+-- | Field of arrows as it changes over time.
+field :: Time -> Diagram B
 field t = position $ zip points (arrows t)
 
-locs   = [(x, y) | x <- [0.1, 0.3 .. 3.25], y <- [0.1, 0.3 .. 3.25]]
-
+-- | Arrow points as they change over time.
+points :: [Point V2 Double]
 points = map p2 locs
 
-vectorField t (x, y) = r2 (sin (t + y + 1), sin (t + x + 1))
+-- | Arrow locations as they change over time.
+locs   :: [(Double, Double)]
+locs   = [(x, y) | x <- [0.1, 0.3 .. 3.25], y <- [0.1, 0.3 .. 3.25]]
 
+-- | Arrows as they change over time.
+arrows :: Time -> [Diagram B]
 arrows t = map (arrowAtPoint t) locs
 
+-- | Diagram of a star at a given point in time and space.
+arrowAtPoint :: Time -> (Double, Double) -> Diagram B
 arrowAtPoint t (x, y) = arrowAt' opts (p2 (x, y)) (sL *^ vf) # alignTL
   where
     vf   = vectorField t (x, y)
@@ -64,3 +75,7 @@
     opts = (with & arrowHead  .~ spike
                  & headLength .~ normalized hs
                  & shaftStyle %~ lwN sW)
+
+-- | Direction vector depending on the time and the position in space.
+vectorField :: Time -> (Double, Double) -> V2 Double
+vectorField t (x, y) = r2 (sin (t + y + 1), sin (t + x + 1))
