diff --git a/.envrc b/.envrc
index 5a9b66bde64884de4c0035c2a4c5cb2e6016d3d3..44610e56df55d95c569ff25313b79ca3d3cd4e78 100644
--- a/.envrc
+++ b/.envrc
@@ -1,2 +1 @@
-env="$(nix-build $PWD/direnv.nix -A env)"
-load_prefix "${env}"
+use flake;
diff --git a/.gitignore b/.gitignore
index da66d29b6a69cfb28a2118afc248c3eb6659324e..17bcffc9ab038e85841904adef969c8c10ef240a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
 result
 dist-newstyle
-.dir-locals.el
\ No newline at end of file
+.dir-locals.el
+.direnv
\ No newline at end of file
diff --git a/README.md b/README.md
index 97ef7a178c8f4c78e9740f98931f66e29676a227..1ec7220fff0e96163268c99153ea77e30cccdd66 100644
--- a/README.md
+++ b/README.md
@@ -33,7 +33,8 @@ used.
      ```
    - Using [nix](https://nixos.org/):
      ```bash
-     nix-env -f https://git.coop/akshay/terraform-http-backend-pass/-/archive/main/terraform-http-backend-pass-main.tar.gz -i
+     nix registry add terraform-http-backend-pass git+https://git.coop/akshay/terraform-http-backend-pass
+     nix build 'terraform-http-backend-pass#' --profile $HOME/.nix-profile
      ```
 2. Create a pass repository:
    ```bash
diff --git a/cabal.project b/cabal.project
index b512e200477dd69ba9c52f636f2917dfb1c0f6b8..5356e76f67c76ea1cf221ce38a73edef1002225e 100644
--- a/cabal.project
+++ b/cabal.project
@@ -1,7 +1 @@
-packages: .
-
-source-repository-package
-  type: git
-  location: https://github.com/haskell-servant/servant.git
-  tag: 27173c922311112dd153346cf3cd72b9fb0f3551
-  subdir: servant servant-server
\ No newline at end of file
+packages: .
\ No newline at end of file
diff --git a/default.nix b/default.nix
index 5b6d87c0d84ce09f0e74e738fa8c15c6522dc30b..926ce1224d07b6e10507cc07a8d0a32881fc0400 100644
--- a/default.nix
+++ b/default.nix
@@ -1,13 +1,19 @@
-let sources = import ./nix/sources.nix;
-in { pkgs ? import sources.nixpkgs {},
-     compiler ? "ghc8103"
-   }:
-     let
-       servantPkgs = import sources.servant {inherit pkgs compiler; };
-       overrides = self: super: {
-         terraform-http-backend-pass = self.callCabal2nix "terraform-http-backend-pass" ./. {};
-         servant = servantPkgs.servant;
-         servant-server = servantPkgs.servant-server;
-       };
-       hPkgs = pkgs.haskell.packages.${compiler}.override { inherit overrides; };
-     in hPkgs.terraform-http-backend-pass
+{ mkDerivation, aeson, base, bytestring, directory, lib, mtl
+, optparse-applicative, optparse-generic, servant, servant-server
+, shelly, text, warp
+}:
+mkDerivation {
+  pname = "terraform-http-backend-pass";
+  version = "0.1.0.0";
+  src = ./.;
+  isLibrary = true;
+  isExecutable = true;
+  libraryHaskellDepends = [
+    aeson base bytestring directory mtl optparse-applicative
+    optparse-generic servant servant-server shelly text warp
+  ];
+  executableHaskellDepends = [ base ];
+  homepage = "https://github.com/akshaymankar/terraform-http-backend-pass#readme";
+  description = "HTTP backend to store terraform state using pass and git";
+  license = "AGPL";
+}
diff --git a/direnv.nix b/direnv.nix
deleted file mode 100644
index b596732e442a19c7f165ab01c009d9a23e30eb6d..0000000000000000000000000000000000000000
--- a/direnv.nix
+++ /dev/null
@@ -1,18 +0,0 @@
-let
-  sources = import ./nix/sources.nix;
-  pkgs = import sources.nixpkgs {};
-in {
-  env = pkgs.buildEnv {
-    name = "terraform-http-backend-pass";
-    paths = with pkgs; [
-      pass
-      niv
-      gnumake
-      haskell-language-server
-      cabal-install
-      haskell.compiler.ghc8103 # HLS doesn't support GHC 9 yet.
-      zlib.dev
-      zlib
-    ];
-  };
-}
diff --git a/flake.lock b/flake.lock
new file mode 100644
index 0000000000000000000000000000000000000000..6bdcae237d31865cffe334c402091b290b3a7b22
--- /dev/null
+++ b/flake.lock
@@ -0,0 +1,43 @@
+{
+  "nodes": {
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1649676176,
+        "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1651114127,
+        "narHash": "sha256-/lLC0wkMZkAdA5e1W76SnJzbhfOGDvync3VRHJMtAKk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "6766fb6503ae1ebebc2a9704c162b2aef351f921",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "flake-utils": "flake-utils",
+        "nixpkgs": "nixpkgs"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flake.nix b/flake.nix
new file mode 100644
index 0000000000000000000000000000000000000000..3e3ac293d5ada098ddece9fa2ccca7e03f08b533
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,53 @@
+{
+  description = "A very basic flake";
+
+  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
+  inputs.flake-utils.url = "github:numtide/flake-utils";
+
+  outputs = {nixpkgs, flake-utils, ...}:
+    flake-utils.lib.eachDefaultSystem (system:
+      let
+        pkgs = import nixpkgs {inherit system;};
+        hlib = pkgs.haskell.lib;
+        # Avoids unnecessary recompiles
+        filteredSource = pkgs.lib.cleanSourceWith {
+          src = ./.;
+          filter = path: type:
+            let baseName = baseNameOf (toString path);
+            in pkgs.lib.cleanSourceFilter path type && !(
+              baseName == "flake.nix" ||
+              baseName == "flake.lock" ||
+              baseName == "dist-newstyle" ||
+              baseName == "nix" ||
+              builtins.match "^cabal\.project\..*$" baseName != null ||
+              baseName == ".envrc" ||
+              baseName == "hie.yaml" ||
+              baseName == ".hlint.yaml" ||
+              baseName == ".hspec"
+            );
+        };
+        haskellPackages = pkgs.haskell.packages.ghc8107.override {
+          overrides = hself: hsuper:
+            {
+              terraform-http-backend-pass = hlib.overrideSrc (hself.callPackage ./default.nix {}) {src = filteredSource;};
+            };
+        };
+      in rec {
+        packages = {
+          terraform-http-backend-pass = haskellPackages.terraform-http-backend-pass;
+          dev-shell = haskellPackages.shellFor {
+            packages = p: [p.terraform-http-backend-pass];
+            buildInputs = [
+              pkgs.cabal-install
+              pkgs.haskell.packages.ghc8107.haskell-language-server
+              pkgs.cabal2nix
+
+              pkgs.pass
+            ];
+          };
+        };
+        defaultPackage = packages.terraform-http-backend-pass;
+        devShell = packages.dev-shell;
+      });
+}
+