diff --git a/manifest.dhall b/manifest.dhall
index 86e54afeeba8c3a98831773f3c21f746885969f3..65473810436abdf5ca7910dda8f8b73b33a89467 100644
--- a/manifest.dhall
+++ b/manifest.dhall
@@ -131,6 +131,7 @@ in  [ callHackage "Cabal" "3.8.1.0"
     , callHackage "cborg-json" "0.2.5.0"
     , callHackage "charset" "0.3.9"
     , callHackage "citeproc" "0.8.0.1"
+    , callHackage "cmdargs" "0.10.21"
     , callHackage "co-log-core" "0.3.1.0"
     , callHackage "co-log-polysemy" "0.0.1.3"
     , callHackage "colourista" "0.1.0.1"
diff --git a/overlay.nix b/overlay.nix
index 9d40601013561767fd3ea31cfcdf2d142dcd09b6..2969d952721a0d0d9666ca3fb355b0fff9fe9057 100644
--- a/overlay.nix
+++ b/overlay.nix
@@ -137,6 +137,8 @@ self: with pkgs.haskell.lib; {
 
   citeproc = self.callPackage (./pkgs/citeproc.nix) { };
 
+  cmdargs = self.callPackage (./pkgs/cmdargs.nix) { };
+
   co-log-core = self.callPackage (./pkgs/co-log-core.nix) { };
 
   co-log-polysemy = self.callPackage (./pkgs/co-log-polysemy.nix) { };
diff --git a/pkgs/cmdargs.nix b/pkgs/cmdargs.nix
new file mode 100644
index 0000000000000000000000000000000000000000..b83bd2187c191bf1b871e02bf08c9f9d9abfc6d8
--- /dev/null
+++ b/pkgs/cmdargs.nix
@@ -0,0 +1,34 @@
+{ mkDerivation
+, base
+, filepath
+, lib
+, process
+, template-haskell
+, transformers
+}:
+mkDerivation {
+  pname = "cmdargs";
+  version = "0.10.21";
+  sha256 = "f7d8ea5c4e6af368d9b5d2eb994fc29235406fbe91916a6dc63bd883025eca75";
+  isLibrary = true;
+  isExecutable = true;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    base
+    filepath
+    process
+    template-haskell
+    transformers
+  ];
+  enableLibraryProfiling = false;
+  enableExecutableProfiling = false;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/ndmitchell/cmdargs#readme";
+  description = "Command line argument processing";
+  license = lib.licenses.bsd3;
+  broken = false;
+}