diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -14,10 +14,10 @@
 
 # Installation
 
-## Prerequisites
+## Prerequisites for hacking
 
-You'll need the following installed and available to be able to use
-this software:
+You'll need the following installed and available to be able to hack
+on this software:
 
 ### [Haskell Stack](https://docs.haskellstack.org/en/stable/README/)
 
@@ -33,10 +33,11 @@
 
 ## Instructions
 
-To download and install the utility, simply run:
+If you're not interested in hacking on this project, you can simply
+download and install it.  Run:
 
 ```sh
-stack install forest-fire
+cabal update; cabal install forest-fire
 ```
 
 # Usage
@@ -72,8 +73,8 @@
     paulrb/forest-fire:master yourstack
 ```
 
-It is hosted on Docker Hub: https://hub.docker.com/r/paulrb/forest-fire 
-and built with Travis CI: https://travis-ci.org/toothbrush/forest-fire 
+It is hosted on Docker Hub: https://hub.docker.com/r/paulrb/forest-fire
+and built with Travis CI: https://travis-ci.org/toothbrush/forest-fire
 from this repository.
 
 # Credits
diff --git a/app/Main.hs b/app/Main.hs
--- a/app/Main.hs
+++ b/app/Main.hs
@@ -23,18 +23,23 @@
       let showVersion  = toParam flagV
       let reallyDelete = toParam flagA
       let stackName    = toParam allArgs
-      case showVersion of
-        True  -> printVersion
-        False -> case stackName of
-                   [s] -> if reallyDelete
-                          then actuallyDoTheDelete s
-                          else showDeletionPlan s
-                   _   -> do putStrLn "[ERROR] Please specify one stack name."
-                             putStrLn usage
-                             exitFailure
+      if showVersion
+        then printVersion
+        else (case stackName of
+                xs@(_:_) -> if reallyDelete
+                            then mapM_ actuallyDoTheDelete xs
+                            else showDeletes xs
+                []  -> do putStrLn "[ERROR] Please specify at least one stack name."
+                          putStrLn usage
+                          exitFailure)
 
-printVersion = putStrLn $ "forest-fire v" ++ showVersion version
+showDeletes :: [String] -> IO ()
+showDeletes xs = do mapM_ outputDeletionPlan xs
+                    putStrLn "\nIf you trust this app you can execute:"
+                    putStrLn $ "forest-fire " ++ unwords xs ++ " --delete\n"
 
+printVersion = putStrLn $ "forest-fire version " ++ showVersion version
+
 descr = "Recursively find and delete CFn dependencies!\n\n"
-usage = "usage: forest-fire <stackname> [--delete]\n" ++
+usage = "usage: forest-fire [--delete] <stacknames>+\n" ++
         "or:    forest-fire --help"
diff --git a/forest-fire.cabal b/forest-fire.cabal
--- a/forest-fire.cabal
+++ b/forest-fire.cabal
@@ -1,5 +1,5 @@
 name:                forest-fire
-version:             0.2.2
+version:             0.3
 synopsis:            Recursively delete CloudFormation stacks and their dependants
 description:
   This simple tool will repeatedly query CloudFormation
diff --git a/src/AWSCommands.hs b/src/AWSCommands.hs
--- a/src/AWSCommands.hs
+++ b/src/AWSCommands.hs
@@ -12,19 +12,22 @@
   case code of
     ExitSuccess -> pure (B.pack stdout)
     _ -> if allowFail
-             then pure (B.pack "")
-             else do putStrLn stderr
-                     error $ show code
+         then do putStrLn "[FAIL] Command failed, continuing."
+                 pure (B.pack "")
+         else do putStrLn "[FAIL] Aborting."
+                 putStrLn stderr
+                 error $ show code
 
 jsonForDescribeStacks :: StackName -> IO B.ByteString
 jsonForDescribeStacks (StackName s) =
-  executeAWScommand False [ "cloudformation"
-                          , "describe-stacks"
-                          , "--stack-name", s]
+  executeAWScommand True [ "cloudformation"
+                         , "describe-stacks"
+                         , "--stack-name", s]
 
 jsonForListImports :: ExportName -> IO B.ByteString
 jsonForListImports (ExportName e) =
-  -- this one's optional, don't fail.
+  -- Don't fail: if an export isn't imported by anything, aws-cli
+  -- returns an error.
   executeAWScommand True [ "cloudformation"
                          , "list-imports"
                          , "--export-name", e]
@@ -32,13 +35,13 @@
 doDeletionWait :: StackName -> IO ()
 doDeletionWait (StackName s) = do
   putStrLn $ "Issuing delete command on stack " ++ s ++ "."
-  res <- executeAWScommand False [ "cloudformation"
-                                 , "delete-stack"
-                                 , "--stack-name", s]
+  _ <- executeAWScommand False [ "cloudformation"
+                               , "delete-stack"
+                               , "--stack-name", s]
   putStrLn "Awaiting completion... (60 minute timeout)"
-  res <- executeAWScommand False [ "cloudformation"
-                                 , "wait"
-                                 , "stack-delete-complete"
-                                 , "--no-paginate"
-                                 , "--stack-name", s]
+  _ <- executeAWScommand False [ "cloudformation"
+                               , "wait"
+                               , "stack-delete-complete"
+                               , "--no-paginate"
+                               , "--stack-name", s]
   putStrLn $ "Removal of " ++ s ++ " complete."
diff --git a/src/JSONInstances.hs b/src/JSONInstances.hs
--- a/src/JSONInstances.hs
+++ b/src/JSONInstances.hs
@@ -37,7 +37,7 @@
 instance AWSExecution IO where
   findExportsByStack s = do
     json <- eitherDecode <$> jsonForDescribeStacks s :: IO (Either String Stacks)
-    either error (pure . map eName . filter anon . concatMap sExports . sStacks) json
+    either (const (pure [])) (pure . map eName . filter anon . concatMap sExports . sStacks) json
       where anon (Export name) | name == ExportName "" = False
                                | otherwise             = True
 
diff --git a/src/Lib.hs b/src/Lib.hs
--- a/src/Lib.hs
+++ b/src/Lib.hs
@@ -13,15 +13,9 @@
   putStrLn $ "Retrieving dependencies of " ++ stackName ++ "..."
   dag <- buildDependencyGraph (StackName stackName)
   putStrLn "Done.  Deletion order:\n"
-  mapM_ print $ deletionOrder dag
+  mapM_ (putStrLn . (++) "  " . show) $ deletionOrder dag
   return dag
 
-showDeletionPlan :: String -> IO ()
-showDeletionPlan stackName = do
-  dag <- outputDeletionPlan stackName
-  putStrLn "\nIf you trust this app you can execute:"
-  putStrLn $ "forest-fire \"" ++ stackName ++ "\" --delete\n"
-
 actuallyDoTheDelete :: String -> IO ()
 actuallyDoTheDelete stackName = do
   dag <- outputDeletionPlan stackName
@@ -46,5 +40,5 @@
     importers <- mapM whoImportsThisValue outputs
     let children = sort $ nub $ concat importers
     downstreamDeps <- mapM buildDependencyGraph children
-    pure $ Map.unionsWith (\new old->nub ((++) new old))
+    pure $ Map.unionsWith (\new old -> nub $ (++) new old)
                           (downstreamDeps ++ [Map.singleton name children])
diff --git a/src/Types.hs b/src/Types.hs
--- a/src/Types.hs
+++ b/src/Types.hs
@@ -14,7 +14,7 @@
 newtype Stacks = Stacks { sStacks :: [Stack]} deriving Show
 newtype Export = Export { eName :: ExportName} deriving Show
 
-newtype StackName  = StackName  String      deriving (Show, Generic, Eq, Ord)
+newtype StackName  = StackName  String      deriving (Generic, Eq, Ord)
 newtype StackId    = StackId    String      deriving (Show, Generic, Eq)
 newtype ExportName = ExportName String      deriving (Show, Generic, Eq)
 newtype Imports    = Imports    { iStackNames :: [StackName] } deriving (Show)
@@ -23,3 +23,6 @@
 -- parser (specifically: makes it expect a record instead of just a
 -- string).
 snStackName (StackName s) = s
+
+instance Show StackName where
+  show (StackName s) = s
