diff --git a/flake.lock b/flake.lock
index 9a56af92a1955255dc2752fc22846e0f07a89773..acda1b9c793520ee6b4bc3d4121d2307a93f1229 100644
--- a/flake.lock
+++ b/flake.lock
@@ -16,6 +16,38 @@
         "type": "github"
       }
     },
+    "flake-compat_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1673956053,
+        "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-compat_3": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1673956053,
+        "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
     "flake-utils": {
       "locked": {
         "lastModified": 1667395993,
@@ -46,6 +78,66 @@
         "type": "github"
       }
     },
+    "flake-utils_3": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_4": {
+      "locked": {
+        "lastModified": 1676283394,
+        "narHash": "sha256-XX2f9c3iySLCw54rJ/CZs+ZK6IQy7GXNY4nSOyu2QG4=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "3db36a8b464d0c4532ba1c7dda728f4576d6d073",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_5": {
+      "locked": {
+        "lastModified": 1676283394,
+        "narHash": "sha256-XX2f9c3iySLCw54rJ/CZs+ZK6IQy7GXNY4nSOyu2QG4=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "3db36a8b464d0c4532ba1c7dda728f4576d6d073",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_6": {
+      "locked": {
+        "lastModified": 1676283394,
+        "narHash": "sha256-XX2f9c3iySLCw54rJ/CZs+ZK6IQy7GXNY4nSOyu2QG4=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "3db36a8b464d0c4532ba1c7dda728f4576d6d073",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
     "gitignore": {
       "inputs": {
         "nixpkgs": [
@@ -68,6 +160,52 @@
         "type": "github"
       }
     },
+    "gitignore_2": {
+      "inputs": {
+        "nixpkgs": [
+          "tahoe-chk",
+          "hs-flake-utils",
+          "pre-commit-hooks",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1660459072,
+        "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=",
+        "owner": "hercules-ci",
+        "repo": "gitignore.nix",
+        "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "gitignore.nix",
+        "type": "github"
+      }
+    },
+    "gitignore_3": {
+      "inputs": {
+        "nixpkgs": [
+          "tahoe-great-black-swamp",
+          "hs-flake-utils",
+          "pre-commit-hooks",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1660459072,
+        "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=",
+        "owner": "hercules-ci",
+        "repo": "gitignore.nix",
+        "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "gitignore.nix",
+        "type": "github"
+      }
+    },
     "hs-flake-utils": {
       "inputs": {
         "flake-utils": "flake-utils_2",
@@ -89,6 +227,48 @@
         "url": "https://whetstone.private.storage/jcalderone/hs-flake-utils.git"
       }
     },
+    "hs-flake-utils_2": {
+      "inputs": {
+        "flake-utils": "flake-utils_4",
+        "nixpkgs": "nixpkgs_2",
+        "pre-commit-hooks": "pre-commit-hooks_2"
+      },
+      "locked": {
+        "lastModified": 1677773826,
+        "narHash": "sha256-xJmOtHugr4k2zNhP/AF6JdIUnIEyM+TEspLn2n5kloc=",
+        "ref": "main",
+        "rev": "d3a83fdd9563546ca41771186427638e685a2e2b",
+        "revCount": 9,
+        "type": "git",
+        "url": "https://whetstone.private.storage/jcalderone/hs-flake-utils.git"
+      },
+      "original": {
+        "ref": "main",
+        "type": "git",
+        "url": "https://whetstone.private.storage/jcalderone/hs-flake-utils.git"
+      }
+    },
+    "hs-flake-utils_3": {
+      "inputs": {
+        "flake-utils": "flake-utils_6",
+        "nixpkgs": "nixpkgs_3",
+        "pre-commit-hooks": "pre-commit-hooks_3"
+      },
+      "locked": {
+        "lastModified": 1677773826,
+        "narHash": "sha256-xJmOtHugr4k2zNhP/AF6JdIUnIEyM+TEspLn2n5kloc=",
+        "ref": "main",
+        "rev": "d3a83fdd9563546ca41771186427638e685a2e2b",
+        "revCount": 9,
+        "type": "git",
+        "url": "https://whetstone.private.storage/jcalderone/hs-flake-utils.git"
+      },
+      "original": {
+        "ref": "main",
+        "type": "git",
+        "url": "https://whetstone.private.storage/jcalderone/hs-flake-utils.git"
+      }
+    },
     "nixpkgs": {
       "locked": {
         "lastModified": 1677624842,
@@ -121,6 +301,70 @@
         "type": "github"
       }
     },
+    "nixpkgs-stable_2": {
+      "locked": {
+        "lastModified": 1673800717,
+        "narHash": "sha256-SFHraUqLSu5cC6IxTprex/nTsI81ZQAtDvlBvGDWfnA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "2f9fd351ec37f5d479556cd48be4ca340da59b8f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-stable_3": {
+      "locked": {
+        "lastModified": 1673800717,
+        "narHash": "sha256-SFHraUqLSu5cC6IxTprex/nTsI81ZQAtDvlBvGDWfnA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "2f9fd351ec37f5d479556cd48be4ca340da59b8f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_2": {
+      "locked": {
+        "lastModified": 1677624842,
+        "narHash": "sha256-4DF9DbDuK4/+KYx0L6XcPBeDHUFVCtzok2fWtwXtb5w=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "d70f5cd5c3bef45f7f52698f39e7cc7a89daa7f0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_3": {
+      "locked": {
+        "lastModified": 1677624842,
+        "narHash": "sha256-4DF9DbDuK4/+KYx0L6XcPBeDHUFVCtzok2fWtwXtb5w=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "d70f5cd5c3bef45f7f52698f39e7cc7a89daa7f0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
     "pre-commit-hooks": {
       "inputs": {
         "flake-compat": "flake-compat",
@@ -149,6 +393,66 @@
         "type": "github"
       }
     },
+    "pre-commit-hooks_2": {
+      "inputs": {
+        "flake-compat": "flake-compat_2",
+        "flake-utils": [
+          "tahoe-chk",
+          "hs-flake-utils",
+          "flake-utils"
+        ],
+        "gitignore": "gitignore_2",
+        "nixpkgs": [
+          "tahoe-chk",
+          "hs-flake-utils",
+          "nixpkgs"
+        ],
+        "nixpkgs-stable": "nixpkgs-stable_2"
+      },
+      "locked": {
+        "lastModified": 1677722096,
+        "narHash": "sha256-7mjVMvCs9InnrRybBfr5ohqcOz+pyEX8m22C1XsDilg=",
+        "owner": "cachix",
+        "repo": "pre-commit-hooks.nix",
+        "rev": "61a3511668891c68ebd19d40122150b98dc2fe3b",
+        "type": "github"
+      },
+      "original": {
+        "owner": "cachix",
+        "repo": "pre-commit-hooks.nix",
+        "type": "github"
+      }
+    },
+    "pre-commit-hooks_3": {
+      "inputs": {
+        "flake-compat": "flake-compat_3",
+        "flake-utils": [
+          "tahoe-great-black-swamp",
+          "hs-flake-utils",
+          "flake-utils"
+        ],
+        "gitignore": "gitignore_3",
+        "nixpkgs": [
+          "tahoe-great-black-swamp",
+          "hs-flake-utils",
+          "nixpkgs"
+        ],
+        "nixpkgs-stable": "nixpkgs-stable_3"
+      },
+      "locked": {
+        "lastModified": 1677722096,
+        "narHash": "sha256-7mjVMvCs9InnrRybBfr5ohqcOz+pyEX8m22C1XsDilg=",
+        "owner": "cachix",
+        "repo": "pre-commit-hooks.nix",
+        "rev": "61a3511668891c68ebd19d40122150b98dc2fe3b",
+        "type": "github"
+      },
+      "original": {
+        "owner": "cachix",
+        "repo": "pre-commit-hooks.nix",
+        "type": "github"
+      }
+    },
     "root": {
       "inputs": {
         "flake-utils": "flake-utils",
@@ -156,7 +460,57 @@
         "nixpkgs": [
           "hs-flake-utils",
           "nixpkgs"
+        ],
+        "tahoe-chk": "tahoe-chk",
+        "tahoe-great-black-swamp": "tahoe-great-black-swamp"
+      }
+    },
+    "tahoe-chk": {
+      "inputs": {
+        "flake-utils": "flake-utils_3",
+        "hs-flake-utils": "hs-flake-utils_2",
+        "nixpkgs": [
+          "tahoe-chk",
+          "hs-flake-utils",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1681998540,
+        "narHash": "sha256-gtlHidh8+qMUdnTzlxLIGlCMavq4/TFQDmope33Cd2w=",
+        "ref": "refs/heads/master",
+        "rev": "799bab0c2b8b5f9cbd98e7dd7d6a77285c87f16b",
+        "revCount": 340,
+        "type": "git",
+        "url": "https://whetstone.private.storage/PrivateStorage/tahoe-chk?tag=0.1.0.0"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://whetstone.private.storage/PrivateStorage/tahoe-chk?tag=0.1.0.0"
+      }
+    },
+    "tahoe-great-black-swamp": {
+      "inputs": {
+        "flake-utils": "flake-utils_5",
+        "hs-flake-utils": "hs-flake-utils_3",
+        "nixpkgs": [
+          "tahoe-great-black-swamp",
+          "hs-flake-utils",
+          "nixpkgs"
         ]
+      },
+      "locked": {
+        "lastModified": 1682446800,
+        "narHash": "sha256-Vxl4dLpoRp2svWTx0w74m7PeVPMlkSu/XOZAHccOUDs=",
+        "ref": "refs/heads/master",
+        "rev": "b81cc3fcdb0107d369a636fdc5a17cf174dff2ea",
+        "revCount": 143,
+        "type": "git",
+        "url": "https://whetstone.private.storage/PrivateStorage/tahoe-great-black-swamp?tag=0.1.0.1"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://whetstone.private.storage/PrivateStorage/tahoe-great-black-swamp?tag=0.1.0.1"
       }
     }
   },
diff --git a/flake.nix b/flake.nix
index cb746bd10f76fa07fc2f2c95693dfc886c08e7d8..655ae67527a6e1fe3394f0ec493401f663a9e1e5 100644
--- a/flake.nix
+++ b/flake.nix
@@ -6,6 +6,9 @@
     nixpkgs.follows = "hs-flake-utils/nixpkgs";
     flake-utils.url = github:numtide/flake-utils;
     hs-flake-utils.url = "git+https://whetstone.private.storage/jcalderone/hs-flake-utils.git?ref=main";
+
+    tahoe-chk.url = "git+https://whetstone.private.storage/PrivateStorage/tahoe-chk?tag=0.1.0.0";
+    tahoe-great-black-swamp.url = "git+https://whetstone.private.storage/PrivateStorage/tahoe-great-black-swamp?tag=0.1.0.1";
   };
 
   outputs = {
@@ -13,6 +16,8 @@
     nixpkgs,
     flake-utils,
     hs-flake-utils,
+    tahoe-chk,
+    tahoe-great-black-swamp,
   }: let
     ulib = flake-utils.lib;
     ghcVersion = "ghc8107";
@@ -28,6 +33,8 @@
         compilerVersion = ghcVersion;
         packageName = "gbs-downloader";
         hsPkgsOverrides = import ./nix/haskell-packages.nix {
+          tahoe-chk = tahoe-chk.outputs.packages.${system}.default;
+          tahoe-great-black-swamp = tahoe-great-black-swamp.outputs.packages.${system}.default;
           haskellLib = pkgs.haskell.lib;
         };
       };
diff --git a/nix/haskell-packages.nix b/nix/haskell-packages.nix
index 0411c50574ae51acb05dd80f11bd70435fdebcfe..175fc2091a3906e508c6b4d7e1146a01122494c1 100644
--- a/nix/haskell-packages.nix
+++ b/nix/haskell-packages.nix
@@ -1,6 +1,10 @@
-{haskellLib}: hfinal: hprev: {
-  tahoe-chk = hfinal.callPackage ./tahoe-chk.nix {};
-  tahoe-great-black-swamp = hfinal.callPackage ./tahoe-great-black-swamp.nix {};
+{
+  haskellLib,
+  tahoe-chk,
+  tahoe-great-black-swamp,
+}: hfinal: hprev: {
+  inherit tahoe-chk;
+  inherit tahoe-great-black-swamp;
 
   # A broken dependency of a tahoe-great-black-swamp executable that we don't
   # use.  Flip the broken bit so we can get a build.
diff --git a/nix/tahoe-chk.nix b/nix/tahoe-chk.nix
deleted file mode 100644
index 4c79be6ff343a138c42cd367fdaf5ddcf5de3868..0000000000000000000000000000000000000000
--- a/nix/tahoe-chk.nix
+++ /dev/null
@@ -1,123 +0,0 @@
-{
-  mkDerivation,
-  aeson,
-  async,
-  base,
-  base32,
-  base64,
-  binary,
-  bytestring,
-  cereal,
-  cipher-aes128,
-  concurrency,
-  containers,
-  crypto-api,
-  cryptonite,
-  directory,
-  extra,
-  fec,
-  fetchgit,
-  filepath,
-  hedgehog,
-  lib,
-  megaparsec,
-  memory,
-  monad-loops,
-  mtl,
-  network-byte-order,
-  optparse-applicative,
-  parser-combinators,
-  primitive,
-  scientific,
-  tagged,
-  tasty,
-  tasty-hedgehog,
-  tasty-hunit,
-  temporary,
-  text,
-  tree-diff,
-  utility-ht,
-  vector,
-  yaml,
-}:
-mkDerivation {
-  pname = "tahoe-chk";
-  version = "0.1.0.0";
-  src = fetchgit {
-    url = "https://whetstone.private.storage/PrivateStorage/tahoe-chk.git";
-    sha256 = "sha256-gtlHidh8+qMUdnTzlxLIGlCMavq4/TFQDmope33Cd2w=";
-    rev = "799bab0c2b8b5f9cbd98e7dd7d6a77285c87f16b";
-    fetchSubmodules = true;
-  };
-  isLibrary = true;
-  isExecutable = true;
-  libraryHaskellDepends = [
-    aeson
-    async
-    base
-    base32
-    base64
-    binary
-    bytestring
-    cereal
-    cipher-aes128
-    concurrency
-    containers
-    crypto-api
-    cryptonite
-    directory
-    extra
-    fec
-    filepath
-    megaparsec
-    memory
-    monad-loops
-    mtl
-    network-byte-order
-    parser-combinators
-    primitive
-    tagged
-    text
-    tree-diff
-    utility-ht
-  ];
-  executableHaskellDepends = [
-    base
-    base32
-    bytestring
-    optparse-applicative
-    text
-  ];
-  testHaskellDepends = [
-    aeson
-    base
-    base32
-    base64
-    binary
-    bytestring
-    cereal
-    cipher-aes128
-    containers
-    crypto-api
-    cryptonite
-    directory
-    fec
-    filepath
-    hedgehog
-    megaparsec
-    scientific
-    tagged
-    tasty
-    tasty-hedgehog
-    tasty-hunit
-    temporary
-    text
-    tree-diff
-    vector
-    yaml
-  ];
-  homepage = "https://gitlab.com/exarkun/chk.hs";
-  description = "The Tahoe-LAFS' Content-Hash-Key (CHK) cryptographic protocol";
-  license = lib.licenses.bsd3;
-  mainProgram = "tahoe-chk-encrypt";
-}
diff --git a/nix/tahoe-great-black-swamp.nix b/nix/tahoe-great-black-swamp.nix
deleted file mode 100644
index c3c1ac0263719621234df649d15350108651acdc..0000000000000000000000000000000000000000
--- a/nix/tahoe-great-black-swamp.nix
+++ /dev/null
@@ -1,125 +0,0 @@
-{
-  mkDerivation,
-  aeson,
-  async,
-  base,
-  base32string,
-  base64-bytestring,
-  binary,
-  bytestring,
-  cborg,
-  cborg-json,
-  containers,
-  deriving-aeson,
-  directory,
-  fetchgit,
-  filepath,
-  foldl,
-  hspec,
-  hspec-expectations,
-  hspec-wai,
-  http-api-data,
-  http-media,
-  http-types,
-  lib,
-  optparse-applicative,
-  primitive,
-  QuickCheck,
-  quickcheck-instances,
-  safe-exceptions,
-  scientific,
-  serialise,
-  servant-client,
-  servant-docs,
-  servant-js,
-  servant-server,
-  temporary,
-  text,
-  unordered-containers,
-  utf8-string,
-  vector,
-  wai,
-  wai-extra,
-  warp,
-  warp-tls,
-}:
-mkDerivation {
-  pname = "tahoe-great-black-swamp";
-  version = "0.1.0.0";
-  src = fetchgit {
-    url = "https://whetstone.private.storage/PrivateStorage/tahoe-great-black-swamp.git";
-    sha256 = "07y0pggiws4cc827w3afnyscbqb4pifvb416l0pyhpcbpiz7fpk1";
-    rev = "55152d2bbb8567c2f3f53ee11d147bedca5c2f8d";
-    fetchSubmodules = true;
-  };
-  isLibrary = true;
-  isExecutable = true;
-  libraryHaskellDepends = [
-    aeson
-    async
-    base
-    base64-bytestring
-    binary
-    bytestring
-    cborg
-    cborg-json
-    containers
-    deriving-aeson
-    directory
-    filepath
-    foldl
-    http-api-data
-    http-media
-    http-types
-    primitive
-    safe-exceptions
-    scientific
-    serialise
-    servant-client
-    servant-docs
-    servant-server
-    text
-    unordered-containers
-    utf8-string
-    vector
-    wai
-    warp
-    warp-tls
-  ];
-  executableHaskellDepends = [
-    base
-    filepath
-    optparse-applicative
-    servant-js
-    warp
-  ];
-  testHaskellDepends = [
-    aeson
-    async
-    base
-    base32string
-    binary
-    bytestring
-    containers
-    deriving-aeson
-    directory
-    filepath
-    foldl
-    hspec
-    hspec-expectations
-    hspec-wai
-    http-types
-    primitive
-    QuickCheck
-    quickcheck-instances
-    safe-exceptions
-    temporary
-    text
-    unordered-containers
-    vector
-    wai-extra
-  ];
-  homepage = "https://whetstone.private.storage/PrivateStorage/tahoe-great-black-swamp";
-  description = "An implementation of the \"Great Black Swamp\" LAFS protocol";
-  license = lib.licenses.bsd3;
-}