diff --git a/handsy.cabal b/handsy.cabal
--- a/handsy.cabal
+++ b/handsy.cabal
@@ -1,5 +1,5 @@
 name:          handsy
-version:       0.0.4
+version:       0.0.5
 synopsis:      A DSL to describe common shell operations and interpeters for running them locally and remotely.
 -- description:   
 Homepage:      https://github.com/utdemir/handsy
@@ -18,6 +18,7 @@
 library
   exposed-modules:  System.Handsy
                     System.Handsy.Remote
+                    System.Handsy.Internal
   build-depends:    base >=4.6 && <4.8
                   , bytestring
                   , process
diff --git a/src/System/Handsy/Internal.hs b/src/System/Handsy/Internal.hs
new file mode 100644
--- /dev/null
+++ b/src/System/Handsy/Internal.hs
@@ -0,0 +1,19 @@
+{-# LANGUAGE DeriveFunctor    #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE TemplateHaskell  #-}
+
+module System.Handsy.Internal where
+
+import           Control.Monad.Free
+import           Control.Monad.Free.TH
+import qualified Data.ByteString.Lazy  as B
+import           System.Exit
+
+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)
+
+makeFree ''HandsyF
