diff --git a/.circleci/config.yml b/.circleci/config.yml
index b2128b76bc1741ab05c4eb2dbad1355466a249dd..1be9adc7afcd45f5c139e1beca4e1596a2a13f68 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -53,7 +53,7 @@ jobs:
             # If nixpkgs changes then potentially a lot of cached packages for
             # the base system will be invalidated so we may as well drop them
             # and make a new cache with the new packages.
-            - privatestorageio-nix-store-v2-{{ checksum "nixpkgs.rev" }}
+            - privatestorageio-nix-store-v2-{{ checksum "nixpkgs.json" }}
             - privatestorageio-nix-store-v2-
 
       - run:
@@ -67,7 +67,7 @@ jobs:
 
       - save_cache:
           name: "Cache Nix Store Paths"
-          key: privatestorageio-nix-store-v2-{{ checksum "nixpkgs.rev" }}
+          key: privatestorageio-nix-store-v2-{{ checksum "nixpkgs.json" }}
           paths:
             - "/nix"
 
@@ -81,7 +81,7 @@ jobs:
           # See comments for nix store caching in `build` job.
           name: "Restore Nix Store Paths"
           keys:
-            - privatestorageio-docs-nix-store-v1-{{ checksum "nixpkgs.rev" }}
+            - privatestorageio-docs-nix-store-v1-{{ checksum "nixpkgs.json" }}
             - privatestorageio-docs-nix-store-v1-
 
       - run:
@@ -91,7 +91,7 @@ jobs:
 
       - save_cache:
           name: "Cache Nix Store Paths"
-          key: privatestorageio-docs-nix-store-v1-{{ checksum "nixpkgs.rev" }}
+          key: privatestorageio-docs-nix-store-v1-{{ checksum "nixpkgs.json" }}
           paths:
             - "/nix"
 
diff --git a/nixpkgs.json b/nixpkgs.json
new file mode 100644
index 0000000000000000000000000000000000000000..25e71e44cd7635329b2dd2e0b43d662165c51328
--- /dev/null
+++ b/nixpkgs.json
@@ -0,0 +1,3 @@
+{ "url": "https://github.com/NixOS/nixpkgs-channels/archive/353333ef340952c05332e3c271dff953264cb017.tar.gz"
+, "sha256": "sha256:0bv34yz892yxhx2kb8a1yr5pm0g8ck5w021yj87r7kfnp416apdh"
+}
diff --git a/nixpkgs.rev b/nixpkgs.rev
deleted file mode 100644
index 339195d572f2a1784ed2ed911834e0e571d639e2..0000000000000000000000000000000000000000
--- a/nixpkgs.rev
+++ /dev/null
@@ -1 +0,0 @@
-353333ef340952c05332e3c271dff953264cb017
\ No newline at end of file
diff --git a/shell.nix b/shell.nix
index f13af40cf174754f42f0021617a7674c10abe386..26aaad6035ca9b16f36eb832d591bddce8a93cbb 100644
--- a/shell.nix
+++ b/shell.nix
@@ -1,10 +1,6 @@
 let
-  nixpkgs-rev = builtins.readFile ./nixpkgs.rev;
-  nixpkgs-url = "https://github.com/NixOS/nixpkgs-channels/archive/${nixpkgs-rev}.tar.gz";
-  nixpkgs-src = builtins.fetchTarball {
-    url = nixpkgs-url;
-    sha256 = "sha256:0bv34yz892yxhx2kb8a1yr5pm0g8ck5w021yj87r7kfnp416apdh";
-  };
+  nixpkgs-pin = builtins.fromJSON (builtins.readFile ./nixpkgs.json);
+  nixpkgs-src = builtins.fetchTarball nixpkgs-pin;
   nixpkgs = import nixpkgs-src { };
 in
 { pkgs ? nixpkgs }:
@@ -19,7 +15,7 @@ let
   morph = pkgs.callPackage (morph-src + "/nix-packaging") { };
 in
 pkgs.mkShell {
-  NIX_PATH = "nixpkgs=${nixpkgs-src}";
+  NIX_PATH = "nixpkgs=${nixpkgs-pin.url}";
   buildInputs = [
     morph
   ];