diff --git a/horizon.dhall b/horizon.dhall
index 37d654246913efd11a257a89493d43934c793fbc..8241f9a323b49c0aff09753925cffb34c16e7e7b 100644
--- a/horizon.dhall
+++ b/horizon.dhall
@@ -276,6 +276,7 @@ let packages =
       , deriving-compat = H.callHackage "deriving-compat" "0.6.1"
       , derp = H.callHackage "derp" "0.1.6"
       , dhall = H.callHackage "dhall" "1.41.2"
+      , dhall-docs = H.callHackage "dhall-docs" "1.0.10"
       , dhall-json = H.callHackage "dhall-json" "1.7.11"
       , dhall-nixpkgs = H.callHackage "dhall-nixpkgs" "1.0.9"
       , diagrams-contrib = H.callHackage "diagrams-contrib" "1.4.5"
@@ -591,6 +592,7 @@ let packages =
       , hsyslog = H.callHackage "hsyslog" "5.0.2"
       , html = H.callHackage "html" "1.0.1.2"
       , html-entities = H.callHackage "html-entities" "1.1.4.6"
+      , html-entity-map = H.callHackage "html-entity-map" "0.1.0.0"
       , http-api-data = H.callHackage "http-api-data" "0.5"
       , http-client = H.callHackage "http-client" "0.7.13.1"
       , http-client-tls = H.callHackage "http-client-tls" "0.3.6.1"
@@ -743,9 +745,11 @@ let packages =
       , mime-mail = H.callHackage "mime-mail" "0.5.1"
       , mime-types = H.callHackage "mime-types" "0.1.1.0"
       , mmap = H.callHackage "mmap" "0.5.9"
+      , mmark = H.callHackage "mmark" "0.0.7.6"
       , mmorph = H.callHackage "mmorph" "1.2.0"
       , mockery = H.callHackage "mockery" "0.3.5"
       , mod = H.callHackage "mod" "0.1.2.2"
+      , modern-uri = H.callHackage "modern-uri" "0.3.6.0"
       , monadlist = H.callHackage "monadlist" "0.0.2"
       , monad-control = H.callHackage "monad-control" "1.0.3.1"
       , monad-logger = H.callHackage "monad-logger" "0.3.37"
