The spy package

[Tags:bsd3, program, test]

Spy can be used to watch for file changes and to either report the modified files or run a command if files change. It can be used to trigger compilation, to run tests or start a deployment.

[Skip to Readme]


Versions 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.10, 0.12, 0.13, 0.14
Dependencies base (>=3 && <5), cmdargs (>=0.10), directory (>=1.1), filemanip (>=, filepath (>=1.3), fsnotify (>=0.2.1), json (>=0.7), process (>=1.1), system-filepath (>=0.4.7), time (>=1.4), unix [details]
License BSD3
Author Stefan Saasen
Stability Unknown
Category Development
Home page
Bug tracker
Source repository head: git clone
Uploaded Sat Sep 17 05:02:30 UTC 2016 by StefanSaasen
Distributions NixOS:0.14
Downloads 1435 total (32 in the last 30 days)
0 []
Status Docs not available [build log]
Last success reported on 2016-09-17 [all 1 reports]


small_baseChoose the new, split-up base package.EnabledAutomatic

Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info


Maintainer's Corner

For package maintainers and hackage trustees

Readme for spy

Readme for spy-0.14


Spy is a compact file system watcher for Mac OS X and Linux (Note: Should work on Windows but is currently untested).


Spy expects a single argument, the directory or a single file to watch. Spy currently supports two different modes: watch and run mode. Press CTRL-D to stop watching for file system changes.

Watch mode

In output mode Spy will print the path to a modified file to STDOUT (followed by a newline) whenever a file modification (new file added, file modified, file deleted) occurs.

$> spy watch .

Because watch is the default mode you can omit the watch command if you want:

$> spy .

It's possible to watch a single file (this obviously only shows changes to that particular file):

$> spy /path/to/file

The default format is the full path to the modified file followed by a newline. To make it easier to parse the output, the --format=json changes the output to be printed formatted as a JSON object (again followed by a newline).

$> spy watch --format=json .
{"path":"/path/to/modified.file","flag":"Added","time":"2012-12-20 11:26:56.859456 UTC"}

Flag is one of "Added", "Modified", "Removed".

For directories the following options apply:

An optional second argument can be used to filter the files in the given directory using a glob pattern:

$> spy watch /path/to/directory "*.md"

Run mode

In run mode Spy will execute a given command whenever a file modification occurs without printing modifications to stdout. The command will be executed with the path to the modified file as the last argument.

$> spy run "./"

In the example above the shell script would be executed with the path to the modified file as the first argument.

If the command to be executed does not expect any (additional) arguments the --notify-only flag can be used. This will cause spy to execute the command without passing the path as an argument:

$> spy run --notify-only "rake test" .

To compile Spy for example use:

$> spy run -n "cabal build" src


Binary distribution

The binary distribution contains a 64bit binary compiled for Mac OS X or Linux.

Download the tarball from and run "make install" to copy the binary and the man page into the correct target directories:

$> curl -OL
$> tar xfz spy-PLATFORM-ARCH-VERSION.tar.gz
$> cd spy
$> make install

The user manual should now be available via man spy and the spy executable should be on your $PATH.

Homebrew on Mac OS X?

You can use:

brew tap juretta/spy
brew install spy

To install the latest spy release.

Source distribution

You need the Haskell platform installed and cabal-install available on your $PATH.

To install spy from hackage simply run:

$> cabal install spy


To install spy from git you need the Haskell Tool Stack installed and stack available on your $PATH:

$> cd spy
$> stack install