diff --git a/.github/actions/setup-haxeshit/action.yml b/.github/actions/setup-haxeshit/action.yml
index 756530178..0cc544cf7 100644
--- a/.github/actions/setup-haxeshit/action.yml
+++ b/.github/actions/setup-haxeshit/action.yml
@@ -25,7 +25,6 @@ runs:
         key: ${{ runner.os }}-hmm-${{ hashFiles('**/hmm.json') }}
         restore-keys: |
           ${{ runner.os }}-hmm-
-          ${{ runner.os }}-
     - if: ${{ steps.cache-hmm.outputs.cache-hit != 'true' }}
       name: hmm install
       run: |
diff --git a/.github/actions/upload-itch/action.yml b/.github/actions/upload-itch/action.yml
index af9a87b39..7a4b45427 100644
--- a/.github/actions/upload-itch/action.yml
+++ b/.github/actions/upload-itch/action.yml
@@ -40,5 +40,5 @@ runs:
           BUTLER_API_KEY: ${{inputs.butler-key}}
         run: |
           ./butler login
-          ./butler push ${{inputs.build-dir}} ninja-muffin24/funkin-secret:${{inputs.target}}-${GITHUB_REF##*/}
+          ./butler push ${{inputs.build-dir}} ninja-muffin24/funkin-secret:${{inputs.target}}-${GITHUB_REF_NAME}
         shell: bash
diff --git a/.github/hooks/README.md b/.github/hooks/README.md
new file mode 100644
index 000000000..544fbf365
--- /dev/null
+++ b/.github/hooks/README.md
@@ -0,0 +1,5 @@
+# Git Hooks
+These work even on Windows because of Git Bash.
+
+## Setup
+`git config core.hooksPath .github/hooks`
diff --git a/.github/hooks/post-checkout b/.github/hooks/post-checkout
new file mode 100644
index 000000000..12358c998
--- /dev/null
+++ b/.github/hooks/post-checkout
@@ -0,0 +1,2 @@
+#!/bin/sh
+git submodule update --init --recursive
diff --git a/.github/hooks/post-merge b/.github/hooks/post-merge
new file mode 100644
index 000000000..12358c998
--- /dev/null
+++ b/.github/hooks/post-merge
@@ -0,0 +1,2 @@
+#!/bin/sh
+git submodule update --init --recursive
diff --git a/.github/hooks/pre-push b/.github/hooks/pre-push
new file mode 100644
index 000000000..ec4c820ac
--- /dev/null
+++ b/.github/hooks/pre-push
@@ -0,0 +1,5 @@
+#!/bin/sh
+if git diff --cached --submodule | grep -q "^+"; then
+  echo "WARNING: You have unpushed changes in submodules."
+  exit 1
+fi
diff --git a/.github/workflows/build-shit.yml b/.github/workflows/build-shit.yml
index 0e365b281..809a8b94b 100644
--- a/.github/workflows/build-shit.yml
+++ b/.github/workflows/build-shit.yml
@@ -52,28 +52,45 @@ jobs:
           submodules: 'recursive'
           token: ${{ secrets.GH_RO_PAT }}
       - uses: ./.github/actions/setup-haxeshit
+      - name: Make HXCPP cache dir
+        shell: bash
+        run: |
+          mkdir -p ${{ runner.temp }}\\hxcpp_cache
+      - name: Restore build cache
+        id: cache-build-win
+        uses: actions/cache@v3
+        with:
+          path: |
+            .haxelib
+            export
+            ${{ runner.temp }}\\hxcpp_cache
+          key: ${{ runner.os }}-build-win-${{ github.ref_name }}
+          restore-keys: |
+            ${{ runner.os }}-build-win-
       - name: Build game
         run: |
           haxelib run lime build windows -release -DNO_REDIRECT_ASSETS_FOLDER
           dir
+        env:
+          HXCPP_COMPILE_CACHE: "${{ runner.temp }}\\hxcpp_cache"
       - uses: ./.github/actions/upload-itch
         with:
-          butler-key: ${{ secrets.BUTLER_API_KEY}}
+          butler-key: ${{ secrets.BUTLER_API_KEY }}
           build-dir: export/release/windows/bin
           target: win
-  test-unit-win:
-    needs: create-nightly-win
-    runs-on: windows-latest
-    permissions:
-       contents: write
-       actions: write
-    steps:
-      - uses: actions/checkout@v3
-        with:
-          submodules: 'recursive'
-          token: ${{ secrets.GH_RO_PAT }}
-      - uses: ./.github/actions/setup-haxeshit
-      - name: Run unit tests
-        run: |
-          cd ./tests/unit/
-          ./start-win-native.bat
+#  test-unit-win:
+#    needs: create-nightly-win
+#    runs-on: windows-latest
+#    permissions:
+#       contents: write
+#       actions: write
+#    steps:
+#      - uses: actions/checkout@v3
+#        with:
+#          submodules: 'recursive'
+#          token: ${{ secrets.GH_RO_PAT }}
+#      - uses: ./.github/actions/setup-haxeshit
+#      - name: Run unit tests
+#        run: |
+#          cd ./tests/unit/
+#          ./start-win-native.bat