diff --git a/.gitignore b/.gitignore
index a92cb04ec7dac6c059e0ee192ba2d92c306e2298..1be7b79db84792e88eb385c94360f515c636620f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,4 +5,6 @@ builds
 **/.DS_Store
 *.orig
 *.cap
-
+*.db
+*.db-shm
+*.db-wal
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index a1e59eaf0d2568539e94ada92aafdad473d0a9bf..7c462e2c3409cc5482802b5d7faf0f57667f2e10 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,106 +1,120 @@
-stages:
-  - build
 
 variables:
-  BUILD_VERSION: '$CI_COMMIT_BRANCH-$CI_COMMIT_SHA'
-  OUTPUT_MSVC: 'win32-msvc-${CI_COMMIT_BRANCH}-${CI_COMMIT_SHA}'
-  OUTPUT_GNU: 'win32-gnu-${CI_COMMIT_BRANCH}-${CI_COMMIT_SHA}'
-  CARGO_HOME: $CI_PROJECT_DIR/.cargo
+  BUILD_VERSION: ${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHORT_SHA}
+  FULL_VERSION: ${CI_PROJECT_NAME}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHORT_SHA}
+  CARGO_HOME: ${CI_PROJECT_DIR}/.cargo_build
+  GIT_DEPTH: "20"
+  APT_CACHE: ${CI_PROJECT_DIR}/.apt_cache
 
 # Setup a cache to cache job parts between jobs to ensure faster builds
 cache:
-    key: "$CI_JOB_NAME"
+    key: "${CI_JOB_NAME}"
     #untracked: true
     paths:
+      - $CARGO_HOME/.crates.toml
+      - $CARGO_HOME/.crates2.json
       - $CARGO_HOME/bin/
       - $CARGO_HOME/registry/index/
       - $CARGO_HOME/registry/cache/
       - $CARGO_HOME/git/db/
+      - ${APT_CACHE}
+      - target
 
-latest-windows-msvc:
+before_script:
+  # Don't check this in enabled because it prints all of the values to the log and is accessible to anyone.
+  #- env
+  - mkdir -p ${APT_CACHE}
+
+stages:
+  - build
+
+latest-windows-cross-compile:
+  image: rust:latest
   stage: build
   tags:
     - linux
   script:
     - echo $CARGO_HOME
-    - apt-get update -qq && apt-get install -y -qq clang llvm
+    - apt-get update -qq && apt-get -o dir::cache::archives="${APT_CACHE}" install -y -qq clang llvm
     - rustup target add x86_64-pc-windows-msvc
     - cargo install cargo-xwin
-    - ./build_scripts/win32/build_resources.sh
-    - ./build_scripts/win32/build_executable_msvc.sh
-    - echo $CI_PROJECT_NAME-$BUILD_VERSION >> builds/win32/version.txt
-    - mkdir -p $OUTPUT_MSVC
-    - cp -rf builds/win32 $OUTPUT_MSVC
+    - cargo install sqlx-cli
+    - ./build_scripts/win64/build_all.sh
+    - echo ${FULL_VERSION} >> builds/win64/version.txt
+    - mkdir -p win64-${FULL_VERSION}
+    - cp -rf builds/win64 win64-${FULL_VERSION}
   artifacts:
-    name: $OUTPUT_MSVC
+    name: win64-${FULL_VERSION}
     expire_in: never
     paths:
-      - $OUTPUT_MSVC
+      - win64-${FULL_VERSION}
 
 latest-macos-arm64:
-  stage: build
   image: rust:latest
+  stage: build
   tags:
     - macos
   script:
+    - cargo install sqlx-cli
     - ./build_scripts/macos/build_resources.sh
     - ./build_scripts/macos/build_executable_arm64.sh
     - ./build_scripts/macos/sign_and_notarize.sh
-    - mkdir $CI_PROJECT_NAME-$BUILD_VERSION-macos
-    - echo $CI_PROJECT_NAME-$BUILD_VERSION >> ./builds/macos/dist/version.txt
-    - cp -rf ./builds/macos/dist $CI_PROJECT_NAME-$BUILD_VERSION-macos
+    - echo ${FULL_VERSION} >> ./builds/macos/version.txt
+    - mkdir -p macos-${FULL_VERSION}
+    - ditto -c -k --keepParent ./builds/macos/ macos-${FULL_VERSION}/VulkanApp.zip
   artifacts:
-    name: ${CI_PROJECT_NAME}-${BUILD_VERSION}-macos
+    name: macos-${FULL_VERSION}
     expire_in: never
     paths:
-      - ${CI_PROJECT_NAME}-${BUILD_VERSION}-macos
+      - macos-${FULL_VERSION}
 
 latest-macos-x86-64:
-  stage: build
   image: rust:latest
+  stage: build
   tags:
     - macos
   script:
+    - cargo install sqlx-cli
     - ./build_scripts/macos/build_resources.sh
     - ./build_scripts/macos/build_executable_x86_64.sh
     - ./build_scripts/macos/sign_and_notarize.sh
-    - mkdir -p $CI_PROJECT_NAME-$BUILD_VERSION-macos
-    - echo $CI_PROJECT_NAME-$BUILD_VERSION >> ./builds/macos/dist/version.txt
-    - cp -rf ./builds/macos/dist $CI_PROJECT_NAME-$BUILD_VERSION-macos
+    - echo ${FULL_VERSION} >> ./builds/macos/version.txt
+    - mkdir -p macos-${FULL_VERSION}
+    - ditto -c -k --keepParent ./builds/macos/ macos-${FULL_VERSION}/VulkanApp.zip
   artifacts:
-    name: ${CI_PROJECT_NAME}-${BUILD_VERSION}-macos
+    name: macos-${FULL_VERSION}
     expire_in: never
     paths:
-      - ${CI_PROJECT_NAME}-${BUILD_VERSION}-macos
+      - macos-${FULL_VERSION}
 
 latest-linux:
-  stage: build
   image: rust:latest
+  stage: build
   tags:
     - linux
   script:
+    - cargo install sqlx-cli
     - ./build_scripts/linux/build_all.sh
-    - echo $CI_PROJECT_NAME-$BUILD_VERSION >> builds/linux/version.txt
-    - mkdir -p $CI_PROJECT_NAME-$BUILD_VERSION-linux
-    - cp -rf builds/linux $CI_PROJECT_NAME-$BUILD_VERSION-linux
+    - echo "${FULL_VERSION}" >> builds/linux/version.txt
+    - mkdir -p linux-${FULL_VERSION}
+    - cp -rf builds/linux linux-${FULL_VERSION}
   artifacts:
-    name: ${CI_PROJECT_NAME}-${BUILD_VERSION}-linux
+    name: linux-${FULL_VERSION}
     expire_in: never
     paths:
-      - ${CI_PROJECT_NAME}-${BUILD_VERSION}-linux
+      - linux-${FULL_VERSION}
 
-rust-nightly-windows-msvc:
+rust-nightly-windows-cross-compile:
   stage: build
   image: rustlang/rust:nightly
   tags:
     - linux
   script:
-    - echo $CARGO_HOME
-    - apt-get update -qq && apt-get install -y -qq clang llvm
+    - apt-get update -qq && apt-get -o dir::cache::archives="${APT_CACHE}" install -y -qq clang llvm
     - rustup target add x86_64-pc-windows-msvc
     - cargo install cargo-xwin
-    - ./build_scripts/win32/build_resources.sh
-    - ./build_scripts/win32/build_executable_msvc.sh
+    - cargo install sqlx-cli
+    - ./build_scripts/win64/build_all.sh
   allow_failure: true
 
 rust-nightly-linux:
@@ -109,6 +123,7 @@ rust-nightly-linux:
   tags:
     - linux
   script:
+    - cargo install sqlx-cli
     - ./build_scripts/linux/build_all.sh
   allow_failure: true
 
@@ -118,6 +133,7 @@ rust-nightly-macos:
   tags:
     - macos
   script:
+    - cargo install sqlx-cli
     - ./build_scripts/macos/build_all.sh
   allow_failure: true
 
diff --git a/Cargo.lock b/Cargo.lock
index 2322f4642e9e375634ad7dfb30548de7add54dc4..762ac8c3074dec00bea71a2e76794645587f7ebc 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -26,6 +26,17 @@ version = "0.3.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e8fd72866655d1904d6b0997d0b07ba561047d070fbe29de039031c641b61217"
 
+[[package]]
+name = "ahash"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
+dependencies = [
+ "getrandom",
+ "once_cell",
+ "version_check",
+]
+
 [[package]]
 name = "aho-corasick"
 version = "0.7.18"
@@ -77,6 +88,26 @@ dependencies = [
  "raw-window-metal",
 ]
 
+[[package]]
+name = "async-trait"
+version = "0.1.53"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed6aa3524a2dfcf9fe180c51eae2b58738348d819517ceadf95789c51fff7600"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "atoi"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "616896e05fc0e2649463a93a15183c6a16bf03413a7af88ef1285ddedfa9cda5"
+dependencies = [
+ "num-traits",
+]
+
 [[package]]
 name = "atty"
 version = "0.2.14"
@@ -94,6 +125,50 @@ version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
 
+[[package]]
+name = "axum"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c9f346c92c1e9a71d14fe4aaf7c2a5d9932cc4e5e48d8fb6641524416eb79ddd"
+dependencies = [
+ "async-trait",
+ "axum-core",
+ "bitflags",
+ "bytes",
+ "futures-util",
+ "http",
+ "http-body",
+ "hyper",
+ "matchit",
+ "memchr",
+ "mime",
+ "percent-encoding",
+ "pin-project-lite",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "sync_wrapper",
+ "tokio",
+ "tower",
+ "tower-http",
+ "tower-layer",
+ "tower-service",
+]
+
+[[package]]
+name = "axum-core"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6dbcda393bef9c87572779cb8ef916f12d77750b27535dd6819fa86591627a51"
+dependencies = [
+ "async-trait",
+ "bytes",
+ "futures-util",
+ "http",
+ "http-body",
+ "mime",
+]
+
 [[package]]
 name = "bit_field"
 version = "0.10.1"
@@ -112,6 +187,15 @@ version = "0.1.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
 
+[[package]]
+name = "block-buffer"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324"
+dependencies = [
+ "generic-array",
+]
+
 [[package]]
 name = "bstr"
 version = "0.2.17"
@@ -142,6 +226,12 @@ version = "1.4.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
 
+[[package]]
+name = "bytes"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8"
+
 [[package]]
 name = "calloop"
 version = "0.6.5"
@@ -186,6 +276,20 @@ version = "1.0.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "75476fe966a8af7c0ceae2a3e514afa87d4451741fcdfab8bfaa07ad301842ec"
 
+[[package]]
+name = "chrono"
+version = "0.4.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73"
+dependencies = [
+ "libc",
+ "num-integer",
+ "num-traits",
+ "serde",
+ "time",
+ "winapi",
+]
+
 [[package]]
 name = "cocoa"
 version = "0.24.0"
@@ -223,6 +327,18 @@ version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
 
+[[package]]
+name = "common"
+version = "0.1.0"
+dependencies = [
+ "chrono",
+ "rand",
+ "serde",
+ "serde_json",
+ "sqlx",
+ "uuid 1.1.0",
+]
+
 [[package]]
 name = "core-foundation"
 version = "0.7.0"
@@ -305,6 +421,30 @@ dependencies = [
  "objc",
 ]
 
+[[package]]
+name = "cpufeatures"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "crc"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49fc9a695bca7f35f5f4c15cddc84415f66a74ea78eef08e90c5024f2b540e23"
+dependencies = [
+ "crc-catalog",
+]
+
+[[package]]
+name = "crc-catalog"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403"
+
 [[package]]
 name = "crc32fast"
 version = "1.3.2"
@@ -383,6 +523,16 @@ dependencies = [
  "lazy_static",
 ]
 
+[[package]]
+name = "crypto-common"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8"
+dependencies = [
+ "generic-array",
+ "typenum",
+]
+
 [[package]]
 name = "csv"
 version = "1.1.6"
@@ -464,6 +614,16 @@ dependencies = [
  "adler32",
 ]
 
+[[package]]
+name = "digest"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506"
+dependencies = [
+ "block-buffer",
+ "crypto-common",
+]
+
 [[package]]
 name = "dirs"
 version = "4.0.0"
@@ -508,6 +668,12 @@ dependencies = [
  "libloading 0.7.3",
 ]
 
+[[package]]
+name = "dotenv"
+version = "0.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f"
+
 [[package]]
 name = "downcast-rs"
 version = "1.2.0"
@@ -533,6 +699,12 @@ dependencies = [
  "termcolor",
 ]
 
+[[package]]
+name = "event-listener"
+version = "2.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71"
+
 [[package]]
 name = "exr"
 version = "1.4.2"
@@ -550,14 +722,33 @@ dependencies = [
 ]
 
 [[package]]
-name = "flate2"
-version = "1.0.23"
+name = "fastrand"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf"
+dependencies = [
+ "instant",
+]
+
+[[package]]
+name = "filetime"
+version = "0.2.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b39522e96686d38f4bc984b9198e3a0613264abaebaff2c5c918bfa6b6da09af"
+checksum = "c0408e2626025178a6a7f7ffc05a25bc47103229f19c113755de7bf63816290c"
 dependencies = [
  "cfg-if 1.0.0",
- "crc32fast",
  "libc",
+ "redox_syscall",
+ "winapi",
+]
+
+[[package]]
+name = "flate2"
+version = "1.0.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6"
+dependencies = [
+ "crc32fast",
  "miniz_oxide",
 ]
 
@@ -586,7 +777,7 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3203e88e086474e56b0785255804a0c23542f76253584d3f43152cd2bb95d0b7"
 dependencies = [
- "hashbrown",
+ "hashbrown 0.8.2",
  "ttf-parser 0.8.3",
 ]
 
@@ -605,18 +796,90 @@ version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
 
+[[package]]
+name = "form_urlencoded"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191"
+dependencies = [
+ "matches",
+ "percent-encoding",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+]
+
 [[package]]
 name = "futures-core"
 version = "0.3.21"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3"
 
+[[package]]
+name = "futures-executor"
+version = "0.3.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-intrusive"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62007592ac46aa7c2b6416f7deb9a8a8f63a01e0f1d6e1787d5630170db2b63e"
+dependencies = [
+ "futures-core",
+ "lock_api",
+ "parking_lot 0.11.2",
+]
+
 [[package]]
 name = "futures-sink"
 version = "0.3.21"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868"
 
+[[package]]
+name = "futures-task"
+version = "0.3.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a"
+
+[[package]]
+name = "futures-util"
+version = "0.3.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+ "futures-task",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.14.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
 [[package]]
 name = "getrandom"
 version = "0.2.6"
@@ -626,7 +889,7 @@ dependencies = [
  "cfg-if 1.0.0",
  "js-sys",
  "libc",
- "wasi",
+ "wasi 0.10.0+wasi-snapshot-preview1",
  "wasm-bindgen",
 ]
 
@@ -652,10 +915,37 @@ version = "0.8.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e91b62f79061a0bc2e046024cb7ba44b08419ed238ecbd9adbd787434b9e8c25"
 dependencies = [
- "ahash",
+ "ahash 0.3.8",
  "autocfg",
 ]
 
+[[package]]
+name = "hashbrown"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
+dependencies = [
+ "ahash 0.7.6",
+]
+
+[[package]]
+name = "hashlink"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf"
+dependencies = [
+ "hashbrown 0.11.2",
+]
+
+[[package]]
+name = "heck"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9"
+dependencies = [
+ "unicode-segmentation",
+]
+
 [[package]]
 name = "hermit-abi"
 version = "0.1.19"
@@ -665,18 +955,107 @@ dependencies = [
  "libc",
 ]
 
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+
+[[package]]
+name = "home"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2456aef2e6b6a9784192ae780c0f15bc57df0e918585282325e8c8ac27737654"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "http"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff8670570af52249509a86f5e3e18a08c60b177071826898fde8997cf5f6bfbb"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa 1.0.2",
+]
+
+[[package]]
+name = "http-body"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
+dependencies = [
+ "bytes",
+ "http",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "http-range-header"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29"
+
+[[package]]
+name = "httparse"
+version = "1.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c"
+
+[[package]]
+name = "httpdate"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421"
+
 [[package]]
 name = "humantime"
 version = "2.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
 
+[[package]]
+name = "hyper"
+version = "0.14.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42dc3c131584288d375f2d07f822b0cb012d8c6fb899a5b9fdb3cb7eb9b6004f"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-core",
+ "futures-util",
+ "http",
+ "http-body",
+ "httparse",
+ "httpdate",
+ "itoa 1.0.2",
+ "pin-project-lite",
+ "socket2",
+ "tokio",
+ "tower-service",
+ "tracing",
+ "want",
+]
+
 [[package]]
 name = "ident_case"
 version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
 
