diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Changelog
 
+## 0.1.4
+### [Added]
+- [#16] [#17] GHC 9.4 support
+
 ## 0.1.3
 
 ### [Changed]
diff --git a/calligraphy.cabal b/calligraphy.cabal
--- a/calligraphy.cabal
+++ b/calligraphy.cabal
@@ -1,13 +1,13 @@
 cabal-version:   2.4
 name:            calligraphy
-version:         0.1.3
+version:         0.1.4
 license:         BSD-3-Clause
 build-type:      Simple
 license-file:    LICENSE
 author:          Jonas Carpay
 maintainer:      Jonas Carpay <jonascarpay@gmail.com>
 copyright:       2022 Jonas Carpay
-tested-with:     GHC ==8.8.4 || ==8.10.7 || ==9.0.2 || ==9.2.2
+tested-with:     GHC ==8.8.4 || ==8.10.7 || ==9.0.2 || ==9.2.7 || ==9.4.4
 extra-doc-files:
   CHANGELOG.md
   README.md
@@ -16,7 +16,7 @@
 description:
   Calligraphy is a Haskell call graph/source code visualizer.
   It works directly on GHC-generated HIE files, giving us features that would otherwise be tricky, like type information and support for generated files.
-  Calligraphy has been tested with all versions of GHC that can produce HIE files (i.e. GHC 8.8, 8.10, 9.0, and 9.2.)
+  Calligraphy has been tested with all versions of GHC that can produce HIE files (i.e. GHC 8.8 through 9.4.)
   See the project's github page for more information.
 
 homepage:        https://github.com/jonascarpay/calligraphy#readme
diff --git a/src/Calligraphy/Compat/Lib.hs b/src/Calligraphy/Compat/Lib.hs
--- a/src/Calligraphy/Compat/Lib.hs
+++ b/src/Calligraphy/Compat/Lib.hs
@@ -14,12 +14,15 @@
     showAnns,
     mergeSpans,
     isPointSpan,
+    getHieFiles,
   )
 where
 
+import qualified Calligraphy.Compat.GHC as GHC
 import Calligraphy.Util.Lens
 import Data.IORef
 import qualified Data.Set as Set
+import Control.Monad
 
 #if MIN_VERSION_ghc(9,0,0)
 import GHC.Iface.Ext.Binary
@@ -35,11 +38,48 @@
 import SrcLoc
 #endif
 
+getHieFiles :: [FilePath] -> IO [HieFile]
+#if MIN_VERSION_ghc(9,4,0)
+
+getHieFiles filePaths = do
+  ref <- newIORef =<< GHC.initNameCache 'z' []
+  forM filePaths (readHieFileWithWarning ref)
+
+#else
+
+getHieFiles filePaths = do
+    uniqSupply <- GHC.mkSplitUniqSupply 'z'
+    ref <- newIORef (GHC.initNameCache uniqSupply [])
+    forM filePaths (readHieFileWithWarning ref)
+
+#endif
+
+readHieFileWithWarning :: IORef GHC.NameCache -> FilePath -> IO GHC.HieFile
+readHieFileWithWarning ref path = do
+  GHC.HieFileResult fileHieVersion fileGHCVersion hie <- readHieFileCompat ref path
+  when (GHC.hieVersion /= fileHieVersion) $ do
+    putStrLn $ "WARNING: version mismatch in " <> path
+    putStrLn $ "    The hie files in this project were generated with GHC version: " <> show fileGHCVersion
+    putStrLn $ "    This version of calligraphy was compiled with GHC version: " <> show GHC.hieVersion
+    putStrLn "    Optimistically continuing anyway..."
+  pure hie
+
 {-# INLINE sourceInfo #-}
 sourceInfo :: Traversal' (HieAST a) (NodeInfo a)
 showContextInfo :: ContextInfo -> String
 readHieFileCompat :: IORef NameCache -> FilePath -> IO HieFileResult
-#if MIN_VERSION_ghc(9,0,0)
+
+#if MIN_VERSION_ghc(9,4,0)
+
+sourceInfo f (Node (SourcedNodeInfo inf) sp children) = (\inf' -> Node (SourcedNodeInfo inf') sp children) <$> Map.alterF (maybe (pure Nothing) (fmap Just . f)) SourceInfo inf
+
+showContextInfo = showSDocUnsafe . ppr
+
+readHieFileCompat ref path = do
+  nameCache <- readIORef ref
+  readHieFile nameCache path
+
+#elif MIN_VERSION_ghc(9,0,0)
 
 sourceInfo f (Node (SourcedNodeInfo inf) sp children) = (\inf' -> Node (SourcedNodeInfo inf') sp children) <$> Map.alterF (maybe (pure Nothing) (fmap Just . f)) SourceInfo inf
 
diff --git a/src/Calligraphy/Phases/Search.hs b/src/Calligraphy/Phases/Search.hs
--- a/src/Calligraphy/Phases/Search.hs
+++ b/src/Calligraphy/Phases/Search.hs
@@ -8,10 +8,8 @@
 where
 
 import qualified Calligraphy.Compat.GHC as GHC
-import Calligraphy.Compat.Lib (readHieFileCompat)
+import Calligraphy.Compat.Lib
 import Control.Applicative
-import Control.Monad.State
-import Data.IORef
 import Data.List (isPrefixOf)
 import Data.List.NonEmpty (NonEmpty (..), nonEmpty, toList)
 import Options.Applicative hiding (str)
@@ -20,12 +18,7 @@
 
 searchFiles :: SearchConfig -> IO [GHC.HieFile]
 searchFiles SearchConfig {searchDotPaths, searchRoots, includePatterns, excludePatterns} = do
-  hieFilePaths <- searchHieFilePaths
-
-  hieFiles <- do
-    uniqSupply <- GHC.mkSplitUniqSupply 'z'
-    ref <- newIORef (GHC.initNameCache uniqSupply [])
-    forM hieFilePaths (readHieFileWithWarning ref)
+  hieFiles <- getHieFiles =<< searchHieFilePaths
 
   pure $
     flip filter hieFiles $ \file ->
@@ -50,16 +43,6 @@
                   contents <- (if searchDotPaths then id else filter (not . isPrefixOf ".")) <$> listDirectory path
                   foldMap (go . (path </>)) contents
                 else pure []
-
-readHieFileWithWarning :: IORef GHC.NameCache -> FilePath -> IO GHC.HieFile
-readHieFileWithWarning ref path = do
-  GHC.HieFileResult fileHieVersion fileGHCVersion hie <- readHieFileCompat ref path
-  when (GHC.hieVersion /= fileHieVersion) $ do
-    putStrLn $ "WARNING: version mismatch in " <> path
-    putStrLn $ "    The hie files in this project were generated with GHC version: " <> show fileGHCVersion
-    putStrLn $ "    This version of calligraphy was compiled with GHC version: " <> show GHC.hieVersion
-    putStrLn $ "    Optimistically continuing anyway..."
-  pure hie
 
 data SearchConfig = SearchConfig
   { includePatterns :: Maybe (NonEmpty Pattern),
