diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index c8cf2b64..d26842db 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -10,16 +10,40 @@ jobs:
       - name: Build with Arduino-CLI
         run: bash ci/build-arduino.sh
 
-  pio-build:
+  pio-builds:
     runs-on: ubuntu-latest
+    strategy:
+      matrix:
+        product:
+          - fastled_webserver
+          - esp_thing
+          - kraken64
+          - chamaeleon64
+          - 1628_rings
+          - fib1024
+          - fib512
+          - fib256
+          - fib128
+          - fib64_full
+          - fib64_mini
+          - fib32
+        platform:
+          - d1_mini
+          # - mini32 # When ESP32 is supported, one-line change to enable 2x product builds
+
     steps:
       - name: Checkout
         uses: actions/checkout@v2
 
-      - name: Build with PlatformIO
+      - name: Build
+        env:
+          FIB_PRODUCT: ${{ matrix.product }}__${{ matrix.platform }}
         run: bash ci/build-platformio.sh
 
       - uses: actions/upload-artifact@v2
         with:
           name: firmware
-          path: .pio/build/*/firmware.bin
+          path: |
+            .pio/build/*/firmware.bin
+            .pio/build/*/firmware.elf
+            .pio/build/*/littlefs.bin
diff --git a/ci/build-platformio.sh b/ci/build-platformio.sh
index 5802536a..40e77a3d 100644
--- a/ci/build-platformio.sh
+++ b/ci/build-platformio.sh
@@ -15,4 +15,10 @@ python3 get-platformio.py
 pio platform install "espressif8266"
 
 # Compile project
-pio run
+if [[ ! -v FIB_PRODUCT ]]; then
+    pio run
+    pio run --target buildfs
+else
+    pio run --environment ${FIB_PRODUCT}
+    pio run --target buildfs --environment ${FIB_PRODUCT}
+fi