+[[package]]
+name = "idna"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8"
+dependencies = [
+ "matches",
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
 [[package]]
 name = "image"
 version = "0.24.2"
@@ -705,7 +1084,7 @@ checksum = "e6a33933d4645d6db1bfa55ff75e13ef301644d4c001cfaec6fe3afcfb05b82c"
 dependencies = [
  "bitflags",
  "imgui-sys",
- "parking_lot",
+ "parking_lot 0.11.2",
 ]
 
 [[package]]
@@ -728,6 +1107,16 @@ dependencies = [
  "winit",
 ]
 
+[[package]]
+name = "indexmap"
+version = "1.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6012d540c5baa3589337a98ce73408de9b5a25ec9fc2c6fd6be8f0d39e0ca5a"
+dependencies = [
+ "autocfg",
+ "hashbrown 0.11.2",
+]
+
 [[package]]
 name = "inflate"
 version = "0.4.5"
@@ -746,6 +1135,15 @@ dependencies = [
  "cfg-if 1.0.0",
 ]
 
+[[package]]
+name = "itertools"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3"
+dependencies = [
+ "either",
+]
+
 [[package]]
 name = "itoa"
 version = "0.4.8"
@@ -754,9 +1152,15 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
 
 [[package]]
 name = "itoa"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d"
+
+[[package]]
+name = "itoap"
 version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35"
+checksum = "9028f49264629065d057f340a86acb84867925865f73bbf8d47b4d149a7e88b8"
 
 [[package]]
 name = "jni-sys"
@@ -796,9 +1200,9 @@ checksum = "7efd1d698db0759e6ef11a7cd44407407399a910c774dd804c64c032da7826ff"
 
 [[package]]
 name = "libc"
-version = "0.2.125"
+version = "0.2.126"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b"
+checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836"
 
 [[package]]
 name = "libloading"
@@ -820,6 +1224,17 @@ dependencies = [
  "winapi",
 ]
 
+[[package]]
+name = "libsqlite3-sys"
+version = "0.24.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "898745e570c7d0453cc1fbc4a701eb6c662ed54e8fec8b7d14be137ebeeb9d14"
+dependencies = [
+ "cc",
+ "pkg-config",
+ "vcpkg",
+]
+
 [[package]]
 name = "lock_api"
 version = "0.4.7"
@@ -855,7 +1270,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f"
 
 [[package]]
-name = "memchr"
+name = "matchit"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9376a4f0340565ad675d11fc1419227faf5f60cd7ac9cb2e7185a471f30af833"
+
+[[package]]
+name = "memchr"
 version = "2.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
@@ -878,6 +1299,12 @@ dependencies = [
  "autocfg",
 ]
 
+[[package]]
+name = "mime"
+version = "0.3.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
+
 [[package]]
 name = "minimal-lexical"
 version = "0.2.1"
@@ -906,6 +1333,18 @@ dependencies = [
  "winapi",
 ]
 
+[[package]]
+name = "mio"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "713d550d9b44d89174e066b7a6217ae06234c10cb47819a88290d2b353c31799"
+dependencies = [
+ "libc",
+ "log",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+ "windows-sys",
+]
+
 [[package]]
 name = "mio-misc"
 version = "1.2.2"
@@ -915,7 +1354,7 @@ dependencies = [
  "crossbeam",
  "crossbeam-queue",
  "log",
- "mio",
+ "mio 0.7.14",
 ]
 
 [[package]]
@@ -936,6 +1375,24 @@ dependencies = [
  "getrandom",
 ]
 
+[[package]]
+name = "native-tls"
+version = "0.2.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9"
+dependencies = [
+ "lazy_static",
+ "libc",
+ "log",
+ "openssl",
+ "openssl-probe",
+ "openssl-sys",
+ "schannel",
+ "security-framework",
+ "security-framework-sys",
+ "tempfile",
+]
+
 [[package]]
 name = "ndk"
 version = "0.3.0"
@@ -1107,9 +1564,54 @@ dependencies = [
 
 [[package]]
 name = "once_cell"
-version = "1.10.0"
+version = "1.12.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9"
+checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225"
+
+[[package]]
+name = "openssl"
+version = "0.10.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb81a6430ac911acb25fe5ac8f1d2af1b4ea8a4fdfda0f1ee4292af2e2d8eb0e"
+dependencies = [
+ "bitflags",
+ "cfg-if 1.0.0",
+ "foreign-types",
+ "libc",
+ "once_cell",
+ "openssl-macros",
+ "openssl-sys",
+]
+
+[[package]]
+name = "openssl-macros"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "openssl-probe"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
+
+[[package]]
+name = "openssl-sys"
+version = "0.9.73"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d5fd19fb3e0a8191c1e34935718976a3e70c112ab9a24af6d7cadccd9d90bc0"
+dependencies = [
+ "autocfg",
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
+]
 
 [[package]]
 name = "owned_ttf_parser"
@@ -1128,7 +1630,17 @@ checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
 dependencies = [
  "instant",
  "lock_api",
- "parking_lot_core",
+ "parking_lot_core 0.8.5",
+]
+
+[[package]]
+name = "parking_lot"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58"
+dependencies = [
+ "lock_api",
+ "parking_lot_core 0.9.3",
 ]
 
 [[package]]
@@ -1145,6 +1657,25 @@ dependencies = [
  "winapi",
 ]
 
+[[package]]
+name = "parking_lot_core"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929"
+dependencies = [
+ "cfg-if 1.0.0",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-sys",
+]
+
+[[package]]
+name = "paste"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c520e05135d6e763148b6426a837e239041653ba7becd2e538c076c738025fc"
+
 [[package]]
 name = "percent-encoding"
 version = "2.1.0"
@@ -1171,6 +1702,18 @@ dependencies = [
  "syn",
 ]
 
+[[package]]
+name = "pin-project-lite"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
 [[package]]
 name = "pkg-config"
 version = "0.3.25"
@@ -1189,6 +1732,12 @@ dependencies = [
  "miniz_oxide",
 ]
 
+[[package]]
+name = "ppv-lite86"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872"
+
 [[package]]
 name = "proc-macro-crate"
 version = "0.1.5"
@@ -1210,9 +1759,9 @@ dependencies = [
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.38"
+version = "1.0.36"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9027b48e9d4c9175fa2218adf3557f91c1137021739951d4932f5f8268ac48aa"
+checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029"
 dependencies = [
  "unicode-xid",
 ]
@@ -1226,6 +1775,36 @@ dependencies = [
  "proc-macro2",
 ]
 
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7"
+dependencies = [
+ "getrandom",
+]
+
 [[package]]
 name = "raw-window-handle"
 version = "0.3.4"
@@ -1303,9 +1882,9 @@ dependencies = [
 
 [[package]]
 name = "regex"
-version = "1.5.5"
+version = "1.5.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286"
+checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1"
 dependencies = [
  "aho-corasick",
  "memchr",
@@ -1320,9 +1899,18 @@ checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
 
 [[package]]
 name = "regex-syntax"
-version = "0.6.25"
+version = "0.6.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b"
+checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64"
+
+[[package]]
+name = "remove_dir_all"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
+dependencies = [
+ "winapi",
+]
 
 [[package]]
 name = "rusttype"
@@ -1336,9 +1924,47 @@ dependencies = [
 
 [[package]]
 name = "ryu"
-version = "1.0.9"
+version = "1.0.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695"
+
+[[package]]
+name = "sailfish"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "948a7edfc2f03d7c58a097dda25ed29440a72e8528894a6e182fe9171195fed1"
+dependencies = [
+ "itoap",
+ "ryu",
+ "sailfish-macros",
+ "version_check",
+]
+
+[[package]]
+name = "sailfish-compiler"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f0a01133d6ce146020e6416ac6a823f813f1cbb30ff77548b4fa20749524947"
+dependencies = [
+ "filetime",
+ "home",
+ "memchr",
+ "proc-macro2",
+ "quote",
+ "serde",
+ "syn",
+ "toml",
+]
+
+[[package]]
+name = "sailfish-macros"
+version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f"
+checksum = "86326c1f1dce0b316e0a47071f683b185417dc64e1a704380b5c706b09e871b1"
+dependencies = [
+ "proc-macro2",
+ "sailfish-compiler",
+]
 
 [[package]]
 name = "same-file"
@@ -1349,6 +1975,16 @@ dependencies = [
  "winapi-util",
 ]
 
+[[package]]
+name = "schannel"
+version = "0.1.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2"
+dependencies = [
+ "lazy_static",
+ "windows-sys",
+]
+
 [[package]]
 name = "scoped-tls"
 version = "1.0.0"
@@ -1367,6 +2003,29 @@ version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
 
+[[package]]
+name = "security-framework"
+version = "2.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc"
+dependencies = [
+ "bitflags",
+ "core-foundation 0.9.3",
+ "core-foundation-sys 0.8.3",
+ "libc",
+ "security-framework-sys",
+]
+
+[[package]]
+name = "security-framework-sys"
+version = "2.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556"
+dependencies = [
+ "core-foundation-sys 0.8.3",
+ "libc",
+]
+
 [[package]]
 name = "serde"
 version = "1.0.137"
@@ -1393,11 +2052,49 @@ version = "1.0.81"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c"
 dependencies = [
- "itoa 1.0.1",
+ "itoa 1.0.2",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_urlencoded"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
+dependencies = [
+ "form_urlencoded",
+ "itoa 1.0.2",
  "ryu",
  "serde",
 ]
 
+[[package]]
+name = "sha2"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676"
+dependencies = [
+ "cfg-if 1.0.0",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "slab"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32"
+
 [[package]]
 name = "smallvec"
 version = "1.8.0"
@@ -1423,6 +2120,16 @@ dependencies = [
  "wayland-protocols",
 ]
 
+[[package]]
+name = "socket2"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
 [[package]]
 name = "spin"
 version = "0.9.3"
@@ -1432,6 +2139,112 @@ dependencies = [
  "lock_api",
 ]
 
+[[package]]
+name = "sqlformat"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4b7922be017ee70900be125523f38bdd644f4f06a1b16e8fa5a8ee8c34bffd4"
+dependencies = [
+ "itertools",
+ "nom",
+ "unicode_categories",
+]
+
+[[package]]
+name = "sqlx"
+version = "0.5.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "551873805652ba0d912fec5bbb0f8b4cdd96baf8e2ebf5970e5671092966019b"
+dependencies = [
+ "sqlx-core",
+ "sqlx-macros",
+]
+
+[[package]]
+name = "sqlx-core"
+version = "0.5.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e48c61941ccf5ddcada342cd59e3e5173b007c509e1e8e990dafc830294d9dc5"
+dependencies = [
+ "ahash 0.7.6",
+ "atoi",
+ "bitflags",
+ "byteorder",
+ "bytes",
+ "chrono",
+ "crc",
+ "crossbeam-queue",
+ "either",
+ "event-listener",
+ "flume",
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-intrusive",
+ "futures-util",
+ "hashlink",
+ "hex",
+ "indexmap",
+ "itoa 1.0.2",
+ "libc",
+ "libsqlite3-sys",
+ "log",
+ "memchr",
+ "once_cell",
+ "paste",
+ "percent-encoding",
+ "sha2",
+ "smallvec",
+ "sqlformat",
+ "sqlx-rt",
+ "stringprep",
+ "thiserror",
+ "tokio-stream",
+ "url",
+ "uuid 0.8.2",
+]
+
+[[package]]
+name = "sqlx-macros"
+version = "0.5.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc0fba2b0cae21fc00fe6046f8baa4c7fcb49e379f0f592b04696607f69ed2e1"
+dependencies = [
+ "dotenv",
+ "either",
+ "heck",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "sha2",
+ "sqlx-core",
+ "sqlx-rt",
+ "syn",
+ "url",
+]
+
+[[package]]
+name = "sqlx-rt"
+version = "0.5.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4db708cd3e459078f85f39f96a00960bd841f66ee2a669e90bf36907f5a79aae"
+dependencies = [
+ "native-tls",
+ "once_cell",
+ "tokio",
+ "tokio-native-tls",
+]
+
+[[package]]
+name = "stringprep"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1"
+dependencies = [
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
 [[package]]
 name = "strsim"
 version = "0.9.3"
@@ -1449,6 +2262,26 @@ dependencies = [
  "unicode-xid",
 ]
 
+[[package]]
+name = "sync_wrapper"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "20518fe4a4c9acf048008599e464deb21beeae3d3578418951a189c235a7a9a8"
+
+[[package]]
+name = "tempfile"
+version = "3.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4"
+dependencies = [
+ "cfg-if 1.0.0",
+ "fastrand",
+ "libc",
+ "redox_syscall",
+ "remove_dir_all",
+ "winapi",
+]
+
 [[package]]
 name = "termcolor"
 version = "1.1.3"
@@ -1498,6 +2331,97 @@ dependencies = [
  "weezl",
 ]
 
+[[package]]
+name = "time"
+version = "0.1.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255"
+dependencies = [
+ "libc",
+ "wasi 0.10.0+wasi-snapshot-preview1",
+ "winapi",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
+
+[[package]]
+name = "tokio"
+version = "1.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4903bf0427cf68dddd5aa6a93220756f8be0c34fcfa9f5e6191e103e15a31395"
+dependencies = [
+ "bytes",
+ "libc",
+ "memchr",
+ "mio 0.8.3",
+ "num_cpus",
+ "once_cell",
+ "parking_lot 0.12.0",
+ "pin-project-lite",
+ "signal-hook-registry",
+ "socket2",
+ "tokio-macros",
+ "winapi",
+]
+
+[[package]]
+name = "tokio-macros"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "tokio-native-tls"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b"
+dependencies = [
+ "native-tls",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-stream"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3"
+dependencies = [
+ "futures-core",
+ "pin-project-lite",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-util"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f988a1a1adc2fb21f9c12aa96441da33a1728193ae0b95d2be22dbd17fcb4e5c"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "pin-project-lite",
+ "tokio",
+]
+
 [[package]]
 name = "toml"
 version = "0.5.9"
@@ -1507,6 +2431,81 @@ dependencies = [
  "serde",
 ]
 
+[[package]]
+name = "tower"
+version = "0.4.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a89fd63ad6adf737582df5db40d286574513c69a11dac5214dc3b5603d6713e"
+dependencies = [
+ "futures-core",
+ "futures-util",
+ "pin-project",
+ "pin-project-lite",
+ "tokio",
+ "tokio-util",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "tower-http"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aba3f3efabf7fb41fae8534fc20a817013dd1c12cb45441efb6c82e6556b4cd8"
+dependencies = [
+ "bitflags",
+ "bytes",
+ "futures-core",
+ "futures-util",
+ "http",
+ "http-body",
+ "http-range-header",
+ "pin-project-lite",
+ "tower",
+ "tower-layer",
+ "tower-service",
+]
+
+[[package]]
+name = "tower-layer"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "343bc9466d3fe6b0f960ef45960509f84480bf4fd96f92901afe7ff3df9d3a62"
+
+[[package]]
+name = "tower-service"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6"
+
+[[package]]
+name = "tracing"
+version = "0.1.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d0ecdcb44a79f0fe9844f0c4f33a342cbcbb5117de8001e6ba0dc2351327d09"
+dependencies = [
+ "cfg-if 1.0.0",
+ "log",
+ "pin-project-lite",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f54c8ca710e81886d498c2fd3331b56c93aa248d49de2222ad2742247c60072f"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "try-lock"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642"
+
 [[package]]
 name = "ttf-parser"
 version = "0.6.2"
@@ -1519,12 +2518,85 @@ version = "0.8.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7622061403fd00f0820df288e5a580e87d3ce15a1c4313c59fd1ffb77129903f"
 
+[[package]]
+name = "typenum"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987"
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992"
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unicode-segmentation"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99"
+
 [[package]]
 name = "unicode-xid"
 version = "0.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04"
 
+[[package]]
+name = "unicode_categories"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e"
+
+[[package]]
+name = "url"
+version = "2.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "matches",
+ "percent-encoding",
+]
+
+[[package]]
+name = "uuid"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
+
+[[package]]
+name = "uuid"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93bbc61e655a4833cf400d0d15bf3649313422fa7572886ad6dab16d79886365"
+dependencies = [
+ "getrandom",
+ "serde",
+]
+
+[[package]]
+name = "vcpkg"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
 [[package]]
 name = "vulkan_app"
 version = "0.1.0"
@@ -1532,6 +2604,7 @@ dependencies = [
  "ash",
  "ash-window",
  "cgmath",
+ "common",
  "core-foundation 0.9.3",
  "csv",
  "data-url",
@@ -1559,11 +2632,27 @@ dependencies = [
  "winapi-util",
 ]
 
+[[package]]
+name = "want"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0"
+dependencies = [
+ "log",
+ "try-lock",
+]
+
+[[package]]
+name = "wasi"
+version = "0.10.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
+
 [[package]]
 name = "wasi"
-version = "0.10.2+wasi-snapshot-preview1"
+version = "0.11.0+wasi-snapshot-preview1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
 
 [[package]]
 name = "wasm-bindgen"
@@ -1692,6 +2781,23 @@ dependencies = [
  "pkg-config",
 ]
 
+[[package]]
+name = "web_server"
+version = "0.1.0"
+dependencies = [
+ "axum",
+ "chrono",
+ "common",
+ "dotenv",
+ "rand",
+ "sailfish",
+ "serde",
+ "serde_json",
+ "sqlx",
+ "tokio",
+ "uuid 1.1.0",
+]
+
 [[package]]
 name = "weezl"
 version = "0.1.6"
@@ -1729,6 +2835,49 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 
+[[package]]
+name = "windows-sys"
+version = "0.36.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2"
+dependencies = [
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.36.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.36.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.36.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.36.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.36.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680"
+
 [[package]]
 name = "winit"
 version = "0.25.0"
@@ -1745,13 +2894,13 @@ dependencies = [
  "lazy_static",
  "libc",
  "log",
- "mio",
+ "mio 0.7.14",
  "mio-misc",
  "ndk",
  "ndk-glue",
  "ndk-sys",
  "objc",
- "parking_lot",
+ "parking_lot 0.11.2",
  "percent-encoding",
  "raw-window-handle 0.3.4",
  "scopeguard",
diff --git a/Cargo.toml b/Cargo.toml
index 53c78e5b7c4791cfb5164d7729dd8395d9b3e802..14161d7764872702156ad42b3e60801f083b0589 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,43 +1,10 @@
-[package]
-name = "vulkan_app"
-version = "0.1.0"
-authors = ["Scott Johnson <zeropointtwo@gmail.com>"]
-edition = "2018"
-description = "An in progress game"
+[workspace]
 
-# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
-#[profile.release]
-#debug = false
-
-[dependencies]
-log         = "0.4.17"
-env_logger  = "0.9.0"
-winit       = "0.25.0"
-ash         = "0.37.0"
-ash-window  = "0.10.0"
-image       = "0.24.2"
-cgmath      = "0.18.0"
-rayon       = "1.5.2"
-
-# Fonts
-fontdue     = "0.4.0"
-csv         = "1.1.6"
-serde       = { version = "1.0.137", features = ["derive"]}
-serde_json  = "1.0.81"
-toml        = "0.5.9"
-
-# IMGui
-imgui               = "0.8.2"
-imgui-winit-support = "0.8.2"
-
-data-url    = "0.1.1"
-
-[target.'cfg(target_os="macos")'.dependencies]
-core-foundation = "0.9.3"
-
-[target.'cfg(target_os="windows")'.dependencies]
-#winapi      = "0.3.9"
+members = [
+  "common",
+  "game",
+  "web_server",
+]
 
 [profile.dev.package."*"]
 opt-level = 3
-
diff --git a/build_all.bat b/build_all.bat
deleted file mode 100755
index 07080940cd75c3f3050219b8e37f7dda4732e05e..0000000000000000000000000000000000000000
--- a/build_all.bat
+++ /dev/null
@@ -1,10 +0,0 @@
-@echo off
-
-set script_path_trailing_slash=%~dp0
-set script_path=%script_path_trailing_slash:~0,-1%
-
-echo %script_path%
-cd %script_path%
-
-call build_scripts\win32\build_all.bat
-
diff --git a/build_all.sh b/build_all.sh
deleted file mode 100755
index f7c47bf2814e6ee922850b0e3d76ae239c16bd89..0000000000000000000000000000000000000000
--- a/build_all.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-
-#!/usr/bin/env bash
-cd "$(dirname "$0")"
-
-echo Compiling resources...
-./build_scripts/linux/build_resources.sh
-./build_scripts/win32/build_resources.sh
-
-echo Compiling Linux executable...
-./build_scripts/linux/build_executable.sh
-./build_scripts/win32/build_executable.sh
-
-echo Done
-
diff --git a/build_scripts/linux/build_executable.sh b/build_scripts/linux/build_executable.sh
index 15592054b6e207f4183824050e7332e467fcb12b..14e509773aafde866ea0aaf5bd08418a6b101119 100755
--- a/build_scripts/linux/build_executable.sh
+++ b/build_scripts/linux/build_executable.sh
@@ -5,15 +5,32 @@ cd "$(dirname "$0")"
 
 export PLATFORM=linux
 
-BIN_DIR=../../builds/${PLATFORM}
-TARGET_DIR=../../target/release
+BIN_DIR=../../builds/${PLATFORM}/game
+TARGET_TYPE=x86_64-unknown-linux-gnu
+TARGET_DIR=../../target/${TARGET_TYPE}/release
 EXE_NAME=vulkan_app
 
+DB_NAME=test.db
+DB_DIR=../../web_server/data
+DB_URL_BUILD_SCRIPTS=sqlite://${DB_DIR}/${DB_NAME}
+DB_URL_WORKSPACE=sqlite://web_server/data/${DB_NAME}
+MIGRATIONS_SRC=../../web_server/migrations
+WEB_SERVER_EXE_NAME=web_server
+WEB_SERVER_DST=../../builds/${PLATFORM}/web_server
+
 # Make sure target directories exist
 mkdir -p ${BIN_DIR}
+mkdir -p ${DB_DIR}
 
 echo Building ${PLATFORM}...
-cargo build --release -vv
 
-cp ${TARGET_DIR}/${EXE_NAME} ${BIN_DIR}
+# This command has to reference the db url and migrations relative to the build script directory
+cargo sqlx database setup --database-url ${DB_URL_BUILD_SCRIPTS} --source ${MIGRATIONS_SRC}
+
+# This command has to be run relative to the root of the whole workspace :/
+export DATABASE_URL=${DB_URL_WORKSPACE}
 
+cargo build --release --target ${TARGET_TYPE}
+
+cp ${TARGET_DIR}/${EXE_NAME} ${BIN_DIR}
+cp ${TARGET_DIR}/${WEB_SERVER_EXE_NAME} ${WEB_SERVER_DST}
diff --git a/build_scripts/linux/build_resources.sh b/build_scripts/linux/build_resources.sh
index 3f80adffd8e6258359f294d0955e2b660a21d3e3..9e5f8e4c542c2d7e2cae8b11abec83a9d6fd2288 100755
--- a/build_scripts/linux/build_resources.sh
+++ b/build_scripts/linux/build_resources.sh
@@ -4,19 +4,30 @@ set -e
 cd "$(dirname "$0")"
 
 PLATFORM=linux
-BIN_DIR=../../builds/${PLATFORM}
-RESOURCES_DIR=../../resources
-TOOLS_DIR=../../tools
-SHADER_COMPILER=${TOOLS_DIR}/${PLATFORM}/glslangValidator/bin/glslangValidator
+BIN_DIR=../../builds/${PLATFORM}/game
+RESOURCES_DIR=../../game/resources
+EXTERNALS_DIR=../../external/${PLATFORM}
+SHADER_COMPILER=${EXTERNALS_DIR}/glslangValidator/bin/glslangValidator
 SHADER_SRC_DIR=${RESOURCES_DIR}/shaders
 SHADER_DST_DIR=${BIN_DIR}/shaders
 
+WEB_SERVER_BIN_DST=../../builds/${PLATFORM}/web_server
+WEB_SERVER_TEMPLATES_DST=${WEB_SERVER_BIN_DST}/templates
+WEB_SERVER_MIGRATIONS_DST=${WEB_SERVER_BIN_DST}/migrations
+
+WEB_SERVER_RESOURCES_SRC_ROOT=../../web_server
+WEB_SERVER_TEMPLATES_SRC=${WEB_SERVER_RESOURCES_SRC_ROOT}/templates
+WEB_SERVER_MIGRATIONS_SRC=${WEB_SERVER_RESOURCES_SRC_ROOT}/migrations
+
+
 # Make sure target directories exist
 mkdir -p ${BIN_DIR}/shaders
 mkdir -p ${BIN_DIR}/images
 mkdir -p ${BIN_DIR}/models
 mkdir -p ${BIN_DIR}/fonts
 mkdir -p ${BIN_DIR}/sprites
+mkdir -p ${WEB_SERVER_TEMPLATES_DST}
+mkdir -p ${WEB_SERVER_MIGRATIONS_DST}
 
 # Compile shaders
 ${SHADER_COMPILER} -V ${SHADER_SRC_DIR}/sprite.vert -o ${SHADER_DST_DIR}/sprite.vert.spv
@@ -43,3 +54,5 @@ cp -rf ${RESOURCES_DIR}/models ${BIN_DIR}
 cp -rf ${RESOURCES_DIR}/fonts ${BIN_DIR}
 cp -rf ${RESOURCES_DIR}/sprites ${BIN_DIR}
 
+cp -rf ${WEB_SERVER_TEMPLATES_SRC} ${WEB_SERVER_TEMPLATES_DST}
+cp -rf ${WEB_SERVER_MIGRATIONS_SRC} ${WEB_SERVER_MIGRATIONS_DST}
diff --git a/build_scripts/macos/build_all.sh b/build_scripts/macos/build_all.sh
index 4c92781cc01d99eb78d692faf9695ee1e1f08d9e..798dd4fea77e8ee9a6ac4d6b2e59a9ad3a765629 100755
--- a/build_scripts/macos/build_all.sh
+++ b/build_scripts/macos/build_all.sh
@@ -1,5 +1,6 @@
-
 #!/usr/bin/env bash
+set -e
+
 cd "$(dirname "$0")"
 
 rm -rf ../../builds/macos
@@ -12,4 +13,3 @@ echo Compiling Linux executable...
 ./build_executable_arm64.sh
 
 echo Done
-
diff --git a/build_scripts/macos/build_executable_arm64.sh b/build_scripts/macos/build_executable_arm64.sh
index 01a947781f04c2c485ca83b906fe3f426c1a372b..3dc39589679fd773ac9c794f1bc6b1968da3c918 100755
--- a/build_scripts/macos/build_executable_arm64.sh
+++ b/build_scripts/macos/build_executable_arm64.sh
@@ -10,22 +10,35 @@ BUILD_TARGET_ARM=aarch64-apple-darwin
 BIN_DIR=../../builds/${PLATFORM}
 TARGET_DIR=../../target/${BUILD_TARGET_ARM}/release
 EXE_NAME=vulkan_app
+
+DB_NAME=test.db
+DB_DIR=../../web_server/data
+DB_URL_BUILD_SCRIPTS=sqlite://${DB_DIR}/${DB_NAME}
+DB_URL_WORKSPACE=sqlite://web_server/data/${DB_NAME}
+MIGRATIONS_SRC=../../web_server/migrations
+WEB_SERVER_EXE_NAME=web_server
+WEB_SERVER_DST=../../builds/${PLATFORM}/web_server
+
 APP_NAME=VulkanApp
-APP_BUNDLE_ROOT=${BIN_DIR}/${APP_NAME}.app/Contents
+APP_BUNDLE_ROOT=${BIN_DIR}/game/${APP_NAME}.app/Contents
 APP_BUNDLE_EXE_PATH=${APP_BUNDLE_ROOT}/MacOS
 
 # Make sure target directories exist
 mkdir -p ${APP_BUNDLE_EXE_PATH}
+mkdir -p ${DB_DIR}
+
+# This command has to reference the db url and migrations relative to the build script directory
+cargo sqlx database setup --database-url ${DB_URL_BUILD_SCRIPTS} --source ${MIGRATIONS_SRC}
 
-pushd "../.."
+# This command has to be run relative to the root of the whole workspace :/
+export DATABASE_URL=${DB_URL_WORKSPACE}
 
 echo Building ${PLATFORM}...
 cargo build --release --target ${BUILD_TARGET_ARM}
 
-popd
-
 install_name_tool -add_rpath @executable_path/../Frameworks ${TARGET_DIR}/${EXE_NAME}
 cp -r ${TARGET_DIR}/${EXE_NAME} ${APP_BUNDLE_EXE_PATH}/${EXE_NAME}
+cp ${TARGET_DIR}/${WEB_SERVER_EXE_NAME} ${WEB_SERVER_DST}
 
 popd
 
diff --git a/build_scripts/macos/build_executable_x86_64.sh b/build_scripts/macos/build_executable_x86_64.sh
index 719441759ea2f598f59569f1e7aa732ebf5bc642..d253ce1417d4ac1d4f3018873b7bf66fe3bd5feb 100755
--- a/build_scripts/macos/build_executable_x86_64.sh
+++ b/build_scripts/macos/build_executable_x86_64.sh
@@ -11,22 +11,35 @@ BUILD_TARGET_X86=x86_64-apple-darwin
 BIN_DIR=../../builds/${PLATFORM}
 TARGET_DIR=../../target/${BUILD_TARGET_X86}/release
 EXE_NAME=vulkan_app
+
+DB_NAME=test.db
+DB_DIR=../../web_server/data
+DB_URL_BUILD_SCRIPTS=sqlite://${DB_DIR}/${DB_NAME}
+DB_URL_WORKSPACE=sqlite://web_server/data/${DB_NAME}
+MIGRATIONS_SRC=../../web_server/migrations
+WEB_SERVER_EXE_NAME=web_server
+WEB_SERVER_DST=../../builds/${PLATFORM}/web_server
+
 APP_NAME=VulkanApp
-APP_BUNDLE_ROOT=${BIN_DIR}/${APP_NAME}.app/Contents
+APP_BUNDLE_ROOT=${BIN_DIR}/game/${APP_NAME}.app/Contents
 APP_BUNDLE_EXE_PATH=${APP_BUNDLE_ROOT}/MacOS
 
 # Make sure target directories exist
 mkdir -p ${BIN_DIR}
+mkdir -p ${DB_DIR}
+
+# This command has to reference the db url and migrations relative to the build script directory
+cargo sqlx database setup --database-url ${DB_URL_BUILD_SCRIPTS} --source ${MIGRATIONS_SRC}
 
-pushd "../.."
+# This command has to be run relative to the root of the whole workspace :/
+export DATABASE_URL=${DB_URL_WORKSPACE}
 
 echo Building ${PLATFORM}...
 cargo build --release --target ${BUILD_TARGET_X86}
 
-popd
-
 install_name_tool -add_rpath @executable_path/../Frameworks ${TARGET_DIR}/${EXE_NAME}
 cp -r ${TARGET_DIR}/${EXE_NAME} ${APP_BUNDLE_EXE_PATH}/${EXE_NAME}
+cp ${TARGET_DIR}/${WEB_SERVER_EXE_NAME} ${WEB_SERVER_DST}
 
 popd
 
diff --git a/build_scripts/macos/build_resources.sh b/build_scripts/macos/build_resources.sh
index e88a5ede8075f8ea8fdd6f0e3e1cd15dfc9b0163..801078e1026eabd997e38bd5a7cb0bce5e74acb4 100755
--- a/build_scripts/macos/build_resources.sh
+++ b/build_scripts/macos/build_resources.sh
@@ -7,10 +7,21 @@ APP_NAME=VulkanApp
 EXE_NAME=vulkan_app
 PLATFORM=macos
 BIN_DIR=../../builds/${PLATFORM}
-RESOURCES_DIR=../../resources
-TOOLS_DIR=../../tools
-SHADER_COMPILER=${TOOLS_DIR}/${PLATFORM}/glslangValidator/bin/glslangValidator
+GAME_BIN_DIR=${BIN_DIR}/game
+RESOURCES_DIR=../../game/resources
+EXTERNALS_DIR=../../external/${PLATFORM}
+SHADER_COMPILER=${EXTERNALS_DIR}/glslangValidator/bin/glslangValidator
 SHADER_SRC_DIR=${RESOURCES_DIR}/shaders
+MOLTEN_VK_ROOT=../../external/macos/moltenvk
+VULKAN_DLL_VERSION=1.3.211
+
+WEB_SERVER_BIN_DST=../../builds/${PLATFORM}/web_server
+WEB_SERVER_TEMPLATES_DST=${WEB_SERVER_BIN_DST}/templates
+WEB_SERVER_MIGRATIONS_DST=${WEB_SERVER_BIN_DST}/migrations
+
+WEB_SERVER_RESOURCES_SRC_ROOT=../../web_server
+WEB_SERVER_TEMPLATES_SRC=${WEB_SERVER_RESOURCES_SRC_ROOT}/templates
+WEB_SERVER_MIGRATIONS_SRC=${WEB_SERVER_RESOURCES_SRC_ROOT}/migrations
 
 # Mac bundle layout
 # vulkan_app.app
@@ -25,7 +36,7 @@ SHADER_SRC_DIR=${RESOURCES_DIR}/shaders
 #       - models
 #     - Info.plist
 
-APP_BUNDLE_ROOT=${BIN_DIR}/${APP_NAME}.app/Contents
+APP_BUNDLE_ROOT=${GAME_BIN_DIR}/${APP_NAME}.app/Contents
 APP_BUNDLE_EXE_PATH=${APP_BUNDLE_ROOT}/MacOS
 APP_BUNDLE_RESOURCES_PATH=${APP_BUNDLE_ROOT}/Resources
 APP_BUNDLE_SHADERS_PATH=${APP_BUNDLE_RESOURCES_PATH}/shaders
@@ -33,7 +44,7 @@ APP_BUNDLE_FRAMEWORKS_PATH=${APP_BUNDLE_ROOT}/Frameworks
 APP_BUNDLE_MVK_ICD_PATH=${APP_BUNDLE_RESOURCES_PATH}/vulkan/icd.d
 
 # Delete the existing app bundle. They get code signed and hashed when launched so they can't be updated.
-rm -rf ${BIN_DIR}/${APP_NAME}.app
+rm -rf ${BIN_DIR}
 
 # Make sure target directories exist
 mkdir -p ${APP_BUNDLE_EXE_PATH}
@@ -44,6 +55,8 @@ mkdir -p ${APP_BUNDLE_RESOURCES_PATH}/images
 mkdir -p ${APP_BUNDLE_RESOURCES_PATH}/models
 mkdir -p ${APP_BUNDLE_RESOURCES_PATH}/fonts
 mkdir -p ${APP_BUNDLE_RESOURCES_PATH}/sprites
+mkdir -p ${WEB_SERVER_TEMPLATES_DST}
+mkdir -p ${WEB_SERVER_MIGRATIONS_DST}
 
 # Compile shaders
 ${SHADER_COMPILER} -V ${SHADER_SRC_DIR}/sprite.vert -o ${APP_BUNDLE_SHADERS_PATH}/sprite.vert.spv
@@ -70,19 +83,17 @@ cp -rf ${RESOURCES_DIR}/models ${APP_BUNDLE_RESOURCES_PATH}
 cp -rf ${RESOURCES_DIR}/fonts ${APP_BUNDLE_RESOURCES_PATH}
 cp -rf ${RESOURCES_DIR}/sprites ${APP_BUNDLE_RESOURCES_PATH}
 
-VULKAN_DLL_VERSION=1.3.211
-VULKAN_SDK_ROOT=~/VulkanSDK/1.3.211.0
+cp -rf ${WEB_SERVER_TEMPLATES_SRC} ${WEB_SERVER_TEMPLATES_DST}
+cp -rf ${WEB_SERVER_MIGRATIONS_SRC} ${WEB_SERVER_MIGRATIONS_DST}
 
-cp ${VULKAN_SDK_ROOT}/macOS/lib/libMoltenVK.dylib ${APP_BUNDLE_FRAMEWORKS_PATH}
-cp ${VULKAN_SDK_ROOT}/macOS/lib/libvulkan.${VULKAN_DLL_VERSION}.dylib ${APP_BUNDLE_FRAMEWORKS_PATH}
-#install_name_tool -add_rpath @executable_path/../Frameworks ${APP_BUNDLE_FRAMEWORKS_PATH}/libvulkan.${VULKAN_DLL_VERSION}.dylib
+cp -rf ${MOLTEN_VK_ROOT}/lib/* ${APP_BUNDLE_FRAMEWORKS_PATH}
 
 pushd ${APP_BUNDLE_FRAMEWORKS_PATH}
 ln -s libvulkan.${VULKAN_DLL_VERSION}.dylib libvulkan.dylib
 ln -s libvulkan.${VULKAN_DLL_VERSION}.dylib libvulkan.1.dylib
 popd
-#cp -r ${VULKAN_SDK_ROOT}/macOS/share/vulkan ${APP_BUNDLE_ROOT}/Resources
-cp MoltenVK_icd.json ${APP_BUNDLE_MVK_ICD_PATH}
+
+cp ${MOLTEN_VK_ROOT}/MoltenVK_icd.json ${APP_BUNDLE_MVK_ICD_PATH}
 
 cat > ${APP_BUNDLE_ROOT}/Info.plist <<EOF
 
diff --git a/build_scripts/macos/sign_and_notarize.sh b/build_scripts/macos/sign_and_notarize.sh
index f9dfc8b4bda32d0237f00243982fe4d713179f8c..4fd77dd314bb22c8df9393ae3a5b9f4d725b28fa 100755
--- a/build_scripts/macos/sign_and_notarize.sh
+++ b/build_scripts/macos/sign_and_notarize.sh
@@ -3,9 +3,9 @@ set -e
 
 pushd "$(dirname "$0")"
 
-export PLATFORM=macos
+PLATFORM=macos
 
-BIN_DIR=../../builds/${PLATFORM}
+BIN_DIR=../../builds/${PLATFORM}/game
 EXE_NAME=vulkan_app
 APP_NAME=VulkanApp
 APP_BUNDLE_ROOT=${BIN_DIR}/${APP_NAME}.app
@@ -14,16 +14,16 @@ XCNOTARY=/opt/homebrew/bin/xcnotary
 
 # Make sure target directories exist
 mkdir -p ${APP_BUNDLE_EXE_PATH}
-mkdir -p ${BIN_DIR}/dist
+#mkdir -p ${BIN_DIR}/dist
 
 #codesign --force --options runtime --entitlements ./hardened_runtime_entitlements.plist -s "Rising Tide Games LLC" --verbose=4 ${APP_BUNDLE_ROOT}/Frameworks/libMoltenVK.dylib
 #codesign --force --options runtime --entitlements ./hardened_runtime_entitlements.plist -s "Rising Tide Games LLC" --verbose=4 ${APP_BUNDLE_ROOT}/Frameworks/libvulkan.1.3.204.dylib
 #codesign --force --options runtime --entitlements ./hardened_runtime_entitlements.plist -s "Rising Tide Games LLC" --verbose=4 ${APP_BUNDLE_ROOT}/Frameworks/libvulkan.dylib
 codesign --force --options runtime --entitlements ./hardened_runtime_entitlements.plist -s "Rising Tide Games LLC" --verbose=4 ${APP_BUNDLE_EXE_PATH}/${EXE_NAME}
 ${XCNOTARY} notarize ${APP_BUNDLE_ROOT} --developer-account zeropointtwo@gmail.com --developer-password-keychain-item NOTARY_KEY
+#${XCNOTARY} precheck ${APP_BUNDLE_ROOT} --developer-account zeropointtwo@gmail.com --developer-password-keychain-item NOTARY_KEY
 #rm -rf ${BIN_DIR}/${APP_NAME}.app
 #unzip -o $TMPDIR/${APP_NAME} -d ${BIN_DIR}
-ditto -c -k --keepParent ${APP_BUNDLE_ROOT} ${BIN_DIR}/dist/${APP_NAME}.zip
+#ditto -c -k --keepParent ${APP_BUNDLE_ROOT} ${BIN_DIR}/${APP_NAME}.zip
 
 popd
-
diff --git a/build_scripts/win32/build_executable_gnu.bat b/build_scripts/win32/build_executable_gnu.bat
deleted file mode 100755
index ab6d376744404464f97a3f5ad14a9cc7676b3470..0000000000000000000000000000000000000000
--- a/build_scripts/win32/build_executable_gnu.bat
+++ /dev/null
@@ -1,22 +0,0 @@
-@echo off
-
-set script_path_trailing_slash=%~dp0
-set script_path=%script_path_trailing_slash:~0,-1%
-
-echo %script_path%
-pushd %script_path%
-
-set TARGET=x86_64-pc-windows-gnu
-set TARGET_DIR=..\..\target\%TARGET%\release
-
-rem Common settings
-set BIN_DIR=..\..\builds\win32
-
-rem Make sure target directories exist
-mkdir %BIN_DIR%
-
-cargo build --release --target %TARGET% -vv
-
-copy %TARGET_DIR%\vulkan_app.exe %BIN_DIR%\vulkan_app_gnu.exe
-
-popd
diff --git a/build_scripts/win32/build_executable_msvc.sh b/build_scripts/win32/build_executable_msvc.sh
deleted file mode 100755
index 424402393cc8c745dabf87d73d2f3cda8821012c..0000000000000000000000000000000000000000
--- a/build_scripts/win32/build_executable_msvc.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/usr/bin/env bash
-set -e
-
-cd "$(dirname "$0")"
-
-# Platform specific settings
-export PLATFORM=win32
-
-EXE_EXTENSION=.exe
-BUILD_TARGET=x86_64-pc-windows-msvc
-TARGET_DIR=../../target/${BUILD_TARGET}/release
-
-# Common settings
-BIN_DIR=../../builds/${PLATFORM}
-EXE_NAME=vulkan_app${EXE_EXTENSION}
-
-# Make sure target directories exist
-mkdir -p ${BIN_DIR}
-
-echo Building ${PLATFORM}...
-cargo xwin build --release --target ${BUILD_TARGET}
-
-cp ${TARGET_DIR}/${EXE_NAME} ${BIN_DIR}/${EXE_NAME}
-
diff --git a/build_scripts/win32/build_all.bat b/build_scripts/win64/build_all.bat
similarity index 100%
rename from build_scripts/win32/build_all.bat
rename to build_scripts/win64/build_all.bat
diff --git a/build_scripts/win32/build_all.sh b/build_scripts/win64/build_all.sh
similarity index 78%
rename from build_scripts/win32/build_all.sh
rename to build_scripts/win64/build_all.sh
index 918988d2f1d85cf717db75671ba272873c35e360..d53de29a090b1f64e7ca8e654a320f423cef1efa 100755
--- a/build_scripts/win32/build_all.sh
+++ b/build_scripts/win64/build_all.sh
@@ -6,7 +6,7 @@ cd "$(dirname "$0")"
 echo Compiling resources...
 ./build_resources.sh
 
-echo Compiling Linux executable...
+echo Compiling Windows executable...
 ./build_executable.sh
 
 echo Done
diff --git a/build_scripts/win32/build_executable_msvc.bat b/build_scripts/win64/build_executable.bat
similarity index 100%
rename from build_scripts/win32/build_executable_msvc.bat
rename to build_scripts/win64/build_executable.bat
diff --git a/build_scripts/win64/build_executable.sh b/build_scripts/win64/build_executable.sh
new file mode 100755
index 0000000000000000000000000000000000000000..1dd3685b162430ea492eb105d4fa7c4772d653f6
--- /dev/null
+++ b/build_scripts/win64/build_executable.sh
@@ -0,0 +1,37 @@
+#!/usr/bin/env bash
+set -e
+
+cd "$(dirname "$0")"
+
+export PLATFORM=win64
+
+BIN_DIR=../../builds/${PLATFORM}/game
+TARGET_TYPE=x86_64-pc-windows-msvc
+TARGET_DIR=../../target/${TARGET_TYPE}/release
+EXE_EXTENSION=.exe
+EXE_NAME=vulkan_app${EXE_EXTENSION}
+
+DB_NAME=test.db
+DB_DIR=../../web_server/data
+DB_URL_BUILD_SCRIPTS=sqlite://${DB_DIR}/${DB_NAME}
+DB_URL_WORKSPACE=sqlite://web_server/data/${DB_NAME}
+MIGRATIONS_SRC=../../web_server/migrations
+WEB_SERVER_EXE_NAME=web_server.exe
+WEB_SERVER_DST=../../builds/${PLATFORM}/web_server
+
+# Make sure target directories exist
+mkdir -p ${BIN_DIR}
+mkdir -p ${DB_DIR}
+
+echo Building ${PLATFORM}...
+
+# This command has to reference the db url and migrations relative to the build script directory
+cargo sqlx database setup --database-url ${DB_URL_BUILD_SCRIPTS} --source ${MIGRATIONS_SRC}
+
+# This command has to be run relative to the root of the whole workspace :/
+export DATABASE_URL=${DB_URL_WORKSPACE}
+
+cargo xwin build --release --target ${TARGET_TYPE}
+
+cp ${TARGET_DIR}/${EXE_NAME} ${BIN_DIR}/${EXE_NAME}
+cp ${TARGET_DIR}/${WEB_SERVER_EXE_NAME} ${WEB_SERVER_DST}
diff --git a/build_scripts/win32/build_resources.bat b/build_scripts/win64/build_resources.bat
similarity index 100%
rename from build_scripts/win32/build_resources.bat
rename to build_scripts/win64/build_resources.bat
diff --git a/build_scripts/win32/build_resources.sh b/build_scripts/win64/build_resources.sh
similarity index 64%
rename from build_scripts/win32/build_resources.sh
rename to build_scripts/win64/build_resources.sh
index 85c23979d8724318534fafbb6d45522d877c65e0..1e14ff4ab79fde51e05939391a97dddf20e1ac44 100755
--- a/build_scripts/win32/build_resources.sh
+++ b/build_scripts/win64/build_resources.sh
@@ -1,21 +1,34 @@
-
 #!/usr/bin/env bash
+set -e
+
 cd "$(dirname "$0")"
 
-PLATFORM=win32
-BIN_DIR=../../builds/${PLATFORM}
-RESOURCES_DIR=../../resources
-TOOLS_DIR=../../tools
-SHADER_COMPILER=${TOOLS_DIR}/linux/glslangValidator/bin/glslangValidator
+PLATFORM=win64
+BIN_DIR=../../builds/${PLATFORM}/game
+RESOURCES_DIR=../../game/resources
+# Since we're cross compiling, we should use the linux shader compiler to generate the spirv
+EXTERNALS_DIR=../../external/linux
+SHADER_COMPILER=${EXTERNALS_DIR}/glslangValidator/bin/glslangValidator
 SHADER_SRC_DIR=${RESOURCES_DIR}/shaders
 SHADER_DST_DIR=${BIN_DIR}/shaders
 
+WEB_SERVER_BIN_DST=../../builds/${PLATFORM}/web_server
+WEB_SERVER_TEMPLATES_DST=${WEB_SERVER_BIN_DST}/templates
+WEB_SERVER_MIGRATIONS_DST=${WEB_SERVER_BIN_DST}/migrations
+
+WEB_SERVER_RESOURCES_SRC_ROOT=../../web_server
+WEB_SERVER_TEMPLATES_SRC=${WEB_SERVER_RESOURCES_SRC_ROOT}/templates
+WEB_SERVER_MIGRATIONS_SRC=${WEB_SERVER_RESOURCES_SRC_ROOT}/migrations
+
+
 # Make sure target directories exist
 mkdir -p ${BIN_DIR}/shaders
 mkdir -p ${BIN_DIR}/images
 mkdir -p ${BIN_DIR}/models
 mkdir -p ${BIN_DIR}/fonts
 mkdir -p ${BIN_DIR}/sprites
+mkdir -p ${WEB_SERVER_TEMPLATES_DST}
+mkdir -p ${WEB_SERVER_MIGRATIONS_DST}
 
 # Compile shaders
 ${SHADER_COMPILER} -V ${SHADER_SRC_DIR}/sprite.vert -o ${SHADER_DST_DIR}/sprite.vert.spv
@@ -42,3 +55,5 @@ cp -rf ${RESOURCES_DIR}/models ${BIN_DIR}
 cp -rf ${RESOURCES_DIR}/fonts ${BIN_DIR}
 cp -rf ${RESOURCES_DIR}/sprites ${BIN_DIR}
 
+cp -rf ${WEB_SERVER_TEMPLATES_SRC} ${WEB_SERVER_TEMPLATES_DST}
+cp -rf ${WEB_SERVER_MIGRATIONS_SRC} ${WEB_SERVER_MIGRATIONS_DST}
diff --git a/common/Cargo.toml b/common/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..cc777b965791c89b0399462449ec16b792633cec
--- /dev/null
+++ b/common/Cargo.toml
@@ -0,0 +1,18 @@
+[package]
+name = "common"
+version = "0.1.0"
+edition = "2021"
+
+#[lib]
+#name = "common"
+#crate-type = ["lib"]
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+sqlx = { version = "0.5.13", features = [ "runtime-tokio-native-tls", "sqlite", "macros", "migrate", "chrono", "uuid" ] }
+uuid = { version = "1.0.0", features = ["v4", "serde"] }
+chrono = { version = "0.4.19", features = ["serde"] }
+rand = "0.8"
+serde = { version = "1", features = ["derive"] }
+serde_json = "1.0.79"
diff --git a/common/src/lib.rs b/common/src/lib.rs
new file mode 100644
index 0000000000000000000000000000000000000000..100c435e299e1511695ed077c1f69802f18db13a
--- /dev/null
+++ b/common/src/lib.rs
@@ -0,0 +1,2 @@
+
+pub mod messages;
diff --git a/common/src/messages.rs b/common/src/messages.rs
new file mode 100644
index 0000000000000000000000000000000000000000..950b9709980175df8dbb43a415423396c52bc7ca
--- /dev/null
+++ b/common/src/messages.rs
@@ -0,0 +1,13 @@
+
+use chrono::{Date, Utc};
+use uuid::Uuid;
+
+pub struct BountiesRequest
+{
+    pub id: Uuid,
+    pub name: String,
+    pub description: String,
+    pub created_date: Date<Utc>,
+    pub expiration_date: Date<Utc>,
+    pub current_cent_value: u32,
+}
\ No newline at end of file
diff --git a/tools/linux/glslangValidator/bin/glslangValidator b/external/linux/glslangValidator/bin/glslangValidator
similarity index 100%
rename from tools/linux/glslangValidator/bin/glslangValidator
rename to external/linux/glslangValidator/bin/glslangValidator
diff --git a/tools/linux/glslangValidator/include/glslang/build_info.h b/external/linux/glslangValidator/include/glslang/build_info.h
similarity index 100%
rename from tools/linux/glslangValidator/include/glslang/build_info.h
rename to external/linux/glslangValidator/include/glslang/build_info.h
diff --git a/tools/linux/glslangValidator/lib/libHLSL.a b/external/linux/glslangValidator/lib/libHLSL.a
similarity index 100%
rename from tools/linux/glslangValidator/lib/libHLSL.a
rename to external/linux/glslangValidator/lib/libHLSL.a
diff --git a/tools/linux/glslangValidator/lib/libOGLCompiler.a b/external/linux/glslangValidator/lib/libOGLCompiler.a
similarity index 100%
rename from tools/linux/glslangValidator/lib/libOGLCompiler.a
rename to external/linux/glslangValidator/lib/libOGLCompiler.a
diff --git a/tools/linux/glslangValidator/lib/libOSDependent.a b/external/linux/glslangValidator/lib/libOSDependent.a
similarity index 100%
rename from tools/linux/glslangValidator/lib/libOSDependent.a
rename to external/linux/glslangValidator/lib/libOSDependent.a
diff --git a/tools/linux/glslangValidator/lib/libSPIRV-Tools-opt.a b/external/linux/glslangValidator/lib/libSPIRV-Tools-opt.a
similarity index 100%
rename from tools/linux/glslangValidator/lib/libSPIRV-Tools-opt.a
rename to external/linux/glslangValidator/lib/libSPIRV-Tools-opt.a
diff --git a/tools/linux/glslangValidator/lib/libSPIRV-Tools.a b/external/linux/glslangValidator/lib/libSPIRV-Tools.a
similarity index 100%
rename from tools/linux/glslangValidator/lib/libSPIRV-Tools.a
rename to external/linux/glslangValidator/lib/libSPIRV-Tools.a
diff --git a/tools/linux/glslangValidator/lib/libSPIRV.a b/external/linux/glslangValidator/lib/libSPIRV.a
similarity index 100%
rename from tools/linux/glslangValidator/lib/libSPIRV.a
rename to external/linux/glslangValidator/lib/libSPIRV.a
diff --git a/tools/linux/glslangValidator/lib/libSPVRemapper.a b/external/linux/glslangValidator/lib/libSPVRemapper.a
similarity index 100%
rename from tools/linux/glslangValidator/lib/libSPVRemapper.a
rename to external/linux/glslangValidator/lib/libSPVRemapper.a
diff --git a/tools/linux/glslangValidator/lib/libglslang.a b/external/linux/glslangValidator/lib/libglslang.a
similarity index 100%
rename from tools/linux/glslangValidator/lib/libglslang.a
rename to external/linux/glslangValidator/lib/libglslang.a
diff --git a/tools/macos/glslangValidator/bin/glslangValidator b/external/macos/glslangValidator/bin/glslangValidator
similarity index 100%
rename from tools/macos/glslangValidator/bin/glslangValidator
rename to external/macos/glslangValidator/bin/glslangValidator
diff --git a/tools/macos/glslangValidator/include/glslang/build_info.h b/external/macos/glslangValidator/include/glslang/build_info.h
similarity index 100%
rename from tools/macos/glslangValidator/include/glslang/build_info.h
rename to external/macos/glslangValidator/include/glslang/build_info.h
diff --git a/tools/macos/glslangValidator/lib/libHLSL.a b/external/macos/glslangValidator/lib/libHLSL.a
similarity index 100%
rename from tools/macos/glslangValidator/lib/libHLSL.a
rename to external/macos/glslangValidator/lib/libHLSL.a
diff --git a/tools/macos/glslangValidator/lib/libOGLCompiler.a b/external/macos/glslangValidator/lib/libOGLCompiler.a
similarity index 100%
rename from tools/macos/glslangValidator/lib/libOGLCompiler.a
rename to external/macos/glslangValidator/lib/libOGLCompiler.a
diff --git a/tools/macos/glslangValidator/lib/libOSDependent.a b/external/macos/glslangValidator/lib/libOSDependent.a
similarity index 100%
rename from tools/macos/glslangValidator/lib/libOSDependent.a
rename to external/macos/glslangValidator/lib/libOSDependent.a
diff --git a/tools/macos/glslangValidator/lib/libSPIRV-Tools-opt.a b/external/macos/glslangValidator/lib/libSPIRV-Tools-opt.a
similarity index 100%
rename from tools/macos/glslangValidator/lib/libSPIRV-Tools-opt.a
rename to external/macos/glslangValidator/lib/libSPIRV-Tools-opt.a
diff --git a/tools/macos/glslangValidator/lib/libSPIRV-Tools.a b/external/macos/glslangValidator/lib/libSPIRV-Tools.a
similarity index 100%
rename from tools/macos/glslangValidator/lib/libSPIRV-Tools.a
rename to external/macos/glslangValidator/lib/libSPIRV-Tools.a
diff --git a/tools/macos/glslangValidator/lib/libSPIRV.a b/external/macos/glslangValidator/lib/libSPIRV.a
similarity index 100%
rename from tools/macos/glslangValidator/lib/libSPIRV.a
rename to external/macos/glslangValidator/lib/libSPIRV.a
diff --git a/tools/macos/glslangValidator/lib/libSPVRemapper.a b/external/macos/glslangValidator/lib/libSPVRemapper.a
similarity index 100%
rename from tools/macos/glslangValidator/lib/libSPVRemapper.a
rename to external/macos/glslangValidator/lib/libSPVRemapper.a
diff --git a/tools/macos/glslangValidator/lib/libglslang.a b/external/macos/glslangValidator/lib/libglslang.a
similarity index 100%
rename from tools/macos/glslangValidator/lib/libglslang.a
rename to external/macos/glslangValidator/lib/libglslang.a
diff --git a/build_scripts/macos/MoltenVK_icd.json b/external/macos/moltenvk/MoltenVK_icd.json
similarity index 100%
rename from build_scripts/macos/MoltenVK_icd.json
rename to external/macos/moltenvk/MoltenVK_icd.json
diff --git a/external/macos/moltenvk/lib/libMoltenVK.dylib b/external/macos/moltenvk/lib/libMoltenVK.dylib
new file mode 100755
index 0000000000000000000000000000000000000000..7aa2605fca03d788f2ce567070f778d5db5d7a40
Binary files /dev/null and b/external/macos/moltenvk/lib/libMoltenVK.dylib differ
diff --git a/external/macos/moltenvk/lib/libvulkan.1.3.211.dylib b/external/macos/moltenvk/lib/libvulkan.1.3.211.dylib
new file mode 100755
index 0000000000000000000000000000000000000000..78b1e4e204021c46578d05a2b45881493240f2d2
Binary files /dev/null and b/external/macos/moltenvk/lib/libvulkan.1.3.211.dylib differ
diff --git a/tools/win32/glslangValidator/bin/glslangValidator.exe b/external/win64/glslangValidator/bin/glslangValidator.exe
similarity index 100%
rename from tools/win32/glslangValidator/bin/glslangValidator.exe
rename to external/win64/glslangValidator/bin/glslangValidator.exe
diff --git a/tools/win32/glslangValidator/bin/spirv-remap.exe b/external/win64/glslangValidator/bin/spirv-remap.exe
similarity index 100%
rename from tools/win32/glslangValidator/bin/spirv-remap.exe
rename to external/win64/glslangValidator/bin/spirv-remap.exe
diff --git a/tools/win32/glslangValidator/include/glslang/HLSL/hlslAttributes.h b/external/win64/glslangValidator/include/glslang/HLSL/hlslAttributes.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/HLSL/hlslAttributes.h
rename to external/win64/glslangValidator/include/glslang/HLSL/hlslAttributes.h
diff --git a/tools/win32/glslangValidator/include/glslang/HLSL/hlslGrammar.h b/external/win64/glslangValidator/include/glslang/HLSL/hlslGrammar.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/HLSL/hlslGrammar.h
rename to external/win64/glslangValidator/include/glslang/HLSL/hlslGrammar.h
diff --git a/tools/win32/glslangValidator/include/glslang/HLSL/hlslOpMap.h b/external/win64/glslangValidator/include/glslang/HLSL/hlslOpMap.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/HLSL/hlslOpMap.h
rename to external/win64/glslangValidator/include/glslang/HLSL/hlslOpMap.h
diff --git a/tools/win32/glslangValidator/include/glslang/HLSL/hlslParseHelper.h b/external/win64/glslangValidator/include/glslang/HLSL/hlslParseHelper.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/HLSL/hlslParseHelper.h
rename to external/win64/glslangValidator/include/glslang/HLSL/hlslParseHelper.h
diff --git a/tools/win32/glslangValidator/include/glslang/HLSL/hlslParseables.h b/external/win64/glslangValidator/include/glslang/HLSL/hlslParseables.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/HLSL/hlslParseables.h
rename to external/win64/glslangValidator/include/glslang/HLSL/hlslParseables.h
diff --git a/tools/win32/glslangValidator/include/glslang/HLSL/hlslScanContext.h b/external/win64/glslangValidator/include/glslang/HLSL/hlslScanContext.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/HLSL/hlslScanContext.h
rename to external/win64/glslangValidator/include/glslang/HLSL/hlslScanContext.h
diff --git a/tools/win32/glslangValidator/include/glslang/HLSL/hlslTokenStream.h b/external/win64/glslangValidator/include/glslang/HLSL/hlslTokenStream.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/HLSL/hlslTokenStream.h
rename to external/win64/glslangValidator/include/glslang/HLSL/hlslTokenStream.h
diff --git a/tools/win32/glslangValidator/include/glslang/HLSL/hlslTokens.h b/external/win64/glslangValidator/include/glslang/HLSL/hlslTokens.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/HLSL/hlslTokens.h
rename to external/win64/glslangValidator/include/glslang/HLSL/hlslTokens.h
diff --git a/tools/win32/glslangValidator/include/glslang/Include/BaseTypes.h b/external/win64/glslangValidator/include/glslang/Include/BaseTypes.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/Include/BaseTypes.h
rename to external/win64/glslangValidator/include/glslang/Include/BaseTypes.h
diff --git a/tools/win32/glslangValidator/include/glslang/Include/Common.h b/external/win64/glslangValidator/include/glslang/Include/Common.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/Include/Common.h
rename to external/win64/glslangValidator/include/glslang/Include/Common.h
diff --git a/tools/win32/glslangValidator/include/glslang/Include/ConstantUnion.h b/external/win64/glslangValidator/include/glslang/Include/ConstantUnion.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/Include/ConstantUnion.h
rename to external/win64/glslangValidator/include/glslang/Include/ConstantUnion.h
diff --git a/tools/win32/glslangValidator/include/glslang/Include/InfoSink.h b/external/win64/glslangValidator/include/glslang/Include/InfoSink.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/Include/InfoSink.h
rename to external/win64/glslangValidator/include/glslang/Include/InfoSink.h
diff --git a/tools/win32/glslangValidator/include/glslang/Include/InitializeGlobals.h b/external/win64/glslangValidator/include/glslang/Include/InitializeGlobals.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/Include/InitializeGlobals.h
rename to external/win64/glslangValidator/include/glslang/Include/InitializeGlobals.h
diff --git a/tools/win32/glslangValidator/include/glslang/Include/PoolAlloc.h b/external/win64/glslangValidator/include/glslang/Include/PoolAlloc.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/Include/PoolAlloc.h
rename to external/win64/glslangValidator/include/glslang/Include/PoolAlloc.h
diff --git a/tools/win32/glslangValidator/include/glslang/Include/ResourceLimits.h b/external/win64/glslangValidator/include/glslang/Include/ResourceLimits.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/Include/ResourceLimits.h
rename to external/win64/glslangValidator/include/glslang/Include/ResourceLimits.h
diff --git a/tools/win32/glslangValidator/include/glslang/Include/ShHandle.h b/external/win64/glslangValidator/include/glslang/Include/ShHandle.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/Include/ShHandle.h
rename to external/win64/glslangValidator/include/glslang/Include/ShHandle.h
diff --git a/tools/win32/glslangValidator/include/glslang/Include/Types.h b/external/win64/glslangValidator/include/glslang/Include/Types.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/Include/Types.h
rename to external/win64/glslangValidator/include/glslang/Include/Types.h
diff --git a/tools/win32/glslangValidator/include/glslang/Include/arrays.h b/external/win64/glslangValidator/include/glslang/Include/arrays.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/Include/arrays.h
rename to external/win64/glslangValidator/include/glslang/Include/arrays.h
diff --git a/tools/win32/glslangValidator/include/glslang/Include/glslang_c_interface.h b/external/win64/glslangValidator/include/glslang/Include/glslang_c_interface.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/Include/glslang_c_interface.h
rename to external/win64/glslangValidator/include/glslang/Include/glslang_c_interface.h
diff --git a/tools/win32/glslangValidator/include/glslang/Include/glslang_c_shader_types.h b/external/win64/glslangValidator/include/glslang/Include/glslang_c_shader_types.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/Include/glslang_c_shader_types.h
rename to external/win64/glslangValidator/include/glslang/Include/glslang_c_shader_types.h
diff --git a/tools/win32/glslangValidator/include/glslang/Include/intermediate.h b/external/win64/glslangValidator/include/glslang/Include/intermediate.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/Include/intermediate.h
rename to external/win64/glslangValidator/include/glslang/Include/intermediate.h
diff --git a/tools/win32/glslangValidator/include/glslang/MachineIndependent/Initialize.h b/external/win64/glslangValidator/include/glslang/MachineIndependent/Initialize.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/MachineIndependent/Initialize.h
rename to external/win64/glslangValidator/include/glslang/MachineIndependent/Initialize.h
diff --git a/tools/win32/glslangValidator/include/glslang/MachineIndependent/LiveTraverser.h b/external/win64/glslangValidator/include/glslang/MachineIndependent/LiveTraverser.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/MachineIndependent/LiveTraverser.h
rename to external/win64/glslangValidator/include/glslang/MachineIndependent/LiveTraverser.h
diff --git a/tools/win32/glslangValidator/include/glslang/MachineIndependent/ParseHelper.h b/external/win64/glslangValidator/include/glslang/MachineIndependent/ParseHelper.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/MachineIndependent/ParseHelper.h
rename to external/win64/glslangValidator/include/glslang/MachineIndependent/ParseHelper.h
diff --git a/tools/win32/glslangValidator/include/glslang/MachineIndependent/RemoveTree.h b/external/win64/glslangValidator/include/glslang/MachineIndependent/RemoveTree.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/MachineIndependent/RemoveTree.h
rename to external/win64/glslangValidator/include/glslang/MachineIndependent/RemoveTree.h
diff --git a/tools/win32/glslangValidator/include/glslang/MachineIndependent/Scan.h b/external/win64/glslangValidator/include/glslang/MachineIndependent/Scan.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/MachineIndependent/Scan.h
rename to external/win64/glslangValidator/include/glslang/MachineIndependent/Scan.h
diff --git a/tools/win32/glslangValidator/include/glslang/MachineIndependent/ScanContext.h b/external/win64/glslangValidator/include/glslang/MachineIndependent/ScanContext.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/MachineIndependent/ScanContext.h
rename to external/win64/glslangValidator/include/glslang/MachineIndependent/ScanContext.h
diff --git a/tools/win32/glslangValidator/include/glslang/MachineIndependent/SymbolTable.h b/external/win64/glslangValidator/include/glslang/MachineIndependent/SymbolTable.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/MachineIndependent/SymbolTable.h
rename to external/win64/glslangValidator/include/glslang/MachineIndependent/SymbolTable.h
diff --git a/tools/win32/glslangValidator/include/glslang/MachineIndependent/Versions.h b/external/win64/glslangValidator/include/glslang/MachineIndependent/Versions.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/MachineIndependent/Versions.h
rename to external/win64/glslangValidator/include/glslang/MachineIndependent/Versions.h
diff --git a/tools/win32/glslangValidator/include/glslang/MachineIndependent/attribute.h b/external/win64/glslangValidator/include/glslang/MachineIndependent/attribute.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/MachineIndependent/attribute.h
rename to external/win64/glslangValidator/include/glslang/MachineIndependent/attribute.h
diff --git a/tools/win32/glslangValidator/include/glslang/MachineIndependent/gl_types.h b/external/win64/glslangValidator/include/glslang/MachineIndependent/gl_types.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/MachineIndependent/gl_types.h
rename to external/win64/glslangValidator/include/glslang/MachineIndependent/gl_types.h
diff --git a/tools/win32/glslangValidator/include/glslang/MachineIndependent/glslang_tab.cpp.h b/external/win64/glslangValidator/include/glslang/MachineIndependent/glslang_tab.cpp.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/MachineIndependent/glslang_tab.cpp.h
rename to external/win64/glslangValidator/include/glslang/MachineIndependent/glslang_tab.cpp.h
diff --git a/tools/win32/glslangValidator/include/glslang/MachineIndependent/iomapper.h b/external/win64/glslangValidator/include/glslang/MachineIndependent/iomapper.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/MachineIndependent/iomapper.h
rename to external/win64/glslangValidator/include/glslang/MachineIndependent/iomapper.h
diff --git a/tools/win32/glslangValidator/include/glslang/MachineIndependent/localintermediate.h b/external/win64/glslangValidator/include/glslang/MachineIndependent/localintermediate.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/MachineIndependent/localintermediate.h
rename to external/win64/glslangValidator/include/glslang/MachineIndependent/localintermediate.h
diff --git a/tools/win32/glslangValidator/include/glslang/MachineIndependent/parseVersions.h b/external/win64/glslangValidator/include/glslang/MachineIndependent/parseVersions.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/MachineIndependent/parseVersions.h
rename to external/win64/glslangValidator/include/glslang/MachineIndependent/parseVersions.h
diff --git a/tools/win32/glslangValidator/include/glslang/MachineIndependent/preprocessor/PpContext.h b/external/win64/glslangValidator/include/glslang/MachineIndependent/preprocessor/PpContext.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/MachineIndependent/preprocessor/PpContext.h
rename to external/win64/glslangValidator/include/glslang/MachineIndependent/preprocessor/PpContext.h
diff --git a/tools/win32/glslangValidator/include/glslang/MachineIndependent/preprocessor/PpTokens.h b/external/win64/glslangValidator/include/glslang/MachineIndependent/preprocessor/PpTokens.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/MachineIndependent/preprocessor/PpTokens.h
rename to external/win64/glslangValidator/include/glslang/MachineIndependent/preprocessor/PpTokens.h
diff --git a/tools/win32/glslangValidator/include/glslang/MachineIndependent/propagateNoContraction.h b/external/win64/glslangValidator/include/glslang/MachineIndependent/propagateNoContraction.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/MachineIndependent/propagateNoContraction.h
rename to external/win64/glslangValidator/include/glslang/MachineIndependent/propagateNoContraction.h
diff --git a/tools/win32/glslangValidator/include/glslang/MachineIndependent/reflection.h b/external/win64/glslangValidator/include/glslang/MachineIndependent/reflection.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/MachineIndependent/reflection.h
rename to external/win64/glslangValidator/include/glslang/MachineIndependent/reflection.h
diff --git a/tools/win32/glslangValidator/include/glslang/Public/ShaderLang.h b/external/win64/glslangValidator/include/glslang/Public/ShaderLang.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/Public/ShaderLang.h
rename to external/win64/glslangValidator/include/glslang/Public/ShaderLang.h
diff --git a/tools/win32/glslangValidator/include/glslang/SPIRV/GLSL.ext.AMD.h b/external/win64/glslangValidator/include/glslang/SPIRV/GLSL.ext.AMD.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/SPIRV/GLSL.ext.AMD.h
rename to external/win64/glslangValidator/include/glslang/SPIRV/GLSL.ext.AMD.h
diff --git a/tools/win32/glslangValidator/include/glslang/SPIRV/GLSL.ext.EXT.h b/external/win64/glslangValidator/include/glslang/SPIRV/GLSL.ext.EXT.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/SPIRV/GLSL.ext.EXT.h
rename to external/win64/glslangValidator/include/glslang/SPIRV/GLSL.ext.EXT.h
diff --git a/tools/win32/glslangValidator/include/glslang/SPIRV/GLSL.ext.KHR.h b/external/win64/glslangValidator/include/glslang/SPIRV/GLSL.ext.KHR.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/SPIRV/GLSL.ext.KHR.h
rename to external/win64/glslangValidator/include/glslang/SPIRV/GLSL.ext.KHR.h
diff --git a/tools/win32/glslangValidator/include/glslang/SPIRV/GLSL.ext.NV.h b/external/win64/glslangValidator/include/glslang/SPIRV/GLSL.ext.NV.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/SPIRV/GLSL.ext.NV.h
rename to external/win64/glslangValidator/include/glslang/SPIRV/GLSL.ext.NV.h
diff --git a/tools/win32/glslangValidator/include/glslang/SPIRV/GLSL.std.450.h b/external/win64/glslangValidator/include/glslang/SPIRV/GLSL.std.450.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/SPIRV/GLSL.std.450.h
rename to external/win64/glslangValidator/include/glslang/SPIRV/GLSL.std.450.h
diff --git a/tools/win32/glslangValidator/include/glslang/SPIRV/GlslangToSpv.h b/external/win64/glslangValidator/include/glslang/SPIRV/GlslangToSpv.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/SPIRV/GlslangToSpv.h
rename to external/win64/glslangValidator/include/glslang/SPIRV/GlslangToSpv.h
diff --git a/tools/win32/glslangValidator/include/glslang/SPIRV/Logger.h b/external/win64/glslangValidator/include/glslang/SPIRV/Logger.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/SPIRV/Logger.h
rename to external/win64/glslangValidator/include/glslang/SPIRV/Logger.h
diff --git a/tools/win32/glslangValidator/include/glslang/SPIRV/NonSemanticDebugPrintf.h b/external/win64/glslangValidator/include/glslang/SPIRV/NonSemanticDebugPrintf.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/SPIRV/NonSemanticDebugPrintf.h
rename to external/win64/glslangValidator/include/glslang/SPIRV/NonSemanticDebugPrintf.h
diff --git a/tools/win32/glslangValidator/include/glslang/SPIRV/SPVRemapper.h b/external/win64/glslangValidator/include/glslang/SPIRV/SPVRemapper.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/SPIRV/SPVRemapper.h
rename to external/win64/glslangValidator/include/glslang/SPIRV/SPVRemapper.h
diff --git a/tools/win32/glslangValidator/include/glslang/SPIRV/SpvBuilder.h b/external/win64/glslangValidator/include/glslang/SPIRV/SpvBuilder.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/SPIRV/SpvBuilder.h
rename to external/win64/glslangValidator/include/glslang/SPIRV/SpvBuilder.h
diff --git a/tools/win32/glslangValidator/include/glslang/SPIRV/SpvTools.h b/external/win64/glslangValidator/include/glslang/SPIRV/SpvTools.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/SPIRV/SpvTools.h
rename to external/win64/glslangValidator/include/glslang/SPIRV/SpvTools.h
diff --git a/tools/win32/glslangValidator/include/glslang/SPIRV/bitutils.h b/external/win64/glslangValidator/include/glslang/SPIRV/bitutils.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/SPIRV/bitutils.h
rename to external/win64/glslangValidator/include/glslang/SPIRV/bitutils.h
diff --git a/tools/win32/glslangValidator/include/glslang/SPIRV/disassemble.h b/external/win64/glslangValidator/include/glslang/SPIRV/disassemble.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/SPIRV/disassemble.h
rename to external/win64/glslangValidator/include/glslang/SPIRV/disassemble.h
diff --git a/tools/win32/glslangValidator/include/glslang/SPIRV/doc.h b/external/win64/glslangValidator/include/glslang/SPIRV/doc.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/SPIRV/doc.h
rename to external/win64/glslangValidator/include/glslang/SPIRV/doc.h
diff --git a/tools/win32/glslangValidator/include/glslang/SPIRV/hex_float.h b/external/win64/glslangValidator/include/glslang/SPIRV/hex_float.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/SPIRV/hex_float.h
rename to external/win64/glslangValidator/include/glslang/SPIRV/hex_float.h
diff --git a/tools/win32/glslangValidator/include/glslang/SPIRV/spirv.hpp b/external/win64/glslangValidator/include/glslang/SPIRV/spirv.hpp
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/SPIRV/spirv.hpp
rename to external/win64/glslangValidator/include/glslang/SPIRV/spirv.hpp
diff --git a/tools/win32/glslangValidator/include/glslang/SPIRV/spvIR.h b/external/win64/glslangValidator/include/glslang/SPIRV/spvIR.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/SPIRV/spvIR.h
rename to external/win64/glslangValidator/include/glslang/SPIRV/spvIR.h
diff --git a/tools/win32/glslangValidator/include/glslang/build_info.h b/external/win64/glslangValidator/include/glslang/build_info.h
similarity index 100%
rename from tools/win32/glslangValidator/include/glslang/build_info.h
rename to external/win64/glslangValidator/include/glslang/build_info.h
diff --git a/tools/win32/glslangValidator/lib/HLSL.lib b/external/win64/glslangValidator/lib/HLSL.lib
similarity index 100%
rename from tools/win32/glslangValidator/lib/HLSL.lib
rename to external/win64/glslangValidator/lib/HLSL.lib
diff --git a/tools/win32/glslangValidator/lib/OGLCompiler.lib b/external/win64/glslangValidator/lib/OGLCompiler.lib
similarity index 100%
rename from tools/win32/glslangValidator/lib/OGLCompiler.lib
rename to external/win64/glslangValidator/lib/OGLCompiler.lib
diff --git a/tools/win32/glslangValidator/lib/OSDependent.lib b/external/win64/glslangValidator/lib/OSDependent.lib
similarity index 100%
rename from tools/win32/glslangValidator/lib/OSDependent.lib
rename to external/win64/glslangValidator/lib/OSDependent.lib
diff --git a/tools/win32/glslangValidator/lib/SPIRV-Tools-opt.lib b/external/win64/glslangValidator/lib/SPIRV-Tools-opt.lib
similarity index 100%
rename from tools/win32/glslangValidator/lib/SPIRV-Tools-opt.lib
rename to external/win64/glslangValidator/lib/SPIRV-Tools-opt.lib
diff --git a/tools/win32/glslangValidator/lib/SPIRV-Tools.lib b/external/win64/glslangValidator/lib/SPIRV-Tools.lib
similarity index 100%
rename from tools/win32/glslangValidator/lib/SPIRV-Tools.lib
rename to external/win64/glslangValidator/lib/SPIRV-Tools.lib
diff --git a/tools/win32/glslangValidator/lib/SPIRV.lib b/external/win64/glslangValidator/lib/SPIRV.lib
similarity index 100%
rename from tools/win32/glslangValidator/lib/SPIRV.lib
rename to external/win64/glslangValidator/lib/SPIRV.lib
diff --git a/tools/win32/glslangValidator/lib/SPVRemapper.lib b/external/win64/glslangValidator/lib/SPVRemapper.lib
similarity index 100%
rename from tools/win32/glslangValidator/lib/SPVRemapper.lib
rename to external/win64/glslangValidator/lib/SPVRemapper.lib
diff --git a/tools/win32/glslangValidator/lib/glslang.lib b/external/win64/glslangValidator/lib/glslang.lib
similarity index 100%
rename from tools/win32/glslangValidator/lib/glslang.lib
rename to external/win64/glslangValidator/lib/glslang.lib
diff --git a/game/Cargo.toml b/game/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..552d0306c965bdb16f8bf574c070f13a2cb498d9
--- /dev/null
+++ b/game/Cargo.toml
@@ -0,0 +1,43 @@
+[package]
+name = "vulkan_app"
+version = "0.1.0"
+authors = ["Scott Johnson <zeropointtwo@gmail.com>"]
+edition = "2018"
+description = "An in progress game"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+#[profile.release]
+#debug = false
+
+[dependencies]
+
+common = { path = "../common" }
+
+log         = "0.4.17"
+env_logger  = "0.9.0"
+winit       = "0.25.0"
+ash         = "0.37.0"
+ash-window  = "0.10.0"
+image       = "0.24.2"
+cgmath      = "0.18.0"
+rayon       = "1.5.2"
+
+# Fonts
+fontdue     = "0.4.0"
+csv         = "1.1.6"
+serde       = { version = "1.0.137", features = ["derive"]}
+serde_json  = "1.0.81"
+toml        = "0.5.9"
+
+# IMGui
+imgui               = "0.8.2"
+imgui-winit-support = "0.8.2"
+
+data-url    = "0.1.1"
+
+[target.'cfg(target_os="macos")'.dependencies]
+core-foundation = "0.9.3"
+
+[target.'cfg(target_os="windows")'.dependencies]
+#winapi      = "0.3.9"
+
diff --git a/README.md b/game/README.md
similarity index 61%
rename from README.md
rename to game/README.md
index 582319543b1f36bdadd642fa3b23997fffa4bb4d..6fad4c3d539d1ab7ead4571432a959d1d3bdd2b5 100644
--- a/README.md
+++ b/game/README.md
@@ -1,9 +1,13 @@
 
+# General Setup
+
+* Install `sqlx-cli` as a cargo tool with the command `cargo install sqlx-cli`.
+* Before running the web server, you will need to set the env variable `DATABASE_URL` to the location of your sqlite database.
+
 # Windows Setup
 
 * Download ``rustup-init`` from the [rustup](https://rustup.rs/) website
 * Install `rustup-init`
-    * The build is only tested using the stable x86_64-pc-windows-gnu toolchain. The msvc toolchain should work, but I don't have MSVC to test it.
 
 # Building on Windows
 
@@ -15,6 +19,14 @@ Run the `build_all.bat` to build using the windows gnu toolchain. The build will
 * Run `build_all.sh` to build both Linux and Windows builds. The Windows builds should run with Wine and on Windows itself.
 * If you only want to build for a specific platform, run the `build_all.sh` script for the desired os under the `build_scripts` folder.
 
+## Cross Compiling windows MSVC from Linux
+
+In addition to the usual linux setup, you will need to add the `x86_64-pc-windows-msvc` target with `rustup` and 
+install a cargo tool called `cargo-xwin`. This can be done with the following commands:
+
+* `rustup target add x86_64-pc-windows-msvc`
+* `cargo install cargo-xwin`
+
 # Mac Notes
 
 Currently, MoltenVK defaults to disabling the argument buffer code path. This prevents the shaders from supporting the 
diff --git a/resources/fonts/Roboto-Regular.ttf b/game/resources/fonts/Roboto-Regular.ttf
similarity index 100%
rename from resources/fonts/Roboto-Regular.ttf
rename to game/resources/fonts/Roboto-Regular.ttf
diff --git a/resources/fonts/roboto-regular.csv b/game/resources/fonts/roboto-regular.csv
similarity index 100%
rename from resources/fonts/roboto-regular.csv
rename to game/resources/fonts/roboto-regular.csv
diff --git a/resources/fonts/roboto-regular.png b/game/resources/fonts/roboto-regular.png
similarity index 100%
rename from resources/fonts/roboto-regular.png
rename to game/resources/fonts/roboto-regular.png
diff --git a/resources/images/alex/alex-sheet-0.indexed.png b/game/resources/images/alex/alex-sheet-0.indexed.png
similarity index 100%
rename from resources/images/alex/alex-sheet-0.indexed.png
rename to game/resources/images/alex/alex-sheet-0.indexed.png
diff --git a/resources/images/alex/alex-sheet-1.indexed.png b/game/resources/images/alex/alex-sheet-1.indexed.png
similarity index 100%
rename from resources/images/alex/alex-sheet-1.indexed.png
rename to game/resources/images/alex/alex-sheet-1.indexed.png
diff --git a/resources/images/alex/alex-sheet-2.indexed.png b/game/resources/images/alex/alex-sheet-2.indexed.png
similarity index 100%
rename from resources/images/alex/alex-sheet-2.indexed.png
rename to game/resources/images/alex/alex-sheet-2.indexed.png
diff --git a/resources/images/alex/alex-sheet-3.indexed.png b/game/resources/images/alex/alex-sheet-3.indexed.png
similarity index 100%
rename from resources/images/alex/alex-sheet-3.indexed.png
rename to game/resources/images/alex/alex-sheet-3.indexed.png
diff --git a/resources/images/alex/alex-sheet-4.indexed.png b/game/resources/images/alex/alex-sheet-4.indexed.png
similarity index 100%
rename from resources/images/alex/alex-sheet-4.indexed.png
rename to game/resources/images/alex/alex-sheet-4.indexed.png
diff --git a/resources/images/alex/alex-sheet-5.indexed.png b/game/resources/images/alex/alex-sheet-5.indexed.png
similarity index 100%
rename from resources/images/alex/alex-sheet-5.indexed.png
rename to game/resources/images/alex/alex-sheet-5.indexed.png
diff --git a/resources/images/alex/alex-sheet-6.indexed.png b/game/resources/images/alex/alex-sheet-6.indexed.png
similarity index 100%
rename from resources/images/alex/alex-sheet-6.indexed.png
rename to game/resources/images/alex/alex-sheet-6.indexed.png
diff --git a/resources/images/alex/alex-sheet-7.indexed.png b/game/resources/images/alex/alex-sheet-7.indexed.png
similarity index 100%
rename from resources/images/alex/alex-sheet-7.indexed.png
rename to game/resources/images/alex/alex-sheet-7.indexed.png
diff --git a/resources/images/alex/alex-sheet-8.indexed.png b/game/resources/images/alex/alex-sheet-8.indexed.png
similarity index 100%
rename from resources/images/alex/alex-sheet-8.indexed.png
rename to game/resources/images/alex/alex-sheet-8.indexed.png
diff --git a/resources/images/alex/alex-sheet-9.indexed.png b/game/resources/images/alex/alex-sheet-9.indexed.png
similarity index 100%
rename from resources/images/alex/alex-sheet-9.indexed.png
rename to game/resources/images/alex/alex-sheet-9.indexed.png
diff --git a/resources/images/aurora_animation.indexed.png b/game/resources/images/aurora_animation.indexed.png
similarity index 100%
rename from resources/images/aurora_animation.indexed.png
rename to game/resources/images/aurora_animation.indexed.png
diff --git a/resources/images/chun-li/chun-li-sheet-0.indexed.png b/game/resources/images/chun-li/chun-li-sheet-0.indexed.png
similarity index 100%
rename from resources/images/chun-li/chun-li-sheet-0.indexed.png
rename to game/resources/images/chun-li/chun-li-sheet-0.indexed.png
diff --git a/resources/images/chun-li/chun-li-sheet-1.indexed.png b/game/resources/images/chun-li/chun-li-sheet-1.indexed.png
similarity index 100%
rename from resources/images/chun-li/chun-li-sheet-1.indexed.png
rename to game/resources/images/chun-li/chun-li-sheet-1.indexed.png
diff --git a/resources/images/chun-li/chun-li-sheet-2.indexed.png b/game/resources/images/chun-li/chun-li-sheet-2.indexed.png
similarity index 100%
rename from resources/images/chun-li/chun-li-sheet-2.indexed.png
rename to game/resources/images/chun-li/chun-li-sheet-2.indexed.png
diff --git a/resources/images/chun-li/chun-li-sheet-3.indexed.png b/game/resources/images/chun-li/chun-li-sheet-3.indexed.png
similarity index 100%
rename from resources/images/chun-li/chun-li-sheet-3.indexed.png
rename to game/resources/images/chun-li/chun-li-sheet-3.indexed.png
diff --git a/resources/images/chun-li/chun-li-sheet-4.indexed.png b/game/resources/images/chun-li/chun-li-sheet-4.indexed.png
similarity index 100%
rename from resources/images/chun-li/chun-li-sheet-4.indexed.png
rename to game/resources/images/chun-li/chun-li-sheet-4.indexed.png
diff --git a/resources/images/chun-li/chun-li-sheet-5.indexed.png b/game/resources/images/chun-li/chun-li-sheet-5.indexed.png
similarity index 100%
rename from resources/images/chun-li/chun-li-sheet-5.indexed.png
rename to game/resources/images/chun-li/chun-li-sheet-5.indexed.png
diff --git a/resources/images/chun-li/chun-li-sheet-6.indexed.png b/game/resources/images/chun-li/chun-li-sheet-6.indexed.png
similarity index 100%
rename from resources/images/chun-li/chun-li-sheet-6.indexed.png
rename to game/resources/images/chun-li/chun-li-sheet-6.indexed.png
diff --git a/resources/images/dudley.indexed.png b/game/resources/images/dudley.indexed.png
similarity index 100%
rename from resources/images/dudley.indexed.png
rename to game/resources/images/dudley.indexed.png
diff --git a/resources/images/dudley/dudley-sheet-0.indexed.png b/game/resources/images/dudley/dudley-sheet-0.indexed.png
similarity index 100%
rename from resources/images/dudley/dudley-sheet-0.indexed.png
rename to game/resources/images/dudley/dudley-sheet-0.indexed.png
diff --git a/resources/images/dudley/dudley-sheet-1.indexed.png b/game/resources/images/dudley/dudley-sheet-1.indexed.png
similarity index 100%
rename from resources/images/dudley/dudley-sheet-1.indexed.png
rename to game/resources/images/dudley/dudley-sheet-1.indexed.png
diff --git a/resources/images/dudley/dudley-sheet-2.indexed.png b/game/resources/images/dudley/dudley-sheet-2.indexed.png
similarity index 100%
rename from resources/images/dudley/dudley-sheet-2.indexed.png
rename to game/resources/images/dudley/dudley-sheet-2.indexed.png
diff --git a/resources/images/dudley/dudley-sheet-3.indexed.png b/game/resources/images/dudley/dudley-sheet-3.indexed.png
similarity index 100%
rename from resources/images/dudley/dudley-sheet-3.indexed.png
rename to game/resources/images/dudley/dudley-sheet-3.indexed.png
diff --git a/resources/images/dudley/dudley-sheet-4.indexed.png b/game/resources/images/dudley/dudley-sheet-4.indexed.png
similarity index 100%
rename from resources/images/dudley/dudley-sheet-4.indexed.png
rename to game/resources/images/dudley/dudley-sheet-4.indexed.png
diff --git a/resources/images/dudley/dudley-sheet-5.indexed.png b/game/resources/images/dudley/dudley-sheet-5.indexed.png
similarity index 100%
rename from resources/images/dudley/dudley-sheet-5.indexed.png
rename to game/resources/images/dudley/dudley-sheet-5.indexed.png
diff --git a/resources/images/hugo/hugo-sheet-0.indexed.png b/game/resources/images/hugo/hugo-sheet-0.indexed.png
similarity index 100%
rename from resources/images/hugo/hugo-sheet-0.indexed.png
rename to game/resources/images/hugo/hugo-sheet-0.indexed.png
diff --git a/resources/images/hugo/hugo-sheet-1.indexed.png b/game/resources/images/hugo/hugo-sheet-1.indexed.png
similarity index 100%
rename from resources/images/hugo/hugo-sheet-1.indexed.png
rename to game/resources/images/hugo/hugo-sheet-1.indexed.png
diff --git a/resources/images/hugo/hugo-sheet-10.indexed.png b/game/resources/images/hugo/hugo-sheet-10.indexed.png
similarity index 100%
rename from resources/images/hugo/hugo-sheet-10.indexed.png
rename to game/resources/images/hugo/hugo-sheet-10.indexed.png
diff --git a/resources/images/hugo/hugo-sheet-11.indexed.png b/game/resources/images/hugo/hugo-sheet-11.indexed.png
similarity index 100%
rename from resources/images/hugo/hugo-sheet-11.indexed.png
rename to game/resources/images/hugo/hugo-sheet-11.indexed.png
diff --git a/resources/images/hugo/hugo-sheet-12.indexed.png b/game/resources/images/hugo/hugo-sheet-12.indexed.png
similarity index 100%
rename from resources/images/hugo/hugo-sheet-12.indexed.png
rename to game/resources/images/hugo/hugo-sheet-12.indexed.png
diff --git a/resources/images/hugo/hugo-sheet-13.indexed.png b/game/resources/images/hugo/hugo-sheet-13.indexed.png
similarity index 100%
rename from resources/images/hugo/hugo-sheet-13.indexed.png
rename to game/resources/images/hugo/hugo-sheet-13.indexed.png
diff --git a/resources/images/hugo/hugo-sheet-2.indexed.png b/game/resources/images/hugo/hugo-sheet-2.indexed.png
similarity index 100%
rename from resources/images/hugo/hugo-sheet-2.indexed.png
rename to game/resources/images/hugo/hugo-sheet-2.indexed.png
diff --git a/resources/images/hugo/hugo-sheet-3.indexed.png b/game/resources/images/hugo/hugo-sheet-3.indexed.png
similarity index 100%
rename from resources/images/hugo/hugo-sheet-3.indexed.png
rename to game/resources/images/hugo/hugo-sheet-3.indexed.png
diff --git a/resources/images/hugo/hugo-sheet-4.indexed.png b/game/resources/images/hugo/hugo-sheet-4.indexed.png
similarity index 100%
rename from resources/images/hugo/hugo-sheet-4.indexed.png
rename to game/resources/images/hugo/hugo-sheet-4.indexed.png
diff --git a/resources/images/hugo/hugo-sheet-5.indexed.png b/game/resources/images/hugo/hugo-sheet-5.indexed.png
similarity index 100%
rename from resources/images/hugo/hugo-sheet-5.indexed.png
rename to game/resources/images/hugo/hugo-sheet-5.indexed.png
diff --git a/resources/images/hugo/hugo-sheet-6.indexed.png b/game/resources/images/hugo/hugo-sheet-6.indexed.png
similarity index 100%
rename from resources/images/hugo/hugo-sheet-6.indexed.png
rename to game/resources/images/hugo/hugo-sheet-6.indexed.png
diff --git a/resources/images/hugo/hugo-sheet-7.indexed.png b/game/resources/images/hugo/hugo-sheet-7.indexed.png
similarity index 100%
rename from resources/images/hugo/hugo-sheet-7.indexed.png
rename to game/resources/images/hugo/hugo-sheet-7.indexed.png
diff --git a/resources/images/hugo/hugo-sheet-8.indexed.png b/game/resources/images/hugo/hugo-sheet-8.indexed.png
similarity index 100%
rename from resources/images/hugo/hugo-sheet-8.indexed.png
rename to game/resources/images/hugo/hugo-sheet-8.indexed.png
diff --git a/resources/images/hugo/hugo-sheet-9.indexed.png b/game/resources/images/hugo/hugo-sheet-9.indexed.png
similarity index 100%
rename from resources/images/hugo/hugo-sheet-9.indexed.png
rename to game/resources/images/hugo/hugo-sheet-9.indexed.png
diff --git a/resources/images/ibuki/ibuki-sheet-0.indexed.png b/game/resources/images/ibuki/ibuki-sheet-0.indexed.png
similarity index 100%
rename from resources/images/ibuki/ibuki-sheet-0.indexed.png
rename to game/resources/images/ibuki/ibuki-sheet-0.indexed.png
diff --git a/resources/images/ibuki/ibuki-sheet-1.indexed.png b/game/resources/images/ibuki/ibuki-sheet-1.indexed.png
similarity index 100%
rename from resources/images/ibuki/ibuki-sheet-1.indexed.png
rename to game/resources/images/ibuki/ibuki-sheet-1.indexed.png
diff --git a/resources/images/ibuki/ibuki-sheet-10.indexed.png b/game/resources/images/ibuki/ibuki-sheet-10.indexed.png
similarity index 100%
rename from resources/images/ibuki/ibuki-sheet-10.indexed.png
rename to game/resources/images/ibuki/ibuki-sheet-10.indexed.png
diff --git a/resources/images/ibuki/ibuki-sheet-2.indexed.png b/game/resources/images/ibuki/ibuki-sheet-2.indexed.png
similarity index 100%
rename from resources/images/ibuki/ibuki-sheet-2.indexed.png
rename to game/resources/images/ibuki/ibuki-sheet-2.indexed.png
diff --git a/resources/images/ibuki/ibuki-sheet-3.indexed.png b/game/resources/images/ibuki/ibuki-sheet-3.indexed.png
similarity index 100%
rename from resources/images/ibuki/ibuki-sheet-3.indexed.png
rename to game/resources/images/ibuki/ibuki-sheet-3.indexed.png
diff --git a/resources/images/ibuki/ibuki-sheet-4.indexed.png b/game/resources/images/ibuki/ibuki-sheet-4.indexed.png
similarity index 100%
rename from resources/images/ibuki/ibuki-sheet-4.indexed.png
rename to game/resources/images/ibuki/ibuki-sheet-4.indexed.png
diff --git a/resources/images/ibuki/ibuki-sheet-5.indexed.png b/game/resources/images/ibuki/ibuki-sheet-5.indexed.png
similarity index 100%
rename from resources/images/ibuki/ibuki-sheet-5.indexed.png
rename to game/resources/images/ibuki/ibuki-sheet-5.indexed.png
diff --git a/resources/images/ibuki/ibuki-sheet-6.indexed.png b/game/resources/images/ibuki/ibuki-sheet-6.indexed.png
similarity index 100%
rename from resources/images/ibuki/ibuki-sheet-6.indexed.png
rename to game/resources/images/ibuki/ibuki-sheet-6.indexed.png
diff --git a/resources/images/ibuki/ibuki-sheet-7.indexed.png b/game/resources/images/ibuki/ibuki-sheet-7.indexed.png
similarity index 100%
rename from resources/images/ibuki/ibuki-sheet-7.indexed.png
rename to game/resources/images/ibuki/ibuki-sheet-7.indexed.png
diff --git a/resources/images/ibuki/ibuki-sheet-8.indexed.png b/game/resources/images/ibuki/ibuki-sheet-8.indexed.png
similarity index 100%
rename from resources/images/ibuki/ibuki-sheet-8.indexed.png
rename to game/resources/images/ibuki/ibuki-sheet-8.indexed.png
diff --git a/resources/images/ibuki/ibuki-sheet-9.indexed.png b/game/resources/images/ibuki/ibuki-sheet-9.indexed.png
similarity index 100%
rename from resources/images/ibuki/ibuki-sheet-9.indexed.png
rename to game/resources/images/ibuki/ibuki-sheet-9.indexed.png
diff --git a/resources/images/ken/ken-sheet-0.indexed.png b/game/resources/images/ken/ken-sheet-0.indexed.png
similarity index 100%
rename from resources/images/ken/ken-sheet-0.indexed.png
rename to game/resources/images/ken/ken-sheet-0.indexed.png
diff --git a/resources/images/ken/ken-sheet-1.indexed.png b/game/resources/images/ken/ken-sheet-1.indexed.png
similarity index 100%
rename from resources/images/ken/ken-sheet-1.indexed.png
rename to game/resources/images/ken/ken-sheet-1.indexed.png
diff --git a/resources/images/ken/ken-sheet-2.indexed.png b/game/resources/images/ken/ken-sheet-2.indexed.png
similarity index 100%
rename from resources/images/ken/ken-sheet-2.indexed.png
rename to game/resources/images/ken/ken-sheet-2.indexed.png
diff --git a/resources/images/ken/ken-sheet-3.indexed.png b/game/resources/images/ken/ken-sheet-3.indexed.png
similarity index 100%
rename from resources/images/ken/ken-sheet-3.indexed.png
rename to game/resources/images/ken/ken-sheet-3.indexed.png
diff --git a/resources/images/ken/ken-sheet-4.indexed.png b/game/resources/images/ken/ken-sheet-4.indexed.png
similarity index 100%
rename from resources/images/ken/ken-sheet-4.indexed.png
rename to game/resources/images/ken/ken-sheet-4.indexed.png
diff --git a/resources/images/ken/ken-sheet-5.indexed.png b/game/resources/images/ken/ken-sheet-5.indexed.png
similarity index 100%
rename from resources/images/ken/ken-sheet-5.indexed.png
rename to game/resources/images/ken/ken-sheet-5.indexed.png
diff --git a/resources/images/ken/ken-sheet-6.indexed.png b/game/resources/images/ken/ken-sheet-6.indexed.png
similarity index 100%
rename from resources/images/ken/ken-sheet-6.indexed.png
rename to game/resources/images/ken/ken-sheet-6.indexed.png
diff --git a/resources/images/megaman_sprites.indexed.png b/game/resources/images/megaman_sprites.indexed.png
similarity index 100%
rename from resources/images/megaman_sprites.indexed.png
rename to game/resources/images/megaman_sprites.indexed.png
diff --git a/resources/images/remy/remy-sheet-0.indexed.png b/game/resources/images/remy/remy-sheet-0.indexed.png
similarity index 100%
rename from resources/images/remy/remy-sheet-0.indexed.png
rename to game/resources/images/remy/remy-sheet-0.indexed.png
diff --git a/resources/images/remy/remy-sheet-1.indexed.png b/game/resources/images/remy/remy-sheet-1.indexed.png
similarity index 100%
rename from resources/images/remy/remy-sheet-1.indexed.png
rename to game/resources/images/remy/remy-sheet-1.indexed.png
diff --git a/resources/images/remy/remy-sheet-2.indexed.png b/game/resources/images/remy/remy-sheet-2.indexed.png
similarity index 100%
rename from resources/images/remy/remy-sheet-2.indexed.png
rename to game/resources/images/remy/remy-sheet-2.indexed.png
diff --git a/resources/images/remy/remy-sheet-3.indexed.png b/game/resources/images/remy/remy-sheet-3.indexed.png
similarity index 100%
rename from resources/images/remy/remy-sheet-3.indexed.png
rename to game/resources/images/remy/remy-sheet-3.indexed.png
diff --git a/resources/images/remy/remy-sheet-4.indexed.png b/game/resources/images/remy/remy-sheet-4.indexed.png
similarity index 100%
rename from resources/images/remy/remy-sheet-4.indexed.png
rename to game/resources/images/remy/remy-sheet-4.indexed.png
diff --git a/resources/images/scott_flag.jpg b/game/resources/images/scott_flag.jpg
similarity index 100%
rename from resources/images/scott_flag.jpg
rename to game/resources/images/scott_flag.jpg
diff --git a/resources/images/twelve/twelve-sheet-0.indexed.png b/game/resources/images/twelve/twelve-sheet-0.indexed.png
similarity index 100%
rename from resources/images/twelve/twelve-sheet-0.indexed.png
rename to game/resources/images/twelve/twelve-sheet-0.indexed.png
diff --git a/resources/images/twelve/twelve-sheet-1.indexed.png b/game/resources/images/twelve/twelve-sheet-1.indexed.png
similarity index 100%
rename from resources/images/twelve/twelve-sheet-1.indexed.png
rename to game/resources/images/twelve/twelve-sheet-1.indexed.png
diff --git a/resources/images/twelve/twelve-sheet-2.indexed.png b/game/resources/images/twelve/twelve-sheet-2.indexed.png
similarity index 100%
rename from resources/images/twelve/twelve-sheet-2.indexed.png
rename to game/resources/images/twelve/twelve-sheet-2.indexed.png
diff --git a/resources/images/twelve/twelve-sheet-3.indexed.png b/game/resources/images/twelve/twelve-sheet-3.indexed.png
similarity index 100%
rename from resources/images/twelve/twelve-sheet-3.indexed.png
rename to game/resources/images/twelve/twelve-sheet-3.indexed.png
diff --git a/resources/images/twelve/twelve-sheet-4.indexed.png b/game/resources/images/twelve/twelve-sheet-4.indexed.png
similarity index 100%
rename from resources/images/twelve/twelve-sheet-4.indexed.png
rename to game/resources/images/twelve/twelve-sheet-4.indexed.png
diff --git a/resources/images/twelve/twelve-sheet-5.indexed.png b/game/resources/images/twelve/twelve-sheet-5.indexed.png
similarity index 100%
rename from resources/images/twelve/twelve-sheet-5.indexed.png
rename to game/resources/images/twelve/twelve-sheet-5.indexed.png
diff --git a/resources/images/twelve/twelve-sheet-6.indexed.png b/game/resources/images/twelve/twelve-sheet-6.indexed.png
similarity index 100%
rename from resources/images/twelve/twelve-sheet-6.indexed.png
rename to game/resources/images/twelve/twelve-sheet-6.indexed.png
diff --git a/resources/images/twelve/twelve-sheet-7.indexed.png b/game/resources/images/twelve/twelve-sheet-7.indexed.png
similarity index 100%
rename from resources/images/twelve/twelve-sheet-7.indexed.png
rename to game/resources/images/twelve/twelve-sheet-7.indexed.png
diff --git a/resources/models/city/scene.bin b/game/resources/models/city/scene.bin
similarity index 100%
rename from resources/models/city/scene.bin
rename to game/resources/models/city/scene.bin
diff --git a/resources/models/city/scene.gltf b/game/resources/models/city/scene.gltf
similarity index 100%
rename from resources/models/city/scene.gltf
rename to game/resources/models/city/scene.gltf
diff --git a/resources/models/city/textures/Basketball_baseColor.png b/game/resources/models/city/textures/Basketball_baseColor.png
similarity index 100%
rename from resources/models/city/textures/Basketball_baseColor.png
rename to game/resources/models/city/textures/Basketball_baseColor.png
diff --git a/resources/models/city/textures/CityProps1GLOW_baseColor.png b/game/resources/models/city/textures/CityProps1GLOW_baseColor.png
similarity index 100%
rename from resources/models/city/textures/CityProps1GLOW_baseColor.png
rename to game/resources/models/city/textures/CityProps1GLOW_baseColor.png
diff --git a/resources/models/city/textures/CityProps1GLOW_emissive.png b/game/resources/models/city/textures/CityProps1GLOW_emissive.png
similarity index 100%
rename from resources/models/city/textures/CityProps1GLOW_emissive.png
rename to game/resources/models/city/textures/CityProps1GLOW_emissive.png
diff --git a/resources/models/city/textures/CityProps_baseColor.png b/game/resources/models/city/textures/CityProps_baseColor.png
similarity index 100%
rename from resources/models/city/textures/CityProps_baseColor.png
rename to game/resources/models/city/textures/CityProps_baseColor.png
diff --git a/resources/models/city/textures/Clinic_baseColor.png b/game/resources/models/city/textures/Clinic_baseColor.png
similarity index 100%
rename from resources/models/city/textures/Clinic_baseColor.png
rename to game/resources/models/city/textures/Clinic_baseColor.png
diff --git a/resources/models/city/textures/FillerBuildings1GLOW_baseColor.png b/game/resources/models/city/textures/FillerBuildings1GLOW_baseColor.png
similarity index 100%
rename from resources/models/city/textures/FillerBuildings1GLOW_baseColor.png
rename to game/resources/models/city/textures/FillerBuildings1GLOW_baseColor.png
diff --git a/resources/models/city/textures/FillerBuildings1GLOW_emissive.png b/game/resources/models/city/textures/FillerBuildings1GLOW_emissive.png
similarity index 100%
rename from resources/models/city/textures/FillerBuildings1GLOW_emissive.png
rename to game/resources/models/city/textures/FillerBuildings1GLOW_emissive.png
diff --git a/resources/models/city/textures/FillerBuildings1_baseColor.png b/game/resources/models/city/textures/FillerBuildings1_baseColor.png
similarity index 100%
rename from resources/models/city/textures/FillerBuildings1_baseColor.png
rename to game/resources/models/city/textures/FillerBuildings1_baseColor.png
diff --git a/resources/models/city/textures/FishFactory1GLOW_baseColor.png b/game/resources/models/city/textures/FishFactory1GLOW_baseColor.png
similarity index 100%
rename from resources/models/city/textures/FishFactory1GLOW_baseColor.png
rename to game/resources/models/city/textures/FishFactory1GLOW_baseColor.png
diff --git a/resources/models/city/textures/FishFactory1GLOW_emissive.png b/game/resources/models/city/textures/FishFactory1GLOW_emissive.png
similarity index 100%
rename from resources/models/city/textures/FishFactory1GLOW_emissive.png
rename to game/resources/models/city/textures/FishFactory1GLOW_emissive.png
diff --git a/resources/models/city/textures/FishFactory_baseColor.png b/game/resources/models/city/textures/FishFactory_baseColor.png
similarity index 100%
rename from resources/models/city/textures/FishFactory_baseColor.png
rename to game/resources/models/city/textures/FishFactory_baseColor.png
diff --git a/resources/models/city/textures/LMProjects1GLOW_baseColor.png b/game/resources/models/city/textures/LMProjects1GLOW_baseColor.png
similarity index 100%
rename from resources/models/city/textures/LMProjects1GLOW_baseColor.png
rename to game/resources/models/city/textures/LMProjects1GLOW_baseColor.png
diff --git a/resources/models/city/textures/LMProjects1GLOW_emissive.png b/game/resources/models/city/textures/LMProjects1GLOW_emissive.png
similarity index 100%
rename from resources/models/city/textures/LMProjects1GLOW_emissive.png
rename to game/resources/models/city/textures/LMProjects1GLOW_emissive.png
diff --git a/resources/models/city/textures/LMProjects_baseColor.png b/game/resources/models/city/textures/LMProjects_baseColor.png
similarity index 100%
rename from resources/models/city/textures/LMProjects_baseColor.png
rename to game/resources/models/city/textures/LMProjects_baseColor.png
diff --git a/resources/models/city/textures/Laundrymat_baseColor.png b/game/resources/models/city/textures/Laundrymat_baseColor.png
similarity index 100%
rename from resources/models/city/textures/Laundrymat_baseColor.png
rename to game/resources/models/city/textures/Laundrymat_baseColor.png
diff --git a/resources/models/city/textures/Paramount1GLOW_baseColor.png b/game/resources/models/city/textures/Paramount1GLOW_baseColor.png
similarity index 100%
rename from resources/models/city/textures/Paramount1GLOW_baseColor.png
rename to game/resources/models/city/textures/Paramount1GLOW_baseColor.png
diff --git a/resources/models/city/textures/Paramount1GLOW_emissive.png b/game/resources/models/city/textures/Paramount1GLOW_emissive.png
similarity index 100%
rename from resources/models/city/textures/Paramount1GLOW_emissive.png
rename to game/resources/models/city/textures/Paramount1GLOW_emissive.png
diff --git a/resources/models/city/textures/Paramount_baseColor.png b/game/resources/models/city/textures/Paramount_baseColor.png
similarity index 100%
rename from resources/models/city/textures/Paramount_baseColor.png
rename to game/resources/models/city/textures/Paramount_baseColor.png
diff --git a/resources/models/city/textures/Pawnshop1GLOW_baseColor.png b/game/resources/models/city/textures/Pawnshop1GLOW_baseColor.png
similarity index 100%
rename from resources/models/city/textures/Pawnshop1GLOW_baseColor.png
rename to game/resources/models/city/textures/Pawnshop1GLOW_baseColor.png
diff --git a/resources/models/city/textures/Pawnshop1GLOW_emissive.png b/game/resources/models/city/textures/Pawnshop1GLOW_emissive.png
similarity index 100%
rename from resources/models/city/textures/Pawnshop1GLOW_emissive.png
rename to game/resources/models/city/textures/Pawnshop1GLOW_emissive.png
diff --git a/resources/models/city/textures/Pawnshop_baseColor.png b/game/resources/models/city/textures/Pawnshop_baseColor.png
similarity index 100%
rename from resources/models/city/textures/Pawnshop_baseColor.png
rename to game/resources/models/city/textures/Pawnshop_baseColor.png
diff --git a/resources/models/city/textures/RoadsGround_baseColor.png b/game/resources/models/city/textures/RoadsGround_baseColor.png
similarity index 100%
rename from resources/models/city/textures/RoadsGround_baseColor.png
rename to game/resources/models/city/textures/RoadsGround_baseColor.png
diff --git a/resources/models/city/textures/Tire_baseColor.png b/game/resources/models/city/textures/Tire_baseColor.png
similarity index 100%
rename from resources/models/city/textures/Tire_baseColor.png
rename to game/resources/models/city/textures/Tire_baseColor.png
diff --git a/resources/models/city/textures/elise_baseColor.png b/game/resources/models/city/textures/elise_baseColor.png
similarity index 100%
rename from resources/models/city/textures/elise_baseColor.png
rename to game/resources/models/city/textures/elise_baseColor.png
diff --git a/resources/models/city/textures/elise_emissive.png b/game/resources/models/city/textures/elise_emissive.png
similarity index 100%
rename from resources/models/city/textures/elise_emissive.png
rename to game/resources/models/city/textures/elise_emissive.png
diff --git a/resources/models/luffy/license.txt b/game/resources/models/luffy/license.txt
similarity index 100%
rename from resources/models/luffy/license.txt
rename to game/resources/models/luffy/license.txt
diff --git a/resources/models/luffy/textures/LuffyD_baseColor.png b/game/resources/models/luffy/textures/LuffyD_baseColor.png
similarity index 100%
rename from resources/models/luffy/textures/LuffyD_baseColor.png
rename to game/resources/models/luffy/textures/LuffyD_baseColor.png
diff --git a/resources/models/luffy/textures/lambert4_baseColor.png b/game/resources/models/luffy/textures/lambert4_baseColor.png
similarity index 100%
rename from resources/models/luffy/textures/lambert4_baseColor.png
rename to game/resources/models/luffy/textures/lambert4_baseColor.png
diff --git a/resources/models/luffy/untitled.bin b/game/resources/models/luffy/untitled.bin
similarity index 100%
rename from resources/models/luffy/untitled.bin
rename to game/resources/models/luffy/untitled.bin
diff --git a/resources/models/luffy/untitled.gltf b/game/resources/models/luffy/untitled.gltf
similarity index 100%
rename from resources/models/luffy/untitled.gltf
rename to game/resources/models/luffy/untitled.gltf
diff --git a/resources/models/milkyway/scene.bin b/game/resources/models/milkyway/scene.bin
similarity index 100%
rename from resources/models/milkyway/scene.bin
rename to game/resources/models/milkyway/scene.bin
diff --git a/resources/models/milkyway/scene.gltf b/game/resources/models/milkyway/scene.gltf
similarity index 100%
rename from resources/models/milkyway/scene.gltf
rename to game/resources/models/milkyway/scene.gltf
diff --git a/resources/models/milkyway/textures/lambert1_emissive.jpeg b/game/resources/models/milkyway/textures/lambert1_emissive.jpeg
similarity index 100%
rename from resources/models/milkyway/textures/lambert1_emissive.jpeg
rename to game/resources/models/milkyway/textures/lambert1_emissive.jpeg
diff --git a/resources/models/model_sources.txt b/game/resources/models/model_sources.txt
similarity index 100%
rename from resources/models/model_sources.txt
rename to game/resources/models/model_sources.txt
diff --git a/resources/models/spiderman/scene.bin b/game/resources/models/spiderman/scene.bin
similarity index 100%
rename from resources/models/spiderman/scene.bin
rename to game/resources/models/spiderman/scene.bin
diff --git a/resources/models/spiderman/scene.gltf b/game/resources/models/spiderman/scene.gltf
similarity index 100%
rename from resources/models/spiderman/scene.gltf
rename to game/resources/models/spiderman/scene.gltf
diff --git a/resources/models/spiderman/textures/RootNode_baseColor.jpeg b/game/resources/models/spiderman/textures/RootNode_baseColor.jpeg
similarity index 100%
rename from resources/models/spiderman/textures/RootNode_baseColor.jpeg
rename to game/resources/models/spiderman/textures/RootNode_baseColor.jpeg
diff --git a/resources/models/spiderman/textures/RootNode_metallicRoughness.png b/game/resources/models/spiderman/textures/RootNode_metallicRoughness.png
similarity index 100%
rename from resources/models/spiderman/textures/RootNode_metallicRoughness.png
rename to game/resources/models/spiderman/textures/RootNode_metallicRoughness.png
diff --git a/resources/shaders/grid.frag b/game/resources/shaders/grid.frag
similarity index 100%
rename from resources/shaders/grid.frag
rename to game/resources/shaders/grid.frag
diff --git a/resources/shaders/grid.vert b/game/resources/shaders/grid.vert
similarity index 100%
rename from resources/shaders/grid.vert
rename to game/resources/shaders/grid.vert
diff --git a/resources/shaders/imgui.frag b/game/resources/shaders/imgui.frag
similarity index 100%
rename from resources/shaders/imgui.frag
rename to game/resources/shaders/imgui.frag
diff --git a/resources/shaders/imgui.vert b/game/resources/shaders/imgui.vert
similarity index 100%
rename from resources/shaders/imgui.vert
rename to game/resources/shaders/imgui.vert
diff --git a/resources/shaders/msdf.frag b/game/resources/shaders/msdf.frag
similarity index 100%
rename from resources/shaders/msdf.frag
rename to game/resources/shaders/msdf.frag
diff --git a/resources/shaders/msdf.vert b/game/resources/shaders/msdf.vert
similarity index 100%
rename from resources/shaders/msdf.vert
rename to game/resources/shaders/msdf.vert
diff --git a/resources/shaders/shader.frag b/game/resources/shaders/shader.frag
similarity index 100%
rename from resources/shaders/shader.frag
rename to game/resources/shaders/shader.frag
diff --git a/resources/shaders/shader.vert b/game/resources/shaders/shader.vert
similarity index 100%
rename from resources/shaders/shader.vert
rename to game/resources/shaders/shader.vert
diff --git a/resources/shaders/sprite.frag b/game/resources/shaders/sprite.frag
similarity index 100%
rename from resources/shaders/sprite.frag
rename to game/resources/shaders/sprite.frag
diff --git a/resources/shaders/sprite.vert b/game/resources/shaders/sprite.vert
similarity index 100%
rename from resources/shaders/sprite.vert
rename to game/resources/shaders/sprite.vert
diff --git a/resources/shaders/standard.frag b/game/resources/shaders/standard.frag
similarity index 100%
rename from resources/shaders/standard.frag
rename to game/resources/shaders/standard.frag
diff --git a/resources/shaders/standard.vert b/game/resources/shaders/standard.vert
similarity index 100%
rename from resources/shaders/standard.vert
rename to game/resources/shaders/standard.vert
diff --git a/resources/sprites/alex/alex.toml b/game/resources/sprites/alex/alex.toml
similarity index 100%
rename from resources/sprites/alex/alex.toml
rename to game/resources/sprites/alex/alex.toml
diff --git a/resources/sprites/chun-li/chun-li.toml b/game/resources/sprites/chun-li/chun-li.toml
similarity index 100%
rename from resources/sprites/chun-li/chun-li.toml
rename to game/resources/sprites/chun-li/chun-li.toml
diff --git a/resources/sprites/dudley/dudley.toml b/game/resources/sprites/dudley/dudley.toml
similarity index 100%
rename from resources/sprites/dudley/dudley.toml
rename to game/resources/sprites/dudley/dudley.toml
diff --git a/resources/sprites/hugo/hugo.toml b/game/resources/sprites/hugo/hugo.toml
similarity index 100%
rename from resources/sprites/hugo/hugo.toml
rename to game/resources/sprites/hugo/hugo.toml
diff --git a/resources/sprites/ibuki/ibuki.toml b/game/resources/sprites/ibuki/ibuki.toml
similarity index 100%
rename from resources/sprites/ibuki/ibuki.toml
rename to game/resources/sprites/ibuki/ibuki.toml
diff --git a/resources/sprites/ken/ken.toml b/game/resources/sprites/ken/ken.toml
similarity index 100%
rename from resources/sprites/ken/ken.toml
rename to game/resources/sprites/ken/ken.toml
diff --git a/resources/sprites/remy/remy.toml b/game/resources/sprites/remy/remy.toml
similarity index 100%
rename from resources/sprites/remy/remy.toml
rename to game/resources/sprites/remy/remy.toml
diff --git a/resources/sprites/test_sprite.toml b/game/resources/sprites/test_sprite.toml
similarity index 100%
rename from resources/sprites/test_sprite.toml
rename to game/resources/sprites/test_sprite.toml
diff --git a/resources/sprites/twelve/twelve.toml b/game/resources/sprites/twelve/twelve.toml
similarity index 100%
rename from resources/sprites/twelve/twelve.toml
rename to game/resources/sprites/twelve/twelve.toml
diff --git a/run_with_overlay.sh b/game/run_with_overlay.sh
similarity index 100%
rename from run_with_overlay.sh
rename to game/run_with_overlay.sh
diff --git a/src/camera.rs b/game/src/camera.rs
similarity index 100%
rename from src/camera.rs
rename to game/src/camera.rs
diff --git a/src/errors.rs b/game/src/errors.rs
similarity index 100%
rename from src/errors.rs
rename to game/src/errors.rs
diff --git a/src/game.rs b/game/src/game.rs
similarity index 100%
rename from src/game.rs
rename to game/src/game.rs
diff --git a/src/game_clock.rs b/game/src/game_clock.rs
similarity index 100%
rename from src/game_clock.rs
rename to game/src/game_clock.rs
diff --git a/src/gltf_loader.rs b/game/src/gltf_loader.rs
similarity index 100%
rename from src/gltf_loader.rs
rename to game/src/gltf_loader.rs
diff --git a/src/main.rs b/game/src/main.rs
similarity index 99%
rename from src/main.rs
rename to game/src/main.rs
index c9265165256c2956072362cce34f4012b715bbb0..ef71957778887a71b6c7c9113dd0bd0bcbe5c4f8 100644
--- a/src/main.rs
+++ b/game/src/main.rs
@@ -51,6 +51,7 @@ mod vulkan_model_loader;
 mod standard_shader;
 mod sprite_shader;
 mod sprite_parser;
+mod message_processing;
 
 // TODO: Create parts of the pipeline based on the model content instead of hardcoding
 // TODO: Move Vulkan app specific stuff into its own file
diff --git a/src/math.rs b/game/src/math.rs
similarity index 100%
rename from src/math.rs
rename to game/src/math.rs
diff --git a/game/src/message_processing.rs b/game/src/message_processing.rs
new file mode 100644
index 0000000000000000000000000000000000000000..a1eb7f540fdce31e0a3eab15c5dea81a12720df5
--- /dev/null
+++ b/game/src/message_processing.rs
@@ -0,0 +1,2 @@
+
+use common::messages;
\ No newline at end of file
diff --git a/src/sprite_parser.rs b/game/src/sprite_parser.rs
similarity index 100%
rename from src/sprite_parser.rs
rename to game/src/sprite_parser.rs
diff --git a/src/sprite_shader.rs b/game/src/sprite_shader.rs
similarity index 100%
rename from src/sprite_shader.rs
rename to game/src/sprite_shader.rs
diff --git a/src/standard_shader.rs b/game/src/standard_shader.rs
similarity index 100%
rename from src/standard_shader.rs
rename to game/src/standard_shader.rs
diff --git a/src/string_utils.rs b/game/src/string_utils.rs
similarity index 100%
rename from src/string_utils.rs
rename to game/src/string_utils.rs
diff --git a/src/vulkan_asset_manager.rs b/game/src/vulkan_asset_manager.rs
similarity index 100%
rename from src/vulkan_asset_manager.rs
rename to game/src/vulkan_asset_manager.rs
diff --git a/src/vulkan_buffers.rs b/game/src/vulkan_buffers.rs
similarity index 100%
rename from src/vulkan_buffers.rs
rename to game/src/vulkan_buffers.rs
diff --git a/src/vulkan_context.rs b/game/src/vulkan_context.rs
similarity index 100%
rename from src/vulkan_context.rs
rename to game/src/vulkan_context.rs
diff --git a/src/vulkan_devices.rs b/game/src/vulkan_devices.rs
similarity index 100%
rename from src/vulkan_devices.rs
rename to game/src/vulkan_devices.rs
diff --git a/src/vulkan_grid.rs b/game/src/vulkan_grid.rs
similarity index 100%
rename from src/vulkan_grid.rs
rename to game/src/vulkan_grid.rs
diff --git a/src/vulkan_imgui.rs b/game/src/vulkan_imgui.rs
similarity index 100%
rename from src/vulkan_imgui.rs
rename to game/src/vulkan_imgui.rs
diff --git a/src/vulkan_model_loader.rs b/game/src/vulkan_model_loader.rs
similarity index 100%
rename from src/vulkan_model_loader.rs
rename to game/src/vulkan_model_loader.rs
diff --git a/src/vulkan_msdf_fonts.rs b/game/src/vulkan_msdf_fonts.rs
similarity index 100%
rename from src/vulkan_msdf_fonts.rs
rename to game/src/vulkan_msdf_fonts.rs
diff --git a/src/vulkan_swapchain.rs b/game/src/vulkan_swapchain.rs
similarity index 100%
rename from src/vulkan_swapchain.rs
rename to game/src/vulkan_swapchain.rs
diff --git a/src/vulkan_sync_objects.rs b/game/src/vulkan_sync_objects.rs
similarity index 100%
rename from src/vulkan_sync_objects.rs
rename to game/src/vulkan_sync_objects.rs
diff --git a/src/vulkan_textures.rs b/game/src/vulkan_textures.rs
similarity index 100%
rename from src/vulkan_textures.rs
rename to game/src/vulkan_textures.rs
diff --git a/web_server/Cargo.toml b/web_server/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..4ac7e8ccae0d05d11c0c913ab4a2663568022d17
--- /dev/null
+++ b/web_server/Cargo.toml
@@ -0,0 +1,20 @@
+[package]
+name = "web_server"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+common = { path = "../common" }
+
+dotenv = "0.15.0"
+tokio = { version = "1", features = ["full"] }
+axum = "0.4"
+sqlx = { version = "0.5.13", features = [ "runtime-tokio-native-tls", "sqlite", "macros", "migrate", "chrono", "uuid" ] }
+uuid = { version = "1.0.0", features = ["v4", "serde"] }
+chrono = { version = "0.4.19", features = ["serde"] }
+rand = "0.8"
+serde = { version = "1", features = ["derive"] }
+serde_json = "1.0.79"
+sailfish = "0.4.0"
diff --git a/web_server/Dockerfile b/web_server/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..ff212342d6c4ffd03c14d4695fc42ec3092553f8
--- /dev/null
+++ b/web_server/Dockerfile
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------
+# Cargo Build Stage
+# ------------------------------------------------------------------------------
+
+FROM rust:slim-buster as builder
+WORKDIR /usr/src/myapp
+COPY . .
+RUN cargo install --path .
+
+# ------------------------------------------------------------------------------
+# Final Stage
+# ------------------------------------------------------------------------------
+FROM debian:buster-slim
+#RUN apt-get update && apt-get install -y extra-runtime-dependencies && rm -rf /var/lib/apt/lists/*
+COPY --from=builder /usr/src/myapp/target/release/web_server /usr/local/bin/myapp
+CMD ["myapp"]
diff --git a/web_server/ReadMe.md b/web_server/ReadMe.md
new file mode 100644
index 0000000000000000000000000000000000000000..4db546d2f550ca0a80f301a57d60f716d40cf222
--- /dev/null
+++ b/web_server/ReadMe.md
@@ -0,0 +1,60 @@
+
+# Bounty Server Design
+
+The goal of this server is to enable people to create charity bounties, view existing 
+bounties, view various statistics and roll-ups about donations. Ideally, bounty conditions
+could be user generated and the server could be used by people other than Rising Tide 
+Games. However, for proof of concept, predefined conditions can be used and RTG can create
+all of them.
+
+## Questions
+
+* How would non-game bounties be verified? 
+  * Elon Musk playing with Bill Gates
+* How would conditions be handled?
+  * If the game is beat without taking damage and in less than 10 minutes
+* How would custom bounties be defined?
+  * Skip getting the sword and shield
+
+# Data
+
+Each bounty should be comprised of an identifier for the user that created it, the charity
+for the payout, the date of creation, and maybe an expiration date. A user might need to
+fund the bounty with an initial deposit to prevent spam bounties. Users that sign up for 
+the bounty will need some way of paying out when the bounty is achieved. This might mean 
+storing payment information, or contact info for prompting the user to fulfill their
+commitment. Another option is charging for the donation when it is filled and keeping
+the money in some sort of escrow account for donation or refund.
+
+# Web Integration
+
+## General Information
+
+The website would allow users to see and sort available and past bounties. The user should be able to sort
+bounties based on total donations, date of creation, remaining time if there is an expiration,
+number of people donating, and the user that created the bounty if they are user created.
+
+## Leader Boards
+
+### Users
+
+* which users have donated the most total dollars
+* which users have donated to the most successful bounties
+
+### Successful Bounties
+
+* which bounties have reached the highest dollar total
+* which bounties have the most users donating
+
+### Active Bounties
+
+* which bounties have reached the highest dollar total
+* which bounties have the most users donating
+
+# Game Integration
+
+The game should have some way of getting the active donations and ideally let the player 
+know when they are close to achieving one of the bounties along with what is still needed.
+When the bounty is fulfilled, the replay should be saved and uploaded for validation. 
+The player should be able to opt out of this if desired.
+
diff --git a/web_server/migrations/20220517030409_Empty_database.down.sql b/web_server/migrations/20220517030409_Empty_database.down.sql
new file mode 100644
index 0000000000000000000000000000000000000000..3236412474933ec2088a526c5deeb4905f438625
--- /dev/null
+++ b/web_server/migrations/20220517030409_Empty_database.down.sql
@@ -0,0 +1,3 @@
+-- Add down migration script here
+DROP INDEX idx_users_on_id;
+drop table users;
\ No newline at end of file
diff --git a/web_server/migrations/20220517030409_Empty_database.up.sql b/web_server/migrations/20220517030409_Empty_database.up.sql
new file mode 100644
index 0000000000000000000000000000000000000000..73cf92a8aa552bfb004ffa9d58d16554fe42d18a
--- /dev/null
+++ b/web_server/migrations/20220517030409_Empty_database.up.sql
@@ -0,0 +1,8 @@
+-- Add up migration script here
+CREATE TABLE IF NOT EXISTS users (
+                                     id TEXT PRIMARY KEY NOT NULL,
+                                     created_at INTEGER NOT NULL,
+                                     username TEXT NOT NULL
+);
+
+CREATE INDEX idx_users_on_id ON users(id, created_at);
diff --git a/web_server/src/main.rs b/web_server/src/main.rs
new file mode 100644
index 0000000000000000000000000000000000000000..bb02d1550620036821ea953166d887086d7c1dcc
--- /dev/null
+++ b/web_server/src/main.rs
@@ -0,0 +1,164 @@
+use axum::{extract::{Query, Extension}, response::{Html, Json, IntoResponse}, routing::{get, post}, Router};
+use rand::{thread_rng, Rng};
+use serde::{Deserialize, Serialize};
+use std::net::SocketAddr;
+use sqlx::sqlite::{SqliteConnectOptions, SqliteJournalMode, SqliteLockingMode, SqlitePoolOptions, SqliteSynchronous};
+use sqlx::{SqlitePool};
+use std::env;
+use std::time::Duration;
+use std::str::FromStr;
+use std::sync::{Arc};
+use tokio::sync::Mutex;
+//use chrono::Utc;
+use sqlx::types::{chrono::{DateTime, Utc}};
+//use uuid::Uuid;
+use sailfish::TemplateOnce;
+use common::messages;
+
+#[derive(sqlx::FromRow, Debug)]
+struct User {
+    id: String,
+    created_at: i64,
+    username: String,
+}
+
+#[derive(Debug, TemplateOnce)]
+#[template(path="index.html")]
+struct UsersTemplate
+{
+    users: Vec<User>
+}
+
+#[derive(Debug, Clone)]
+struct SharedState
+{
+    db: SqlitePool,
+    html: Option<String>,
+    timestamp: DateTime<Utc>,
+}
+
+#[tokio::main]
+async fn main() {
+    //dotenv::dotenv().ok();
+
+    let db_url = env::var("DATABASE_URL").expect("Failed to get DATABASE_URL env var");
+
+    let connection_options = SqliteConnectOptions::from_str(&db_url).unwrap()
+        .create_if_missing(true)
+        .journal_mode(SqliteJournalMode::Wal)
+        .synchronous(SqliteSynchronous::Normal)
+        .locking_mode(SqliteLockingMode::Normal)
+        .busy_timeout(Duration::from_secs(30));
+
+    let db = SqlitePoolOptions::new()
+        .max_connections(8)
+        .connect_timeout(Duration::from_secs(30))
+        .connect_with(connection_options)
+        .await.expect("Failed to create Sqlite connection pool");
+
+    sqlx::migrate!().run(&db).await.ok();
+
+    sqlx::query("pragma temp_store = memory;")
+        .execute(&db)
+        .await.ok();
+    sqlx::query("pragma mmap_size = 30000000000;")
+        .execute(&db)
+        .await.ok();
+    sqlx::query("pragma page_size = 4096;")
+        .execute(&db)
+        .await.ok();
+
+    let state = Arc::new(Mutex::new(SharedState { db, html: None, timestamp: Utc::now() }));
+
+    let app = Router::new().route("/", get(static_handler))
+        .route("/random", get(random_handler))
+        .route("/json", post(post_json_handler).get(get_json_handler))
+        .layer(Extension(state));
+
+    let addr = SocketAddr::from(([0, 0, 0, 0], 3000));
+    println!("listening on {}", addr);
+    axum::Server::bind(&addr)
+        .serve(app.into_make_service())
+        .await
+        .unwrap();
+}
+
+// `Deserialize` need be implemented to use with `Query` extractor.
+#[derive(Deserialize)]
+struct RangeParameters {
+    start: usize,
+    end: usize,
+}
+
+#[derive(Deserialize, Serialize, sqlx::FromRow)]
+struct JsonParameters {
+    name: String,
+    age: usize,
+}
+
+async fn static_handler(Extension(state): Extension<Arc<Mutex<SharedState>>>) -> Html<String> {
+    let user = User
+    {
+        id: uuid::Uuid::new_v4().to_string(),
+        created_at: Utc::now().timestamp(),
+        username: String::from("Hello")
+    };
+
+    let state_clone = Arc::clone(&state);
+    let mut state = state_clone.lock().await;
+    //let state_mut = state.borrow_mut();
+    //let state = state.borrow();
+
+    /*
+    sqlx::query_as!(User, "insert into users (id, created_at, username) values (?, ?, ?)",
+        user.id, user.created_at, user.username)
+        .execute(&state.db)
+        .await.ok();
+    */
+
+    /*
+    let today = (Utc::now() - chrono::Duration::seconds(300)).timestamp();
+    let users = sqlx::query!(r#"select id, created_at from users where created_at <= ? limit 10"#, today)
+        .fetch_all(&state.db)
+        .await.unwrap();
+    */
+
+    let now = Utc::now();
+
+    if now - state.timestamp > chrono::Duration::seconds(1) || state.html.is_none()
+    {
+        ///*
+        let today = (now - chrono::Duration::seconds(300)).timestamp();
+        let users = sqlx::query_as!(User, r#"select id, created_at, username from users where created_at > ? limit 5"#, today)
+            .fetch_all(&state.db)
+            .await.unwrap();
+        //*/
+
+        state.timestamp = now;
+
+        let users_context = UsersTemplate { users };
+        state.html = Some(users_context.render_once().unwrap());
+    }
+
+    let rendered_html =  state.html.as_ref().unwrap();
+
+    Html(rendered_html.to_string())
+}
+
+async fn random_handler(Query(range): Query<RangeParameters>) -> Html<String> {
+    // Generate a random number in range parsed from query.
+    let random_number = thread_rng().gen_range(range.start..range.end);
+
+    // Send response in html format.
+    Html(format!("<h1>Random Number: {}</h1>", random_number))
+}
+
+async fn get_json_handler() -> impl IntoResponse {
+    let json = JsonParameters { name: "Name".to_string(), age: 100 };
+    (axum::http::StatusCode::OK, Json(json))
+}
+
+async fn post_json_handler(Json(parameters): Json<JsonParameters>) -> impl IntoResponse {
+    let json = JsonParameters { name: parameters.name.to_uppercase(), age: parameters.age + 100 };
+    (axum::http::StatusCode::OK, Json(json))
+}
\ No newline at end of file
diff --git a/web_server/templates/index.html b/web_server/templates/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..f3723d24328333c6a848e0b337388415ab141187
--- /dev/null
+++ b/web_server/templates/index.html
@@ -0,0 +1,10 @@
+<html>
+<body>
+    Users IDs
+    <ul>
+        <% for user in &users {
+        include!("./user.html");
+        } %>
+    </ul>
+</body>
+</html>
diff --git a/web_server/templates/user.html b/web_server/templates/user.html
new file mode 100644
index 0000000000000000000000000000000000000000..647cffa2c08904e40477036984fe30bdb1f6dd0f
--- /dev/null
+++ b/web_server/templates/user.html
@@ -0,0 +1 @@
+<li> <%= user.id %> </li>