incremental
diff --git a/scripts/build_web_assets.py b/scripts/build_web_assets.py
new file mode 100755
index 0000000..035a7da
--- /dev/null
+++ b/scripts/build_web_assets.py
@@ -0,0 +1,81 @@
+#! /usr/bin/python3
+
+import argparse
+import os
+import gzip
+import hashlib
+from subprocess import Popen, PIPE
+
+THIS_DIR = os.path.dirname(os.path.realpath(__file__))
+
+BEGIN_BUFFER = """
+
+
+#include <webassets.hpp>
+
+void crow::webassets::request_routes(crow::App<crow::TokenAuthorizationMiddleware>& app){
+"""
+
+MIDDLE_BUFFER = """
+    CROW_ROUTE(app, "{}")([](const crow::request& req, crow::response& res) {{
+        res.code = 200;
+        // TODO, if you have a browser from the dark ages that doesn't support gzip,
+        // unzip it before sending based on Accept-Encoding header
+        res.add_header("Content-Encoding", "gzip");
+
+        res.write({{{}}});
+        res.end();
+        
+    }});
+"""
+
+
+END_BUFFER = """
+
+"""
+
+def main():
+    """ Main Function """
+    file_list = []
+
+    parser = argparse.ArgumentParser()
+    parser.add_argument('-i', '--input', nargs='+', type=str)
+    parser.add_argument('-o', '--output', type=str)
+    args = parser.parse_args()
+
+    file_list = args.input
+
+    with open(args.output, 'w') as output_handle:
+
+        output_handle.write(BEGIN_BUFFER)
+
+        for full_filepath in file_list:
+
+            pathsplit = full_filepath.split(os.path.sep)
+            relative_path = os.path.sep.join(pathsplit[pathsplit.index("static") + 1:])
+            relative_path = "/" + relative_path
+            
+            # make sure none of the files are hidden
+            with open(full_filepath, 'rb') as input_file:
+                file_content = input_file.read()
+
+            print("Including {:<40} size {:>7}".format(relative_path, len(file_content)))
+
+            sha = hashlib.sha256()
+            sha.update(file_content)
+
+            sha_text = "".join("{:02x}".format(x) for x in sha.digest())
+
+            print(sha_text)
+            file_content = gzip.compress(file_content)
+            #file_content = file_content[:10]
+
+            array_binary_text = ', '.join('0x{:02x}'.format(x) for x in file_content)
+
+            output_handle.write(MIDDLE_BUFFER.format(relative_path, array_binary_text))
+
+        output_handle.write("};\n")
+        output_handle.write(END_BUFFER)
+
+if __name__ == "__main__":
+    main()
diff --git a/scripts/file_to_string_array.py b/scripts/file_to_string_array.py
deleted file mode 100644
index b81e854..0000000
--- a/scripts/file_to_string_array.py
+++ /dev/null
@@ -1,29 +0,0 @@
-# -*- coding: utf-8 -*-
-import os.path
-import string
-import sys
-
-
-def print_buf(counter, buf):
-    buf2 = [('%02x' % ord(i)) for i in buf]
-    print '{0}: {1:<39}  {2}'.format(('%07x' % (counter * 16)),
-        ' '.join([''.join(buf2[i:i + 2]) for i in range(0, len(buf2), 2)]),
-        ''.join([c if c in string.printable[:-5] else '.' for c in buf]))
-
-
-def process_xxd(file_path):
-    with open(file_path, 'r') as f:
-        counter = 0
-        while True:
-            buf = f.read(16)
-            if not buf:
-                break
-            print_buf(counter, buf)
-            counter += 1
-
-
-if __name__ == '__main__':
-    if not os.path.exists(sys.argv[1]):
-        print >> (sys.stderr, "The file doesn't exist.")
-        sys.exit(1)
-    process_xxd(sys.argv[1])
\ No newline at end of file