diff --git a/app/Main.hs b/app/Main.hs
new file mode 100644
--- /dev/null
+++ b/app/Main.hs
@@ -0,0 +1,28 @@
+import Path
+import qualified Data.ByteString.Lazy as BS
+import qualified Data.Text as T
+import Data.Attoparsec.Text (parseOnly, endOfInput, eitherP)
+import Data.Attoparsec.Path (absFilePath, relFilePath, absDirPath)
+import System.INotify (initINotify, removeWatch, killINotify)
+import System.File.Follow (follow)
+import System.Directory (getCurrentDirectory)
+import System.Environment (getArgs)
+import Control.Monad (forever)
+import Control.Exception (bracket)
+import Control.Concurrent (threadDelay)
+
+
+main = do
+  [f] <- getArgs
+  f <- case parseOnly (eitherP absFilePath relFilePath <* endOfInput) (T.pack f) of
+          Left e -> error e
+          Right eAR -> case eAR of
+            Left a -> pure a
+            Right r -> do
+              d <- getCurrentDirectory
+              case parseOnly (absDirPath <* endOfInput) (T.pack (d ++ "/")) of
+                Left e -> error e
+                Right d' ->
+                  pure (d' </> r)
+  i <- initINotify
+  bracket (follow i f BS.putStr) (\watch -> removeWatch watch >> killINotify i) $ \_ -> forever $ threadDelay 50000
diff --git a/follow-file.cabal b/follow-file.cabal
--- a/follow-file.cabal
+++ b/follow-file.cabal
@@ -1,5 +1,5 @@
 Name:                   follow-file
-Version:                0.0.1
+Version:                0.0.1.1
 Author:                 Athan Clark <athan.clark@gmail.com>
 Maintainer:             Athan Clark <athan.clark@gmail.com>
 License:                BSD3
@@ -26,14 +26,17 @@
                       , utf8-string
                       , vector
 
-Test-suite filefollow-tests
-  Type:                exitcode-stdio-1.0
+Executable follow-file
   Default-Language:    Haskell2010
-  Hs-Source-Dirs:      test
+  Hs-Source-Dirs:      app
   Main-is:             Main.hs
   Build-Depends:       base
+                     , bytestring
                      , follow-file
                      , path
+                     , text
+                     , attoparsec
+                     , attoparsec-path
                      , hinotify
                      , directory
 
diff --git a/test/Main.hs b/test/Main.hs
deleted file mode 100644
--- a/test/Main.hs
+++ /dev/null
@@ -1,17 +0,0 @@
-import Path
-import System.INotify (initINotify, removeWatch, killINotify)
-import System.File.Follow (follow)
-import System.Directory (getCurrentDirectory)
-import Control.Monad (forever)
-import Control.Exception (bracket)
-import Control.Concurrent (threadDelay)
-
-
-main = do
-  i <- initINotify
-  d <- getCurrentDirectory
-  f <- parseAbsFile $ d ++ "/foo"
-  bracket (follow i f print) (\watch -> do
-                                removeWatch watch
-                                killINotify i
-                              ) $ \_ -> forever $ threadDelay 50000
