diff --git a/manifest.dhall b/manifest.dhall
index 81c9da148c985c67615e273f3aa0f021749f5632..4279f885303f9ad752706996a98973736d238e04 100644
--- a/manifest.dhall
+++ b/manifest.dhall
@@ -671,6 +671,7 @@ in  [ callHackage "Cabal" "3.8.1.0"
     , callHackage "safe-coloured-text-terminfo" "0.1.0.0"
     , callHackage "safe-coloured-text" "0.2.0.1"
     , callHackage "safe-exceptions" "0.1.7.3"
+    , callHackage "safe" "0.3.19"
     , callHackage "saltine" "0.2.0.1"
     , callHackage "sandwich" "0.1.1.2"
     , callHackage "scotty" "0.12"
diff --git a/overlay.nix b/overlay.nix
index e8fac7ebd4d853c7ee560b40cda7e1a2be738a13..feb2f32761b76f0bfd61dc6ad2d63b608759aae4 100644
--- a/overlay.nix
+++ b/overlay.nix
@@ -1061,6 +1061,8 @@ self: with pkgs.haskell.lib; {
 
   rope-utf16-splay = self.callPackage (./pkgs/rope-utf16-splay.nix) { };
 
+  safe = self.callPackage (./pkgs/safe.nix) { };
+
   safe-coloured-text = self.callPackage (./pkgs/safe-coloured-text.nix) { };
 
   safe-coloured-text-terminfo = self.callPackage (./pkgs/safe-coloured-text-terminfo.nix) { };
diff --git a/pkgs/safe.nix b/pkgs/safe.nix
new file mode 100644
index 0000000000000000000000000000000000000000..5d73feb9a596b3a083e73a369783e758ecf8627d
--- /dev/null
+++ b/pkgs/safe.nix
@@ -0,0 +1,22 @@
+{ mkDerivation, base, deepseq, lib, QuickCheck }:
+mkDerivation {
+  pname = "safe";
+  version = "0.3.19";
+  sha256 = "25043442c8f8aa95955bb17467d023630632b961aaa61e807e325d9b2c33f7a2";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ base ];
+  testHaskellDepends = [ base deepseq QuickCheck ];
+  enableLibraryProfiling = false;
+  enableExecutableProfiling = false;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/ndmitchell/safe#readme";
+  description = "Library of safe (exception free) functions";
+  license = lib.licenses.bsd3;
+  broken = false;
+}