diff --git a/manifest.dhall b/manifest.dhall
index 097d50ae7471f28e9d2f5af1675f82e62b8bbc88..e0de96e6865376e5ab0c926e0972f6301d0b8c0c 100644
--- a/manifest.dhall
+++ b/manifest.dhall
@@ -322,6 +322,7 @@ in  [ callHackage "Cabal" "3.8.1.0"
         (None Text)
     , callHackage "lsp-types" "1.6.0.0"
     , callHackage "lsp" "1.6.0.0"
+    , callHackage "lua" "2.2.1"
     , callHackage "lucid-alpine" "0.1.0.7"
     , callHackage "lucid-aria" "0.1.0.1"
     , callHackage "lucid-svg" "0.7.1"
diff --git a/overlay.nix b/overlay.nix
index aa05d99e7d5baacfb60969579929866796f68106..e55a43954bb2791b94a0a8070d61bac7c043f4f3 100644
--- a/overlay.nix
+++ b/overlay.nix
@@ -375,6 +375,8 @@ final: prev: with pkgs.haskell.lib; {
 
   lsp-types = prev.callPackage (./pkgs/lsp-types.nix) { };
 
+  lua = prev.callPackage (./pkgs/lua.nix) { };
+
   lucid = prev.callPackage (./pkgs/lucid.nix) { };
 
   lucid-alpine = prev.callPackage (./pkgs/lucid-alpine.nix) { };
diff --git a/pkgs/lua.nix b/pkgs/lua.nix
new file mode 100644
index 0000000000000000000000000000000000000000..68938317e4da8f769937004d3f9c9f8dca57a85b
--- /dev/null
+++ b/pkgs/lua.nix
@@ -0,0 +1,24 @@
+{ mkDerivation, base, lib, lua5_4, tasty, tasty-hunit }:
+mkDerivation {
+  pname = "lua";
+  version = "2.2.1";
+  sha256 = "85546fb11ee349d3182ce11bd3046e644c2964fcfc39c797c2cd1a12e588961f";
+  configureFlags = [ "-fsystem-lua" "-f-use-pkgconfig" ];
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ base ];
+  librarySystemDepends = [ lua5_4 ];
+  testHaskellDepends = [ base tasty tasty-hunit ];
+  enableLibraryProfiling = false;
+  enableExecutableProfiling = false;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://hslua.org/";
+  description = "Lua, an embeddable scripting language";
+  license = lib.licenses.mit;
+  broken = false;
+}