diff --git a/manifest.dhall b/manifest.dhall
index 63d51fba92ce479755b2d0dda256b6a8a80ea93c..4bb125a387affc796d4bc4462be37b6cada58674 100644
--- a/manifest.dhall
+++ b/manifest.dhall
@@ -303,6 +303,7 @@ in  [ callHackage "Cabal" "3.8.1.0"
     , callHackage "infer-license" "0.2.0"
     , callHackage "integer-logarithms" "1.0.3.1"
     , callHackage "invariant" "0.6"
+    , callHackage "ipynb" "0.2"
     , callHackage "iproute" "1.7.12"
     , callCabal2nix
         "kvstore-effectful"
diff --git a/overlay.nix b/overlay.nix
index 465da688ea8db131819fc1c4cef7caf9a088028f..d7a447d2196729e043874d172f8bb740b7105623 100644
--- a/overlay.nix
+++ b/overlay.nix
@@ -379,6 +379,8 @@ final: prev: with pkgs.haskell.lib; {
 
   iproute = prev.callPackage (./pkgs/iproute.nix) { };
 
+  ipynb = prev.callPackage (./pkgs/ipynb.nix) { };
+
   kvstore-effectful = prev.callPackage (./pkgs/kvstore-effectful.nix) { };
 
   kvstore-effectful-cache = prev.callPackage (./pkgs/kvstore-effectful-cache.nix) { };
diff --git a/pkgs/ipynb.nix b/pkgs/ipynb.nix
new file mode 100644
index 0000000000000000000000000000000000000000..78ecfb5a88e74ccd07b4e4b8f8c18960c2ca45de
--- /dev/null
+++ b/pkgs/ipynb.nix
@@ -0,0 +1,57 @@
+{ mkDerivation
+, aeson
+, base
+, base64-bytestring
+, bytestring
+, containers
+, directory
+, filepath
+, lib
+, microlens
+, microlens-aeson
+, tasty
+, tasty-hunit
+, text
+, unordered-containers
+}:
+mkDerivation {
+  pname = "ipynb";
+  version = "0.2";
+  sha256 = "9a743d74e95ccccfadca4a734f44c7b3e2a5b838da3f9044231590d7355191c7";
+  revision = "1";
+  editedCabalFile = "0fl9x5amq0g5dg57dcgc0g4ir0r1fdbx06aldsqdwzdc9zs97v6k";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    aeson
+    base
+    base64-bytestring
+    bytestring
+    containers
+    text
+    unordered-containers
+  ];
+  testHaskellDepends = [
+    aeson
+    base
+    bytestring
+    directory
+    filepath
+    microlens
+    microlens-aeson
+    tasty
+    tasty-hunit
+    text
+  ];
+  enableLibraryProfiling = false;
+  enableExecutableProfiling = false;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  description = "Data structure for working with Jupyter notebooks (ipynb)";
+  license = lib.licenses.bsd3;
+  broken = false;
+}