diff --git a/src/System/Console/Questioner/Autocomplete.hs b/src/System/Console/Questioner/Autocomplete.hs
new file mode 100644
--- /dev/null
+++ b/src/System/Console/Questioner/Autocomplete.hs
@@ -0,0 +1,2 @@
+module System.Console.Questioner.Autocomplete
+  where
diff --git a/src/System/Console/Questioner/ProgressIndicators.hs b/src/System/Console/Questioner/ProgressIndicators.hs
new file mode 100644
--- /dev/null
+++ b/src/System/Console/Questioner/ProgressIndicators.hs
@@ -0,0 +1,139 @@
+-- |
+-- Module      :  System.Console.Questioner.ProgressIndicators
+-- Description :  Provides progress indicators and spinners
+-- Copyright   :  (c) Pedro Yamada
+-- License     :  MIT
+--
+-- Maintainer  :  Pedro Yamada <tacla.yamada@gmail.com>
+-- Stability   :  stable
+-- Portability :  non-portable (not tested on multiple environments)
+--
+-- Shamefully steals ideas from modules like `Inquirer.js` and `go-spin`.
+module System.Console.Questioner.ProgressIndicators
+  where
+
+import Control.Applicative ((<$>))
+import Control.Concurrent -- (MVar, ThreadId, forkIO, killThread, modifyMVar_,
+                          --  newMVar, tryTakeMVar, threadDelay)
+import Control.Monad (forever)
+import Data.Maybe (fromMaybe)
+import System.Console.ANSI (clearLine, setCursorColumn)
+import System.Console.Terminal.Size (size, Window(..))
+import System.IO (BufferMode(NoBuffering), stdout)
+
+import System.Console.Questioner.Util
+
+-- ProgressIndicator type and utilities
+-------------------------------------------------------------------------------
+
+data ProgressIndicator = BarIndicator ThreadId (MVar Double)
+                       | SpinnerIndicator ThreadId
+
+stopIndicator :: ProgressIndicator -> IO ()
+stopIndicator i = case i of
+    (BarIndicator tid _) -> stopProgressIndicator' tid
+    (SpinnerIndicator tid) -> stopProgressIndicator' tid
+  where
+    stopProgressIndicator' tid = do
+        killThread tid
+        clearLine
+        setCursorColumn 0
+
+updateIndicator :: ProgressIndicator -> Double -> IO ()
+updateIndicator (BarIndicator _ c) i = putMVar c i
+updateIndicator _ _ = return ()
+
+-- ProgressBars
+-------------------------------------------------------------------------------
+
+newtype ProgressBarTheme = ProgressBarTheme (Double -> IO ())
+
+progressBar :: ProgressBarTheme -> IO ProgressIndicator
+progressBar (ProgressBarTheme render) = do
+    mi <- newEmptyMVar
+    render 0
+    tid <- forkIO $ hWithBufferMode stdout NoBuffering $ forever $ do
+        i <- takeMVar mi
+        clearLine
+        setCursorColumn 0
+        render i
+    putMVar mi 0
+    return $ BarIndicator tid mi
+
+-- Spinners
+-------------------------------------------------------------------------------
+
+type SpinnerTheme = String
+
+spinner :: SpinnerTheme -> Int -> String -> IO ProgressIndicator
+spinner theme interval prompt = SpinnerIndicator <$> forkIO (setup $ loop 0)
+  where
+    setup = hWithBufferMode stdout NoBuffering
+
+    loop i = do
+        clearLine
+        setCursorColumn 0
+        putStr $ ' ' : spinnerState i : ' ' : prompt
+        threadDelay interval
+        loop $ i + 1
+
+    -- TODO - parameterize
+    themeLen = length theme
+    spinnerState i = theme !! (i `mod` themeLen)
+
+-- Boilerplate for easier usage (TODO - generate this with TH)
+-------------------------------------------------------------------------------
+
+simple1SpinnerTheme, simple2SpinnerTheme, simple3SpinnerTheme,
+  simple4SpinnerTheme, simple5SpinnerTheme, simple6SpinnerTheme,
+  simple7SpinnerTheme, simple8SpinnerTheme, simple9SpinnerTheme,
+  dots1SpinnerTheme, dots2SpinnerTheme, dots3SpinnerTheme, dots4SpinnerTheme,
+  dots5SpinnerTheme, dots6SpinnerTheme, dots7SpinnerTheme :: SpinnerTheme
+
+simple1Spinner, simple2Spinner, simple3Spinner, simple4Spinner, simple5Spinner,
+  simple6Spinner, simple7Spinner, simple8Spinner, simple9Spinner, dots1Spinner,
+  dots2Spinner, dots3Spinner, dots4Spinner, dots5Spinner, dots6Spinner,
+  dots7Spinner :: Int -> String -> IO ProgressIndicator
+
+simple1SpinnerTheme = "|/-\\"
+simple2SpinnerTheme = "◴◷◶◵"
+simple3SpinnerTheme = "◰◳◲◱"
+simple4SpinnerTheme = "◐◓◑◒"
+simple5SpinnerTheme = "▉▊▋▌▍▎▏▎▍▌▋▊▉"
+simple6SpinnerTheme = "▌▄▐▀"
+simple7SpinnerTheme = "╫╪"
+simple8SpinnerTheme = "■□▪▫"
+simple9SpinnerTheme = "←↑→↓"
+simple1Spinner = spinner simple1SpinnerTheme
+simple2Spinner = spinner simple2SpinnerTheme
+simple3Spinner = spinner simple3SpinnerTheme
+simple4Spinner = spinner simple4SpinnerTheme
+simple5Spinner = spinner simple5SpinnerTheme
+simple6Spinner = spinner simple6SpinnerTheme
+simple7Spinner = spinner simple7SpinnerTheme
+simple8Spinner = spinner simple8SpinnerTheme
+simple9Spinner = spinner simple9SpinnerTheme
+
+dots1SpinnerTheme = "⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏"
+dots2SpinnerTheme = "⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏"
+dots3SpinnerTheme = "⠄⠆⠇⠋⠙⠸⠰⠠⠰⠸⠙⠋⠇⠆"
+dots4SpinnerTheme = "⠋⠙⠚⠒⠂⠂⠒⠲⠴⠦⠖⠒⠐⠐⠒⠓⠋"
+dots5SpinnerTheme = "⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠴⠲⠒⠂⠂⠒⠚⠙⠉⠁"
+dots6SpinnerTheme = "⠈⠉⠋⠓⠒⠐⠐⠒⠖⠦⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈"
+dots7SpinnerTheme = "⠁⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈⠈"
+dots1Spinner = spinner dots1SpinnerTheme
+dots2Spinner = spinner dots2SpinnerTheme
+dots3Spinner = spinner dots3SpinnerTheme
+dots4Spinner = spinner dots4SpinnerTheme
+dots5Spinner = spinner dots5SpinnerTheme
+dots6Spinner = spinner dots6SpinnerTheme
+dots7Spinner = spinner dots7SpinnerTheme
+
+simpleProgressBarTheme :: ProgressBarTheme
+simpleProgressBarTheme = ProgressBarTheme $ \i -> do
+    w <- fromMaybe (45 :: Int) <$> (fmap width <$> size)
+    let blocks = floor ((fromIntegral w :: Double) * i) - 3
+    putStr (replicate blocks '▉')
+
+simpleProgressBar :: IO ProgressIndicator
+simpleProgressBar = progressBar simpleProgressBarTheme
diff --git a/src/System/Console/Questioner/Util.hs b/src/System/Console/Questioner/Util.hs
new file mode 100644
--- /dev/null
+++ b/src/System/Console/Questioner/Util.hs
@@ -0,0 +1,48 @@
+module System.Console.Questioner.Util
+  where
+
+import Control.Exception (bracket_)
+import System.Console.ANSI (clearLine, cursorDownLine, cursorUpLine,
+                            hideCursor, showCursor)
+import System.IO (BufferMode(..), Handle, hGetBuffering, hSetBuffering,
+                  hSetEcho, stdin)
+
+-- |
+-- Performs an IO action with some buffer mode on a handle
+hWithBufferMode :: Handle -> BufferMode -> IO a -> IO a
+hWithBufferMode handle bufferMode action = do
+    originalBuffering <- hGetBuffering handle
+    bracket_
+        (hSetBuffering handle bufferMode)
+        (hSetBuffering handle originalBuffering)
+        action
+
+-- |
+-- Performs an IO action with NoBuffering on a handle
+hWithNoBuffering :: Handle -> IO a -> IO a
+hWithNoBuffering handle = hWithBufferMode handle NoBuffering
+
+-- |
+-- Performs an IO action with the console cursor hidden
+withNoCursor :: IO a -> IO a
+withNoCursor = bracket_ hideCursor showCursor
+
+-- |
+-- Performs an IO action with console "echoing" supressed
+withNoEcho :: IO a -> IO a
+withNoEcho = bracket_ (hSetEcho stdin False) (hSetEcho stdin True)
+
+-- |
+-- Clears the screen from the cursor's current position until `n` lines
+-- above it
+clearFromCursorTo :: Int -> IO ()
+clearFromCursorTo nlines = do
+    cursorUpLine nlines
+    loop nlines
+    cursorUpLine nlines
+  where
+    loop 0 = return ()
+    loop n = do
+        clearLine
+        cursorDownLine 1
+        loop (n - 1)
diff --git a/stack-run.cabal b/stack-run.cabal
--- a/stack-run.cabal
+++ b/stack-run.cabal
@@ -1,5 +1,5 @@
 name:                stack-run
-version:             0.1.1.2
+version:             0.1.1.3
 synopsis:            An equivalent to cabal run for stack.
 description:         Finds the project root, compiles your code and runs the
                      first or set default executable. It's a shorthand for
@@ -21,6 +21,9 @@
 executable stack-run
   main-is:             Main.hs
   other-modules: System.Console.Questioner
+               , System.Console.Questioner.Autocomplete
+               , System.Console.Questioner.ProgressIndicators
+               , System.Console.Questioner.Util
   build-depends:       Cabal
                      , terminal-size
                      , vty
