diff --git a/src/Web/Tweet/API.hs b/src/Web/Tweet/API.hs
--- a/src/Web/Tweet/API.hs
+++ b/src/Web/Tweet/API.hs
@@ -36,10 +36,9 @@
 tweetData :: Tweet -> FilePath -> IO Int
 tweetData tweet filepath = do
     let requestString = urlString tweet
-    bytes <- postRequest ("https://api.twitter.com/1.1/statuses/update.json" ++ requestString) filepath
+    bytes <- postRequest ("https://api.twitter.com/1.1/statuses/update.json" ++ requestString) filepath -- FIXME fix the coloration
     putStrLn $ displayTimelineColor . either (error "failed to parse tweet") id . getTweets . BSL.toStrict $ bytes
     pure . (view tweetId) . head . either (error "failed to parse tweet") id . getTweets . BSL.toStrict $ bytes
--- FIXME fix the coloration
 
 -- | Gets user profile with max_id set.
 getProfileMax :: String -> Int -> FilePath -> Maybe Int -> IO (Either (ParseError Char Dec) Timeline)
diff --git a/src/Web/Tweet/Exec.hs b/src/Web/Tweet/Exec.hs
--- a/src/Web/Tweet/Exec.hs
+++ b/src/Web/Tweet/Exec.hs
@@ -80,7 +80,7 @@
 selectCommand (Sort name maybeNum) color file = putStrLn =<< showBest name (maybe 11 id maybeNum) color file
 selectCommand (Markov name) _ file = do
     raw <- getMarkov name Nothing file
-    writeFile (name ++ ".txt") (unlines raw)
+    appendFile (name ++ ".txt") (unlines raw)
     putStrLn $ "Written output to: " ++ name ++ ".txt"
 selectCommand (Delete n) color file = do
     putStrLn "Deleted:\n"
diff --git a/src/Web/Tweet/Parser.hs b/src/Web/Tweet/Parser.hs
--- a/src/Web/Tweet/Parser.hs
+++ b/src/Web/Tweet/Parser.hs
@@ -73,7 +73,7 @@
     string $ "\"" <> str <> "\":"
     open <- optional $ char '\"'
     let forbidden = if (isJust open) then ("\\\"" :: String) else ("\\\"," :: String)
-    want <- many $ noneOf forbidden <|> specialChar '\"' <|> specialChar '/' <|> newlineChar <|> unicodeChar -- specialChar 'u'
+    want <- many $ noneOf forbidden <|> specialChar '\"' <|> specialChar '/' <|> newlineChar <|> unicodeChar -- TODO modify parsec to make this parallel?
     pure want
 
 -- | Parse a newline
diff --git a/src/Web/Tweet/Sign.hs b/src/Web/Tweet/Sign.hs
--- a/src/Web/Tweet/Sign.hs
+++ b/src/Web/Tweet/Sign.hs
@@ -8,15 +8,10 @@
 import Network.HTTP.Client
 import Web.Tweet.Types
 
--- | Sign a request using your OAuth dev token.
+-- | Sign a request using your OAuth dev token, as stored in a config file.
 -- Uses the IO monad because signatures require a timestamp
 signRequest :: FilePath -> Request -> IO Request
-signRequest filepath req = do
-    o <- oAuth filepath
-    c <- credential filepath
-    signOAuth o c req
-
--- TODO function to read a ~/.tweetrc file to a 'Config'
+signRequest = (. flip signRequestMem) . (>>=) . mkConfig
 
 -- | Sign a request using a 'Config' object, avoiding the need to read token/key from file
 signRequestMem :: Config -> Request -> IO Request
@@ -29,6 +24,12 @@
     key <- (lineByKey "api-key") <$> getConfigData filepath
     let url = "api.twitter.com"
     return newOAuth { oauthConsumerKey = key , oauthConsumerSecret = secret , oauthServerName = url }
+
+mkConfig :: FilePath -> IO Config
+mkConfig filepath = do
+    o <- oAuth filepath
+    c <- credential filepath
+    pure (o, c)
 
 -- | Create a new credential from a token and token secret
 credential :: FilePath -> IO Credential
diff --git a/src/Web/Tweet/Utils/API.hs b/src/Web/Tweet/Utils/API.hs
--- a/src/Web/Tweet/Utils/API.hs
+++ b/src/Web/Tweet/Utils/API.hs
@@ -17,19 +17,27 @@
 import Web.Tweet.Sign
 
 -- | Make a GET request to twitter given a request string
