diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,67 @@
+## [v1.5](https://github.com/diagrams/diagrams-cairo/tree/v1.5) (2025-06-16)
+
+- Allow `diagrams-lib-1.5` and remove `DiagramLoopOpts` which is no
+  longer supported
+- Allow `optparse-applicative-0.19`
+
+## [v1.4.3](https://github.com/diagrams/diagrams-cairo/tree/v1.4.3) (2024-11-06)
+
+- Require `data-default-0.8`
+
+## [v1.4.2.1-r3](https://github.com/diagrams/diagrams-cairo/tree/v1.4.2.1-r3) (2024-08-13)
+
+- Allow `base-4.20`, `containers-0.7`, `lens-5.3`, `hashable-1.5`
+- Test on GHC 9.10
+
+## [v1.4.2.1-r2](https://github.com/diagrams/diagrams-cairo/tree/v1.4.2.1-r2) (2024-02-13)
+
+- Allow `base-4.19`
+- Test on GHC 9.8
+
+## [v1.4.2.1-r1](https://github.com/diagrams/diagrams-cairo/tree/v1.4.2.1-r1) (2023-08-16)
+
+- Allow `bytestring-0.12`
+
+## [v1.4.2.1](https://github.com/diagrams/diagrams-cairo/tree/v1.4.2.1) (2023-07-10)
+
+- Allow `base-4.18`, `mtl-2.3`, `optparse-applicative-0.18`,
+  `unix-2.8`
+- Test with GHC 9.4 and 9.6
+
+## [v1.4.2](https://github.com/diagrams/diagrams-cairo/tree/v1.4.2) (2022-01-26)
+
+- Test with GHC 9.0 (requires `--allow-newer`)
+- Allow `base-4.15`, `lens-5.1`, `bytestring-0.11`,
+  `transformers-0.6`, `hashable-1.4`
+- Add `Eq Options` instance required for `Hashable`
+
+- r1 (6 Feb 2022): allow `optparse-applicative-0.17`
+- r2 (19 Aug 2022): allow `vector-0.13`
+- r3 (4 Jan 2023): allow `lens-5.2`, test with GHC 9.2, drop official support for GHC < 8.8
+
+## [v1.4.1.1](https://github.com/diagrams/diagrams-cairo/tree/v1.4.1.1) (2019-01-11)
+
+- Drop GHC 7.10 and 8.0 support
+- Test with GHC 8.6 and 8.8
+
+- r1: allow `lens-4.19` and `linear-1.21`
+- r2: allow `base-4.14`, `diagrams-core-1.5`, `lens-5.0`,
+  `optparse-applicative-0.16`
+
+## [v1.4.1](https://github.com/diagrams/diagrams-cairo/tree/v1.4.1) (2018-05-17)
+
+- Allow `base-4.11` and `lens-4.16`
+- Add `Semigroup` instance for `Render Cairo V2 Double`
+- Drop GHC 7.8 support
+
+## [v1.4](https://github.com/diagrams/diagrams-cairo/tree/v1.4) (2016-10-26)
+
+- No significant changes, just bumping version for diagrams 1.4
+  release
+
+- Allow `vector-0.12` (Hackage revision 1)
+- Allow `base-4.10` and `optparse-applicative-0.14` (Hackage rev 2)
+
 ## [v1.3.1.2](https://github.com/diagrams/diagrams-cairo/tree/v1.3.1.2) (2016-08-22)
 
 - Require `optparse-applicative-0.13` and fix compilation error
