diff --git a/flake.nix b/flake.nix
index d41d81652d1a272c4115622d031415d896c7478c..0b6a2e5daecdf36a006c6dd9e421d19b1fd6ea03 100644
--- a/flake.nix
+++ b/flake.nix
@@ -94,5 +94,10 @@
 
       inherit packages;
 
-    });
+    }) // {
+      templates.minimal = {
+        description = "horizon-platform minimal template";
+        path = ./templates/minimal;
+    };
+  };
 }
diff --git a/templates/minimal/ChangeLog.md b/templates/minimal/ChangeLog.md
new file mode 100644
index 0000000000000000000000000000000000000000..9da5940ec078e92e00dc89d49e24468588a82747
--- /dev/null
+++ b/templates/minimal/ChangeLog.md
@@ -0,0 +1,3 @@
+# Changelog for template
+
+## v0.1.0.0
diff --git a/templates/minimal/LICENSE b/templates/minimal/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..342c588b3a040858158b87f55432d4f8deab7d57
--- /dev/null
+++ b/templates/minimal/LICENSE
@@ -0,0 +1,30 @@
+Copyright Author name here (c) 2022
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Author name here nor the names of other
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/templates/minimal/README.md b/templates/minimal/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..69f582fe4e4a2692236ea90fc6ce5059e73753ab
--- /dev/null
+++ b/templates/minimal/README.md
@@ -0,0 +1,18 @@
+# horizon-minimal-template
+
+This template is a barebones haskell template using
+[horizon](https://horizon-haskell.net). Just add
+things to the dependencies in the cabal file.
+
+## Building
+
+```
+nix build
+```
+
+## Development
+
+```
+nix develop
+cabal test all
+```
diff --git a/templates/minimal/app/Main.hs b/templates/minimal/app/Main.hs
new file mode 100644
index 0000000000000000000000000000000000000000..14e874c472ac6b3675486b4989e0977a3c33f97f
--- /dev/null
+++ b/templates/minimal/app/Main.hs
@@ -0,0 +1,6 @@
+module Main (main) where
+
+import qualified Lib (main)
+
+main :: IO ()
+main = Lib.main
diff --git a/templates/minimal/cabal.project b/templates/minimal/cabal.project
new file mode 100644
index 0000000000000000000000000000000000000000..c14fcd10d62cd81ffb6607c5de09776f456cfad3
--- /dev/null
+++ b/templates/minimal/cabal.project
@@ -0,0 +1,3 @@
+packages: ./.
+
+test-show-details: streaming
diff --git a/templates/minimal/flake.lock b/templates/minimal/flake.lock
new file mode 100644
index 0000000000000000000000000000000000000000..695eb8f9f61a21a80158540d9ff28087f3ecdde0
--- /dev/null
+++ b/templates/minimal/flake.lock
@@ -0,0 +1,177 @@
+{
+  "nodes": {
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_2": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "id": "flake-utils",
+        "type": "indirect"
+      }
+    },
+    "flake-utils_3": {
+      "locked": {
+        "lastModified": 1644229661,
+        "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "get-flake": {
+      "locked": {
+        "lastModified": 1644686428,
+        "narHash": "sha256-zkhYsURWFrvEZLkIoBeqFBzSu+cA2u5mo6M8vq9LN7M=",
+        "owner": "ursi",
+        "repo": "get-flake",
+        "rev": "703f15558daa56dfae19d1858bb3046afe68831a",
+        "type": "github"
+      },
+      "original": {
+        "owner": "ursi",
+        "repo": "get-flake",
+        "type": "github"
+      }
+    },
+    "horizon-gen-nix": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1670944091,
+        "narHash": "sha256-WFj0uQqaEIURuZpfsb8yy/iqyzN8Lrc9BpWloL5a4R0=",
+        "rev": "8eb5ffc81cd8331f340546d746a786c7b2f021a6",
+        "revCount": 109,
+        "type": "git",
+        "url": "https://gitlab.homotopic.tech/horizon/horizon-gen-nix"
+      },
+      "original": {
+        "rev": "8eb5ffc81cd8331f340546d746a786c7b2f021a6",
+        "type": "git",
+        "url": "https://gitlab.homotopic.tech/horizon/horizon-gen-nix"
+      }
+    },
+    "horizon-platform": {
+      "inputs": {
+        "flake-utils": "flake-utils_2",
+        "get-flake": "get-flake",
+        "horizon-gen-nix": "horizon-gen-nix",
+        "lint-utils": "lint-utils",
+        "nixpkgs": "nixpkgs_2"
+      },
+      "locked": {
+        "lastModified": 1671046351,
+        "narHash": "sha256-P80LAEx8E0bE1X3J23PUlnE/kkvK9txAe82iuWCxC9g=",
+        "ref": "refs/heads/master",
+        "rev": "eba696abb902fd5538dd006a297e699c7b2cee80",
+        "revCount": 762,
+        "type": "git",
+        "url": "https://gitlab.homotopic.tech/horizon/horizon-platform"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://gitlab.homotopic.tech/horizon/horizon-platform"
+      }
+    },
+    "lint-utils": {
+      "inputs": {
+        "flake-utils": "flake-utils_3",
+        "nixpkgs": "nixpkgs"
+      },
+      "locked": {
+        "lastModified": 1669815989,
+        "narHash": "sha256-yDE8uxa/O633VeRBlJKSY5q9JtzoBoMANvgupdI42YI=",
+        "ref": "refs/heads/master",
+        "rev": "5b97bd76dd6756dfc29a32d25a5c78c0522bac10",
+        "revCount": 39,
+        "type": "git",
+        "url": "https://gitlab.homotopic.tech/nix/lint-utils"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://gitlab.homotopic.tech/nix/lint-utils"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1644525281,
+        "narHash": "sha256-D3VuWLdnLmAXIkooWAtbTGSQI9Fc1lkvAr94wTxhnTU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "48d63e924a2666baf37f4f14a18f19347fbd54a2",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_2": {
+      "locked": {
+        "lastModified": 1665830552,
+        "narHash": "sha256-qel2bZ9TqfW8WzWCWdjuCy4bVFhhGsEeqFv/bj1ka2s=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "26b7e6ab6a864c3e7e077bcb27a49f0480b9894a",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_3": {
+      "locked": {
+        "lastModified": 1671095104,
+        "narHash": "sha256-BgI8tDJgORrKX9lF93enEDKP5WxIoVBt9+1zoGIfx7k=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "7634c3250b6870e76f2e611cb95b72392add9aef",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "flake-utils": "flake-utils",
+        "horizon-platform": "horizon-platform",
+        "nixpkgs": "nixpkgs_3"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/templates/minimal/flake.nix b/templates/minimal/flake.nix
new file mode 100644
index 0000000000000000000000000000000000000000..7eefaf6d7c0b3f54ac58ac04dc7eeeb15eae6c89
--- /dev/null
+++ b/templates/minimal/flake.nix
@@ -0,0 +1,39 @@
+{
+  description = "haskell-template";
+  inputs = {
+    flake-utils.url = "github:numtide/flake-utils";
+    horizon-platform.url = "git+https://gitlab.homotopic.tech/horizon/horizon-platform";
+    nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
+  };
+  outputs =
+    inputs@
+    { self
+    , flake-utils
+    , horizon-platform
+    , nixpkgs
+    , ...
+    }:
+    flake-utils.lib.eachSystem [ "x86_64-linux" ] (system:
+    let
+      pkgs = import nixpkgs { inherit system; };
+      legacyPackages = with pkgs.haskell.lib.compose;
+        horizon-platform.legacyPackages.${system}.override {
+          overrides = hfinal: hprev: {
+            haskell-template = hprev.callCabal2nix "haskell-template" ./. { };
+          };
+        };
+    in
+    {
+
+      devShells.default = legacyPackages.haskell-template.env.overrideAttrs (attrs: {
+        buildInputs = attrs.buildInputs ++ [
+          legacyPackages.cabal-install
+          pkgs.stylish-haskell
+          pkgs.nixpkgs-fmt
+        ];
+      });
+
+      packages.default = legacyPackages.haskell-template;
+
+    });
+}
diff --git a/templates/minimal/src/Lib.hs b/templates/minimal/src/Lib.hs
new file mode 100644
index 0000000000000000000000000000000000000000..ff89e4cf7852bc57bc26ebc0ebb9c4e13af3730b
--- /dev/null
+++ b/templates/minimal/src/Lib.hs
@@ -0,0 +1,4 @@
+module Lib (main) where
+
+main :: IO ()
+main = putStrLn "Hello"
diff --git a/templates/minimal/template.cabal b/templates/minimal/template.cabal
new file mode 100644
index 0000000000000000000000000000000000000000..537edebb8a71c1e9f340981582e475fdc6d2feb9
--- /dev/null
+++ b/templates/minimal/template.cabal
@@ -0,0 +1,72 @@
+cabal-version: 1.12
+
+-- This file has been generated from package.yaml by hpack version 0.34.7.
+--
+-- see: https://github.com/sol/hpack
+
+name:           template
+version:        0.1.0.0
+synopsis:       Short description of your package
+description:    Please see the README on GitHub at <https://github.com/githubuser/ranger#readme>
+category:       Web
+author:         Daniel Firth
+maintainer:     dan.firth@homotopic.tech
+copyright:      2022 Daniel Firth
+license:        BSD3
+license-file:   LICENSE
+build-type:     Simple
+extra-source-files:
+    README.md
+    ChangeLog.md
+
+source-repository head
+  type: git
+  location: https://gitlab.homotopic.tech/haskell/template
+
+library
+  exposed-modules:
+      Lib
+  other-modules:
+      Paths_template
+  hs-source-dirs:
+      src
+  default-extensions:
+      DataKinds
+      DerivingStrategies
+      GHC2021
+  ghc-options: -Weverything -Wno-all-missed-specialisations -Wno-implicit-prelude -Wno-missing-safe-haskell-mode -Wno-prepositive-qualified-module -Wno-safe -Wno-unsafe
+  build-depends:
+      base >=4.7 && <5
+  default-language: Haskell2010
+
+executable template
+  main-is: Main.hs
+  other-modules:
+      Paths_template
+  hs-source-dirs:
+      app
+  default-extensions:
+      DataKinds
+      DerivingStrategies
+      GHC2021
+  ghc-options: -Weverything -Wno-all-missed-specialisations -Wno-implicit-prelude -Wno-missing-safe-haskell-mode -Wno-prepositive-qualified-module -Wno-safe -Wno-unsafe -threaded -rtsopts -with-rtsopts=-N
+  build-depends:
+      base >=4.7 && <5
+    , template
+  default-language: Haskell2010
+
+test-suite template-tests
+  type: exitcode-stdio-1.0
+  main-is: Main.hs
+  other-modules:
+      Paths_template
+  hs-source-dirs:
+      test
+  default-extensions:
+      DataKinds
+      DerivingStrategies
+      GHC2021
+  ghc-options: -Weverything -Wno-all-missed-specialisations -Wno-implicit-prelude -Wno-missing-safe-haskell-mode -Wno-prepositive-qualified-module -Wno-safe -Wno-unsafe -threaded -rtsopts -with-rtsopts=-N
+  build-depends:
+      base >=4.7 && <5
+  default-language: Haskell2010
diff --git a/templates/minimal/test/Main.hs b/templates/minimal/test/Main.hs
new file mode 100644
index 0000000000000000000000000000000000000000..652d2cb8fee6d2719ca48a16e74f9483c8443880
--- /dev/null
+++ b/templates/minimal/test/Main.hs
@@ -0,0 +1,6 @@
+module Main
+  ( main
+  ) where
+
+main :: IO ()
+main = putStrLn "Test suite not implemented."