diff --git a/pkgs/default.nix b/pkgs/default.nix
index c8f0e2265e20caa06cfe809d67a9f56bc746a1bc..3d2b2511225139aa49bfbf36d6e18e02464ccc85 100644
--- a/pkgs/default.nix
+++ b/pkgs/default.nix
@@ -12,6 +12,8 @@ rec {
   greetd = self.callPackage ./greetd {};
   gtkgreet = self.callPackage ./gtkgreet {};
 
+  squeekboard = self.callPackage ./squeekboard {};
+
   mpv-queezle = self.mpv-with-scripts.override {
     scripts = [ self.mpvScripts.mpris ];
   };
diff --git a/pkgs/squeekboard/1.12.0.nix b/pkgs/squeekboard/1.12.0.nix
deleted file mode 100644
index d741df1d029add0ddae2128b48f542c16acf3018..0000000000000000000000000000000000000000
--- a/pkgs/squeekboard/1.12.0.nix
+++ /dev/null
@@ -1,77 +0,0 @@
-{ lib
-, stdenv
-, pkgs
-, fetchFromGitLab
-, cmake
-, meson
-, ninja
-, pkg-config
-, gnome3
-, glib
-, gtk3
-, wayland
-, wayland-protocols
-, rustc
-, cargo
-, libxml2
-, libxkbcommon
-, rustPlatform
-, makeWrapper
-, substituteAll
-, fetchpatch
-, feedbackd
-}:
-
-rustPlatform.buildRustPackage rec {
-  pname = "squeekboard";
-  version = "1.12.0";
-
-  src = fetchFromGitLab {
-    domain = "source.puri.sm";
-    owner = "Librem5";
-    repo = pname;
-    rev = "v${version}";
-    sha256 = "sha256-1iQqu2pnEsSVqPYTpeC8r/BDHDTlQGYiU5xwiLlzQXQ=";
-  };
-
-  nativeBuildInputs = [
-    meson
-    ninja
-    pkg-config
-    rustc
-    cargo
-    glib  # for glib-compile-resources
-    wayland
-    makeWrapper
-  ];
-
-  buildInputs = [
-    gtk3  # for gio-2.0
-    gnome3.gnome-desktop
-    wayland
-    wayland-protocols
-    libxml2
-    libxkbcommon
-    feedbackd
-  ];
-
-  cargoSha256 = "sha256-XALMnV3XShHoV3C/B/pVhlYiEiw2nfR4r6eG1KhZLDo=";
-
-  cargoUpdateHook = ''
-    cat Cargo.toml.in Cargo.deps > Cargo.toml
-  '';
-
-  # Don't use buildRustPackage phases, only use it for rust deps setup
-  configurePhase = null;
-  buildPhase = null;
-  checkPhase = null;
-  installPhase = null;
-
-  meta = with lib; {
-    description = "Squeekboard is a virtual keyboard supporting Wayland";
-    homepage = "https://source.puri.sm/Librem5/squeekboard";
-    license = licenses.gpl3Plus;
-    maintainers = with maintainers; [ masipcat ];
-    platforms = platforms.linux;
-  };
-}
diff --git a/pkgs/squeekboard/default.nix b/pkgs/squeekboard/default.nix
index cff369563589faa2762c64ebbc014b4e462ea309..64cb839d128979f62419e6ad044ac64cabc5535d 100644
--- a/pkgs/squeekboard/default.nix
+++ b/pkgs/squeekboard/default.nix
@@ -1,8 +1,5 @@
 { lib
-, stdenv
-, pkgs
 , fetchFromGitLab
-, cmake
 , meson
 , ninja
 , pkg-config
@@ -17,31 +14,21 @@
 , libxkbcommon
 , rustPlatform
 , makeWrapper
-, substituteAll
-, fetchpatch
+, feedbackd
 }:
 
 rustPlatform.buildRustPackage rec {
   pname = "squeekboard";
-  version = "1.9.2";
+  version = "1.12.0";
 
   src = fetchFromGitLab {
     domain = "source.puri.sm";
     owner = "Librem5";
     repo = pname;
     rev = "v${version}";
-    sha256 = "02jjc9qxzb4iw3vypqdaxzs5mc66zkfmij1yrv72h99acg5s3ncz";
+    sha256 = "sha256-1iQqu2pnEsSVqPYTpeC8r/BDHDTlQGYiU5xwiLlzQXQ=";
   };
 
-  patches = [
-    # Add missing dependency 'gio-unix-2.0' to meson.build.
-    # https://source.puri.sm/Librem5/squeekboard/-/merge_requests/356
-    (fetchpatch {
-      url = "https://source.puri.sm/Librem5/squeekboard/-/merge_requests/356.patch";
-      sha256 = "1xi7h2nsrlf7szlj41kj6x1503af9svk5yj19l0q32ln3c40kgfs";
-    })
-  ];
-
   nativeBuildInputs = [
     meson
     ninja
@@ -60,9 +47,15 @@ rustPlatform.buildRustPackage rec {
     wayland-protocols
     libxml2
     libxkbcommon
+    feedbackd
   ];
 
-  cargoSha256 = "00gzw703w16i81yna4winj7gi4w7a1p986ggnx48jvyi0c14mxx0";
+  cargoSha256 = "sha256-XALMnV3XShHoV3C/B/pVhlYiEiw2nfR4r6eG1KhZLDo=";
+
+  cargoDepsHook = ''
+    substituteInPlace source/Cargo.toml.in --subst-var-by path /build/source
+    cat source/Cargo.toml.in source/Cargo.deps > source/Cargo.toml
+  '';
 
   # Don't use buildRustPackage phases, only use it for rust deps setup
   configurePhase = null;