diff --git a/README.markdown b/README.markdown
--- a/README.markdown
+++ b/README.markdown
@@ -23,9 +23,14 @@
 A simple example that uses _diagrams-cairo_ to draw a blue circle:
 
 ```haskell
+{-# LANGUAGE NoMonomorphismRestriction #-}
+{-# LANGUAGE FlexibleContexts          #-}
+{-# LANGUAGE TypeFamilies              #-}
+
 import Diagrams.Prelude
 import Diagrams.Backend.Cairo.CmdLine
 
+d :: Diagram B
 d = circle 1 # fc blue
 
 main = mainWith (pad 1.1 d)
diff --git a/diagrams-cairo.cabal b/diagrams-cairo.cabal
--- a/diagrams-cairo.cabal
+++ b/diagrams-cairo.cabal
@@ -1,5 +1,5 @@
 Name:                diagrams-cairo
-Version:             1.3.1.2
+Version:             1.5
 Synopsis:            Cairo backend for diagrams drawing EDSL
 Description:         A full-featured backend for rendering
                      diagrams using the cairo rendering engine.
@@ -30,7 +30,7 @@
                      .
                      * "Diagrams.Backend.Cairo.Ptr" - render diagrams
                        to buffers in memory.
-Homepage:            http://projects.haskell.org/diagrams
+Homepage:            https://diagrams.github.io
 License:             BSD3
 License-file:        LICENSE
 Author:              Brent Yorgey
@@ -38,9 +38,10 @@
 Bug-reports:         http://github.com/diagrams/diagrams-cairo/issues
 Category:            Graphics
 Build-type:          Simple
-Cabal-version:       >=1.10
-Extra-source-files:  CHANGELOG.md, README.markdown
-Tested-with:         GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.2, GHC == 8.0.1
+Cabal-version:       2.0
+Extra-source-files:  README.markdown
+Extra-doc-files:     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
 Source-repository head
   type:     git
   location: http://github.com/diagrams/diagrams-cairo.git
@@ -53,31 +54,29 @@
                        Diagrams.Backend.Cairo.Ptr
                        Diagrams.Backend.Cairo.Text
   Hs-source-dirs:      src
-  Build-depends:       base >= 4.2 && < 4.10,
-                       mtl >= 2.0 && < 2.3,
+  Build-depends:       base >=4.2 && <4.21,
+                       mtl >=2.0 && <2.4,
                        filepath,
-                       diagrams-core >= 1.3 && < 1.4,
-                       diagrams-lib >= 1.3 && < 1.4,
-                       cairo >= 0.12.4 && < 0.14,
-                       pango >= 0.12.5  && < 0.14,
+                       diagrams-core >=1.3 && <1.6,
+                       diagrams-lib >=1.3 && <1.6,
+                       cairo >=0.12.4 && <0.14,
+                       pango >=0.12.5 && <0.14,
                        colour,
-                       split >= 0.1.2 && < 0.3,
-                       containers >= 0.3 && < 0.6,
-                       lens >= 3.8 && < 4.15,
-                       data-default-class >= 0.0.1 && < 0.2,
-                       statestack >= 0.2 && < 0.3,
-                       JuicyPixels >= 3.1.3.2 && < 3.3,
-                       vector >= 0.10.0 && < 0.12,
-                       array >= 0.4.0 && < 0.6,
-                       bytestring >= 0.9 && < 0.11,
-                       optparse-applicative >= 0.13 && < 0.14,
-                       transformers >= 0.3 && <0.6,
-                       hashable >= 1.1 && < 1.3
-  if impl(ghc < 7.6)
-    Build-depends: ghc-prim
+                       split >=0.1.2 && <0.3,
+                       containers >=0.3 && <0.8,
+                       lens >=3.8 && <5.4,
+                       data-default >=0.8 && <0.9,
+                       statestack >=0.2 && <0.4,
+                       JuicyPixels >=3.1.3.2 && <3.4,
+                       vector >=0.10.0 && <0.14,
+                       array >=0.4.0 && <0.6,
+                       bytestring >=0.9 && <0.12 || ^>=0.12.0,
+                       optparse-applicative >=0.13 && <0.20,
+                       transformers >=0.3 && <0.7,
+                       hashable >=1.1 && <1.6
 
   default-language:    Haskell2010
 
   if !os(windows)
     cpp-options: -DCMDLINELOOP
-    Build-depends:     unix >= 2.4 && < 2.8
+    Build-depends:     unix >=2.4 && <2.9
diff --git a/src/Diagrams/Backend/Cairo/CmdLine.hs b/src/Diagrams/Backend/Cairo/CmdLine.hs
--- a/src/Diagrams/Backend/Cairo/CmdLine.hs
+++ b/src/Diagrams/Backend/Cairo/CmdLine.hs
@@ -54,7 +54,7 @@
 --   information.
 --
 -- For a tutorial on command-line diagram creation see
--- <http://projects.haskell.org/diagrams/doc/cmdline.html>.
+-- <https://diagrams.github.io/doc/cmdline.html>.
 --
 -----------------------------------------------------------------------------
 
@@ -110,6 +110,14 @@
 
 import           Data.List.Split
 
+-- | Extra options for animated GIFs.
+data GifOpts = GifOpts { _dither     :: Bool
+                       , _noLooping  :: Bool
+                       , _loopRepeat :: Maybe Int}
+
+makeLenses ''GifOpts
+
+
 -- $mainwith
 -- The 'mainWith' method unifies all of the other forms of @main@ and is now
 -- the recommended way to build a command-line diagrams program.  It works as a
@@ -185,9 +193,9 @@
 defaultMain = mainWith
 
 instance Mainable (QDiagram Cairo V2 Double Any) where
-    type MainOpts (QDiagram Cairo V2 Double Any) = (DiagramOpts, DiagramLoopOpts)
+    type MainOpts (QDiagram Cairo V2 Double Any) = DiagramOpts
 
-    mainRender (opts, l) d = chooseRender opts d >> defaultLoopRender l
+    mainRender opts d = chooseRender opts d
 
 chooseRender :: DiagramOpts -> QDiagram Cairo V2 Double Any -> IO ()
 chooseRender opts d =
@@ -262,9 +270,9 @@
 animMain = mainWith
 
 instance Mainable (Animation Cairo V2 Double) where
-    type MainOpts (Animation Cairo V2 Double) = ((DiagramOpts, DiagramAnimOpts), DiagramLoopOpts)
+    type MainOpts (Animation Cairo V2 Double) = (DiagramOpts, DiagramAnimOpts)
 
-    mainRender (opts, l) d =  defaultAnimMainRender chooseRender output opts d >> defaultLoopRender l
+    mainRender opts d =  defaultAnimMainRender chooseRender output opts d
 
 -- | @gifMain@ takes a list of diagram and delay time pairs and produces a
 --   command line program to generate an animated GIF, with options @GifOpts@.
@@ -294,13 +302,6 @@
 -- @
 gifMain :: [(QDiagram Cairo V2 Double Any, GifDelay)] -> IO ()
 gifMain = mainWith
-
--- | Extra options for animated GIFs.
-data GifOpts = GifOpts { _dither     :: Bool
-                       , _noLooping  :: Bool
-                       , _loopRepeat :: Maybe Int}
-
-makeLenses ''GifOpts
 
 -- | Command line parser for 'GifOpts'.
 --   @--dither@ turn dithering on.
diff --git a/src/Diagrams/Backend/Cairo/Internal.hs b/src/Diagrams/Backend/Cairo/Internal.hs
--- a/src/Diagrams/Backend/Cairo/Internal.hs
+++ b/src/Diagrams/Backend/Cairo/Internal.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP                       #-}
 {-# LANGUAGE DeriveDataTypeable        #-}
 {-# LANGUAGE DeriveGeneric             #-}
 {-# LANGUAGE ExistentialQuantification #-}
@@ -5,11 +6,12 @@
 {-# LANGUAGE FlexibleInstances         #-}
 {-# LANGUAGE GADTs                     #-}
 {-# LANGUAGE MultiParamTypeClasses     #-}
+{-# LANGUAGE ScopedTypeVariables       #-}
 {-# LANGUAGE TemplateHaskell           #-}
 {-# LANGUAGE TypeFamilies              #-}
+{-# LANGUAGE TypeOperators             #-}
 {-# LANGUAGE TypeSynonymInstances      #-}
 {-# LANGUAGE ViewPatterns              #-}
-{-# LANGUAGE ScopedTypeVariables       #-}
 
 -----------------------------------------------------------------------------
 -- |
@@ -53,7 +55,8 @@
 import qualified Graphics.Rendering.Pango        as P
 
 import           Codec.Picture
-import           Codec.Picture.Types             (convertImage, promoteImage, packPixel)
+import           Codec.Picture.Types             (convertImage, packPixel,
+                                                  promoteImage)
 
 
 import           Control.Exception               (try)
@@ -61,15 +64,15 @@
 import           Control.Monad.IO.Class
 import qualified Control.Monad.StateStack        as SS
 import           Control.Monad.Trans             (lift)
+import qualified Data.Array.MArray               as MA
+import           Data.Bits                       (rotateL, (.&.))
 import qualified Data.Foldable                   as F
 import           Data.Hashable                   (Hashable (..))
 import           Data.List                       (isSuffixOf)
 import           Data.Maybe                      (catMaybes, fromMaybe, isJust)
 import           Data.Tree
 import           Data.Typeable
-import qualified Data.Array.MArray               as MA
 import           Data.Word                       (Word32)
-import           Data.Bits                       (rotateL, (.&.))
 import           GHC.Generics                    (Generic)
 
 -- | This data declaration is simply used as a token to distinguish
@@ -151,7 +154,7 @@
           , _cairoOutputType :: OutputType -- ^ the output format and associated options
           , _cairoBypassAdjust  :: Bool    -- ^ Should the 'adjustDia' step be bypassed during rendering?
           }
-    deriving (Show)
+    deriving (Show, Eq)
 
   renderRTree _ opts t = (renderIO, r)
     where
@@ -177,9 +180,14 @@
 runC :: Render Cairo V2 Double -> RenderM ()
 runC (C r) = r
 
+instance Semigroup (Render Cairo V2 Double) where
+  C rd1 <> C rd2 = C (rd1 >> rd2)
+
 instance Monoid (Render Cairo V2 Double) where
   mempty  = C $ return ()
-  (C rd1) `mappend` (C rd2) = C (rd1 >> rd2)
+#if !(MIN_VERSION_base(4,11,0))
+  mappend = (<>)
+#endif
 
 instance Hashable (Options Cairo V2 Double) where
   hashWithSalt s (CairoOptions fn sz out adj)
@@ -254,7 +262,6 @@
 fromFontSlant FontSlantOblique  = P.StyleOblique
 
 fromFontWeight :: FontWeight -> P.Weight
-fromFontWeight FontWeightNormal = P.WeightNormal
 fromFontWeight FontWeightBold   = P.WeightBold
 fromFontWeight _                = P.WeightNormal
 
