diff --git a/shake-ext.cabal b/shake-ext.cabal
--- a/shake-ext.cabal
+++ b/shake-ext.cabal
@@ -1,5 +1,5 @@
 name:                shake-ext
-version:             0.3.0.0
+version:             0.3.1.0
 synopsis:            Helper functions for linting with shake 
 description:         This package provides several linters out of the box, as well as functionality for building ATS source files with [shake](http://shakebuild.com/).
 homepage:            https://hub.darcs.net/vmchale/shake-ext
diff --git a/src/Development/Shake/Linters.hs b/src/Development/Shake/Linters.hs
--- a/src/Development/Shake/Linters.hs
+++ b/src/Development/Shake/Linters.hs
@@ -5,11 +5,21 @@
                                  , hlint
                                  , shellcheck
                                  , ghc
+                                 , atsfmt
                                  , module Development.Shake.FileDetect
                                  ) where
 
 import           Development.Shake
 import           Development.Shake.FileDetect
+
+checkIdempotent :: String -> FilePath -> Action ()
+checkIdempotent s p = do
+    contents <- liftIO $ readFile p
+    (Stdout out) <- cmd (s ++ " " ++ p)
+    if contents == out then pure () else error "formatter is not fully applied!"
+
+atsfmt :: String -> [FilePath] -> Action ()
+atsfmt s = mapM_ (checkIdempotent s)
 
 checkFiles :: String -> [FilePath] -> Action ()
 checkFiles str = mapM_ (cmd_ . ((str ++ " ") ++))
