diff --git a/CHANGES.txt b/CHANGES.txt
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,7 @@
 Changelog for Weeder
 
+0.1.5
+    If --yaml and no hints give no output
 0.1.4
     #9, allow --dist-dir to set the stack dist-dir
     Deal with operators including | in them
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
 * [HLint](https://github.com/ndmitchell/hlint#readme), looking for "Redundant extension" hints, which finds unused extensions.
 * The `weeder` tool, which detects functions that are exported internally but not available from outside this package. It also detects redundancies and missing information in your `.cabal` file.
 
-## Running Weeder
+## Running Weeder locally
 
 Weeder piggy-backs off files generated by [`stack`](https://www.haskellstack.org), so first obtain stack, then:
 
@@ -42,3 +42,21 @@
 ```
 
 This configuration declares that I am not interested in the message about modules being reused between components (that's the way `ghcid` works, and I am aware of it). It also says that I am not concerned about `withWaiterPoll` being a weed - it's a simplified method of file change detection I use for debugging, so even though it's dead now, I sometimes do switch to it.
+
+## Running with Continuous Integration
+
+Before running Weeder on your continuous integration (CI) server, you should first ensure there are no existing weeds. One way to achieve that is to ignore existing hints by running `weeder . --yaml > .weeder.yaml` and checking in the resulting `.weeder.yaml`.
+
+On the CI you should then run `weeder .` (or `weeder . --build` to compile as well). To avoid the cost of compilation you may wish to fetch the [latest Weeder binary release](https://github.com/ndmitchell/weeder/releases/latest). For certain CI environments there are helper scripts to do that.
+
+**Travis:** Execute the following command:
+
+    curl -sL https://raw.github.com/ndmitchell/weeder/master/misc/travis.sh | sh -s .
+
+The arguments after `-s` are passed to `weeder`, so modify the final `.` if you want other arguments.
+
+**Appveyor:** Add the following statement to `.appveyor.yml`:
+
+    - ps: Invoke-Command ([Scriptblock]::Create((Invoke-WebRequest 'https://raw.githubusercontent.com/ndmitchell/weeder/master/misc/appveyor.ps1').Content)) -ArgumentList @('.')
+
+The arguments inside `@()` are passed to `weeder`, so add new arguments surrounded by `'`, space separated - e.g. `@('.' '--build')`.
diff --git a/src/Warning.hs b/src/Warning.hs
--- a/src/Warning.hs
+++ b/src/Warning.hs
@@ -107,7 +107,7 @@
 showWarningsValue = valToValue . f warningLabels . map (dropWhileEnd isNothing . warningPath)
     where
         f (name:names) xs
-            | all (\x -> length x <= 1) xs = [End name $ sort [x | [Just x] <- xs]]
+            | all (\x -> length x <= 1) xs = [End name $ sort [x | [Just x] <- xs] | xs /= []]
             | otherwise = concat
                 [ case a of
                     Nothing -> f names b
@@ -118,7 +118,8 @@
 showWarningsJson = LBS.unpack . JSON.encode . showWarningsValue
 
 showWarningsYaml :: [Warning] -> String
-showWarningsYaml = BS.unpack . Yaml.encode . showWarningsValue
+showWarningsYaml [] = "" -- no need to write anything in the file
+showWarningsYaml xs = BS.unpack $ Yaml.encode $ showWarningsValue xs
 
 
 readWarningsFile :: FilePath -> IO [Warning]
diff --git a/weeder.cabal b/weeder.cabal
--- a/weeder.cabal
+++ b/weeder.cabal
@@ -1,7 +1,7 @@
 cabal-version:      >= 1.18
 build-type:         Simple
 name:               weeder
-version:            0.1.4
+version:            0.1.5
 license:            BSD3
 license-file:       LICENSE
 category:           Development
