diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright Vanessa McHale (c) 2019
+Copyright Vanessa McHale (c) 2019-2020
 
 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
 
diff --git a/archive-tar.cabal b/archive-tar.cabal
--- a/archive-tar.cabal
+++ b/archive-tar.cabal
@@ -1,34 +1,35 @@
-cabal-version: 2.0
-name: archive-tar
-version: 0.2.0.0
-license: BSD3
-license-file: LICENSE
-copyright: Copyright: (c) 2019 Vanessa McHale
-maintainer: vanessa.mchale@iohk.io
-author: Vanessa McHale
-synopsis: Common interface using the tar package
+cabal-version:   2.0
+name:            archive-tar
+version:         0.2.2.0
+license:         BSD3
+license-file:    LICENSE
+copyright:       Copyright: (c) 2019-2020 Vanessa McHale
+maintainer:      vamchale@gmail.com
+author:          Vanessa McHale
+synopsis:        Common interface using the tar package
 description:
     Backpack-ified way to use [tar](http://hackage.haskell.org/package/tar) bindings
-category: Codec, Tar, Archive
-build-type: Simple
+
+category:        Codec, Tar, Archive
+build-type:      Simple
 extra-doc-files: CHANGELOG.md
 
 source-repository head
-    type: git
+    type:     git
     location: https://github.com/vmchale/archive-backpack
+    subdir:   archive-tar
 
 flag development
-    description:
-        Enable `-Werror`
-    default: False
-    manual: True
+    description: Enable `-Werror`
+    default:     False
+    manual:      True
 
 library
-    exposed-modules:
-        Archive.Tar
-    hs-source-dirs: src
-    default-language: Haskell2010
-    ghc-options: -Wall
+    exposed-modules:    Archive.Tar
+    build-tool-depends: cpphs:cpphs -any
+    hs-source-dirs:     src
+    default-language:   Haskell2010
+    ghc-options:        -Wall
     build-depends:
         base >=4.3 && <5,
         tar -any,
@@ -39,8 +40,9 @@
         ghc-options: -Werror
 
     if impl(ghc >=8.0)
-        ghc-options: -Wincomplete-uni-patterns -Wincomplete-record-updates
-                     -Wredundant-constraints -Widentities
+        ghc-options:
+            -Wincomplete-uni-patterns -Wincomplete-record-updates
+            -Wredundant-constraints -Widentities
 
     if impl(ghc >=8.4)
         ghc-options: -Wmissing-export-lists
diff --git a/src/Archive/Tar.cpphs b/src/Archive/Tar.cpphs
new file mode 100644
--- /dev/null
+++ b/src/Archive/Tar.cpphs
@@ -0,0 +1,39 @@
+module Archive.Tar ( Entry
+                   , Error
+                   , writeArchiveBytes
+                   , unpackToDir
+                   , readArchiveBytes
+                   , packFiles
+                   , versionInfo
+                   ) where
+
+import           Codec.Archive.Tar    (Entries (..))
+import qualified Codec.Archive.Tar    as Tar
+import           Control.Composition  ((.@))
+import qualified Data.ByteString.Lazy as BSL
+
+type Entry = Tar.Entry
+
+type Error = Tar.FormatError
+
+-- this is bad but libarchive's error handling is vaguely fucked
+coerceToList :: Entries a -> Either a [Entry]
+coerceToList (Next e es) = (e :) <$> coerceToList es
+coerceToList Done        = Right []
+coerceToList (Fail ex)   = Left ex
+
+writeArchiveBytes :: [Entry] -> BSL.ByteString
+writeArchiveBytes = Tar.write
+
+readArchiveBytes :: BSL.ByteString -> Either Error [Entry]
+readArchiveBytes = coerceToList . Tar.read
+
+unpackToDir :: FilePath -> BSL.ByteString -> IO ()
+unpackToDir = Tar.read .@ Tar.unpack
+
+packFiles :: [FilePath] -> IO BSL.ByteString
+packFiles = fmap Tar.write . Tar.pack "."
+
+-- | @since 0.2.2.0
+versionInfo :: String
+versionInfo = "tar: " ++ VERSION_tar
diff --git a/src/Archive/Tar.hs b/src/Archive/Tar.hs
deleted file mode 100644
--- a/src/Archive/Tar.hs
+++ /dev/null
@@ -1,34 +0,0 @@
-module Archive.Tar ( Entry
-                   , Error
-                   , writeArchiveBytes
-                   , unpackToDir
-                   , readArchiveBytes
-                   , packFiles
-                   ) where
-
-import           Codec.Archive.Tar    (Entries (..))
-import qualified Codec.Archive.Tar    as Tar
-import           Control.Composition  ((.@))
-import qualified Data.ByteString.Lazy as BSL
-
-type Entry = Tar.Entry
-
-type Error = Tar.FormatError
-
--- this is bad but libarchive's error handling is vaguely fucked
-coerceToList :: Entries a -> Either a [Entry]
-coerceToList (Next e es) = (e :) <$> coerceToList es
-coerceToList Done        = Right []
-coerceToList (Fail ex)   = Left ex
-
-writeArchiveBytes :: [Entry] -> BSL.ByteString
-writeArchiveBytes = Tar.write
-
-readArchiveBytes :: BSL.ByteString -> Either Error [Entry]
-readArchiveBytes = coerceToList . Tar.read
-
-unpackToDir :: FilePath -> BSL.ByteString -> IO ()
-unpackToDir = Tar.read .@ Tar.unpack
-
-packFiles :: [FilePath] -> IO BSL.ByteString
-packFiles = fmap Tar.write . Tar.pack "."
