diff --git a/shakers.cabal b/shakers.cabal
--- a/shakers.cabal
+++ b/shakers.cabal
@@ -1,36 +1,41 @@
-name:                  shakers
-version:               0.0.34
-synopsis:              Shake helpers.
-description:           Primitive helpers for Shake files.
-homepage:              https://github.com/swift-nav/shakers
-license:               MIT
-license-file:          LICENSE
-author:                Swift Navigation Inc.
-maintainer:            Mark Fine <dev@swiftnav.com>
-copyright:             Copyright (C) 2016 Swift Navigation, Inc.
-category:              Development
-build-type:            Simple
-cabal-version:         >= 1.22
+name: shakers
+version: 0.0.35
+cabal-version: >=1.22
+build-type: Simple
+license: MIT
+license-file: LICENSE
+copyright: Copyright (C) 2016 Swift Navigation, Inc.
+maintainer: Mark Fine <dev@swiftnav.com>
+homepage: https://github.com/swift-nav/shakers
+synopsis: Shake helpers.
+description:
+    Primitive helpers for Shake files.
+category: Development
+author: Swift Navigation Inc.
 
+source-repository head
+    type: git
+    location: git@github.com:swift-nav/shakers.git
+
 library
-  hs-source-dirs:      src
-  exposed-modules:     Development.Shakers
-  default-language:    Haskell2010
-  ghc-options:         -Wall
-  build-depends:       base >= 4.8 && < 5
-                     , basic-prelude
-                     , deepseq
-                     , directory
-                     , regex-compat
-                     , shake
+    exposed-modules:
+        Development.Shakers
+    build-depends:
+        base >=4.8 && <5,
+        basic-prelude >=0.5.2,
+        deepseq >=1.4.1.1,
+        directory >=1.2.2.0,
+        regex-compat >=0.95.1,
+        shake >=0.15.11
+    default-language: Haskell2010
+    hs-source-dirs: src
+    ghc-options: -Wall
 
 executable shake-shakers
-  main-is:             Shakefile.hs
-  ghc-options:         -threaded -rtsopts -with-rtsopts=-N -Wall
-  build-depends:       base
-                     , shakers
-  default-language:    Haskell2010
+    main-is: Shakefile.hs
+    build-depends:
+        base >=4.8.2.0,
+        shakers
+    default-language: Haskell2010
+    ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall
 
-source-repository head
-  type:                git
-  location:            git@github.com:swift-nav/shakers.git
diff --git a/src/Development/Shakers.hs b/src/Development/Shakers.hs
--- a/src/Development/Shakers.hs
+++ b/src/Development/Shakers.hs
@@ -28,7 +28,6 @@
   , git_
   , schemaApply_
   , m4
-  , tar_
   , aws
   , rsync_
   , ssh
@@ -58,10 +57,12 @@
   ) where
 
 import BasicPrelude               as Exports hiding ((*>))
+import Control.DeepSeq
 import Data.Char
 import Development.Shake          as Exports
 import Development.Shake.FilePath
 import System.Directory
+import Text.Regex
 
 -- | Join strings with ":"
 --
@@ -519,7 +520,26 @@
   --
   phony "publish" $ do
     need [ file ]
-    stack_ dir [ "upload", dir, "--no-signature" ]
+    stack_ dir [ "upload", dir, "--no-signature", "--ignore-check" ]
+
+  phony "publish-lower" $ do
+    need [file, metaFile "cabalVersion" ]
+    version <- dropWhile (not . isDigit) <$> gitVersion dir
+    yaml    <- fromMaybe "stack.yaml" <$> getEnv "STACK_YAML"
+    dist    <- stack dir [ "path", "--dist-dir" ]
+    stack_ dir [ "sdist", dir, "--pvp-bounds", "lower" ]
+    let pkg = dropExtension file
+        hkg = pkg <-> version
+    [sdist] <- getDirectoryFiles dist [ hkg <.> "tar.gz" ]
+    withTempDir $ \d -> do
+      tar_ dist [ "xzf", sdist, "-C", d ]
+      let e = d </> hkg
+          f = e </> file
+      contents <- readFile' f
+      let contents' = subRegex (mkRegex $ pkg <> " >=" <> version) contents pkg
+      contents' `deepseq` writeFile' f contents'
+      copyFile' yaml $ e </> yaml
+      stack_ e [ "upload", e, "--no-signature", "--ignore-check" ]
 
 -- | Database rules
 --
