diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,10 @@
 
 See full history at: <https://github.com/faylang/fay/commits>
 
+#### 0.23.1.0
+
+* Add `--show-ghc-calls` and `configShowGhcCalls` to print invocations to GHC.
+
 #### 0.23.0.1
 
 * Allow `mtl-compat 0.2.*` and `transformers-compat 0.4.*"`.
diff --git a/fay.cabal b/fay.cabal
--- a/fay.cabal
+++ b/fay.cabal
@@ -1,5 +1,5 @@
 name:                fay
-version:             0.23.0.1
+version:             0.23.1.0
 synopsis:            A compiler for Fay, a Haskell subset that compiles to JavaScript.
 description:         Fay is a proper subset of Haskell which is type-checked
                      with GHC, and compiled to JavaScript. It is lazy, pure, has a Fay monad,
diff --git a/src/Fay/Compiler/Typecheck.hs b/src/Fay/Compiler/Typecheck.hs
--- a/src/Fay/Compiler/Typecheck.hs
+++ b/src/Fay/Compiler/Typecheck.hs
@@ -40,7 +40,10 @@
           , "-i" ++ intercalate ":" includeDirs
           , fp ] ++ ghcPackageDbArgs ++ wallF ++ map ("-package " ++) packages
   exists <- doesFileExist GHCPaths.ghc
-  res <- readAllFromProcess (if exists then GHCPaths.ghc else "ghc") flags ""
+  let ghcPath = if exists then GHCPaths.ghc else "ghc"
+  when (configShowGhcCalls cfg) $
+    putStrLn . intercalate " " $ ghcPath : flags
+  res <- readAllFromProcess ghcPath flags ""
   either (return . Left . GHCError . fst) (return . Right . fst) res
    where
     wallF | configWall cfg = ["-Wall"]
diff --git a/src/Fay/Config.hs b/src/Fay/Config.hs
--- a/src/Fay/Config.hs
+++ b/src/Fay/Config.hs
@@ -25,6 +25,7 @@
       , configOptimizeNewtypes
       , configPrettyThunks
       , configPrettyOperators
+      , configShowGhcCalls
       )
   , defaultConfig
   , defaultConfigWithSandbox
@@ -76,6 +77,7 @@
   , configOptimizeNewtypes   :: Bool                        -- ^ Optimize away newtype constructors?
   , configPrettyThunks       :: Bool                        -- ^ Use pretty thunk names?
   , configPrettyOperators    :: Bool                        -- ^ Use pretty operators?
+  , configShowGhcCalls       :: Bool                        -- ^ Print commands sent to GHC?
   } deriving (Show)
 
 defaultConfig :: Config
@@ -106,6 +108,7 @@
     , configOptimizeNewtypes   = True
     , configPrettyThunks       = False
     , configPrettyOperators    = False
+    , configShowGhcCalls       = False
     }
 
 defaultConfigWithSandbox :: IO Config
diff --git a/src/main/Main.hs b/src/main/Main.hs
--- a/src/main/Main.hs
+++ b/src/main/Main.hs
@@ -44,6 +44,7 @@
   , optTypecheckOnly      :: Bool
   , optVersion            :: Bool
   , optWall               :: Bool
+  , optShowGhcCalls       :: Bool
   , optFiles              :: [String]
   }
 
@@ -75,6 +76,7 @@
           , configOptimizeNewtypes = not $ optNoOptimizeNewtypes opts
           , configPrettyThunks     = optPrettyThunks opts || optPrettyAll opts
           , configPrettyOperators  = optPrettyOperators opts || optPrettyAll opts
+          , configShowGhcCalls     = optShowGhcCalls opts
           }
   if optVersion opts
     then runCommandVersion
@@ -128,6 +130,7 @@
   <*> switch (long "typecheck-only" <> help "Only invoke GHC for typechecking, don't produce any output")
   <*> switch (long "version" <> help "Output version number")
   <*> switch (long "Wall" <> help "Typecheck with -Wall")
+  <*> switch (long "show-ghc-calls" <> help "Print commands sent to ghc")
   <*> many (argument (ReadM ask) (metavar "<hs-file>..."))
   where
     strsOption :: Mod OptionFields [String] -> Parser [String]
diff --git a/src/tests/Test/Compile.hs b/src/tests/Test/Compile.hs
--- a/src/tests/Test/Compile.hs
+++ b/src/tests/Test/Compile.hs
@@ -96,14 +96,14 @@
 
 assertPretty :: Config -> String -> Assertion
 assertPretty cfg flagName = do
