diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,4 @@
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/file-path-th.cabal b/file-path-th.cabal
new file mode 100644
--- /dev/null
+++ b/file-path-th.cabal
@@ -0,0 +1,34 @@
+cabal-version: 1.12
+
+-- This file has been generated from package.yaml by hpack version 0.31.2.
+--
+-- see: https://github.com/sol/hpack
+--
+-- hash: 467442d094a298061e3beddf420a8944d47883cd4a5040c468f7f2483ab4a74e
+
+name:           file-path-th
+version:        0.1.0.0
+synopsis:       Template Haskell utilities for filepaths.
+description:    Template Haskell utilities for filepaths. This package has utilities for embedding relative filepaths using Template Haskell.
+category:       System
+maintainer:     Dan Fithian
+license:        MIT
+license-file:   LICENSE
+build-type:     Simple
+
+library
+  exposed-modules:
+      System.FilePath.TH
+  other-modules:
+      Paths_file_path_th
+  hs-source-dirs:
+      src
+  default-extensions: ConstraintKinds DataKinds DeriveDataTypeable EmptyDataDecls FlexibleContexts FlexibleInstances GADTs GeneralizedNewtypeDeriving LambdaCase MultiParamTypeClasses MultiWayIf NamedFieldPuns NoImplicitPrelude NoMonomorphismRestriction OverloadedStrings QuasiQuotes RankNTypes RecordWildCards ScopedTypeVariables StandaloneDeriving TemplateHaskell TupleSections TypeFamilies ViewPatterns
+  ghc-options: -Wall -fwarn-tabs
+  build-depends:
+      base <5.0
+    , directory
+    , file-embed
+    , filepath
+    , template-haskell
+  default-language: Haskell2010
diff --git a/src/System/FilePath/TH.hs b/src/System/FilePath/TH.hs
new file mode 100644
--- /dev/null
+++ b/src/System/FilePath/TH.hs
@@ -0,0 +1,33 @@
+module System.FilePath.TH where
+
+import Prelude
+
+import Control.Monad ((<=<))
+import Data.FileEmbed (makeRelativeToProject)
+import Language.Haskell.TH (Loc(Loc), Exp, Q, loc_filename, location, runIO, stringE)
+import System.Directory (canonicalizePath, getCurrentDirectory)
+import System.FilePath ((</>), takeDirectory)
+
+fileRelativeToAbsolute :: String -> Q Exp
+fileRelativeToAbsolute = stringE <=< fileRelativeToAbsoluteStr
+
+-- | Use a path relative to the source file in which you're writing the path instead of relative to the working
+-- directory in which that source file will be compiled.
+--
+-- e.g. if this source file is in `my-project/src/Foo/Bar.hs`, `fileRelativeToAbsoluteStr
+-- "../../../config/settings.yml"` will load the path at `my-project/config/settings.yml`.
+--
+-- If this function is provided an absolute path, it will simply canonicalize that path
+-- by calling 'System.Directory.canonicalizePath' rather than compute an absolute path from
+-- a relative path.
+fileRelativeToAbsoluteStr :: String -> Q String
+fileRelativeToAbsoluteStr absoluteFilePath@('/':_) =
+  runIO . canonicalizePath $ absoluteFilePath
+fileRelativeToAbsoluteStr relativeFilePath = do
+  Loc {..} <- location
+  currentDir <- runIO getCurrentDirectory
+  let baseDir = takeDirectory loc_filename
+  runIO $ canonicalizePath $ currentDir </> baseDir </> relativeFilePath
+
+fileRelativeToProject :: FilePath -> Q Exp
+fileRelativeToProject = stringE <=< makeRelativeToProject
