diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,24 @@
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <http://unlicense.org/>
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/shadower.cabal b/shadower.cabal
new file mode 100644
--- /dev/null
+++ b/shadower.cabal
@@ -0,0 +1,18 @@
+name:                shadower
+version:             0.1.0.2
+synopsis:            An automated way to run doctests in files that are changing
+description:         Shadower watches folders with Haskell sources, and runs doctests in files that are modified
+homepage:             http://github.com/karun012/shadower
+license:             PublicDomain
+license-file:        LICENSE
+author:              Karun Ramakrishnan
+maintainer:          karun012@gmail.com
+category:            Testing
+build-type:          Simple
+cabal-version:       >=1.10
+
+executable shadower
+  default-language:   Haskell2010
+  build-depends:      base >4 && <5, fsnotify, process, system-filepath, text, filemanip, MissingH, doctest
+  main-is:            Shadower.hs 
+  HS-Source-Dirs:     src
diff --git a/src/Shadower.hs b/src/Shadower.hs
new file mode 100644
--- /dev/null
+++ b/src/Shadower.hs
@@ -0,0 +1,50 @@
+{-# OPTIONS -Wall #-}
+ 
+module Main where
+
+import Filesystem.Path.CurrentOS (fromText, encodeString)
+import Data.Text (pack)
+import Data.String.Utils
+
+import Control.Exception
+import qualified Control.Exception as E
+
+import System.FSNotify
+import System.Environment
+import System.Exit
+
+import Test.DocTest
+
+main :: IO ()
+main = getArgs >>= getFilePathFromArgs >>= watchPath
+
+getFilePathFromArgs :: [String] -> IO FilePath
+getFilePathFromArgs (filePath:_) = return filePath
+getFilePathFromArgs []       = return "."
+
+watchPath :: FilePath -> IO ()
+watchPath path = withManager $ \manager -> do
+       _ <- watchTree manager (fromText $ pack path) (const True) handler
+       _ <- getLine
+       exitSuccess
+
+handler :: Event -> IO()
+handler action = case action of 
+                 Modified file _ -> maybeRunDocTests (encodeString file)
+                 _ -> return ()
+
+maybeRunDocTests :: String -> IO ()
+maybeRunDocTests file = case isHaskellSource file of 
+                   True -> E.catch (runDocTests file) ignoreAllExceptions
+                   _ -> return ()
+
+ignoreAllExceptions :: SomeException -> IO ()
+ignoreAllExceptions _ = return ()
+
+runDocTests :: String -> IO ()
+runDocTests file = do
+              _ <- putStrLn $ "Running doctests in " ++ file
+              doctest [file]
+
+isHaskellSource :: String -> Bool
+isHaskellSource file = endswith ".hs" file || endswith ".lhs" file