-  res <- compileFile cfg "tests/Compile/Pretty.hs"
+  res <- compileFile cfg $ "tests/Compile/" ++ flagName ++ ".hs"
   case res of
     Left l  -> assertFailure $ "Should compile, but failed with: " ++ show l
     Right js -> do
-    writeFile "tests/Compile/Pretty.js" js
-    (err, out) <- either id id <$> readAllFromProcess "node" ["tests/Compile/Pretty.js"] ""
+    writeFile ("tests/Compile/" ++ flagName ++ ".js") js
+    (err, out) <- either id id <$> readAllFromProcess "node" ["tests/Compile/" ++ flagName ++ ".js"] ""
     when (err /= "") $ assertFailure err
-    expected <- readFile "tests/Compile/Pretty.res"
+    expected <- readFile $ "tests/Compile/" ++ flagName ++ ".res"
     assertEqual (flagName ++ " node stdout") expected out
 
 case_pretty :: Assertion
diff --git a/tests/Compile/Pretty.hs b/tests/Compile/Pretty.hs
deleted file mode 100644
--- a/tests/Compile/Pretty.hs
+++ /dev/null
@@ -1,9 +0,0 @@
-module Pretty where
-
-import Prelude
-
-main = do
-  let n = 3::Int
-  print . length' 0 . takeWhile (<=n) $ [0..]
-  putStrLn $  if (n + 5) ^ 2 == 64 && n*8 == 26 then "T" else "F"
-  forM [1..5] $ \k -> putStrLn $ if odd k then "odd" else "even"
diff --git a/tests/Compile/Pretty.res b/tests/Compile/Pretty.res
deleted file mode 100644
--- a/tests/Compile/Pretty.res
+++ /dev/null
@@ -1,7 +0,0 @@
-4
-F
-odd
-even
-odd
-even
-odd
diff --git a/tests/Compile/pretty.hs b/tests/Compile/pretty.hs
new file mode 100644
--- /dev/null
+++ b/tests/Compile/pretty.hs
@@ -0,0 +1,9 @@
+module Pretty where
+
+import Prelude
+
+main = do
+  let n = 3::Int
+  print . length' 0 . takeWhile (<=n) $ [0..]
+  putStrLn $  if (n + 5) ^ 2 == 64 && n*8 == 26 then "T" else "F"
+  forM [1..5] $ \k -> putStrLn $ if odd k then "odd" else "even"
diff --git a/tests/Compile/pretty.res b/tests/Compile/pretty.res
new file mode 100644
--- /dev/null
+++ b/tests/Compile/pretty.res
@@ -0,0 +1,7 @@
+4
+F
+odd
+even
+odd
+even
+odd
diff --git a/tests/Compile/prettyOperators.hs b/tests/Compile/prettyOperators.hs
new file mode 100644
--- /dev/null
+++ b/tests/Compile/prettyOperators.hs
@@ -0,0 +1,9 @@
+module Pretty where
+
+import Prelude
+
+main = do
+  let n = 3::Int
+  print . length' 0 . takeWhile (<=n) $ [0..]
+  putStrLn $  if (n + 5) ^ 2 == 64 && n*8 == 26 then "T" else "F"
+  forM [1..5] $ \k -> putStrLn $ if odd k then "odd" else "even"
diff --git a/tests/Compile/prettyOperators.res b/tests/Compile/prettyOperators.res
new file mode 100644
--- /dev/null
+++ b/tests/Compile/prettyOperators.res
@@ -0,0 +1,7 @@
+4
+F
+odd
+even
+odd
+even
+odd
diff --git a/tests/Compile/prettyThunks.hs b/tests/Compile/prettyThunks.hs
new file mode 100644
--- /dev/null
+++ b/tests/Compile/prettyThunks.hs
@@ -0,0 +1,9 @@
+module Pretty where
+
+import Prelude
+
+main = do
+  let n = 3::Int
+  print . length' 0 . takeWhile (<=n) $ [0..]
+  putStrLn $  if (n + 5) ^ 2 == 64 && n*8 == 26 then "T" else "F"
+  forM [1..5] $ \k -> putStrLn $ if odd k then "odd" else "even"
diff --git a/tests/Compile/prettyThunks.res b/tests/Compile/prettyThunks.res
new file mode 100644
--- /dev/null
+++ b/tests/Compile/prettyThunks.res
@@ -0,0 +1,7 @@
+4
+F
+odd
+even
+odd
+even
+odd
