diff --git a/.gitignore b/.gitignore
index 7e2fa5822dfa726c5beabdc542c6968bfe85d558..44b5927d98ac89ebdc654188f700c3573685f29f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,7 +7,8 @@ pom.xml
 pom.xml.asc
 *.jar
 *.class
-/.lein-*
+/.lein-env
+/.lein-repl-history
 /.nrepl-port
 .hgignore
 .hg/
diff --git a/.lein-classpath b/.lein-classpath
new file mode 100644
index 0000000000000000000000000000000000000000..a38ac2ef8384ba8bdc8b8f0657e5d5789a029e40
--- /dev/null
+++ b/.lein-classpath
@@ -0,0 +1 @@
+lein_tasks
diff --git a/lein_tasks/leiningen/gulp.clj b/lein_tasks/leiningen/gulp.clj
new file mode 100644
index 0000000000000000000000000000000000000000..79769423c704543a30ad6991228da94c036799c0
--- /dev/null
+++ b/lein_tasks/leiningen/gulp.clj
@@ -0,0 +1,11 @@
+(ns leiningen.gulp
+  (:use clojure.java.shell))
+
+
+(defn gulp [projects & args]
+  ;; TODO - some better validations such as checking that we have gulp available
+  (println "Running `gulp build` to assemble frontend assets into a better format")
+  (let [result (sh (str (:root projects) "/node_modules/gulp/bin/gulp.js") "build")]
+    (if (= 0 (:exit result))
+      (println (:out result))
+      (println (:err result)))))
\ No newline at end of file
diff --git a/lein_tasks/leiningen/npm.clj b/lein_tasks/leiningen/npm.clj
new file mode 100644
index 0000000000000000000000000000000000000000..79f9e4d93bda5b699dc5ec61c851010292c2835e
--- /dev/null
+++ b/lein_tasks/leiningen/npm.clj
@@ -0,0 +1,11 @@
+(ns leiningen.npm
+  (:use clojure.java.shell))
+
+
+(defn npm [projects & args]
+  ;; TODO - some better validations such as checking if `npm` is available
+  (println "Running `npm install` to download javascript dependencies")
+  (let [result (sh "npm" "install")]
+    (if (= 0 (:exit result))
+      (println (:out result))
+      (println (:err result)))))
\ No newline at end of file