diff --git a/Evaluator.hs b/Evaluator.hs
--- a/Evaluator.hs
+++ b/Evaluator.hs
@@ -6,6 +6,7 @@
 import qualified Language.Elm as Elm
 import qualified Environment as Env
 
+import System.IO
 import System.IO.Error  (isDoesNotExistError)
 import System.Directory (removeFile)
 import System.Exit      (ExitCode(..))
@@ -14,11 +15,12 @@
 import Control.Exception
 import Control.Monad (unless)
 
-runRepl :: Env.Repl -> IO Bool
-runRepl environment =
-  do writeFile tempElm (Env.toElm environment)
-     result <- run "elm" elmArgs $ \types -> do
-       reformatJS tempJS
+runRepl :: String -> Env.Repl -> IO Env.Repl
+runRepl "" env = return env
+runRepl input oldEnv =
+  do writeFile tempElm $ Env.toElm newEnv
+     success <- run "elm" elmArgs $ \types -> do
+       reformatJS input tempJS
        run "node" nodeArgs $ \value' ->
            let value = BSC.init value'
                tipe = scrapeOutputType types
@@ -26,10 +28,13 @@
                            BSC.isInfixOf "\n" tipe ||
                            BSC.length value + BSC.length tipe > 80   
                message = BS.concat [ if isTooLong then value' else value, tipe ]
-           in  unless (BSC.null value') $ BSC.putStrLn message
+           in  do unless (BSC.null value') $ BSC.hPutStrLn stdout message
+                  return True
      removeIfExists tempElm
-     return result
+     return $ if success then newEnv else oldEnv
   where
+    newEnv = Env.insert input oldEnv
+
     tempElm = "repl-temp-000.elm"
     tempJS  = "build" </> replaceExtension tempElm "js"
     
@@ -37,32 +42,46 @@
     elmArgs  = ["--make", "--only-js", "--print-types", tempElm]
 
     run name args nextComputation =
-      let failure message = BSC.putStrLn message >> return False
-          missingExe = unlines [ "Error: '" ++ name ++ "' command not found."
-                               , "  Do you have it installed?"
-                               , "  Can it be run from anywhere? I.e. is it on your PATH?" ]
-      in
-      do (_, stdout, _, handle') <- createProcess (proc name args) { std_out = CreatePipe }
+      do (_, stdout, stderr, handle') <-
+             createProcess (proc name args) { std_out = CreatePipe
+                                            , std_err = CreatePipe }
          exitCode <- waitForProcess handle'
-         case (exitCode, stdout) of
-           (ExitFailure 127, _)      -> failure $ BSC.pack missingExe
-           (_, Nothing)              -> failure "Unknown error!"
-           (ExitFailure _, Just out) -> failure =<< BSC.hGetContents out
-           (ExitSuccess  , Just out) ->
-               do nextComputation =<< BS.hGetContents out
-                  return True
+         case (exitCode, stdout, stderr) of
+           (ExitSuccess, Just out, Just _) ->
+               nextComputation =<< BS.hGetContents out
+           (ExitFailure 127, Just _, Just _) -> failure missingExe
+           (ExitFailure _, Just out, Just err) -> do e <- BSC.hGetContents err
+                                                     o <- BSC.hGetContents out
+                                                     failure (BS.concat [o,e])
+           (_, _, _) -> failure "Unknown error!"
+      where
+        failure message = BSC.hPutStrLn stderr message >> return False
+        missingExe = BSC.pack $ unlines $
+                     [ "Error: '" ++ name ++ "' command not found."
+                     , "  Do you have it installed?"
+                     , "  Can it be run from anywhere? I.e. is it on your PATH?" ]
 
-reformatJS :: String -> IO ()
-reformatJS tempJS =
+
+reformatJS :: String -> String -> IO ()
+reformatJS input tempJS =
   do rts <- BS.readFile =<< Elm.runtime
      src <- BS.readFile tempJS
      BS.length src `seq` BS.writeFile tempJS (BS.concat [rts,src,out])
   where
     out = BS.concat
-          [ "var context = { inputs:[] };\n"
+          [ "process.on('uncaughtException', function(err) {\n"
+          , "  var input = '", BSC.pack input, "';\n"
+          , "  var msg = (input.slice(0,7) === 'import ') ? ", badImport, " : ('Runtime error: ' + err);\n"
+          , "  process.stderr.write(msg);\n"
+          , "  process.exit(1);\n"
+          , "});\n"
+          , "var context = { inputs:[] };\n"
           , "var repl = Elm.Repl.make(context);\n"
           , "if ('", Env.output, "' in repl)\n"
           , "  console.log(context.Native.Show.values.show(repl.", Env.output, "));" ]
+
+    badImport = "('Error: unable to import \\\"' + input.slice(7).replace(/ /g,'') + '\\\".\\nIt may rely on a browser API that is unavailable on the command line.')"
+
 
 scrapeOutputType :: BS.ByteString -> BS.ByteString
 scrapeOutputType types
diff --git a/Repl.hs b/Repl.hs
--- a/Repl.hs
+++ b/Repl.hs
@@ -13,17 +13,15 @@
 loop :: Env.Repl -> InputT IO ()
 loop environment@(Env.Repl _ _ _ wasCtrlC) = do
   str' <- handleInterrupt (return Nothing) getInput
-  let env = environment {Env.ctrlc = False}
   case str' of
-    Nothing -> if wasCtrlC then lift $ exitWith (ExitFailure 130)
-                          else do 
-                            lift $ putStrLn "(Ctrl-C again to exit)"
-                            loop $ environment {Env.ctrlc = True}
-    Just "" -> loop env
-    Just str  -> do
-      let env' = Env.insert str env
-      success <- liftIO $ Eval.runRepl env'
-      loop (if success then env' else env)
+    Just input ->
+        loop =<< liftIO (Eval.runRepl input $ environment {Env.ctrlc = False})
+
+    Nothing
+        | wasCtrlC  -> lift $ exitWith (ExitFailure 130)
+        | otherwise -> do 
+              lift $ putStrLn "(Ctrl-C again to exit)"
+              loop $ environment {Env.ctrlc = True}
 
 getInput :: InputT IO (Maybe String)
 getInput = get "> " ""
diff --git a/elm-repl.cabal b/elm-repl.cabal
--- a/elm-repl.cabal
+++ b/elm-repl.cabal
@@ -1,5 +1,5 @@
 Name:                elm-repl
-Version:             0.1
+Version:             0.1.0.1
 Synopsis:            a REPL for Elm
 Description:         A read-eval-print-loop (REPL) for evaluating Elm expressions,
                      definitions, ADTs, and module imports. This tool is meant to
@@ -34,7 +34,7 @@
                        bytestring,
                        containers >= 0.3,
                        directory,
-                       Elm >= 0.10,
+                       Elm >= 0.10.0.2,
                        filepath,
                        haskeline,
                        transformers >= 0.2,
