diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,8 @@
+# 0.1.1.0
+
+Added `frameConsA`, `frameSnoc`, and `RecordColumns` to help with
+changing row types.
+
+# 0.1.0.0
+
+Initial version pushed to hackage.
diff --git a/Frames.cabal b/Frames.cabal
--- a/Frames.cabal
+++ b/Frames.cabal
@@ -1,5 +1,5 @@
 name:                Frames
-version:             0.1.0.0
+version:             0.1.1.0
 synopsis:            Data frames For working with tabular data files
 description:         User-friendly, type safe, runtime efficient tooling for
                      working with tabular data deserialized from
@@ -15,7 +15,7 @@
 category:            Data
 build-type:          Simple
 extra-source-files:  benchmarks/*.hs benchmarks/*.py
-                     demo/Main.hs
+                     demo/Main.hs CHANGELOG.md
                      data/GetData.hs
 cabal-version:       >=1.10
 
diff --git a/src/Frames.hs b/src/Frames.hs
--- a/src/Frames.hs
+++ b/src/Frames.hs
@@ -32,7 +32,7 @@
 import Frames.InCore (toFrame, inCore, inCoreSoA,
                       inCoreAoS, inCoreAoS', toAoS, filterFrame)
 import Frames.Melt (melt, meltRow)
-import Frames.Rec (Record, (&:), recUncons, recMaybe, showFields)
+import Frames.Rec (Record, RecordColumns, (&:), recUncons, recMaybe, showFields)
 import Frames.RecF
 import Frames.RecLens
 import Frames.TypeLevel
diff --git a/src/Frames/Rec.hs b/src/Frames/Rec.hs
--- a/src/Frames/Rec.hs
+++ b/src/Frames/Rec.hs
@@ -30,6 +30,9 @@
 x &: xs = frameCons (Identity x) xs
 infixr 5 &:
 
+type family RecordColumns t where
+  RecordColumns (Record ts) = ts
+
 -- | Separate the first element of a 'Record' from the rest of the row.
 recUncons :: Record (s :-> a ': rs) -> (a, Record rs)
 recUncons (Identity x :& xs) = (x, xs)
diff --git a/src/Frames/RecF.hs b/src/Frames/RecF.hs
--- a/src/Frames/RecF.hs
+++ b/src/Frames/RecF.hs
@@ -12,7 +12,8 @@
              TypeOperators,
              ViewPatterns #-}
 module Frames.RecF (V.rappend, V.rtraverse, rdel, CanDelete,
-                    frameCons, pattern (:&), pattern Nil, AllCols,
+                    frameCons, frameConsA, frameSnoc,
+                    pattern (:&), pattern Nil, AllCols,
                     UnColumn, AsVinyl(..), mapMono, mapMethod,
                     ShowRec, showRec, ColFun, ColumnHeaders, 
                     columnHeaders, reifyDict) where
@@ -32,10 +33,21 @@
 frameCons = (V.:&) . fmap Col
 {-# INLINE frameCons #-}
 
+-- | Add a pure column to the head of a row.
+frameConsA :: Applicative f => a -> V.Rec f rs -> V.Rec f (s :-> a ': rs)
+frameConsA = (V.:&) . fmap Col . pure
+{-# INLINE frameConsA #-}
+
 -- | Separate the first element of a row from the rest of the row.
 frameUncons :: Functor f => V.Rec f (s :-> r ': rs) -> (f r, V.Rec f rs)
 frameUncons (x V.:& xs) = (fmap getCol x, xs)
 {-# INLINE frameUncons #-}
+
+-- | Add a column to the tail of a row. Note that the supplied value
+-- should be a 'Col' to work with the @Frames@ tooling.
+frameSnoc :: V.Rec f rs -> f r -> V.Rec f (rs ++ '[r])
+frameSnoc r x = V.rappend r (x V.:& RNil)
+{-# INLINE frameSnoc #-}
 
 pattern Nil = V.RNil
 pattern x :& xs <- (frameUncons -> (x, xs))
