diff --git a/.gitignore b/.gitignore
index 1377554..e3740eb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,7 @@
*.swp
+deployment-config.mk
+scanner/venv
+scanner/floatapp/app.cfg
+*.pyc
+*.min.css
+*.min.js
diff --git a/deployment-config.mk b/deployment-config.mk.sample
similarity index 100%
rename from deployment-config.mk
rename to deployment-config.mk.sample
diff --git a/scanner/.gitignore b/scanner/.gitignore
deleted file mode 100644
index 0d20b64..0000000
--- a/scanner/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*.pyc
diff --git a/scanner/floatapp/app.cfg b/scanner/floatapp/app.cfg.sample
similarity index 100%
rename from scanner/floatapp/app.cfg
rename to scanner/floatapp/app.cfg.sample
diff --git a/web/.htaccess b/web/.htaccess
deleted file mode 100755
index 2069589..0000000
--- a/web/.htaccess
+++ /dev/null
@@ -1,19 +0,0 @@
-AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml text/css application/x-javascript application/javascript application/json
-
-
- Header set Cache-Control "max-age=29030400, public"
-
-
- Header set Cache-Control "max-age=5184000, public"
-
-
- Header set Cache-Control "max-age=2678400, public"
-
-
- Header set Cache-Control "max-age=3600, public"
-
-
-
- deny from all
-
-
diff --git a/web/Makefile b/web/Makefile
new file mode 100644
index 0000000..fc9e181
--- /dev/null
+++ b/web/Makefile
@@ -0,0 +1,69 @@
+JS_DIR = js
+CSS_DIR = css
+
+JS_MIN = $(JS_DIR)/scripts.min.js
+CSS_MIN = $(CSS_DIR)/styles.min.css
+
+JS_MIN_FILES := $(sort $(patsubst %.js, %.min.js, $(filter-out %.min.js, $(wildcard $(JS_DIR)/*.js))))
+CSS_MIN_FILES := $(sort $(patsubst %.css, %.min.css, $(filter-out %.min.css, $(wildcard $(CSS_DIR)/*.css))))
+
+JS_COMPILER := java -jar bin/closure-compiler.jar --warning_level QUIET
+CSS_COMPILER := java -jar bin/yui-compressor.jar --type css
+
+DEBUG ?= 0
+
+.PHONY: all deploy clean
+
+all: $(JS_MIN) $(CSS_MIN)
+
+ifeq ($(DEBUG),0)
+%.min.js: %.js
+ @echo " JS " $@
+ @$(JS_COMPILER) --js $< --js_output_file $@
+else
+%.min.js: %.js
+ @echo " JS " $@
+ @cat $< > $@
+endif
+
+%.min.css: %.css
+ @echo " CSS " $@
+ @$(CSS_COMPILER) -o $@ $<
+
+$(JS_MIN): $(JS_MIN_FILES)
+ @echo " CAT " $@
+ @cat $^ > $@
+
+$(CSS_MIN): $(CSS_MIN_FILES)
+ @echo " CAT " $@
+ @cat $^ > $@
+
+clean:
+ @echo " RM " $(JS_MIN) $(JS_MIN_FILES) $(CSS_MIN) $(CSS_MIN_FILES)
+ @rm -fv $(JS_MIN) $(JS_MIN_FILES) $(CSS_MIN) $(CSS_MIN_FILES)
+
+include ../deployment-config.mk
+
+SSH_OPTS := -q -o ControlMaster=auto -o ControlPath=.ssh-deployment.sock
+
+deploy: all
+ @echo " SSH $(WEB_SERVER)"
+ @ssh $(SSH_OPTS) -Nf $(WEB_SERVER)
+
+ @echo " RSYNC . $(WEB_SERVER):$(HTDOCS_PATH)"
+ @ssh -t $(SSH_OPTS) $(WEB_SERVER) "sudo -u $(HTDOCS_USER) -v"
+ @rsync -aizm --delete-excluded --exclude=.ssh-deployment.sock --exclude=Makefile --exclude=*.swp \
+ --exclude=bin/ --include=scripts.min.js --include=styles.min.css \
+ --exclude=*.js --exclude=*.css --rsh="ssh $(SSH_OPTS)" \
+ --rsync-path="sudo -n -u $(HTDOCS_USER) rsync" \
+ . "$(WEB_SERVER):$(HTDOCS_PATH)"
+
+ @echo " CHOWN $(HTDOCS_USER):$(HTDOCS_USER) $(WEB_SERVER):$(HTDOCS_PATH)"
+ @ssh -t $(SSH_OPTS) $(WEB_SERVER) "sudo chown -R $(HTDOCS_USER):$(HTDOCS_USER) '$(HTDOCS_PATH)'"
+
+ @echo " CHMOD 750/640 $(WEB_SERVER):$(HTDOCS_PATH)"
+ @ssh -t $(SSH_OPTS) $(WEB_SERVER) "sudo find '$(HTDOCS_PATH)' -type f -exec chmod 640 {} \;; \
+ sudo find '$(HTDOCS_PATH)' -type d -exec chmod 750 {} \;;"
+
+ @echo " SSH $(WEB_SERVER)"
+ @ssh -O exit $(SSH_OPTS) $(WEB_SERVER)
diff --git a/web/bin/closure-compiler.jar b/web/bin/closure-compiler.jar
new file mode 100644
index 0000000..53037b0
Binary files /dev/null and b/web/bin/closure-compiler.jar differ
diff --git a/web/bin/yui-compressor.jar b/web/bin/yui-compressor.jar
new file mode 100644
index 0000000..bf39747
Binary files /dev/null and b/web/bin/yui-compressor.jar differ
diff --git a/web/css/.gitignore b/web/css/.gitignore
deleted file mode 100644
index 433b482..0000000
--- a/web/css/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*.min.css
diff --git a/web/css/.htaccess b/web/css/.htaccess
deleted file mode 100755
index 764e76c..0000000
--- a/web/css/.htaccess
+++ /dev/null
@@ -1,3 +0,0 @@
-
- deny from all
-
diff --git a/web/css/css-minify.sh b/web/css/css-minify.sh
deleted file mode 100755
index 37a60c1..0000000
--- a/web/css/css-minify.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/bash
-
-# minify all .css-files
-ls -1 *.css|grep -Ev "min.css$" | while read cssfile; do
- newfile="${cssfile%.*}.min.css"
- echo "$cssfile --> $newfile"
- curl -X POST -s --data-urlencode "input@$cssfile" http://cssminifier.com/raw > $newfile
-done
-
-# merge all into one single file
-rm -f styles.min.css
-cat *.min.css > styles.min.css
diff --git a/web/js/.gitignore b/web/js/.gitignore
deleted file mode 100644
index 121531a..0000000
--- a/web/js/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*.min.js
diff --git a/web/js/.htaccess b/web/js/.htaccess
deleted file mode 100755
index 2448b79..0000000
--- a/web/js/.htaccess
+++ /dev/null
@@ -1,3 +0,0 @@
-
- deny from all
-
diff --git a/web/js/js-minify.sh b/web/js/js-minify.sh
deleted file mode 100755
index 00faa9f..0000000
--- a/web/js/js-minify.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/bash
-
-# minify all .js-files
-ls -1 *.js|grep -Ev "min.js$" | while read jsfile; do
- newfile="${jsfile%.*}.min.js"
- echo "$jsfile --> $newfile"
- curl -X POST -s --data-urlencode "input@$jsfile" http://javascript-minifier.com/raw > $newfile
-done
-
-# merge all into one single file
-rm -f scripts.min.js
-cat *.min.js > scripts.min.js