diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+## [v1.4.6.2](https://github.com/diagrams/diagrams-lib/tree/v1.4.6.2) (2024-05-01)
+
+- Support for `linear-1.23`.  This version of `linear` introduces a
+  breaking change, so add an internal compatibility module that allows
+  diagrams to work with any version of `linear` both before and after
+  the change.
+
 ## [v1.4.6.1](https://github.com/diagrams/diagrams-lib/tree/v1.4.6.1) (2024-02-26)
 
 - Fix compilation on BSD ([#367](https://github.com/diagrams/diagrams-lib/pull/367), thanks to Finn Espen Gundersen)
diff --git a/diagrams-lib.cabal b/diagrams-lib.cabal
--- a/diagrams-lib.cabal
+++ b/diagrams-lib.cabal
@@ -1,5 +1,5 @@
 Name:                diagrams-lib
-Version:             1.4.6.1
+Version:             1.4.6.2
 Synopsis:            Embedded domain-specific language for declarative graphics
 Description:         Diagrams is a flexible, extensible EDSL for creating
                      graphics of many types.  Graphics can be created
@@ -100,6 +100,7 @@
                        Diagrams.TwoD.Types,
                        Diagrams.TwoD.Vector,
                        Diagrams.Util
+  other-modules:       Linear.Vector.Compat
   Build-depends:       base >= 4.9 && < 4.20,
                        containers >= 0.3 && < 0.7,
                        array >= 0.3 && < 0.6,
@@ -114,12 +115,12 @@
                        fingertree >= 0.1 && < 0.2,
                        intervals >= 0.7 && < 0.10,
                        lens >= 5.1 && < 5.3,
-                       tagged >= 0.7,
+                       tagged >= 0.7 && < 0.9,
                        optparse-applicative >= 0.11 && < 0.19,
-                       filepath,
+                       filepath >= 1.4 && < 1.5,
                        JuicyPixels >= 3.3.4 && < 3.4,
                        hashable >= 1.1 && < 1.5,
-                       linear >= 1.20.1 && < 1.23,
+                       linear >= 1.20.1 && < 1.24,
                        adjunctions >= 4.0 && < 5.0,
                        distributive >=0.2.2 && < 1.0,
                        process >= 1.1 && < 1.7,
diff --git a/src/Diagrams/Align.hs b/src/Diagrams/Align.hs
--- a/src/Diagrams/Align.hs
+++ b/src/Diagrams/Align.hs
@@ -52,7 +52,8 @@
 
 import           Linear.Affine
 import           Linear.Metric
-import           Linear.Vector
+import           Linear.Vector        (negated)
+import           Linear.Vector.Compat (lerp)
 
 -- | Class of things which can be aligned.
 class Alignable a where
@@ -78,8 +79,8 @@
 alignBy'Default :: (InSpace v n a, Fractional n, HasOrigin a)
                 => (v n -> a -> Point v n) -> v n -> n -> a -> a
 alignBy'Default boundary v d a = moveOriginTo (lerp ((d + 1) / 2)
-                                                    (boundary v a)
                                                     (boundary (negated v) a)
+                                                    (boundary v a)
                                               ) a
 {-# ANN alignBy'Default ("HLint: ignore Use camelCase" :: String) #-}
 
diff --git a/src/Diagrams/BoundingBox.hs b/src/Diagrams/BoundingBox.hs
--- a/src/Diagrams/BoundingBox.hs
+++ b/src/Diagrams/BoundingBox.hs
@@ -69,7 +69,8 @@
 import           Data.Traversable        as T
 import           Linear.Affine
 import           Linear.Metric
-import           Linear.Vector
+import           Linear.Vector           hiding (lerp)
+import           Linear.Vector.Compat    (lerp)
 
 -- Unexported utility newtype
 
diff --git a/src/Diagrams/CubicSpline/Boehm.hs b/src/Diagrams/CubicSpline/Boehm.hs
--- a/src/Diagrams/CubicSpline/Boehm.hs
+++ b/src/Diagrams/CubicSpline/Boehm.hs
@@ -33,7 +33,8 @@
 import           Diagrams.Segment   (FixedSegment (..), fromFixedSeg)
 import           Diagrams.TrailLike (TrailLike, fromLocSegments)
 import           Diagrams.Util      (iterateN)
-import           Linear.Vector      (Additive, lerp)
+import           Linear.Vector      (Additive)
+import           Linear.Vector.Compat (lerp)
 
 type BSpline v n = [Point v n]
 
@@ -41,7 +42,7 @@
 --   which lies at parameter t, if x has parameter a and y has parameter b.
 --   The usual @lerp@ arises by giving x parameter 0 and y parameter 1.
 affineCombo :: (Additive f, Fractional a) => a -> a -> a -> f a -> f a -> f a
-affineCombo a b t x y = lerp ((t-a)/(b-a)) y x
+affineCombo a b t = lerp ((t-a)/(b-a))
 
 -- | @windows k xs@ yields all the length-@k@ windows from @xs@, e.g.
 --   @windows 3 [a,b,c,d,e] == [[a,b,c], [b,c,d], [c,d,e]]@.
diff --git a/src/Diagrams/Segment.hs b/src/Diagrams/Segment.hs
--- a/src/Diagrams/Segment.hs
+++ b/src/Diagrams/Segment.hs
@@ -75,7 +75,8 @@
 
 import           Linear.Affine
 import           Linear.Metric
-import           Linear.Vector
+import           Linear.Vector             hiding (lerp)
+import           Linear.Vector.Compat      (lerp)
 
 import           Control.Applicative
 import           Diagrams.Core             hiding (Measured)
@@ -308,16 +309,16 @@
   splitAtParam (Linear (OffsetClosed x1)) t = (left, right)
     where left  = straight p
           right = straight (x1 ^-^ p)
-          p = lerp t x1 zero
+          p = lerp t zero x1
   splitAtParam (Cubic c1 c2 (OffsetClosed x2)) t = (left, right)
     where left  = bezier3 a b e
           right = bezier3 (c ^-^ e) (d ^-^ e) (x2 ^-^ e)
-          p = lerp t c2 c1
-          a = lerp t c1 zero
-          b = lerp t p a
-          d = lerp t x2 c2
-          c = lerp t d p
-          e = lerp t c b
+          p = lerp t c1 c2
+          a = lerp t zero c1
+          b = lerp t a p
+          d = lerp t c2 x2
+          c = lerp t p d
+          e = lerp t b c
 
   reverseDomain = reverseSegment
 
@@ -426,16 +427,16 @@
 type instance Codomain (FixedSegment v n) = Point v
 
 instance (Additive v, Num n) => Parametric (FixedSegment v n) where
-  atParam (FLinear p1 p2) t = lerp t p2 p1
+  atParam (FLinear p1 p2) t = lerp t p1 p2
   atParam (FCubic x1 c1 c2 x2) t = p3
-    where p11 = lerp t c1 x1
-          p12 = lerp t c2 c1
-          p13 = lerp t x2 c2
+    where p11 = lerp t x1 c1
+          p12 = lerp t c1 c2
+          p13 = lerp t c2 x2
 
-          p21 = lerp t p12 p11
-          p22 = lerp t p13 p12
+          p21 = lerp t p11 p12
+          p22 = lerp t p12 p13
 
-          p3  = lerp t p22 p21
+          p3  = lerp t p21 p22
 
 instance Num n => DomainBounds (FixedSegment v n)
 
@@ -449,19 +450,19 @@
   splitAtParam (FLinear p0 p1) t = (left, right)
     where left  = FLinear p0 p
           right = FLinear p  p1
-          p = lerp t p1 p0
+          p = lerp t p0 p1
   splitAtParam (FCubic p0 c1 c2 p1) t = (left, right)
     where left  = FCubic p0 a b cut
           right = FCubic cut c d p1
           -- first round
-          a   = lerp t c1 p0
-          p   = lerp t c2 c1
-          d   = lerp t p1 c2
+          a   = lerp t p0 c1
+          p   = lerp t c1 c2
+          d   = lerp t c2 p1
           -- second round
-          b   = lerp t p a
-          c   = lerp t d p
+          b   = lerp t a p
+          c   = lerp t p d
           -- final round
-          cut = lerp t c b
+          cut = lerp t b c
 
   reverseDomain (FLinear p0 p1) = FLinear p1 p0
   reverseDomain (FCubic p0 c1 c2 p1) = FCubic p1 c2 c1 p0
diff --git a/src/Linear/Vector/Compat.hs b/src/Linear/Vector/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Linear/Vector/Compat.hs
@@ -0,0 +1,24 @@
+{-# LANGUAGE CPP #-}
+
+-- |
+-- Module      :  Linear.Vector.Compat
+-- Copyright   :  (c) 2024 diagrams-lib team (see LICENSE)
+-- License     :  BSD-style (see LICENSE)
+-- Maintainer  :  diagrams-discuss@googlegroups.com
+--
+-- Compatibility layer for working with versions of linear both before
+-- (< 1.23) and after (>= 1.23) the interpolation direction of `lerp`
+-- was reversed.
+module Linear.Vector.Compat (lerp) where
+
+import qualified Linear.Vector as V
+
+-- | Linearly interpolate between two vectors, such that @lerp 0 x y =
+--   x@ and @lerp 1 x y = 1@.
+lerp :: (V.Additive f, Num a) => a -> f a -> f a -> f a
+lerp =
+#if MIN_VERSION_linear(1,23,0)
+  V.lerp
+#else
+  V.lerp . (1-)
+#endif
