anchor.diff:          match fi.Attributes.HasFlag FileAttributes.Hidden || fi.Attributes.HasFlag FileAttributes.Directory with
           | true -> ()
           | _ -> generateFor fi
  +    refreshEvent.Trigger()
  +
  +let echo (webSocket : WebSocket) =
  +  fun cx -> socket {
  +    let loop = ref true
  +    while !loop do
  +      let! refreshed =
  +        Control.Async.AwaitEvent(refreshEvent.Publish)
  +        |> Suave.Sockets.SocketOp.ofAsync 
  +      do! webSocket.send Text (UTF8.bytes "refreshed") true
  +  }
   
   let startWebServer () =
       let serverConfig = 
  
positive.code:            homeFolder = Some (FullName outDir)
          }
      let app =
          Writers.setHeader "Cache-Control" "no-cache, no-store, must-revalidate"
          >>= Writers.setHeader "Pragma" "no-cache"
          >>= Writers.setHeader "Expires" "0"
          >>= browseHome
      startWebServerAsync serverConfig app |> snd |> Async.Start
      Process.Start "http://localhost:8083/index.html" |> ignore
  
  
negative.code:     | :? FileNotFoundException as exn ->
          traceImportant <| sprintf "Could not copy file: %s" exn.FileName
  
  let refreshEvent = new Event<_>()
  
  let handleWatcherEvents (events:FileChange seq) =
      for e in events do
          let fi = fileInfo e.FullPath
  