diff --git a/.gitea/workflows/abstract-machine-build.yml b/.gitea/workflows/abstract-machine-build.yml
new file mode 100644
index 0000000..6d8b9c3
--- /dev/null
+++ b/.gitea/workflows/abstract-machine-build.yml
@@ -0,0 +1,25 @@
+name: Build abstract machine with nix
+on: [push]
+
+jobs:
+  build-abstract-machine:
+    runs-on: nix
+    steps:
+      - uses: https://github.com/cachix/cachix-action@v14
+        with:
+          name: ysyx
+          signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}'
+      - name: Watch nix store
+        run: |
+          cachix watch-store ysyx &
+      - uses: actions/checkout@v4
+        sparse-checkout: |
+          flake.nix
+          abstract-machine
+      - name: Build abstract-machine
+        run: |
+          cachix watch-exec ysyx -- nix build .#abstract-machine
+      - name: Build nemu
+        run: |
+          cachix watch-exec ysyx -- nix build .#nemu
+
diff --git a/flake.nix b/flake.nix
index 42dccac..3a07d79 100644
--- a/flake.nix
+++ b/flake.nix
@@ -20,10 +20,10 @@
         };
       in
       {
-        packages.nemu = pkgs.callPackage ./nemu { am-kernels = self.packages.${system}.am-kernels-cmake; };
+        packages.nemu = pkgs.callPackage ./nemu { am-kernels = self.packages.${system}.am-kernels; };
         packages.abstract-machine = crossPkgs.callPackage ./abstract-machine { isa = "riscv"; platform = "nemu"; };
 
-        packages.am-kernels-cmake = crossPkgs.stdenv.mkDerivation rec {
+        packages.am-kernels = crossPkgs.stdenv.mkDerivation rec {
           pname = "am-kernels-cmake";
           version = "2024.02.18";