diff --git a/.github/workflows/reusable-test-native.yml b/.github/workflows/reusable-test-native.yml
index 9c78bd14f..55f0287f5 100644
--- a/.github/workflows/reusable-test-native.yml
+++ b/.github/workflows/reusable-test-native.yml
@@ -156,7 +156,7 @@ jobs:
 
           # merge coverage output from all tests
           # use find because bash on GitHub Actions currently does not support '**'
-          find test/working -type f -name "*profraw" -print0 | xargs -0 ${prefix}llvm-profdata merge -output=default.profdata
+          find test/working -type f -name "*.profraw" -print0 | xargs -0 ${prefix}llvm-profdata merge -output=default.profdata
           
           # copy over merged coverage output and corresponding binary
           # use variable because cp does not support globbing in file names
@@ -170,7 +170,7 @@ jobs:
           cd ../..
           echo "$PWD" >> upload/cov/${{ env.UNIQUE_NAME }}/patomic.rootpath
 
-      - name: Upload Coverage Results
+      - name: Upload Internal Coverage Results
         if: env.SKIP_JOB != 'true' && matrix.kind == 'coverage'
         uses: actions/upload-artifact@v3
         with:
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 880d9fd08..238f182fa 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -141,3 +141,92 @@ jobs:
 #          action_fail_on_inconclusive: true
 #          check_name: "Tests Results: Warning"
 #          files: test-results/**/*.xml
+
+  publish-coverage:
+    runs-on: ubuntu-latest
+    needs:
+      - test-native
+      # - test-qemu
+    strategy:
+      matrix:
+        include:
+          - hi_limit: 100
+          - lo_limit: 90
+
+    steps:
+      - name: Install Dependencies
+        run: |
+          sudo apt update
+          sudo apt install binutils  # for c++filt
+          sudo apt install llvm
+          sudo apt install lcov
+
+      - name: Download Test Coverage Artifacts
+        uses: actions/download-artifact@v3
+        with:
+          name: test-coverage-internal
+          path: test-coverage-internal/
+
+      - name: Delete Test Coverage Artifacts
+        uses: geekyeggo/delete-artifact@v2
+        with:
+          name: test-coverage-internal
+
+      - name: Get Root Compilation Dir
+        id: get-path
+        run: |
+          # this only contains directories
+          dir_names=(test-coverage-internal/*)
+          
+          # all directories have the same root path
+          root_path="test-coverage-internal/${dir_names[0]}/patomic.rootpath
+          
+          # save path for future steps
+          echo "root_compilation_dir=${root_path}" >> $GITHUB_OUTPUT
+
+      - name: Checkout patomic
+        uses: actions/checkout@v4
+        with:
+          repository: patomic
+          path: "${{ steps.get-path.root_compiler_dir }}/patomic"
+      
+      - name: Create Lcov Config File
+        run: |
+          touch lcovrc
+          
+          echo "genhtml_hi_limit = ${{ matrix.hi_limit }}" >> lcovrc
+          echo "genhtml_med_limit = ${{ matrix.med_limit }}" >> lcovrc
+          echo "genhtml_function_hi_limit = ${{ matrix.hi_limit }}" >> lcovrc
+          echo "genhtml_function_med_limit = ${{ matrix.med_limit }}" >> lcovrc
+          
+          echo "Contents of lcovrc:
+          echo "-------------------"
+          cat lcovrc
+
+      - name: Generate HTML Files
+        run: |
+          # directory into which to put user artifacts
+          mkdir test-coverage
+          
+          # generate lcov and html files for each separate compilation
+          for dir in $(find ./test-coverage-internal -not -path '*/*' -type d -mindepth 1 -maxdepth 1); do
+            arch=$(basename "${dir}")
+            touch "${dir}/patomic.profdata"  # avoid out-of-date warning
+            mkdir "./test-coverage/${arch}"
+            llvm-cov export -format=lcov -instr-profile="${dir}/patomic.profdata" -object="${dir}/patomic.bin" >> "./test-coverage/${arch}/patomic.lcov"
+            genhtml --output-directory "./test-coverage/${arch}" --title "patomic-${arch}" --show-details --num-spaces 4 --legend --demangle-cpp --config-file ./lcovrc --precision 2 "./test-coverage/${arch}/patomic.lcov"
+          done
+
+      - name: Upload Coverage Results
+        uses: actions/upload-artifact@v3
+        with:
+          name: test-coverage
+          path: test-coverage/
+
+      - name: Create Coverage Summary
+        uses: irongut/CodeCoverageSummary@v1
+        with:
+          filename: test-coverage/**/patomic.lcov
+          badge: true
+          fail_below_min: true
+          thresholds: '${{ matrix.med_limit }} ${{ matrix.hi_limit }}'