diff --git a/dataframe-parquet-th.cabal b/dataframe-parquet-th.cabal
--- a/dataframe-parquet-th.cabal
+++ b/dataframe-parquet-th.cabal
@@ -1,6 +1,6 @@
-cabal-version:      2.4
+cabal-version:      3.4
 name:               dataframe-parquet-th
-version:            1.0.1.2
+version:            1.1.0.0
 
 synopsis:           Parquet-file-based Template Haskell splices for the dataframe ecosystem.
 description:
@@ -28,11 +28,12 @@
     import:             warnings
     exposed-modules:
                         DataFrame.TH.Parquet
+                        DataFrame.Typed.TH.Parquet
     build-depends:      base >= 4 && < 5,
-                        containers >= 0.6.7 && < 0.9,
-                        dataframe-core ^>= 1.1,
-                        dataframe-parquet ^>= 1.1,
-                        dataframe-th ^>= 1.0,
+                        containers >= 0.6.7 && < 0.10,
+                        dataframe-core:internal >= 2.0 && < 2.1,
+                        dataframe-parquet >= 1.2 && < 1.3,
+                        dataframe-th >= 2.0 && < 2.1,
                         directory >= 1.3.0.0 && < 2,
                         filepath >= 1.4 && < 2,
                         Glob >= 0.10 && < 1,
diff --git a/src/DataFrame/Typed/TH/Parquet.hs b/src/DataFrame/Typed/TH/Parquet.hs
new file mode 100644
--- /dev/null
+++ b/src/DataFrame/Typed/TH/Parquet.hs
@@ -0,0 +1,29 @@
+{- |
+Module      : DataFrame.Typed.TH.Parquet
+License     : MIT
+
+Parquet-file-based typed-schema derivation. The typed counterpart of
+'DataFrame.TH.Parquet.declareColumnsFromParquetFile': instead of binding one
+@Expr@ per column, it generates a type synonym describing the file's schema,
+suitable for 'DataFrame.Typed.freeze' / @readParquet \@Schema@.
+
+@
+deriveSchemaFromParquetFile \"Trips\" \"trips.parquet\"
+-- generates:  type Trips = '[Column \"id\" Int, Column \"fare\" Double, ...]
+@
+-}
+module DataFrame.Typed.TH.Parquet (
+    deriveSchemaFromParquetFile,
+) where
+
+import Control.Monad.IO.Class (liftIO)
+import Language.Haskell.TH
+
+import qualified DataFrame.IO.Parquet as Parquet
+import DataFrame.Typed.TH.Records (deriveSchema)
+
+-- | Derive a typed schema synonym from a Parquet file (or directory\/glob).
+deriveSchemaFromParquetFile :: String -> String -> DecsQ
+deriveSchemaFromParquetFile typeName path = do
+    df <- liftIO (Parquet.readParquetFiles path)
+    deriveSchema typeName df
