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:             2.6.0.0
+version:             2.6.0.1
 synopsis:            Helper functions for linting with shake 
 description:         This package provides several linters out of the box, for use with [shake](http://shakebuild.com/).
 homepage:            https://hub.darcs.net/vmchale/shake-ext
@@ -29,6 +29,8 @@
                      , Development.Shake.Cabal
                      , Development.Shake.Version
                      , Development.Shake.C
+                     , Development.Shake.CCJS
+                     , Development.Shake.Elm
   other-modules:       Development.Shake.TH
   build-depends:       base >= 4.10 && < 5
                      , shake
diff --git a/src/Development/Shake/CCJS.hs b/src/Development/Shake/CCJS.hs
new file mode 100644
--- /dev/null
+++ b/src/Development/Shake/CCJS.hs
@@ -0,0 +1,12 @@
+module Development.Shake.CCJS ( ccjs
+                              ) where
+
+import           Data.Semigroup
+import           Development.Shake
+
+ccjs :: [FilePath] -> FilePattern -> Rules ()
+ccjs sources fp =
+    fp %> \out -> do
+        need sources
+        (Stdout sout) <- command mempty "ccjs" (sources <> ["--externs=node"])
+        liftIO $ writeFile out sout
diff --git a/src/Development/Shake/Clean.hs b/src/Development/Shake/Clean.hs
--- a/src/Development/Shake/Clean.hs
+++ b/src/Development/Shake/Clean.hs
@@ -1,6 +1,12 @@
-module Development.Shake.Clean where
+module Development.Shake.Clean ( cleanElm
+                               , cleanProducts
+                               , cleanHaskell
+                               ) where
 
 import           Development.Shake
+
+cleanElm :: Action ()
+cleanElm = removeFilesAfter "elm-stuff" ["//*"]
 
 -- | Clean generic products (@.o@, @.so@, @.a@).
 cleanProducts :: Action ()
diff --git a/src/Development/Shake/Elm.hs b/src/Development/Shake/Elm.hs
new file mode 100644
--- /dev/null
+++ b/src/Development/Shake/Elm.hs
@@ -0,0 +1,9 @@
+module Development.Shake.Elm ( elmMake
+                             ) where
+
+import           Development.Shake
+
+elmMake :: [FilePath] -> FilePattern -> Rules ()
+elmMake sources fp =
+    fp %> \out -> do
+        command mempty "elm-make" ("--yes" : "--output" : out : "--warn" : sources)
diff --git a/src/Development/Shake/FileDetect.hs b/src/Development/Shake/FileDetect.hs
--- a/src/Development/Shake/FileDetect.hs
+++ b/src/Development/Shake/FileDetect.hs
@@ -10,11 +10,15 @@
     , getAlex
     , getShell
     , getDhall
+    , getElm
     ) where
 
 import           Control.Monad
 import           Data.Semigroup    ((<>))
 import           Development.Shake
+
+getElm :: Action [FilePath]
+getElm = getAll ["elm"]
 
 getDhall :: Action [FilePath]
 getDhall = getAll ["dhall"]