diff --git a/initial-packages.nix b/initial-packages.nix
index 432a69f56de424df5ece1ccb8fa8937dfe26fe89..011576db90eed1fd96451201a9177c86a9b3f79e 100644
--- a/initial-packages.nix
+++ b/initial-packages.nix
@@ -433,6 +433,8 @@ self: with pkgs.haskell.lib; {
 
   dhall = self.callPackage (./pkgs/dhall.nix) { };
 
+  dhall-docs = self.callPackage (./pkgs/dhall-docs.nix) { };
+
   dhall-json = self.callPackage (./pkgs/dhall-json.nix) { };
 
   dhall-nixpkgs = self.callPackage (./pkgs/dhall-nixpkgs.nix) { };
@@ -925,6 +927,8 @@ self: with pkgs.haskell.lib; {
 
   html-entities = self.callPackage (./pkgs/html-entities.nix) { };
 
+  html-entity-map = self.callPackage (./pkgs/html-entity-map.nix) { };
+
   http-api-data = self.callPackage (./pkgs/http-api-data.nix) { };
 
   http-client = self.callPackage (./pkgs/http-client.nix) { };
@@ -1173,12 +1177,16 @@ self: with pkgs.haskell.lib; {
 
   mmap = self.callPackage (./pkgs/mmap.nix) { };
 
+  mmark = self.callPackage (./pkgs/mmark.nix) { };
+
   mmorph = self.callPackage (./pkgs/mmorph.nix) { };
 
   mockery = self.callPackage (./pkgs/mockery.nix) { };
 
   mod = self.callPackage (./pkgs/mod.nix) { };
 
+  modern-uri = self.callPackage (./pkgs/modern-uri.nix) { };
+
   monad-control = self.callPackage (./pkgs/monad-control.nix) { };
 
   monad-logger = self.callPackage (./pkgs/monad-logger.nix) { };
diff --git a/pkgs/dhall-docs.nix b/pkgs/dhall-docs.nix
new file mode 100644
index 0000000000000000000000000000000000000000..6878d2ac17ac32365b79544a49e5cd7ad95a4fe5
--- /dev/null
+++ b/pkgs/dhall-docs.nix
@@ -0,0 +1,92 @@
+{ mkDerivation
+, base
+, base16-bytestring
+, bytestring
+, containers
+, cryptohash-sha256
+, dhall
+, directory
+, doctest
+, file-embed
+, filepath
+, foldl
+, lens-family-core
+, lib
+, lucid
+, megaparsec
+, mmark
+, mtl
+, optparse-applicative
+, path
+, path-io
+, pretty
+, prettyprinter
+, tasty
+, tasty-hunit
+, tasty-silver
+, text
+, transformers
+, turtle
+}:
+mkDerivation {
+  pname = "dhall-docs";
+  version = "1.0.10";
+  sha256 = "4257d1a4fb06f5c98dbef7d39b420e7c52db9f966cc1c5f4da13d9286bb706e6";
+  revision = "3";
+  editedCabalFile = "06pjafliw9a3pzw9846yb9rmsjrwrn7jhax7s2bsdasx5agdrfg5";
+  isLibrary = true;
+  isExecutable = true;
+  enableSeparateDataOutput = true;
+  libraryHaskellDepends = [
+    base
+    base16-bytestring
+    bytestring
+    containers
+    cryptohash-sha256
+    dhall
+    directory
+    file-embed
+    filepath
+    lens-family-core
+    lucid
+    megaparsec
+    mmark
+    mtl
+    optparse-applicative
+    path
+    path-io
+    prettyprinter
+    text
+    transformers
+  ];
+  executableHaskellDepends = [ base dhall ];
+  testHaskellDepends = [
+    base
+    bytestring
+    containers
+    dhall
+    directory
+    doctest
+    filepath
+    foldl
+    lucid
+    path
+    path-io
+    pretty
+    tasty
+    tasty-hunit
+    tasty-silver
+    text
+    turtle
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  description = "Generate HTML docs from a dhall package";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
diff --git a/pkgs/html-entity-map.nix b/pkgs/html-entity-map.nix
new file mode 100644
index 0000000000000000000000000000000000000000..8d26c9e52d9129cb6b68449e9fdcefe891540911
--- /dev/null
+++ b/pkgs/html-entity-map.nix
@@ -0,0 +1,29 @@
+{ mkDerivation, base, criterion, lib, text, unordered-containers }:
+mkDerivation {
+  pname = "html-entity-map";
+  version = "0.1.0.0";
+  sha256 = "983600c33e8515e6ca31742d25490fb5a7be02503331963621b0ba5cd70d344c";
+  revision = "5";
+  editedCabalFile = "1776z73bs1v8z3qwpjvqqmzdlj6gm8qba93f41irhn7swdppfq72";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ base text unordered-containers ];
+  benchmarkHaskellDepends = [
+    base
+    criterion
+    text
+    unordered-containers
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/mrkkrp/html-entity-map";
+  description = "Map from HTML5 entity names to the corresponding Unicode text";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
diff --git a/pkgs/mmark.nix b/pkgs/mmark.nix
new file mode 100644
index 0000000000000000000000000000000000000000..3ac6563ba407ef96fa377d3c505da212950f5811
--- /dev/null
+++ b/pkgs/mmark.nix
@@ -0,0 +1,86 @@
+{ mkDerivation
+, QuickCheck
+, aeson
+, base
+, case-insensitive
+, containers
+, criterion
+, deepseq
+, dlist
+, email-validate
+, foldl
+, hashable
+, hspec
+, hspec-megaparsec
+, html-entity-map
+, lib
+, lucid
+, megaparsec
+, microlens
+, microlens-th
+, modern-uri
+, mtl
+, parser-combinators
+, text
+, text-metrics
+, unordered-containers
+, weigh
+, yaml
+}:
+mkDerivation {
+  pname = "mmark";
+  version = "0.0.7.6";
+  sha256 = "8c78a5aa7a1806c315bf8c0aa68321f04f508d72e4cac412ea401371fc7c50fd";
+  revision = "1";
+  editedCabalFile = "0jpin5hrh2wi5yqzzccww3rb94ylb3i7y0wm16q8knq4680fq8zx";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = true;
+  libraryHaskellDepends = [
+    aeson
+    base
+    case-insensitive
+    containers
+    deepseq
+    dlist
+    email-validate
+    foldl
+    hashable
+    html-entity-map
+    lucid
+    megaparsec
+    microlens
+    microlens-th
+    modern-uri
+    mtl
+    parser-combinators
+    text
+    text-metrics
+    unordered-containers
+    yaml
+  ];
+  testHaskellDepends = [
+    aeson
+    base
+    foldl
+    hspec
+    hspec-megaparsec
+    lucid
+    megaparsec
+    modern-uri
+    QuickCheck
+    text
+  ];
+  benchmarkHaskellDepends = [ base criterion text weigh ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/mmark-md/mmark";
+  description = "Strict markdown processor for writers";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
diff --git a/pkgs/modern-uri.nix b/pkgs/modern-uri.nix
new file mode 100644
index 0000000000000000000000000000000000000000..5a2747bac457814e58637916d2d869b711e80996
--- /dev/null
+++ b/pkgs/modern-uri.nix
@@ -0,0 +1,78 @@
+{ mkDerivation
+, QuickCheck
+, base
+, bytestring
+, containers
+, contravariant
+, criterion
+, deepseq
+, exceptions
+, hashable
+, hspec
+, hspec-discover
+, hspec-megaparsec
+, lib
+, megaparsec
+, mtl
+, profunctors
+, reflection
+, tagged
+, template-haskell
+, text
+, weigh
+}:
+mkDerivation {
+  pname = "modern-uri";
+  version = "0.3.6.0";
+  sha256 = "cf3c5b2cbbab9b8f3c171488ff8056dd1c37de011301090345689fc7138d43d2";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    base
+    bytestring
+    containers
+    contravariant
+    deepseq
+    exceptions
+    hashable
+    megaparsec
+    mtl
+    profunctors
+    QuickCheck
+    reflection
+    tagged
+    template-haskell
+    text
+  ];
+  testHaskellDepends = [
+    base
+    bytestring
+    hspec
+    hspec-megaparsec
+    megaparsec
+    QuickCheck
+    text
+  ];
+  testToolDepends = [ hspec-discover ];
+  benchmarkHaskellDepends = [
+    base
+    bytestring
+    criterion
+    deepseq
+    megaparsec
+    text
+    weigh
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/mrkkrp/modern-uri";
+  description = "Modern library for working with URIs";
+  license = lib.licenses.bsd3;
+  broken = false;
+}