diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,15 @@
 # Revision history for skylighting and skylighting-core
 
+## 0.14.2
+
+  * Add `loadValidSyntaxesFromDir` (Kevin Quick) [API change].
+    The `loadSyntaxesFromDir` function is an all-or-nothing function:
+    a single invalid file results in a error and *no* loaded syntaxes.
+    This adds the `loadValidSyntaxesFromDir`, which is resilient
+    against individual syntax file load failures.  It returns a map
+    of the failure messages, and the SyntaxMap that is created from
+    all the successful parsing.
+
 ## 0.14.1.2
 
   * Add terraform syntax (#190).
diff --git a/skylighting-core.cabal b/skylighting-core.cabal
--- a/skylighting-core.cabal
+++ b/skylighting-core.cabal
@@ -1,5 +1,5 @@
 name:                skylighting-core
-version:             0.14.1.2
+version:             0.14.2
 synopsis:            syntax highlighting library
 description:         Skylighting is a syntax highlighting library.
                      It derives its tokenizers from XML syntax
@@ -21,7 +21,7 @@
 license-file:        LICENSE
 author:              John MacFarlane
 maintainer:          jgm@berkeley.edu
-copyright:           (C) 2016-2018 John MacFarlane
+copyright:           (C) 2016-2024 John MacFarlane
 category:            Text
 build-type:          Simple
 extra-source-files:  README.md
diff --git a/src/Skylighting/Loader.hs b/src/Skylighting/Loader.hs
--- a/src/Skylighting/Loader.hs
+++ b/src/Skylighting/Loader.hs
@@ -1,8 +1,10 @@
 {-# LANGUAGE CPP #-}
+{-# LANGUAGE LambdaCase #-}
 -- | This module provides routines to load syntax definitions from disk
 -- files.
 module Skylighting.Loader ( loadSyntaxFromFile
                           , loadSyntaxesFromDir
+                          , loadValidSyntaxesFromDir
                           )
                           where
 
@@ -37,7 +39,8 @@
 -- | Loads all syntax definitions from the specified directory by
 -- looking for files with an ".xml" extension. This function assumes
 -- such files are Kate XML syntax definitions, so XML files with
--- unexpected contents will cause a parsing error returned as a 'Left'.
+-- unexpected contents will cause a parsing error returned as a 'Left'
+-- and syntax parsing will be aborted.
 loadSyntaxesFromDir :: FilePath -> IO (Either String SyntaxMap)
 loadSyntaxesFromDir path = runExceptT $ do
     files <- liftIO $ syntaxFiles path
@@ -54,3 +57,20 @@
     entries <- listDirectory dir
     let absEntries = (dir </>) <$> filter isSyntaxFile entries
     filterM doesFileExist absEntries
+
+-- | Loads all valid syntax definitions from the specified directory by looking
+-- for files with an ".xml" extension.  Any files that are not valid Kate XML
+-- syntax definitions will have an entry in the resulting error map; the returned
+-- SyntaxMap will be made up of only the files that could successfully be loaded
+-- and parsed.
+loadValidSyntaxesFromDir :: FilePath -> IO (LoadErrMap, SyntaxMap)
+loadValidSyntaxesFromDir path = foldM go (mempty, mempty) =<< syntaxFiles path
+  where
+    go (errMap, syntaxMap) file =
+      loadSyntaxFromFile file >>= \case
+        Right s -> return (errMap, addSyntaxDefinition s syntaxMap)
+        Left e -> return (M.insert file e errMap, syntaxMap)
+
+-- | A map from a potential syntax file to the error encountered when trying to
+-- load that syntax file.
+type LoadErrMap = M.Map FilePath String
