diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Revision history for auto-instrument
 
+## 0.1.0.3 -- 2025-11-18
+
+* Support GHC 9.12
+
 ## 0.1.0.2 -- 2025-04-06
 
 * Support GHC 9.10
diff --git a/hs-opentelemetry-instrumentation-auto.cabal b/hs-opentelemetry-instrumentation-auto.cabal
--- a/hs-opentelemetry-instrumentation-auto.cabal
+++ b/hs-opentelemetry-instrumentation-auto.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.0
 name:               hs-opentelemetry-instrumentation-auto
-version:            0.1.0.2
+version:            0.1.0.3
 synopsis:           Plugin for instrumenting an application
 description:        A GHC plugin that auto-instruments an application for emitting open telementry tracing.
 license:            BSD-3-Clause
@@ -19,6 +19,7 @@
   GHC == 9.4.8
   GHC == 9.6.2
   GHC == 9.10.1
+  GHC == 9.12.2
 bug-reports: https://github.com/aaronallen8455/opentelemetry-auto/issues
 source-repository head
     type: git
@@ -40,16 +41,16 @@
     -- other-extensions:
     build-depends:
       base >=4.17.0.0 && <4.22.0.0,
-      ghc >=9.4.0 && <9.11.0,
+      ghc >=9.4.0 && <9.13.0,
       bytestring ^>= 0.11 || ^>= 0.12,
       directory ^>= 1.3,
       containers ^>= 0.6 || ^>= 0.7,
       unliftio ^>= 0.2,
-      hs-opentelemetry-api ^>= 0.0.3 || ^>= 0.1 || ^>= 0.2,
+      hs-opentelemetry-api ^>= 0.0.3 || ^>= 0.1 || ^>= 0.2 || ^>= 0.3,
       text ^>= 2.0 || ^>= 2.1,
       toml-parser >= 2.0.0.0 && < 3.0.0.0,
       parsec ^>= 3.1,
-      time ^>= 1.12
+      time ^>= 1.12 || ^>= 1.14
     hs-source-dirs:   src
     default-language: GHC2021
 
@@ -65,9 +66,9 @@
       base >=4.17.0.0 && <4.22.0.0,
       unordered-containers,
       hs-opentelemetry-instrumentation-auto,
-      hs-opentelemetry-exporter-in-memory,
       hs-opentelemetry-api,
       hs-opentelemetry-sdk,
