diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,18 @@
+## [v1.4.2.1](https://github.com/diagrams/diagrams-canvas/tree/v1.4.2.1) (2026-11-11)
+
+- Allow `base-4.22`, `diagrams-lib-1.6`, `containers-0.8`
+- Remove redundant `cmdargs` dep
+- Test on GHC 9.14
+- Drop support for GHC < 8.10
+- Fix new warnings
+
 ## [v1.4.2](https://github.com/diagrams/diagrams-canvas/tree/v1.4.2) (2024-10-30)
 
 - Require `data-default-0.8`
+
+- r1 (14 Apr 2025): allow `base-4.21`, `diagrams-lib-1.5`, test on GHC
+  9.12
+- r2 (14 Jun 2025): allow `optparse-applicative-0.19`
 
 ## [v1.4.1.2](https://github.com/diagrams/diagrams-canvas/tree/v1.4.1.2) (2023-06-22)
 
diff --git a/diagrams-canvas.cabal b/diagrams-canvas.cabal
--- a/diagrams-canvas.cabal
+++ b/diagrams-canvas.cabal
@@ -1,5 +1,5 @@
 Name:                diagrams-canvas
-Version:             1.4.2
+Version:             1.4.2.1
 Synopsis:            HTML5 canvas backend for diagrams drawing EDSL
 Description:         This package provides a modular backend for rendering
                      diagrams created with the diagrams EDSL using an
@@ -14,7 +14,7 @@
 Category:            Graphics
 Build-type:          Simple
 Extra-source-files:  README.md, CHANGELOG.md
-Tested-with:         GHC ==8.8.4 || ==8.10.7 || ==9.0.2 || ==9.2.8 || ==9.4.8 || ==9.6.5 || ==9.8.2 || ==9.10.1
+Tested-with:         GHC ==8.10.7 || ==9.0.2 || ==9.2.8 || ==9.4.8 || ==9.6.7 || ==9.8.4 || ==9.10.3 || ==9.12.4 || ==9.14.1
 Cabal-version:       >=1.10
 Source-repository head
   type:     git
@@ -24,18 +24,17 @@
   Exposed-modules:     Diagrams.Backend.Canvas
                        Diagrams.Backend.Canvas.CmdLine
   Hs-source-dirs:      src
-  Build-depends:       base >= 4.13 && < 4.21,
+  Build-depends:       base >= 4.13 && < 4.23,
                        mtl >= 2.0 && < 2.4,
                        NumInstances >= 1.0 && < 1.5,
                        diagrams-core >= 1.3 && < 1.6,
-                       diagrams-lib >= 1.3 && < 1.5,
-                       cmdargs >= 0.6 && < 0.11,
+                       diagrams-lib >= 1.3 && < 1.7,
                        blank-canvas >= 0.5 && < 0.8,
                        lens >= 4.0 && < 5.4,
-                       containers >= 0.3 && < 0.8,
+                       containers >= 0.3 && < 0.9,
                        text >= 1.0 && < 2.2,
                        data-default >= 0.8 && < 0.9,
                        statestack >= 0.2 && <0.4,
-                       optparse-applicative >= 0.13 && < 0.19
+                       optparse-applicative >= 0.13 && < 0.20
 
   Default-language:    Haskell2010
diff --git a/src/Diagrams/Backend/Canvas.hs b/src/Diagrams/Backend/Canvas.hs
--- a/src/Diagrams/Backend/Canvas.hs
+++ b/src/Diagrams/Backend/Canvas.hs
@@ -5,7 +5,6 @@
 {-# LANGUAGE FlexibleContexts      #-}
 {-# LANGUAGE GADTs                 #-}
 {-# LANGUAGE TypeSynonymInstances  #-}
-{-# LANGUAGE DeriveDataTypeable    #-}
 {-# LANGUAGE ViewPatterns          #-}
 {-# LANGUAGE InstanceSigs          #-}
 {-# LANGUAGE OverloadedStrings     #-}
@@ -95,7 +94,6 @@
 import           Data.NumInstances            ()
 import qualified Data.Text                    as T
 import           Data.Tree                    (Tree(Node))
-import           Data.Typeable                (Typeable)
 import           Data.Word                    (Word8)
 
 import           Diagrams.Attributes
@@ -115,7 +113,7 @@
 -- | This data declaration is simply used as a token to distinguish
 --   this rendering engine.
 data Canvas = Canvas
-    deriving (Eq, Ord, Read, Show, Typeable)
+    deriving (Eq, Ord, Read, Show)
 
 type B = Canvas
 
@@ -228,7 +226,7 @@
 relCurveTo :: Double -> Double -> Double -> Double -> Double -> Double -> RenderM ()
 relCurveTo ax ay bx by cx cy = do
   p <- use csPos
-  let [(ax',ay'),(bx',by'),(cx',cy')] = map (p +) [(ax,ay),(bx,by),(cx,cy)]
+  let ((ax',ay'),(bx',by'),(cx',cy')) = over each (p +) ((ax,ay),(bx,by),(cx,cy))
   liftC $ BC.bezierCurveTo (ax',ay',bx',by',cx',cy')
   move (cx', cy')
 
@@ -301,7 +299,9 @@
 canvasTransform :: T2 Double -> RenderM ()
 canvasTransform tr = liftC $ BC.transform vs
     where
-      [[ax, ay], [bx, by], [tx, ty]] = matrixHomRep tr
+      (ax, ay, bx, by, tx, ty) = case matrixHomRep tr of
+        [[ax', ay'], [bx', by'], [tx', ty']] -> (ax', ay', bx', by', tx', ty')
+        _ -> (0, 0, 0, 0, 0, 0)
       vs = (realToFrac ax,realToFrac ay
            ,realToFrac bx,realToFrac by
            ,realToFrac tx,realToFrac ty)
diff --git a/src/Diagrams/Backend/Canvas/CmdLine.hs b/src/Diagrams/Backend/Canvas/CmdLine.hs
--- a/src/Diagrams/Backend/Canvas/CmdLine.hs
+++ b/src/Diagrams/Backend/Canvas/CmdLine.hs
@@ -5,6 +5,7 @@
 {-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-orphans #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-imports #-}
 
 -----------------------------------------------------------------------------
 -- |
@@ -73,7 +74,7 @@
   { _width  :: Maybe Int -- ^ Final output width of diagram.
   , _height :: Maybe Int -- ^ Final height of diagram.
   , _port   :: Int       -- ^ Port on which to start web server.
-  } deriving (Show, Data, Typeable)
+  } deriving (Show, Data)
 
 makeLenses ''DiaOpts
 
