diff --git a/dataframe-th.cabal b/dataframe-th.cabal
--- a/dataframe-th.cabal
+++ b/dataframe-th.cabal
@@ -1,6 +1,6 @@
-cabal-version:      2.4
+cabal-version:      3.4
 name:               dataframe-th
-version:            1.0.1.2
+version:            2.0.0.0
 
 synopsis:           Record-based Template Haskell splices for the dataframe ecosystem.
 description:
@@ -28,16 +28,19 @@
 library
     import:             warnings
     exposed-modules:
-                        DataFrame.Internal.Schema.TH
                         DataFrame.TH.Records
                         DataFrame.Typed.TH.Records
+    -- Internal record→schema TH; sealed (superseded publicly by
+    -- @deriveSchemaFromType@ in DataFrame.Typed.TH.Records).
+    other-modules:      DataFrame.Internal.Schema.TH
     build-depends:      base >= 4 && < 5,
-                        containers >= 0.6.7 && < 0.9,
-                        dataframe-core ^>= 1.1,
-                        dataframe-operations ^>= 1.1.1,
-                        dataframe-parsing ^>= 1.0.2,
+                        containers >= 0.6.7 && < 0.10,
+                        dataframe-core >= 2.0 && < 2.1,
+                        dataframe-core:internal >= 2.0 && < 2.1,
+                        dataframe-operations >= 2.0 && < 2.1,
+                        dataframe-parsing >= 2.0 && < 2.1,
                         template-haskell >= 2.0 && < 3,
-                        text >= 2.0 && < 3,
-                        vector ^>= 0.13
+                        text >= 2.1 && < 3,
+                        vector >= 0.13 && < 0.15
     hs-source-dirs:     src
     default-language:   Haskell2010
diff --git a/src/DataFrame/Internal/Schema/TH.hs b/src/DataFrame/Internal/Schema/TH.hs
--- a/src/DataFrame/Internal/Schema/TH.hs
+++ b/src/DataFrame/Internal/Schema/TH.hs
@@ -18,25 +18,12 @@
 import Language.Haskell.TH
 
 import DataFrame.Internal.Expression (Expr)
-import DataFrame.Internal.Schema (Schema, makeSchema, schemaType)
 import DataFrame.Operators (col)
+import DataFrame.Schema (Schema, makeSchema, schemaType)
 
 {- | Auto-generate a runtime 'Schema' (and per-column @'Expr'@ accessors)
-from a record ADT.
-
-The splice reifies the record, applies @camelCase -> snake_case@ to each
-record-selector name, and emits:
-
-* a top-level @\<lower-first TyConName\>Schema :: 'Schema'@ binding suitable
-  for passing to 'DataFrame.IO.CSV.readCsvWithSchema'.
-* one @\<lower-first TyConName\>\<UpperFirst FieldName\> :: 'Expr' /ty/@ binding
-  per field, so you can refer to columns in expression DSL code by name
-  without writing @col \@/ty/ "snake_case_name"@ at every call site.
-
-The data type must have exactly one record constructor; sum types or
-positional constructors fail the splice with a descriptive error. Field
-types must satisfy @('Columnable' a, 'Read' a)@ — the same constraints
-'schemaType' already requires.
+from a record ADT. Emits @\<tyName\>Schema@ plus one accessor per field
+(@camelCase -> snake_case@). Requires a single record constructor.
 -}
 deriveSchema :: Name -> DecsQ
 deriveSchema tyName = do
diff --git a/src/DataFrame/Typed/TH/Records.hs b/src/DataFrame/Typed/TH/Records.hs
--- a/src/DataFrame/Typed/TH/Records.hs
+++ b/src/DataFrame/Typed/TH/Records.hs
@@ -19,6 +19,7 @@
     -- * ADT-based schema derivation
     deriveSchemaFromType,
     deriveSchemaFromTypeWith,
+    deriveSchemaValues,
     SchemaOptions (..),
     defaultSchemaOptions,
     camelToSnake,
@@ -42,6 +43,7 @@
 
 import qualified DataFrame.Internal.Column as C
 import qualified DataFrame.Internal.DataFrame as D
+import qualified DataFrame.Internal.Schema.TH as SchemaTH
 import DataFrame.Typed.Record (
     HasSchema,
     Schema,
@@ -51,6 +53,13 @@
  )
 import DataFrame.Typed.Types (Column, TypedDataFrame)
 import DataFrame.Typed.Util (camelToSnake)
+
+{- | Derive an untyped 'DataFrame.Schema.Schema' value plus per-column 'Expr'
+accessors from a record type. The value-level companion to
+'deriveSchemaFromType': @$(deriveSchemaValues ''Order)@ generates @orderSchema@.
+-}
+deriveSchemaValues :: Name -> DecsQ
+deriveSchemaValues = SchemaTH.deriveSchema
 
 deriveSchema :: String -> D.DataFrame -> DecsQ
 deriveSchema typeName df = do
