diff --git a/manifest.dhall b/manifest.dhall
index 898b80e1ff688811d9c5dc32c6584f231c87de45..af28419a8a800f857acfcdd155e4f2be4d780828 100644
--- a/manifest.dhall
+++ b/manifest.dhall
@@ -682,6 +682,7 @@ in  [ callHackage "Cabal" "3.8.1.0"
     , callHackage "wai" "3.2.3"
     , callHackage "warp" "3.3.22"
     , callHackage "warp-tls" "3.3.3"
+    , callHackage "websockets" "0.12.7.3"
     , callHackage "witherable" "0.4.2"
     , callHackage "with-utf8" "1.0.2.3"
     , callHackage "x509-store" "1.6.9"
diff --git a/overlay.nix b/overlay.nix
index 6b98efe5e4ae49782f2e1d58d177146a35ad5c80..c0e92ba6f3eeb843213439d3e2865ea60bad475f 100644
--- a/overlay.nix
+++ b/overlay.nix
@@ -971,6 +971,8 @@ final: prev: with pkgs.haskell.lib; {
 
   warp-tls = prev.callPackage (./pkgs/warp-tls.nix) { };
 
+  websockets = prev.callPackage (./pkgs/websockets.nix) { };
+
   with-utf8 = prev.callPackage (./pkgs/with-utf8.nix) { };
 
   witherable = prev.callPackage (./pkgs/witherable.nix) { };
diff --git a/pkgs/websockets.nix b/pkgs/websockets.nix
new file mode 100644
index 0000000000000000000000000000000000000000..c93003b387209163a0c58e79f88753121b10fab9
--- /dev/null
+++ b/pkgs/websockets.nix
@@ -0,0 +1,105 @@
+{ mkDerivation
+, async
+, attoparsec
+, base
+, base64-bytestring
+, binary
+, bytestring
+, bytestring-builder
+, case-insensitive
+, clock
+, containers
+, criterion
+, entropy
+, HUnit
+, lib
+, network
+, QuickCheck
+, random
+, SHA
+, streaming-commons
+, test-framework
+, test-framework-hunit
+, test-framework-quickcheck2
+, text
+}:
+mkDerivation {
+  pname = "websockets";
+  version = "0.12.7.3";
+  sha256 = "d3b0a8a0df7ac7c39c2572152ff903af2d5f009627dde4dada6fb81c89057f3c";
+  revision = "1";
+  editedCabalFile = "1yx97y6jl74vy200y43vjxfyzx338kh10dx8vxkjhr0mfh36wldq";
+  isLibrary = true;
+  isExecutable = true;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    async
+    attoparsec
+    base
+    base64-bytestring
+    binary
+    bytestring
+    bytestring-builder
+    case-insensitive
+    clock
+    containers
+    entropy
+    network
+    random
+    SHA
+    streaming-commons
+    text
+  ];
+  testHaskellDepends = [
+    async
+    attoparsec
+    base
+    base64-bytestring
+    binary
+    bytestring
+    bytestring-builder
+    case-insensitive
+    clock
+    containers
+    entropy
+    HUnit
+    network
+    QuickCheck
+    random
+    SHA
+    streaming-commons
+    test-framework
+    test-framework-hunit
+    test-framework-quickcheck2
+    text
+  ];
+  benchmarkHaskellDepends = [
+    async
+    attoparsec
+    base
+    base64-bytestring
+    binary
+    bytestring
+    bytestring-builder
+    case-insensitive
+    clock
+    containers
+    criterion
+    entropy
+    network
+    random
+    SHA
+    text
+  ];
+  enableLibraryProfiling = false;
+  enableExecutableProfiling = false;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "http://jaspervdj.be/websockets";
+  description = "A sensible and clean way to write WebSocket-capable servers in Haskell";
+  license = lib.licenses.bsd3;
+  broken = false;
+}