diff --git a/.github/workflows/flake-check.yml b/.github/workflows/flake-check.yml
new file mode 100644
index 0000000..839ad02
--- /dev/null
+++ b/.github/workflows/flake-check.yml
@@ -0,0 +1,45 @@
+name: "Flake checks"
+on:
+  pull_request:
+  push:
+    branches:
+      - main
+jobs:
+
+  flake-checks:
+    runs-on: ubuntu-latest
+    outputs:
+      matrix: ${{ steps.set-matrix.outputs.matrix }}
+    steps:
+      - uses: actions/checkout@v2.4.0
+        with:
+          # Nix Flakes doesn't work on shallow clones
+          fetch-depth: 0
+      - uses: cachix/install-nix-action@v16
+        with:
+          nix_path: nixpkgs=channel:nixos-unstable
+      - id: set-matrix
+        run: |
+          set -euo pipefail
+
+          matrix="$(nix flake show --json | jq '.checks."x86_64-linux" | keys' | jq -rcM '{attr: ., os: ["ubuntu-latest", "macos-latest"]}')"
+          echo "::set-output name=matrix::$matrix"
+
+  builds:
+    needs: flake-checks
+    runs-on: ${{ matrix.os }}
+    strategy:
+      matrix: ${{fromJSON(needs.flake-checks.outputs.matrix)}}
+    steps:
+      - uses: actions/checkout@v2.4.0
+        with:
+          # Nix Flakes doesn't work on shallow clones
+          fetch-depth: 0
+      - uses: cachix/install-nix-action@v16
+        with:
+          nix_path: nixpkgs=channel:nixos-unstable
+      - run: |
+          set -euo pipefail
+
+          system=$(nix-instantiate --eval --expr builtins.currentSystem | jq -r)
+          nix build -L .#checks.$system.${{ matrix.attr }}
diff --git a/.github/workflows/test.yml b/.github/workflows/test-develop-classic.yml
similarity index 50%
rename from .github/workflows/test.yml
rename to .github/workflows/test-develop-classic.yml
index ce115e5..0455e30 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test-develop-classic.yml
@@ -1,11 +1,9 @@
-name: "Test"
+name: "Development workflow - nix-shell"
 on:
   pull_request:
   push:
     branches:
       - main
-  schedule:
-    - cron:  '51 2 * * *'
 jobs:
   tests:
     strategy:
@@ -15,5 +13,9 @@ jobs:
     steps:
     - uses: actions/checkout@v2
     - uses: cachix/install-nix-action@v16
-    - name: build
-      run: NIX_PATH=nixpkgs=https://github.com/NixOS/nixpkgs/archive/nixpkgs-unstable.tar.gz nix-build --expr '(import <nixpkgs> { }).callPackage ./. { }'
+      with:
+        nix_path: nixpkgs=channel:nixos-unstable
+    - name: Build
+      run: nix-shell --run 'meson build && cd build && ninja'
+    - name: Run tests
+      run: nix-shell --run 'pytest ./tests'
diff --git a/.github/workflows/test-flakes.yml b/.github/workflows/test-develop-flakes.yml
similarity index 56%
rename from .github/workflows/test-flakes.yml
rename to .github/workflows/test-develop-flakes.yml
index 8b8d29f..b4c0afa 100644
--- a/.github/workflows/test-flakes.yml
+++ b/.github/workflows/test-develop-flakes.yml
@@ -1,11 +1,9 @@
-name: "Flake test"
+name: "Development workflow - flakes"
 on:
   pull_request:
   push:
     branches:
       - main
-  schedule:
-    - cron:  '51 2 * * *'
 jobs:
   tests:
     strategy:
@@ -18,11 +16,7 @@ jobs:
           # Nix Flakes doesn't work on shallow clones
           fetch-depth: 0
     - uses: cachix/install-nix-action@v16
-    - name: List flake structure
-      run: nix flake show
     - name: Build
-      run: nix build --out-link result
+      run: nix develop -c bash -c 'meson build && cd build && ninja'
     - name: Run tests
-      run: |
-        nix develop -c install -D ./result/bin/nix-eval-jobs ./build/src/nix-eval-jobs
-        nix develop -c pytest ./tests
+      run: nix develop -c pytest ./tests
diff --git a/.github/workflows/update-flake-lock.yml b/.github/workflows/update-flake-lock.yml
index e53ba93..5a3d232 100644
--- a/.github/workflows/update-flake-lock.yml
+++ b/.github/workflows/update-flake-lock.yml
@@ -2,7 +2,7 @@ name: update-flake-lock
 on:
   workflow_dispatch: # allows manual triggering
   schedule:
-    - cron: '0 0 * * 0' # runs weekly on Sunday at 00:00
+    - cron: '0 0 * * 1,4' # Run twice a week
 
 jobs:
   lockfile: