anchor.diff:                  DreamStatus.Ok,
                   new DreamHeaders([| new KeyValuePair<string, string>("Authorization", "token " + token.Value) |]),
                   MimeType.JSON,
  -                String.Format("""{{ "name" : "web", "events" : ["pull_request"], "config" : {{ "url" : "{0}", "content_type" : "json" }} }}""", this.Self.Uri.At("notify").AsPublicUri().ToString()))
  +                String.Format("""{{ "name" : "web", "events" : ["pull_request"], "config" : {{ "url" : "{0}", "content_type" : "json" }} }}""", publicUri.Value))
           try
               ignore(GITHUB_API.At("repos", owner.Value, repo, "hooks").Post(createHook))
           with
  
positive.code: [<DreamServiceConfig("github.token", "string", "A Github's personal API access token")>]
  [<DreamServiceConfig("github.owner", "string", "The owner of the repos we want to watch")>]
  [<DreamServiceConfig("github.repos", "string", "Comma separated list of repos to watch")>]
  type PullRequestService() =
      inherit DreamService()
      let GITHUB_API = Plug.New(new XUri("https://api.github.com"))
      let mutable token = None
      let mutable owner = None
                  
      override this.Start(config : XDoc, container : ILifetimeScope, result : Result) =
          
  
negative.code:         token <- Some config.["github.token"].AsText
          owner <- Some config.["github.owner"].AsText
          let repos = Some config.["github.repos"].AsText
          publicUri <- Some config.["public.uri"].AsText
          match publicUri with
          | None -> publicUri <- Some(this.Self.Uri.At("notify").AsPublicUri().ToString())
          | _ -> ()
          
          // Validate
          this.ValidateConfig "github.token" token
          this.ValidateConfig "github.owner" owner
          this.ValidateConfig "github.repos" repos
          
          // Use
          this.CreateWebHooks(repos.Value.Split(','))
  