diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## [v1.4.5.3](https://github.com/diagrams/diagrams-lib/tree/v1.4.5.3) (2022-09-19)
+
+- Update to `fsnotify-0.4`
+
 ## [v1.4.5.2](https://github.com/diagrams/diagrams-lib/tree/v1.4.5.2) (2022-09-14)
 
 - Fix build with `transformers-0.6`
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.5.2
+Version:             1.4.5.3
 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
@@ -123,7 +123,7 @@
                        adjunctions >= 4.0 && < 5.0,
                        distributive >=0.2.2 && < 1.0,
                        process >= 1.1 && < 1.7,
-                       fsnotify >= 0.2.1 && < 0.4,
+                       fsnotify >= 0.4 && < 0.5,
                        directory >= 1.2 && < 1.4,
                        unordered-containers >= 0.2 && < 0.3,
                        text >= 0.7.1 && < 2.1,
diff --git a/src/Diagrams/Backend/CmdLine.hs b/src/Diagrams/Backend/CmdLine.hs
--- a/src/Diagrams/Backend/CmdLine.hs
+++ b/src/Diagrams/Backend/CmdLine.hs
@@ -55,7 +55,6 @@
   , diagramLoopOpts
   , loop
   , src
-  , interval
 
     -- * Parsing
   , Parseable(..)
@@ -111,9 +110,9 @@
 import           System.FilePath           (addExtension, dropExtension,
                                             replaceExtension, splitExtension,
                                             takeDirectory, takeFileName, (</>))
-import           System.FSNotify           (WatchConfig (..), defaultConfig,
+import           System.FSNotify           (defaultConfig,
                                             eventTime, watchDir,
-                                            withManagerConf)
+                                            withManagerConf, confWatchMode, WatchMode(..))
 import           System.FSNotify.Devel     (existsEvents)
 import           System.Info               (os)
 import           System.IO                 (hFlush, stdout)
@@ -154,7 +153,6 @@
 data DiagramLoopOpts = DiagramLoopOpts
   { _loop     :: Bool            -- ^ Flag to indicate that the program should loop creation.
   , _src      :: Maybe FilePath  -- ^ File path for the source file to recompile.
-  , _interval :: Int             -- ^ Interval in seconds at which to check for recompilation.
   }
 
 makeLenses ''DiagramLoopOpts
@@ -204,18 +202,12 @@
 -- | CommandLine parser for 'DiagramLoopOpts'
 --   Loop is @--loop@ or @-l@.
 --   Source is @--src@ or @-s@.
---   Interval is @-i@ defaulting to one second.
 diagramLoopOpts :: Parser DiagramLoopOpts
 diagramLoopOpts = DiagramLoopOpts
   <$> switch (long "loop" <> short 'l' <> help "Run in a self-recompiling loop")
   <*> (optional . strOption)
       ( long "src" <> short 's'
      <> help "Source file to watch")
-  <*> option auto
-      ( long "interval" <> short 'i'
-     <> value 1
-     <> metavar "INTERVAL"
-     <> help "When running in a loop, check for changes every INTERVAL seconds.")
 
 -- | A hidden \"helper\" option which always fails.
 --   Taken from Options.Applicative.Extra but without the
@@ -600,8 +592,7 @@
       newProg     = newProgName (takeFileName srcPath) prog
       timeOfDay   = take 8 . drop 11 . show . eventTime
 
-  -- Polling is only used on Windows
-  withManagerConf defaultConfig { confPollInterval = opts ^. interval } $
+  withManagerConf defaultConfig { confWatchMode = WatchModeOS } $
     \mgr -> do
       lock <- newIORef False
 
