Cleanup deployment
diff --git a/Gruntfile.js b/Gruntfile.js
new file mode 100644
index 0000000..b7cf080
--- /dev/null
+++ b/Gruntfile.js
@@ -0,0 +1,104 @@
+/*
+ * http://gruntjs.com/getting-started
+ *
+ * Todo: Move all source files outside the public folder!
+ *
+ * TODO: Use https://www.npmjs.com/package/grunt-contrib-compress
+ * for assets.
+ * http://yui.github.io/yuidoc/
+ * use it with https://www.npmjs.com/package/grunt-contrib-yuidoc
+ *
+ * RequireJS
+ * http://addyosmani.com/writing-modular-js/
+ * http://qnundrum.com/question/393866
+ */
+module.exports = function(grunt) {
+  grunt.initConfig({
+    pkg: grunt.file.readJSON('package.json'),
+    concat: {
+      dist: {
+	src : [
+	  'dev/js/lib/dagre/dagre.min.js',
+	  'dev/js/src/menu.js',
+	  'dev/js/src/match.js',
+	  'dev/js/src/hint.js',
+	  'dev/js/src/vc.js',
+	  'dev/js/src/api.js',
+	  'dev/js/src/session.js',
+	  'dev/js/src/tutorial.js',
+	  'dev/js/src/util.js'
+	],
+	dest: 'dev/js/build/kalamar.js'
+      }
+    },
+    uglify : {
+      build : {
+	src: 'dev/js/build/kalamar.js',
+	dest: 'public/js/kalamar-<%= pkg.version %>.js'
+      }
+    },
+    imagemin: {
+      dynamic: {
+	files: [{
+	  expand: true,
+	  cwd: 'dev/img/',
+	  src: ['*.{png,gif,jpg,svg}'],
+	  dest: 'public/img/'
+	}]
+      }
+    },
+    sass: {
+      dist: {
+        options: {
+          style: 'compressed'
+        },
+        files: {
+          'public/css/kalamar-<%= pkg.version %>.css' : 'dev/scss/kalamar.scss'
+        }
+      }
+    },
+    jasmine: {
+      pivotal: {
+	src: [
+	  'dev/js/src/menu.js',
+	  'dev/js/src/match.js',
+	  'dev/js/src/match.js',
+	  'dev/js/src/vc.js'
+	],
+	options: {
+	  specs: 'dev/js/spec/*Spec.js'
+	}
+      }
+    },
+    watch: {
+/*
+      options: {
+	livereload: true
+      },
+      scripts: {
+        files: ['js/*.js'],
+        tasks: ['concat', 'uglify'],
+        options: {
+          spawn: false
+        },
+      },
+*/
+      css: {
+	files: ['dev/scss/{util,fonts,base,header,searchbar,matchinfo,resultinfo,kwic,menu,hint,pagination,logos,alertify,vc,media,kalamar,tutorial,query,sidebar}.scss'],
+	tasks: ['sass'],
+	options: {
+	  spawn: false
+	}
+      }
+    }    
+  });
+
+  grunt.loadNpmTasks('grunt-contrib-concat');
+  grunt.loadNpmTasks('grunt-contrib-uglify');
+  grunt.loadNpmTasks('grunt-contrib-imagemin');
+  grunt.loadNpmTasks('grunt-contrib-watch');
+  grunt.loadNpmTasks('grunt-contrib-sass');
+  grunt.loadNpmTasks('grunt-contrib-jasmine');
+  grunt.registerTask('css', ['sass']);
+  grunt.registerTask('default', ['concat', 'uglify', 'imagemin', 'sass']);
+};