diff --git a/handsy.cabal b/handsy.cabal
--- a/handsy.cabal
+++ b/handsy.cabal
@@ -1,5 +1,5 @@
 name:          handsy
-version:       0.0.2
+version:       0.0.3
 synopsis:      A DSL to describe common shell operations and interpeters for running them locally and remotely.
 -- description:   
 Homepage:      https://github.com/utdemir/handsy
@@ -18,7 +18,7 @@
 library
   exposed-modules:  System.Handsy
                     System.Handsy.Remote
-  build-depends:    base >=4.7 && <4.8
+  build-depends:    base >=4.6 && <4.8
                   , bytestring
                   , process
                   , transformers
diff --git a/src/System/Handsy.hs b/src/System/Handsy.hs
--- a/src/System/Handsy.hs
+++ b/src/System/Handsy.hs
@@ -5,26 +5,34 @@
 
 module System.Handsy where
 
-import           Prelude                   hiding (readFile, writeFile)
-
 import           Control.Monad.IO.Class
-import qualified Data.ByteString.Char8     as B
+import qualified Data.ByteString.Lazy           as B
 import           System.Exit
 
 import           Control.Monad.Free.TH
 import           Control.Monad.Trans.Free
-import           System.Process.ByteString
+import           System.Process.ByteString.Lazy
 
--- | Base functor for our dsl
-data HandsyF k = Command      String [String] B.ByteString ((ExitCode, B.ByteString, B.ByteString) -> k)
-               | ReadFile     String                       (B.ByteString -> k)
-               | WriteFile    String B.ByteString          (() -> k)
-             deriving (Functor)
+-- * Types
+data HandsyF k =
+    Command      FilePath [String] B.ByteString ((ExitCode, B.ByteString, B.ByteString) -> k)
+  | ReadFile     FilePath                       (B.ByteString -> k)
+  | WriteFile    FilePath B.ByteString          (() -> k)
+  | AppendFile   FilePath B.ByteString          (() -> k)
+  deriving (Functor)
 
 type Handsy = FreeT HandsyF IO
 
+-- * TH generated actions
 makeFree ''HandsyF
 
+-- * Helpers
+shell :: String -> Handsy (ExitCode, B.ByteString, B.ByteString)
+shell cmd = command "/usr/bin/env" ["sh", "-c", cmd] ""
+
+-- * Interpreter
+
+-- | Executes the actions locally
 run :: Handsy a -> IO a
 run h = do
   x <- runFreeT h
@@ -34,5 +42,8 @@
       -> B.readFile fp >>= run . next
     Free (WriteFile fp str next)
       -> B.writeFile fp str >>= run . next
+    Free (AppendFile fp str next)
+      -> B.appendFile fp str >>= run . next
     Free (Command prg args stdin next)
       -> readProcessWithExitCode prg args stdin >>= run . next
+
diff --git a/src/System/Handsy/Remote.hs b/src/System/Handsy/Remote.hs
--- a/src/System/Handsy/Remote.hs
+++ b/src/System/Handsy/Remote.hs
@@ -1,40 +1,43 @@
 {-# LANGUAGE OverloadedStrings #-}
-
 module System.Handsy.Remote where
 
-import           Prelude                  hiding (readFile, writeFile)
-
-import           System.Handsy
+import           System.Handsy            as H
 
-import qualified Data.ByteString.Char8    as B
+import qualified Data.ByteString.Lazy     as B
 
 import           Control.Monad.IO.Class
 import           Control.Monad.Trans.Free
 
 data RemoteOptions =
   RemoteOptions {
-    sshCommand :: (String, [String])
+    sshCommand :: (FilePath, [String])
   }
 
+-- | Executes the actions at a remote host
 runRemote :: RemoteOptions -> Handsy a -> IO a
 runRemote opts h = do
   x <- runFreeT h
   case x of
     Pure r -> return r
-    Free (ReadFile fp next) -> do
-      (_, stdin,  _) <- runSsh "cat" [fp] ""
-      runRemote opts (next stdin)
-    Free (WriteFile fp str next) -> do
-      _ <- runSsh "dd" ["of=" ++ fp] str -- TODO: Escape necessary?
-      runRemote opts (next ())
-    Free (Command prg args stdin next) -> runSsh prg args stdin >>= run . next
+    Free (ReadFile fp next)
+      -> runSsh "cat" [fp] "" >>= \(_, stdin, _) -> runRemote opts (next stdin)
+    Free (WriteFile fp str next)
+      -> runSsh "dd" ["of=" ++ fp] str >> runRemote opts (next ())
+    Free (AppendFile fp str next)
+      -> runSsh "dd" ["of=" ++ fp, "conv=notrunc", "oflag=append"] str >> runRemote opts (next ())
+    Free (Command prg args stdin next)
+      -> runSsh prg args stdin >>= runRemote opts . next
 
   where
     (ssh, sshOpts) = sshCommand opts
     runSsh prg args stdin = run (command ssh (sshOpts ++ prg : args) stdin)
 
-pushFile :: FilePath -> FilePath -> Handsy ()
-pushFile local remote = liftIO (B.readFile local) >>= writeFile remote
+pushFile :: FilePath -- ^ Local path of source
+         -> FilePath -- ^ Remote path of destination
+         -> Handsy ()
+pushFile local remote = liftIO (B.readFile local) >>= H.writeFile remote
 
-pullFile :: FilePath -> FilePath -> Handsy ()
-pullFile remote local = readFile remote >>= liftIO . B.writeFile local
+pullFile :: FilePath -- ^ Remote path of source
+         -> FilePath -- ^ Local path of destination
+         -> Handsy ()
+pullFile remote local = H.readFile remote >>= liftIO . B.writeFile local