+      hs-opentelemetry-exporter-in-memory,
       tasty-hunit,
       tasty,
       unliftio,
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE OverloadedLists #-}
 {-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE CPP #-}
 module Main (main) where
 
 import           Data.Kind (Constraint)
@@ -9,7 +10,11 @@
 import           OpenTelemetry.Attributes
 import qualified OpenTelemetry.Context as Context
 import           OpenTelemetry.Context.ThreadLocal
+#if MIN_VERSION_hs_opentelemetry_api(0,3,0)
+import           OpenTelemetry.Exporter.InMemory.Span
+#else
 import           OpenTelemetry.Exporter.InMemory
+#endif
 import           OpenTelemetry.Trace
 import           OpenTelemetry.Trace.Core
 import           OpenTelemetry.Trace.Sampler
@@ -29,7 +34,11 @@
   pure SpanInfo
     { name = spanName s
     , parentName = spanName <$> parentSpan
+#if MIN_VERSION_hs_opentelemetry_api(0,3,0)
+    , attrs = H.delete "thread.id" . getAttributeMap $ spanAttributes s
+#else
     , attrs = H.delete "thread.id" . snd . getAttributes $ spanAttributes s
+#endif
     }
 
 withGlobalTracing :: (OutChan ImmutableSpan -> IO a) -> IO a
@@ -159,9 +168,9 @@
   t1
   spans <- getSpans spansChan
   spans @?=
-    [ spanInfo "67" "t2" (Just "t1")
-    , spanInfo "67" "t2" (Just "t1")
-    , spanInfo "61" "t1" Nothing
+    [ spanInfo "76" "t2" (Just "t1")
+    , spanInfo "76" "t2" (Just "t1")
+    , spanInfo "70" "t1" Nothing
     ]
 
 excludedCon :: OutChan ImmutableSpan -> Assertion
@@ -169,7 +178,7 @@
   t4
   spans <- getSpans spansChan
   spans @?=
-    [ spanInfo "67" "t2" Nothing
+    [ spanInfo "76" "t2" Nothing
     ]
 
 simpleConstraint :: OutChan ImmutableSpan -> Assertion
@@ -177,8 +186,8 @@
   t5
   spans <- getSpans spansChan
   spans @?=
-    [ spanInfo "67" "t2" (Just "t5")
-    , spanInfo "81" "t5" Nothing
+    [ spanInfo "76" "t2" (Just "t5")
+    , spanInfo "90" "t5" Nothing
     ]
 
 excludeConstraint :: OutChan ImmutableSpan -> Assertion
@@ -186,7 +195,7 @@
   t6
   spans <- getSpans spansChan
   spans @?=
-    [ spanInfo "67" "t2" Nothing ]
+    [ spanInfo "76" "t2" Nothing ]
 
 partialCon :: OutChan ImmutableSpan -> Assertion
 partialCon spansChan = do
@@ -194,9 +203,9 @@
   t8
   spans <- getSpans spansChan
   spans @?=
-    [ spanInfo "67" "t2" Nothing
-    , spanInfo "67" "t2" (Just "t8")
-    , spanInfo "95" "t8" Nothing
+    [ spanInfo "76" "t2" Nothing
+    , spanInfo "76" "t2" (Just "t8")
+    , spanInfo "104" "t8" Nothing
     ]
 
 wildCard :: OutChan ImmutableSpan -> Assertion
@@ -206,7 +215,7 @@
   _ <- t11
   spans <- getSpans spansChan
   spans @?=
-    [ spanInfo "101" "t9" Nothing ]
+    [ spanInfo "110" "t9" Nothing ]
 
 multiPred :: OutChan ImmutableSpan -> Assertion
 multiPred spansChan = do
@@ -214,7 +223,7 @@
   t13
   spans <- getSpans spansChan
   spans @?=
-    [ spanInfo "119" "t13" Nothing ]
+    [ spanInfo "128" "t13" Nothing ]
 
 multiPredX :: OutChan ImmutableSpan -> Assertion
 multiPredX spansChan = do
@@ -223,14 +232,14 @@
   t16
   spans <- getSpans spansChan
   spans @?=
-    [ spanInfo "134" "t16" Nothing ]
+    [ spanInfo "143" "t16" Nothing ]
 
 pointFree :: OutChan ImmutableSpan -> Assertion
 pointFree spansChan = do
   t17 ()
   spans <- getSpans spansChan
   spans @?=
-    [ spanInfo "137" "t17" Nothing ]
+    [ spanInfo "146" "t17" Nothing ]
 
 spanInfo :: Text -> Text -> Maybe Text -> SpanInfo
 spanInfo lineNo funName mParentName =
@@ -242,7 +251,11 @@
       , ("code.filepath", AttributeValue (TextAttribute "test/Main.hs"))
       , ("code.function", AttributeValue (TextAttribute funName))
       , ("code.namespace", AttributeValue (TextAttribute "Main"))
+#if MIN_VERSION_hs_opentelemetry_api(0,3,0)
+      , ("code.package", AttributeValue (TextAttribute "hs-opentelemetry-instrumentation-auto-0.1.0.3-inplace-auto-instrument-test"))
+#else
       , ("code.package", AttributeValue (TextAttribute "hs-opentelemetry-instrumentation-auto-0.1.0.2-inplace-auto-instrument-test"))
+#endif
       ]
     }
 
