diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+1.0.2
+
+* [Improve command-line interface](https://github.com/dhall-lang/dhall-haskell/pull/2355)
+* [Build against `optparse-applicative-0.17`](https://github.com/dhall-lang/dhall-haskell/pull/2355)
+* [Build against `text-2.0`](https://github.com/dhall-lang/dhall-haskell/pull/2356)
+
 1.0.1
 
 * [Fix doctest](https://github.com/dhall-lang/dhall-haskell/pull/2325)
diff --git a/dhall-toml.cabal b/dhall-toml.cabal
--- a/dhall-toml.cabal
+++ b/dhall-toml.cabal
@@ -1,5 +1,5 @@
 Name:               dhall-toml
-Version:            1.0.1
+Version:            1.0.2
 Cabal-Version:      >=1.10
 Build-Type:         Simple
 License:            BSD3
@@ -35,16 +35,19 @@
     Hs-Source-Dirs:   src
     Build-Depends:
         base                 >= 4.12     && < 5    ,
-        dhall                >= 1.39.0   && < 1.41 ,
+        dhall                >= 1.39.0   && < 1.42 ,
         tomland              >= 1.3.2.0  && < 1.4  ,
-        text                 >= 0.11.1.0 && < 1.3  ,
+        text                 >= 0.11.1.0 && < 2.1  ,
         containers           >= 0.5.9    && < 0.7  ,
         unordered-containers >= 0.2      && < 0.3  ,
-        prettyprinter        >= 1.7.0    && < 1.8
+        prettyprinter        >= 1.7.0    && < 1.8  ,
+        optparse-applicative >= 0.14     && < 0.18
     Exposed-Modules:
         Dhall.DhallToToml
         Dhall.TomlToDhall
         Dhall.Toml.Utils
+    Other-Modules:
+        Paths_dhall_toml
     GHC-Options:      -Wall
     Default-Language: Haskell2010
 
diff --git a/src/Dhall/DhallToToml.hs b/src/Dhall/DhallToToml.hs
--- a/src/Dhall/DhallToToml.hs
+++ b/src/Dhall/DhallToToml.hs
@@ -1,4 +1,6 @@
+{-# LANGUAGE ApplicativeDo   #-}
 {-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE RecordWildCards #-}
 
 {-| This module exports the `dhallToToml` function for translating a
     Dhall syntax tree to a TOML syntax tree (`TOML`) for the @tomland@
@@ -106,9 +108,10 @@
 import Data.Foldable      (toList)
 import Data.List.NonEmpty (NonEmpty ((:|)))
 import Data.Text          (Text)
+import Data.Version       (showVersion)
 import Data.Void          (Void)
 import Dhall.Core         (DhallDouble (..), Expr)
-import Dhall.Toml.Utils   (inputToDhall)
+import Dhall.Toml.Utils   (fileToDhall, inputToDhall)
 import Prettyprinter      (Pretty)
 import Toml.Type.Key      (Key (Key, unKey), Piece (Piece))
 import Toml.Type.Printer  (pretty)
@@ -122,6 +125,8 @@
 import qualified Dhall.Map                 as Map
 import qualified Dhall.Pretty
 import qualified Dhall.Util
+import qualified Options.Applicative       as OA
+import qualified Paths_dhall_toml          as Meta
 import qualified Prettyprinter.Render.Text as Pretty
 import qualified Toml.Type.AnyValue        as Toml.AnyValue
 import qualified Toml.Type.TOML            as Toml.TOML
@@ -356,15 +361,37 @@
             Core.RecordLit _ -> Left $ UnsupportedArray e
             _ -> Left $ Unsupported e
 
+data Options = Options
+    { input :: Maybe FilePath
+    , output :: Maybe FilePath
+    }
 
+parserInfo :: OA.ParserInfo Options
+parserInfo = OA.info
+    (OA.helper <*> versionOption <*> optionsParser)
+    (OA.fullDesc <> OA.progDesc "Convert Dhall to TOML")
+  where
+    versionOption = OA.infoOption (showVersion Meta.version) $
+        OA.long "version" <> OA.help "Display version"
+    optionsParser = do
+        input <- OA.optional . OA.strOption $
+               OA.long "file"
+            <> OA.help "Read Dhall from file instead of standard input"
+            <> fileOpts
+        output <- OA.optional . OA.strOption $
+               OA.long "output"
+            <> OA.help "Write TOML to a file instead of standard output"
+            <> fileOpts
+        pure Options {..}
+    fileOpts = OA.metavar "FILE" <> OA.action "file"
+
 {-| Runs the @dhall-to-toml@ command
 -}
 dhallToTomlMain :: IO ()
 dhallToTomlMain = do
-    resolvedExpression <- inputToDhall
+    Options {..} <- OA.execParser parserInfo
+    resolvedExpression <- maybe inputToDhall fileToDhall input
     toml <- case dhallToToml resolvedExpression of
         Left err -> throwIO err
         Right toml -> return toml
-    Text.IO.putStrLn $ pretty toml
-
-
+    maybe Text.IO.putStrLn Text.IO.writeFile output $ pretty toml
diff --git a/src/Dhall/TomlToDhall.hs b/src/Dhall/TomlToDhall.hs
--- a/src/Dhall/TomlToDhall.hs
+++ b/src/Dhall/TomlToDhall.hs
@@ -1,5 +1,7 @@
+{-# LANGUAGE ApplicativeDo   #-}
 {-# LANGUAGE GADTs           #-}
 {-# LANGUAGE OverloadedLists #-}
+{-# LANGUAGE RecordWildCards #-}
 
 {-| This module exports the `tomlToDhall` function for translating a
     TOML syntax tree from @tomland@ to a Dhall syntax tree. For now,
@@ -121,6 +123,7 @@
 import Data.Foldable        (foldl', toList)
 import Data.List.NonEmpty   (NonEmpty ((:|)))
 import Data.Text            (Text)
+import Data.Version         (showVersion)
 import Data.Void            (Void)
 import Dhall.Core           (DhallDouble (..), Expr)
 import Dhall.Parser         (Src)
@@ -138,7 +141,8 @@
 import qualified Data.Text.IO         as Text.IO
 import qualified Dhall.Core           as Core
 import qualified Dhall.Map            as Map
-import qualified System.Environment
+import qualified Options.Applicative  as OA
+import qualified Paths_dhall_toml     as Meta
 import qualified Toml.Parser
 import qualified Toml.Type.AnyValue   as Toml.AnyValue
 import qualified Toml.Type.PrefixTree as Toml.PrefixTree
@@ -295,20 +299,44 @@
         tables = tablesToObject $ Toml.TOML.tomlTables toml
         tableArrays = tableArraysToObject $ Toml.TOML.tomlTableArrays toml
 
+data Options = Options
+    { input :: Maybe FilePath
+    , output :: Maybe FilePath
+    , schemaFile :: FilePath
+    }
+
+parserInfo :: OA.ParserInfo Options
+parserInfo = OA.info
+    (OA.helper <*> versionOption <*> optionsParser)
+    (OA.fullDesc <> OA.progDesc "Convert TOML to Dhall")
+  where
+    versionOption = OA.infoOption (showVersion Meta.version) $
+        OA.long "version" <> OA.help "Display version"
+    optionsParser = do
+        input <- OA.optional . OA.strOption $
+               OA.long "file"
+            <> OA.help "Read TOML from file instead of standard input"
+            <> fileOpts
+        output <- OA.optional . OA.strOption $
+               OA.long "output"
+            <> OA.help "Write Dhall to a file instead of standard output"
+            <> fileOpts
+        schemaFile <- OA.strArgument $
+               OA.help "Path to Dhall schema file"
+            <> OA.action "file"
+            <> OA.metavar "SCHEMA"
+        pure Options {..}
+    fileOpts = OA.metavar "FILE" <> OA.action "file"
+
 tomlToDhallMain :: IO ()
 tomlToDhallMain = do
-    text <- Text.IO.getContents
+    Options {..} <- OA.execParser parserInfo
+    text <- maybe Text.IO.getContents Text.IO.readFile input
     toml <- case Toml.Parser.parse text of
         Left tomlErr -> throwIO (InvalidToml tomlErr)
         Right toml -> return toml
-    args <- System.Environment.getArgs
-    schemaFile <- case args of
-        [] -> fail "schema not provided"
-        schemaFile:[] -> return schemaFile
-        _ -> fail "too many agrgs"
     schema <- fileToDhall schemaFile
     dhall <- case tomlToDhall schema toml of
         Left err -> throwIO err
         Right dhall -> return dhall
-    Text.IO.putStrLn $ Core.pretty dhall
-
+    maybe Text.IO.putStrLn Text.IO.writeFile output $ Core.pretty dhall
