diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml
index c97fe95..2bfe2a0 100644
--- a/.github/workflows/workflow.yml
+++ b/.github/workflows/workflow.yml
@@ -45,6 +45,17 @@ jobs:
       run: npm run lint
     - name: Build & Test
       run: npm run test
+    - name: Ensure dist/ folder is up-to-date
+      if: ${{ runner.os == 'Linux' }}
+      shell: bash
+      run: |
+        npm run build
+        if [ "$(git status --porcelain | wc -l)" -gt "0" ]; then
+          echo "Detected uncommitted changes after build.  See status below:"
+          git diff
+          exit 1
+        fi
+        
 
   # End to end save and restore
   test-save:
diff --git a/README.md b/README.md
index a979c38..33fe48c 100644
--- a/README.md
+++ b/README.md
@@ -61,6 +61,7 @@ Every programming language and framework has its own way of caching.
 See [Examples](examples.md) for a list of `actions/cache` implementations for use with:
 
 - [C# - Nuget](./examples.md#c---nuget)
+- [D - DUB](./examples.md#d---dub)
 - [Elixir - Mix](./examples.md#elixir---mix)
 - [Go - Modules](./examples.md#go---modules)
 - [Haskell - Cabal](./examples.md#haskell---cabal)
diff --git a/examples.md b/examples.md
index e9f43cc..ce31929 100644
--- a/examples.md
+++ b/examples.md
@@ -2,6 +2,7 @@
 
 - [Examples](#examples)
   - [C# - NuGet](#c---nuget)
+  - [D - DUB](#d---dub)
   - [Elixir - Mix](#elixir---mix)
   - [Go - Modules](#go---modules)
   - [Haskell - Cabal](#haskell---cabal)
@@ -57,6 +58,30 @@ steps:
         ${{ runner.os }}-nuget-
 ```
 
+## D - DUB
+
+### POSIX
+
+```yaml
+- uses: actions/cache@v1
+  with:
+    path: ~/.dub
+    key: ${{ runner.os }}-dub-${{ hashFiles('**/dub.json') }}
+    restore-keys: |
+      ${{ runner.os }}-dub-
+```
+
+### Windows
+
+```yaml
+- uses: actions/cache@v1
+  with:
+    path: ~\AppData\Local\dub
+    key: ${{ runner.os }}-dub-${{ hashFiles('**/dub.json') }}
+    restore-keys: |
+      ${{ runner.os }}-dub-
+```
+
 ## Elixir - Mix
 ```yaml
 - uses: actions/cache@v1