diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.markdown
@@ -0,0 +1,4 @@
+# Change log
+
+Burrito follows the [Package Versioning Policy](https://pvp.haskell.org).
+You can find release notes [on GitHub](https://github.com/tfausak/burrito/releases).
diff --git a/burrito.cabal b/burrito.cabal
--- a/burrito.cabal
+++ b/burrito.cabal
@@ -1,7 +1,7 @@
 cabal-version: 2.2
 
 name: burrito
-version: 2.0.0.0
+version: 2.0.1.0
 
 synopsis: Parse and render URI templates.
 description:
@@ -23,7 +23,7 @@
 
 build-type: Simple
 category: Network
-extra-source-files: README.markdown
+extra-source-files: CHANGELOG.markdown README.markdown
 license-file: LICENSE.markdown
 license: MIT
 maintainer: Taylor Fausak
diff --git a/source/library/Burrito.hs b/source/library/Burrito.hs
--- a/source/library/Burrito.hs
+++ b/source/library/Burrito.hs
@@ -2,8 +2,8 @@
 --
 -- According to [RFC 6570](https://tools.ietf.org/html/rfc6570): "A URI
 -- Template is a compact sequence of characters for describing a range of
-  -- Uniform Resource Identifiers through variable expansion." Burrito
-  -- implements URI templates according to the specification in that RFC.
+-- Uniform Resource Identifiers through variable expansion." Burrito
+-- implements URI templates according to the specification in that RFC.
 --
 -- The term "uniform resource identifiers" (URI) is often used interchangeably
 -- with other related terms like "internationalized resource identifier" (IRI),
@@ -33,6 +33,7 @@
   , Expand.expandWith
   , Match.match
   , TH.uriTemplate
+  , TH.expandTH
   , Template.Template
   , Value.Value
   , stringValue
diff --git a/source/library/Burrito/Internal/Expand.hs b/source/library/Burrito/Internal/Expand.hs
--- a/source/library/Burrito/Internal/Expand.hs
+++ b/source/library/Burrito/Internal/Expand.hs
@@ -50,7 +50,7 @@
 -- | This is like @expand@ except that it gives you more control over how
 -- variables are expanded. If you can, use @expand@. It's simpler.
 --
--- Instead of passing in a static mapping form names to
+-- Instead of passing in a static mapping from names to
 -- values, you pass in a function that is used to look up values on the fly.
 -- This can be useful if computing values takes a while or requires some impure
 -- actions.
diff --git a/source/library/Burrito/Internal/TH.hs b/source/library/Burrito/Internal/TH.hs
--- a/source/library/Burrito/Internal/TH.hs
+++ b/source/library/Burrito/Internal/TH.hs
@@ -1,10 +1,41 @@
 module Burrito.Internal.TH
-  ( uriTemplate
+  ( expandTH
+  , uriTemplate
   ) where
 
+import qualified Burrito.Internal.Expand as Expand
 import qualified Burrito.Internal.Parse as Parse
+import qualified Burrito.Internal.Type.Template as Template
+import qualified Burrito.Internal.Type.Value as Value
+import qualified Data.Bifunctor as Bifunctor
+import qualified Data.Map as Map
+import qualified Data.Text as Text
+import qualified Data.Text.Lazy as LazyText
+import qualified Data.Text.Lazy.Builder as Builder
 import qualified Language.Haskell.TH.Quote as TH
 import qualified Language.Haskell.TH.Syntax as TH
+
+-- | This can be used together with the @TemplateHaskell@ language extension to
+-- expand a URI template at compile time. This is slightly different from
+-- 'Expand.expand' in that missing variables will throw an exception. This is
+-- convenient because it allows you to verify that all of the variables have
+-- been supplied at compile time.
+--
+-- >>> :set -XQuasiQuotes -XTemplateHaskell
+-- >>> import Burrito
+-- >>> $( expandTH [("foo", stringValue "bar")] [uriTemplate|l-{foo}-r|] )
+-- "l-bar-r"
+expandTH :: [(String, Value.Value)] -> Template.Template -> TH.Q TH.Exp
+expandTH xs t = do
+  let
+    m = Map.fromList $ fmap (Bifunctor.first Text.pack) xs
+    f k =
+      maybe (Left $ "missing variable: " <> show k) (Right . Just)
+        $ Map.lookup k m
+  x <-
+    either fail (pure . LazyText.unpack . Builder.toLazyText)
+      $ Expand.expandWith f t
+  TH.lift x
 
 -- | This can be used together with the @QuasiQuotes@ language extension to
 -- parse a URI template at compile time. This is convenient because it allows
