diff --git a/manifest.dhall b/manifest.dhall
index 13fc7cb603b6f8d8fab94a9ee89d80e3dc4b0dfa..fd61e373ea1794b3fbe77b4b6a558dc02562e3ed 100644
--- a/manifest.dhall
+++ b/manifest.dhall
@@ -71,6 +71,7 @@ in  [ callHackage "Cabal" "3.8.1.0"
     , callHackage "OpenGLRaw" "3.3.4.1"
     , callHackage "PyF" "0.11.1.0"
     , callHackage "aeson" "2.1.0.0"
+    , callHackage "aeson-pretty" "0.8.9"
     , callHackage "aeson-yaml" "1.1.0.1"
     , callHackage "ansi-terminal" "0.11.3"
     , callHackage "apecs" "0.9.4"
@@ -89,6 +90,7 @@ in  [ callHackage "Cabal" "3.8.1.0"
     , callHackage "blaze-markup" "0.8.2.8"
     , callHackage "boring" "0.2"
     , callHackage "bsb-http-chunked" "0.0.0.4"
+    , callHackage "breakpoint" "0.1.1.1"
     , callHackage "brick" "1.3"
     , callHackage "bytes" "0.17.2"
     , callHackage "cabal-doctest" "1.0.9"
@@ -99,6 +101,8 @@ in  [ callHackage "Cabal" "3.8.1.0"
         "https://github.com/NixOS/cabal2nix"
         (None Text)
         (Some "cabal2nix")
+    , callHackage "cassava" "0.5.3.0"
+    , callHackage "cassava-megaparsec" "2.0.4"
     , callHackage "cereal" "0.5.8.3"
     , callHackage "cborg" "0.2.8.0"
     , callHackage "cborg-json" "0.2.5.0"
@@ -239,6 +243,8 @@ in  [ callHackage "Cabal" "3.8.1.0"
     , callHackage "hie-bios" "0.11.0"
     , callHackage "hie-compat" "0.3.0.0"
     , callHackage "hiedb" "0.4.2.0"
+    , callHackage "hledger-lib" "1.27.1"
+    , callHackage "hledger" "1.27.1"
     , callHackage "hlint" "3.5"
     , callHackage "hourglass" "0.2.12"
     , callCabal2nix
diff --git a/overlay.nix b/overlay.nix
index 533397ed3e058b503d92f7164e61e470446b26ac..b9eeef90132b297def202e0aff54306340f0559b 100644
--- a/overlay.nix
+++ b/overlay.nix
@@ -25,6 +25,8 @@ final: prev: with pkgs.haskell.lib; {
 
     aeson = prev.callPackage (./pkgs/aeson.nix) { };
 
+    aeson-pretty = prev.callPackage (./pkgs/aeson-pretty.nix) { };
+
     aeson-yaml = prev.callPackage (./pkgs/aeson-yaml.nix) { };
 
     ansi-terminal = prev.callPackage (./pkgs/ansi-terminal.nix) { };
@@ -59,6 +61,8 @@ final: prev: with pkgs.haskell.lib; {
 
     boring = prev.callPackage (./pkgs/boring.nix) { };
 
+    breakpoint = prev.callPackage (./pkgs/breakpoint.nix) { };
+
     brick = prev.callPackage (./pkgs/brick.nix) { };
 
     bsb-http-chunked = prev.callPackage (./pkgs/bsb-http-chunked.nix) { };
@@ -73,6 +77,10 @@ final: prev: with pkgs.haskell.lib; {
 
     cabal2nix = prev.callPackage (./pkgs/cabal2nix.nix) { };
 
+    cassava = prev.callPackage (./pkgs/cassava.nix) { };
+
+    cassava-megaparsec = prev.callPackage (./pkgs/cassava-megaparsec.nix) { };
+
     cborg = prev.callPackage (./pkgs/cborg.nix) { };
 
     cborg-json = prev.callPackage (./pkgs/cborg-json.nix) { };
@@ -265,6 +273,10 @@ final: prev: with pkgs.haskell.lib; {
 
     hiedb = prev.callPackage (./pkgs/hiedb.nix) { };
 
+    hledger = prev.callPackage (./pkgs/hledger.nix) { };
+
+    hledger-lib = prev.callPackage (./pkgs/hledger-lib.nix) { };
+
     hlint = prev.callPackage (./pkgs/hlint.nix) { };
 
     hnix = prev.callPackage (./pkgs/hnix.nix) { };
diff --git a/pkgs/aeson-pretty.nix b/pkgs/aeson-pretty.nix
new file mode 100644
index 0000000000000000000000000000000000000000..19158ce4aa5be546040af26425c5fc6128fb5ea9
--- /dev/null
+++ b/pkgs/aeson-pretty.nix
@@ -0,0 +1,27 @@
+{ mkDerivation, aeson, attoparsec, base, base-compat, bytestring
+, cmdargs, lib, scientific, text, unordered-containers, vector
+}:
+mkDerivation {
+  pname = "aeson-pretty";
+  version = "0.8.9";
+  sha256 = "5dbc4f451dfa1e667b2c6ec5170714fed1905dc9cae6a1134b3376f355fa2a08";
+  revision = "2";
+  editedCabalFile = "1895w56jl4c06wfhv5zf8ayqpzkxgva2rz5xxz8fvfdiza781cgp";
+  isLibrary = true;
+  isExecutable = true;
+  libraryHaskellDepends = [
+    aeson base base-compat bytestring scientific text
+    unordered-containers vector
+  ];
+  executableHaskellDepends = [
+    aeson attoparsec base bytestring cmdargs
+  ];
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  hyperlinkSource = false;
+  homepage = "http://github.com/informatikr/aeson-pretty";
+  description = "JSON pretty-printing library and command-line tool";
+  license = lib.licenses.bsd3;
+  mainProgram = "aeson-pretty";
+}
\ No newline at end of file
diff --git a/pkgs/breakpoint.nix b/pkgs/breakpoint.nix
new file mode 100644
index 0000000000000000000000000000000000000000..d6dfc5de0f75fc14b446a31e86b9cda5ba045959
--- /dev/null
+++ b/pkgs/breakpoint.nix
@@ -0,0 +1,20 @@
+{ mkDerivation, ansi-terminal, base, containers, ghc, haskeline
+, lib, mtl, pretty-simple, tasty, tasty-hunit, template-haskell
+, text, transformers
+}:
+mkDerivation {
+  pname = "breakpoint";
+  version = "0.1.1.1";
+  sha256 = "e24a2cafa6ea866b571fe50bcc49fbf64c14244d985918e9ffe2c7c789d5cec3";
+  libraryHaskellDepends = [
+    ansi-terminal base containers ghc haskeline mtl pretty-simple
+    template-haskell text transformers
+  ];
+  testHaskellDepends = [ base containers tasty tasty-hunit ];
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  hyperlinkSource = false;
+  description = "Set breakpoints using a GHC plugin";
+  license = lib.licenses.mit;
+}
\ No newline at end of file
diff --git a/pkgs/cassava-megaparsec.nix b/pkgs/cassava-megaparsec.nix
new file mode 100644
index 0000000000000000000000000000000000000000..15673053d8eb1a025bdcedf9493c6da5f02e090c
--- /dev/null
+++ b/pkgs/cassava-megaparsec.nix
@@ -0,0 +1,21 @@
+{ mkDerivation, base, bytestring, cassava, hspec, hspec-megaparsec
+, lib, megaparsec, unordered-containers, vector
+}:
+mkDerivation {
+  pname = "cassava-megaparsec";
+  version = "2.0.4";
+  sha256 = "16398f202df2898de482c156835ba6e7dea8ef71d7ac818c5cd4e72ad1f8e95d";
+  libraryHaskellDepends = [
+    base bytestring cassava megaparsec unordered-containers vector
+  ];
+  testHaskellDepends = [
+    base bytestring cassava hspec hspec-megaparsec vector
+  ];
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/stackbuilders/cassava-megaparsec";
+  description = "Megaparsec parser of CSV files that plays nicely with Cassava";
+  license = lib.licenses.mit;
+}
\ No newline at end of file
diff --git a/pkgs/cassava.nix b/pkgs/cassava.nix
new file mode 100644
index 0000000000000000000000000000000000000000..3581c8633d6d1bc780c93bdd3671acaf3b23990c
--- /dev/null
+++ b/pkgs/cassava.nix
@@ -0,0 +1,28 @@
+{ mkDerivation, array, attoparsec, base, bytestring, containers
+, deepseq, hashable, HUnit, lib, Only, QuickCheck
+, quickcheck-instances, scientific, test-framework
+, test-framework-hunit, test-framework-quickcheck2, text
+, text-short, transformers, unordered-containers, vector
+}:
+mkDerivation {
+  pname = "cassava";
+  version = "0.5.3.0";
+  sha256 = "b4c8451f433ad7725cb8b9f7a7efe598ba103b16584713c91f48ae023829e9be";
+  configureFlags = [ "-f-bytestring--lt-0_10_4" ];
+  libraryHaskellDepends = [
+    array attoparsec base bytestring containers deepseq hashable Only
+    scientific text text-short transformers unordered-containers vector
+  ];
+  testHaskellDepends = [
+    attoparsec base bytestring hashable HUnit QuickCheck
+    quickcheck-instances scientific test-framework test-framework-hunit
+    test-framework-quickcheck2 text unordered-containers vector
+  ];
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/haskell-hvr/cassava";
+  description = "A CSV parsing and encoding library";
+  license = lib.licenses.bsd3;
+}
\ No newline at end of file
diff --git a/pkgs/hledger-lib.nix b/pkgs/hledger-lib.nix
new file mode 100644
index 0000000000000000000000000000000000000000..6e072669b9d29846597c7af602fe051e2a6d196c
--- /dev/null
+++ b/pkgs/hledger-lib.nix
@@ -0,0 +1,39 @@
+{ mkDerivation, aeson, aeson-pretty, ansi-terminal, array, base
+, blaze-markup, breakpoint, bytestring, call-stack, cassava
+, cassava-megaparsec, cmdargs, containers, data-default, Decimal
+, deepseq, directory, doclayout, doctest, extra, file-embed
+, filepath, Glob, hashtables, lib, megaparsec, microlens
+, microlens-th, mtl, parser-combinators, pretty-simple, regex-tdfa
+, safe, tabular, tasty, tasty-hunit, template-haskell, text, time
+, timeit, transformers, uglymemo, unordered-containers, utf8-string
+}:
+mkDerivation {
+  pname = "hledger-lib";
+  version = "1.27.1";
+  sha256 = "0bf2ab283435a3c49b91a2f18e124f7b27d8203a4db6ef8a1df71ae6fcb55270";
+  libraryHaskellDepends = [
+    aeson aeson-pretty ansi-terminal array base blaze-markup breakpoint
+    bytestring call-stack cassava cassava-megaparsec cmdargs containers
+    data-default Decimal deepseq directory doclayout extra file-embed
+    filepath Glob hashtables megaparsec microlens microlens-th mtl
+    parser-combinators pretty-simple regex-tdfa safe tabular tasty
+    tasty-hunit template-haskell text time timeit transformers uglymemo
+    unordered-containers utf8-string
+  ];
+  testHaskellDepends = [
+    aeson aeson-pretty ansi-terminal array base blaze-markup breakpoint
+    bytestring call-stack cassava cassava-megaparsec cmdargs containers
+    data-default Decimal deepseq directory doclayout doctest extra
+    file-embed filepath Glob hashtables megaparsec microlens
+    microlens-th mtl parser-combinators pretty-simple regex-tdfa safe
+    tabular tasty tasty-hunit template-haskell text time timeit
+    transformers uglymemo unordered-containers utf8-string
+  ];
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  hyperlinkSource = false;
+  homepage = "http://hledger.org";
+  description = "A reusable library providing the core functionality of hledger";
+  license = lib.licenses.gpl3Only;
+}
\ No newline at end of file
diff --git a/pkgs/hledger.nix b/pkgs/hledger.nix
new file mode 100644
index 0000000000000000000000000000000000000000..f951a7a330a6538752ec98b0e0f56a03dba47871
--- /dev/null
+++ b/pkgs/hledger.nix
@@ -0,0 +1,47 @@
+{ mkDerivation, aeson, ansi-terminal, base, breakpoint, bytestring
+, cmdargs, containers, data-default, Decimal, Diff, directory
+, extra, filepath, githash, hashable, haskeline, hledger-lib, lib
+, lucid, math-functions, megaparsec, microlens, mtl, process
+, regex-tdfa, safe, shakespeare, split, tabular, tasty, temporary
+, terminfo, text, time, timeit, transformers, unordered-containers
+, utf8-string, utility-ht, wizards
+}:
+mkDerivation {
+  pname = "hledger";
+  version = "1.27.1";
+  sha256 = "0bb7f637c5dfe0deaf6ea463b68a23fc08c4d581e78a81319e5e687fea41af61";
+  isLibrary = true;
+  isExecutable = true;
+  libraryHaskellDepends = [
+    aeson ansi-terminal base breakpoint bytestring cmdargs containers
+    data-default Decimal Diff directory extra filepath githash hashable
+    haskeline hledger-lib lucid math-functions megaparsec microlens mtl
+    process regex-tdfa safe shakespeare split tabular tasty temporary
+    terminfo text time timeit transformers unordered-containers
+    utf8-string utility-ht wizards
+  ];
+  executableHaskellDepends = [
+    aeson ansi-terminal base breakpoint bytestring cmdargs containers
+    data-default Decimal directory extra filepath githash haskeline
+    hledger-lib math-functions megaparsec microlens mtl process
+    regex-tdfa safe shakespeare split tabular tasty temporary terminfo
+    text time timeit transformers unordered-containers utf8-string
+    utility-ht wizards
+  ];
+  testHaskellDepends = [
+    aeson ansi-terminal base breakpoint bytestring cmdargs containers
+    data-default Decimal directory extra filepath githash haskeline
+    hledger-lib math-functions megaparsec microlens mtl process
+    regex-tdfa safe shakespeare split tabular tasty temporary terminfo
+    text time timeit transformers unordered-containers utf8-string
+    utility-ht wizards
+  ];
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  hyperlinkSource = false;
+  homepage = "http://hledger.org";
+  description = "Command-line interface for the hledger accounting system";
+  license = lib.licenses.gpl3Only;
+  mainProgram = "hledger";
+}
\ No newline at end of file