-getRequest :: String -> FilePath -> IO BSL.ByteString
-getRequest urlStr filepath = do
+getRequestMem :: String -> Config -> IO BSL.ByteString
+getRequestMem urlStr config = do
     manager <- newManager tlsManagerSettings
     initialRequest <- parseRequest urlStr
-    request <- signRequest filepath $ initialRequest { method = "GET" }
+    request <- signRequestMem config $ initialRequest { method = "GET" }
     responseBS request manager
 
+-- | Make a GET request to twitter given a request string
+getRequest :: String -> FilePath -> IO BSL.ByteString
+getRequest = flip ((. getRequestMem) . (>>=) . mkConfig)
+
 -- | Make a POST request to twitter given a request string
 postRequest :: String -> FilePath -> IO BSL.ByteString
-postRequest urlStr filepath = do
+postRequest = flip ((. postRequestMem) . (>>=) . mkConfig)
+
+-- | Make a POST request to twitter given a request string
+postRequestMem :: String -> Config -> IO BSL.ByteString
+postRequestMem urlStr config = do
     manager <- newManager tlsManagerSettings
     initialRequest <- parseRequest urlStr
-    request <- signRequest filepath $ initialRequest { method = "POST" }
+    request <- signRequestMem config $ initialRequest { method = "POST" }
     responseBS request manager
 
 -- | Return HTTP request's result as a bytestring
diff --git a/stack.yaml b/stack.yaml
--- a/stack.yaml
+++ b/stack.yaml
@@ -1,6 +1,66 @@
-resolver: lts-8.6
+# This file was automatically generated by 'stack init'
+#
+# Some commonly used options have been documented as comments in this file.
+# For advanced use and comprehensive documentation of the format, please see:
+# http://docs.haskellstack.org/en/stable/yaml_configuration/
+
+# Resolver to choose a 'specific' stackage snapshot or a compiler version.
+# A snapshot resolver dictates the compiler version and the set of packages
+# to be used for project dependencies. For example:
+#
+# resolver: lts-3.5
+# resolver: nightly-2015-09-21
+# resolver: ghc-7.10.2
+# resolver: ghcjs-0.1.0_ghc-7.10.2
+# resolver:
+#  name: custom-snapshot
+#  location: "./custom-snapshot.yaml"
+resolver: lts-8.11
+
+# User packages to be built.
+# Various formats can be used as shown in the example below.
+#
+# packages:
+# - some-directory
+# - https://example.com/foo/bar/baz-0.0.2.tar.gz
+# - location:
+#    git: https://github.com/commercialhaskell/stack.git
+#    commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a
+# - location: https://github.com/commercialhaskell/stack/commit/e7b331f14bcffb8367cd58fbfc8b40ec7642100a
+#   extra-dep: true
+#  subdirs:
+#  - auto-update
+#  - wai
+#
+# A package marked 'extra-dep: true' will only be built if demanded by a
+# non-dependency (i.e. a user package), and its test suites and benchmarks
+# will not be run. This is useful for tweaking upstream packages.
 packages:
 - '.'
+# Dependency packages to be pulled from upstream that are not in the resolver
+# (e.g., acme-missiles-0.3)
 extra-deps: []
+
+# Override default flag values for local packages and extra-deps
 flags: {}
+
+# Extra package databases containing global packages
 extra-package-dbs: []
+
+# Control whether we use the GHC we find on the path
+# system-ghc: true
+#
+# Require a specific version of stack, using version ranges
+# require-stack-version: -any # Default
+# require-stack-version: ">=1.4"
+#
+# Override the architecture used by stack, especially useful on Windows
+# arch: i386
+# arch: x86_64
+#
+# Extra directories used by stack for building
+# extra-include-dirs: [/path/to/dir]
+# extra-lib-dirs: [/path/to/dir]
+#
+# Allow a newer minor version of GHC than the snapshot specifies
+# compiler-check: newer-minor
diff --git a/tweet-hs.cabal b/tweet-hs.cabal
--- a/tweet-hs.cabal
+++ b/tweet-hs.cabal
@@ -1,5 +1,5 @@
 name:                tweet-hs
-version:             0.5.3.4
+version:             0.5.3.5
 synopsis:            Command-line tool for twitter
 description:         a Command Line Interface Tweeter
 homepage:            https://github.com/vmchale/command-line-tweeter#readme
