diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
+# 0.2.1.0
+
+  * Add `packSrcDirAndCompress`
+
 # 0.2.0.2
-  
+
   * Export `Compressor` type for docs
 
 # 0.2.0.1
diff --git a/archive-sig.cabal b/archive-sig.cabal
--- a/archive-sig.cabal
+++ b/archive-sig.cabal
@@ -1,6 +1,6 @@
 cabal-version:   2.0
 name:            archive-sig
-version:         0.2.0.2
+version:         0.2.1.0
 license:         BSD3
 license-file:    LICENSE
 copyright:       Copyright: (c) 2019 Vanessa McHale
@@ -36,7 +36,7 @@
         base >=4.3 && <5,
         bytestring -any,
         composition-prelude >=2.0.3.0,
-        dir-traverse >=0.2.0.0
+        dir-traverse >=0.2.2.0
 
     if flag(development)
         ghc-options: -Werror
diff --git a/src/Archive/Compression.hs b/src/Archive/Compression.hs
--- a/src/Archive/Compression.hs
+++ b/src/Archive/Compression.hs
@@ -3,6 +3,7 @@
                            , unpackFileToDirAndDecompress
                            , packFromFilesAndCompress
                            , packFromDirAndCompress
+                           , packSrcDirAndCompress
                            ) where
 
 import           Archive
@@ -23,6 +24,28 @@
 packFromDirAndCompress :: Compressor -> FilePath -> FilePath -> IO ()
 packFromDirAndCompress f dir tar = packFromFilesAndCompress f tar =<< getDirRecursive dir
 
+-- | Pack up source files, ignoring version control directories and common
+-- artifact directories
+--
+-- @since 0.2.1.0
+packSrcDirAndCompress :: Compressor -> FilePath -> FilePath -> IO ()
+packSrcDirAndCompress f dir tar = packFromFilesAndCompress f tar =<< getDirFiltered (pure.srcFilter) dir
+
+srcFilter :: FilePath -> Bool
+srcFilter ".git"          = False
+srcFilter "_dargs"        = False
+srcFilter ".hg"           = False
+srcFilter ".pijul"        = False
+srcFilter "dist"          = False
+srcFilter "dist-newstyle" = False
+srcFilter ".stack-work"   = False
+srcFilter "target"        = False -- rust/cargo
+srcFilter ".atspkg"       = False
+srcFilter ".shake"        = False
+srcFilter ".vagrant"      = False
+srcFilter _               = False
+
+-- | @since 0.2.0.0
 -- | @since 0.2.0.0
 packFromFilesAndCompress :: Compressor -> FilePath -> [FilePath] -> IO ()
 packFromFilesAndCompress f tar fps = BSL.writeFile tar =<< (f <$> packFiles fps)
